LoRA超参数指南
LoRA 超参数的最佳实践,并了解它们如何影响微调过程。
有数百万种可能的超参数组合,选择正确的值对于微调至关重要。您将学习超参数的最佳实践 - 基于来自数百篇研究论文/实验的见解以及它们如何影响模型。 我们建议您使用 Unsloth 的预选默认值。
目标是更改超参数数字以提高准确性,但也要抵消过度拟合或欠拟合 。过度拟合是模型记住数据并努力解决新问题的地方。我们想要一个通用的模型,而不是一个仅仅记住的模型。
关键微调超参数
Learning Rate
定义模型权重在每个训练步骤中调整的程度。
- 更高的学习率 : 更快的训练,减少过拟合,请确保不要让它太高,因为它会欠拟合
- 更低的学习率 :更稳定的训练,可能需要更多的 epoch。
- 典型范围 :1e-4 (0.0001) 至 5e-5 (0.00005)。
模型在每次迭代中参数更新的步长大小。
学习率过大时,参数更新步长过大,可能会导致参数跨过最优解,训练过程不稳定,甚至发散;学习率过小时,参数更新缓慢,可能导致模型陷入局部最优解,训练时间延长
Epochs
模型看到完整训练数据集的次数。
- 推荐:1-3 个 epoch(任何超过 3 个的事物通常都不是最佳选择,除非你希望你的模型有更少的幻觉,但也更少创造力)
- 更多 Epochs:更好的学习,更高的过拟合风险
- 较少的 epochs:可能会对模型进行欠训练。
高级超参数
超参数 | 功能 | 推荐设置 |
---|---|---|
LoRA Rank | 控制用于适应的低秩因子的数量。 | 4-128 |
LoRA Alpha | 权重更新的缩放因子。 | LoRA Rank * 1 or 2 |
Max Sequence Length | 模型可以学习的最大上下文。 | 根据数据集需求进行调整 |
Batch Size | 每个训练步骤处理的样本数 | 值越高,需要的 VRAM 就越多。1 表示长上下文,2 或 4 表示较短的上下文。 |
LoRA Dropout | 防止过拟合 | 0.1-0.2 |
Warmup Steps | 在训练开始时逐渐提高学习率 | 总步数的 5-10% |
Scheduler Type | 在训练过程中动态调整学习率。 | Linear Decay |
Seed or Random State | 确保结果的可重复性。 | 固定数字(例如,42) |
Weight Decay | 惩罚较大的权重更新以防止过度拟合。 | 1.0 或 0.3(如果您有问题) |
Unsloth 中的 LoRA 超参数
如果您愿意,可以手动调整下面的超参数 - 但请随意跳过它,因为 Unsloth 会自动为您选择均衡的默认值。
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_droput = 0, # Supports any, but=0 is optimized
# [NEW] "unsloth" uses 30% less VRAM, fits 2x larger batch sizes!
use_gradient_checkpointing = "unsloth", # True or "unsloth" for vety long context
random_state = 3407,
use_rslora = False, # We support rank stabilized LoRA
loftq_config = None, # And LoftQ
)
1、r = 16, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128
微调过程的等级。较大的数字会占用更多内存,并且速度会变慢,但可以提高更难任务的准确性。我们通常建议使用 8 (用于快速微调) 和最多 128 的数字。太大的数字会导致过度拟合,从而损害模型的质量
2、target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",],
我们选择所有模块进行微调。您可以删除一些以减少内存使用量并加快训练速度,但我们强烈建议不要这样做。只需在所有模块上进行训练即可!
3、lora_alpha = 16,
微调的比例因子。较大的数字将使 finetune 了解有关您的数据集的更多信息,但可能会促进过度拟合。我们建议它等于秩 r
,或将其翻倍。
4、lora_dropout = 0, # Supports any, but = 0 is optimized
将此值保留为 0 可加快训练速度!可以减少过度拟合,但不会那么多。
5、bias = "none", # Supports any, but = "none" is optimized
将此值保留为 0 以获得更快、更少的过度拟合训练!
6、use_gradient_checkpointing = "unsloth", # True or "unsloth" for very long context
选项包括 True
、False
和 “unsloth”。
我们建议使用 “unsloth”
,因为我们将内存使用量额外减少了 30%,并支持超长的上下文微调。您可以在此处阅读:https://unsloth.ai/blog/long-context 了解更多详情。
7、random_state = 3407,
用于确定确定性运行数的编号。训练和微调需要随机数,因此设置此数字可使实验可重现。
8、use_rslora = False, # We support rank stabilized LoRA
自动设置 lora_alpha = 16
的高级功能。如果你愿意,你可以使用它!
9、loftq_config = None, # And LoftQ
高级功能,用于将 LoRA 矩阵初始化为权重的前 r 个奇异向量。可以在一定程度上提高准确性,但可能会使内存使用量在开始时呈爆炸式增长。
避免过度配合和不足配合
过拟合Overfitting
记住训练数据,无法推广到看不见的输入
- 如果您的训练持续时间较短,请降低学习率。对于更长的训练运行时间,请提高学习率。因此,最好对两者进行测试,看看哪个更好。
- 增加批量大小(batch size)。
- 减少训练 epoch 的数量。
- 将您的数据集与通用数据集(例如 ShareGPT)相结合
- 提高 dropout rate 以引入正则化。
欠拟合Underfitting
虽然不太常见,但欠拟合是由于缺乏可学习的参数而导致低秩模型无法泛化的地方,因此您的模型可能无法从训练数据中学习。
- 如果您的训练持续时间较短,请提高学习率。对于较长的训练运行,请降低学习率。
- 训练更多epochs
- 提高rank 和 alpha。Alpha 应至少等于rank 数字,对于较小的模型/更复杂的数据集,rank 应该更大;通常在 4 到 64 之间。
- 使用与域更相关的数据集。
评论(0)