前言
最近正在研究大模型微调,经常记不住Llama-Factory的各种参数和各种概念,这里记录下来,方便自己查看。
1 微调方法
1.1 LoRA
LoRA是一种通过低秩近似方法来减少模型参数数量和计算量的技术。它的主要目标是通过将原始的高维参数矩阵分解为两个低秩矩阵的乘积,从而实现模型的参数压缩和计算加速。
优点
参数压缩: 通过低秩分解,可以将模型的参数数量显著减少,从而减小模型的存储需求。
计算加速: 低秩分解后的计算复杂度较低,可以加速模型的推理和训练过程。
保持模型性能: 在大多数情况下,LoRA能够在减少参数数量的同时,保持模型的性能不显著下降。
缺点
适应性有限: 对于一些非常复杂或特定的任务,它可能无法完全捕捉任务中的细节。
灵活性有限: LoRA 将模型参数进行低秩分解,可能限制了模型对复杂任务的灵活调整能力。
难以处理极大模型: 对于极其庞大的模型,LoRA 可能仍然无法有效地缩减到一个适用的范围,特别是在存储和计算上。
1.2 Full
全参数微调是指在微调过程中,预训练模型的所有参数都参与训练。这意味着模型的每一层、每一个参数都会根据新的任务数据进行更新和调整。
优点
灵活性高: 可以充分利用预训练模型的全部能力,适应新任务的各种特性。
效果好: 在大多数情况下,能够获得较好的微调效果,因为所有参数都参与了训练和调整。
缺点
计算资源消耗大: 需要较多的计算资源和时间,尤其是在处理大型模型时。
过拟合风险: 在数据量较小的情况下,容易导致过拟合,因为所有参数都可能被过度调整。
1.3 Freeze
优点
计算资源需求低: 由于只更新部分参数,计算资源和时间需求较低。
减少过拟合风险: 冻结大部分参数可以减少过拟合的风险,特别是在数据量较小的情况下。
快速收敛: 由于参数更新较少,模型训练通常收敛更快。
缺点
灵活性较低: 由于大部分参数被冻结,模型的适应能力有限,可能无法充分利用预训练模型的全部能力。
性能可能受限: 在一些复杂任务中,性能可能不如全参数微调,因为模型无法进行全面的调整。
总的来说,LoRA 是一个高效且较为节省资源的方法,尤其适用于在有限的显存和数据集情况下微调模型,Freeze 更适用于在数据集较小且对新任务要求不高的场景,显存消耗较低,但模型灵活性较差,Full 方法性能最强,适合数据集较大且需要模型充分适应新任务的场景,但它显存消耗较高,可能不适用于资源有限的情况,如下图所示:
2 微调超参数
2.1 序列长度
在模型微调过程中,序列长度(--cutoff_len)指的是模型在处理输入文本时所考虑的最大令牌(token)数。具体来说,当输入文本被Token化后,如果文本长度超过设定的--cutoff_len,模型将仅截取前--cutoff_len个Token进行训练。
优点
降低显存需求: 适当减少序列长度,可以避免OOM问题,使训练过程更加顺利。
提升计算效率: 减少每步的计算量,加快训练速度。
缺点
信息丢失: 如果重要信息集中在序列的后部,截断可能导致模型无法学习到这些关键内容,影响模型性能。
上下文理解不足: 对于需要长上下文理解的任务,如长文生成或文档摘要,截断可能会削弱模型的表现。
2.2 梯度累计
梯度累计(Gradient Accumulation)是一种训练技巧,旨在模拟更大的批次大小(batch size),从而提升模型的训练稳定性和效果,同时不额外增加显存的消耗。其核心思想是在多次小批次(mini-batch)的前向和反向传播过程中,累计梯度,待达到设定的梯度累积步数后,再一次性更新模型参数。
优点
节省显存: 允许使用较小的物理批次,减少每步的显存占用。
提升泛化能力: 较大的有效批次大小有助于模型的泛化能力提升。
稳定训练: 更大的批次规模使梯度估计更准确,训练过程更稳定。
缺点
训练时间延长: 累计梯度过程增加了每步的训练时间。
复杂性增加: 需要管理梯度的累积和参数的更新,使训练过程更为复杂。
3 优化步数训练
我一直有一个疑问,为什么大模型微调时,不像传统的视觉算法训练,多少个epoch就显示多少个epoch显示,跑完就完成了,如下图所示:
明明epoch=10,但是却显示优化步数410,这是怎么计算的呢?
后来研究发现,优化步数是根据epoch个数、总样本数(数据集条数)、梯度累积步数和批处理大小决定的,就上图而言,计算步骤如下:
总结
这只是目前阶段,有疑问的超参数和微调问题,后续会继续提出问题、解决问题、总结问题,持续更新。