参数说明
微调方法
内置的微调方法有以下三种:
- full:全参微调,将整个模型都进行微调,对显存要求巨大。
- freeze:冻结微调,将模型的大部分参数冻结,只对部分参数进行微调,可以降低对显存的要求。
- lora:将模型的部分参数冻结,只对部分参数进行微调,但只在特定的层上进行微调,极大节约显存。
学习率
学习率是最重要的超参数之一,它决定了在每次参数更新时参数改变的幅度。一个太大的学习率可能会导致模型训练不稳定,而太小的学习率会导致训练过程缓慢。微调时,通常使用比预训练阶段更小的学习率,因为我们希望模型参数的改变更加细微,以免破坏已学到的有用信息。
关于学习率有一个比较形象的解释:学习率有点像教一个小孩学习新知识,如果你一次性给他太多的信息,他可能会感觉到困惑,无法吸收。但是如果给的信息太少,学习进度又会非常慢。
学习率到底设置多少算是合适呢?得试。
建议从保守的小值开始,然后根据训练过程的反馈进行调整。同时使用学习率调度和自适应优化器可以帮助在训练过程中自动调整学习率,提高模型性能。
常见的学习率参数包括但不限于:
- 1e-1(0.1):相对较大的学习率,用于初期快速探索。
- 1e-2(0.01):中等大小的学习率,常用于许多标准模型的初始学习率。
- 1e-3(0.001):较小的学习率,适用于接近优化目标时的细致调整。
- 1e-4(0.0001):更小的学习率,用于当模型接近收敛时的微调。
- 5e-5(0.00005):非常小的学习率,常见于预训练模型的微调阶段,例如在自然语言处理中微调BERT模型。
下面是一些建议:
- 快速探索:在模型训练初期或者当你不确定最佳参数时,可以使用较大的学习率(例如0.1或0.01),快速找到一个合理的解。
- 细致调整:当你发现模型的性能开始稳定,但还需要进一步优化时,可以减小学习率(例如0.001或0.0001),帮助模型更精确地找到最优解。
- 微调预训练模型:当使用已经预训练好的模型(如在特定任务上微调BERT)时,通常使用非常小的学习率(例如5e-5或更小),这是因为预训练模型已经非常接近优化目标,我们只需要做一些轻微的调整。
截断长度
Cutoff Length是训练句子截断长度,句子越长,显存占用越多,如果显存不够可以考虑降低到512甚至256。可以根据微调目标需要的长度进行设置。微调后,模型处理长度大于Cutoff Length的句子的能力会下降。
训练轮数
训练轮数,也称为epochs,是模型训练过程中的一个重要参数。它表示模型在训练集上训练的完整次数。例如,如果我们有一个训练集,并且我们的模型需要学习这个训练集的所有数据,那么一个epoch就是指模型对这个训练集进行一次完整的遍历。
似乎没有什么确定的好的办法,只能多调整几次对比看看效果。以下是一些建议:
- 通常从较小的轮数开始,比如3-5轮,观察模型性能。
- 根据验证集上的性能来调整。如果性能还在提升,可以适当增加轮数;如果开始过拟合,则应减少轮数。
- 对于大规模预训练模型,往往只需要少量轮数就能达到不错的效果,通常不超过10轮。
- 使用early stopping策略,在验证集性能不再提升时自动停止训练。
- 对于不同规模的数据集,合适的轮数也有区别:
- 小数据集(< 1万样本):可能需要10-20轮
- 中等数据集(1-10万样本):5-10轮左右
- 大数据集(>10万样本):3-5轮可能就足够
- 配合学习率衰减策略使用,可以在较少轮数内达到较好效果。
- 不同任务类型可能需要的轮数也不同,需要具体任务具体分析。
- 可以尝试使用较大learning rate配合较少的epoch数。
- 监控训练过程中的loss变化,作为调整轮数的参考。
总之需要通过实验来确定最佳轮数,有点类似玄学或者魔法,参数具体设置多少充满着不确定性,没有固定的标准。
梯度累积
梯度累积(Gradient Accumulation)的基本思想是将一次性的整批参数更新的梯度计算变为以一小步一小步的方式进行。具体而言该方法以小批次的方式进行模型前向传播和反向传播,过程中迭代计算多个小批次梯度并累加,当累积到足够多的梯度时,执行模型的优化步骤更新参数。这也是一种典型的时间换空间的做法,即我们可以实现在有限的GPU内存上更新大量参数,不过额外添加的小批次前向传播和后向传播会使得训练速度变慢一些。
例如,若目标批量大小是1,024,但设备每次只能处理256个样本,那么可以通过累积四个步骤中每个步骤的256个样本的梯度,来模拟出一个包含1,024个样本的批量更新。
这种方法在有限的内存资源下,平衡了对大批量的需求,有助于实现更稳定的梯度估计以及可能达到的更快收敛速度。