unsloth的微调示例学习-model的构建
这几天试了试unsloth的微调,操作非常简单,但是实际上代码我都不知道啥意思,所以一步一步学习,顺便总结记录一下,记录内容都基于我和chatgpt的讨论,都是它教的。
微调语言模型中的随机种子与偏置项:深入解析
在微调大型语言模型时,诸多配置选项决定了模型的性能、效率以及可重复性。本文通过讨论实际代码示例,深入解析了这些配置的含义,并回答了有关随机种子和偏置项的问题。
代码示例
以下是用于微调语言模型的代码片段:
model = FastLanguageModel.get_peft_model(
model,
r = 16, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",],
lora_alpha = 16,
lora_dropout = 0, # Supports any, but = 0 is optimized
bias = "none", # Supports any, but = "none" is optimized
# [NEW] "unsloth" uses 30% less VRAM, fits 2x larger batch sizes!
use_gradient_checkpointing = "unsloth", # True or "unsloth" for very long context
random_state = 3407,
use_rslora = False, # We support rank stabilized LoRA
loftq_config = None, # And LoftQ
)
配置项解析
-
r = 16
:- LoRA的秩(rank),通常选择偶数值如8、16、32等,以优化计算性能。但理论上,
r
也可以是单数,如1、3、5等。
- LoRA的秩(rank),通常选择偶数值如8、16、32等,以优化计算性能。但理论上,
-
target_modules
:- 指定需要应用LoRA的模型模块,如Transformer中的投影层。对这些模块进行低秩更新。
-
lora_alpha = 16
:- LoRA的缩放因子,控制训练时扰动的大小。
-
lora_dropout = 0
:- Dropout率,设为0表示不使用Dropout,有利于优化内存和计算。
-
bias = "none"
:- 是否使用偏置项,设为
"none"
表示不引入偏置参数,进一步优化内存使用。
- 是否使用偏置项,设为
-
use_gradient_checkpointing = "unsloth"
:- 使用优化版的梯度检查点技术,减少内存占用,特别适合处理长上下文任务。
-
random_state = 3407
:- 随机种子,确保实验的可重复性。
-
use_rslora = False
和loftq_config = None
:- 分别是是否使用Rank Stabilized LoRA和LoftQ配置,两者都为模型优化提供额外选项。
偏置项的作用
偏置项在神经网络中有以下几个主要作用:
- 移位功能:帮助模型更灵活地调整输出,即使在输入为零时,也能产生非零输出。
- 增强表达能力:增加模型的自由度,使其能更好地拟合复杂数据。
- 帮助模型更好地拟合数据:特别是在数据有全局偏移或趋势时,偏置项能帮助模型捕捉这种趋势。
- 防止过拟合与欠拟合:合适的偏置项设置能帮助模型找到最佳解,从而避免欠拟合或过拟合。
随机种子的作用
随机种子用于保证实验的可重复性。设置相同的随机种子可以控制模型训练过程中涉及的随机性操作,包括:
- 权重初始化
- 数据打乱
- Dropout
- Batch Normalization
实验的可重复性
如果两次微调设置的随机种子相同,并且其他条件(如硬件、软件环境)完全一致,那么得到的微调模型应当是相同的。但如果硬件或软件环境有差异,浮点数运算的微小不同可能导致模型最终结果略有差异。因此,要确保完全的可重复性,除了相同的随机种子外,还需要确保环境的一致性。