可后台滴滴小英熊学长欧~
目录:
一. 监督微调SFT
二. 大模型微调技巧
1.SFT开发流程
2.训练数据要注重什么?
3.模型的选择
4.幻觉问题
5.BERT和LLM不同
标签不平衡问题:在进行分类任务时,如果正反标签比例为8:2,无论是BERT还是LLM,模型都可能出现偏差。
多任务平衡:在进行多任务学习时,任务之间的平衡同样重要,Q4 对这一问题进行了讨论。
不同点:
开发体验差异:当 BERT 遇到难以处理的情况时,可能需要标注 50甚至上百条类似数据才能解决问题。而 LLM 则更为高效,往往仅需标注2~4条数据即可解决这一场景的 bad cases。在数据集需求上,BERT 可能需要近万条数据才能达到理想效果,而 LLM 可能仅需不到 1K的数据就能实现相似的效果。这使得LLM 在迭代速度和效率上更具优势。
模型规模调整策略不同:当BERT的效果不佳时,我们可能会尝试增加模型规模。然而,对于LLM 来说,当效果达到预期时,我们反而会考虑减小模型规模,这主要是因为LLM 的参数量通常非常庞大:越大的效率会越慢。
6.全量微调/P-tuning/Lora选取。
此外,DeepMind 的一篇研究 SFT scaling law 的论文中探讨了不同数据量下不同训练方式的效果及其对泛化性的影响。该研究指出,当数据量仅在几千条时,P-tuning 是最佳选择;数据量在几千至万条之间时,Lora 更为适合;而当数据量达到百万级别时,Full-tunning 效果最佳。此外,使用 Full-tunning 会导致训练后的模型泛化性不如 Lora。当然,论文的实验任务是一个多语种的翻译任务,其它任务可能会不一样但大概的趋势是这样。因此在大多数场景下,推荐使用 Lora,因为稳定,效果不差,能尽可能保留模型原来的泛化性。
7.SFT价值
消除幻觉:对于依赖高精度的应用来说,这是一个重要的解决方向。
精选数据集和任务配比:现在更多是实验工程,期待有如 Less,等扎实的工作不断涌现。设置科学设计问答格式和 Data format:这是为了激发模型的最大潜能,这个可能要:model by model 。
探寻更高效的微调技巧:Lora 表现出色且稳定,但我们仍在探索其他方法。Lora 虽好,但仍有提升空间。目前已有一些如 Lora+、PLora、PiSSA 等工作的出现。
1.那些参数可以调
(2)Learning rate 和 batch size 是两个重要的参数,而且二者也是相互影响的,在反向传播时直接影响梯度。一般情况下,先调 batchsize,再调learning
rate。
(3)batchsize 不能太大,也不能太小,太小会浪费计算资源,太大则会浪费内存;一般设置为 16 的倍数。
(4)如果使用微调,则learningrate 设置为 0.0001较好。learningrate 设置上有很多 trick 包括 cosinglearning rate 等。
(5)Epochnumber 和 Early stopping 是息息相关的,需要输出 loss 看一下,到底是什么 epoch 时效果最好,及时 early stopping。
(6)Adam 和 SGDM 是最常用的两个,前者能快速收敛,后者收敛慢但最终精度更高。现在大家会先使用 Adam 快速收敛,后面再用 SGDM 提升精度。
(7)ReLu、Sigmoid、Softmax、Tanh 是最常用的 4个激活函数
(8)对于输出层,常用 sigmoid 和 softMax 激活函数,中间层常用 ReLu 激活函数,RNN 常用 Tanh激活函数。
(9)预训练参数是最好的参数初始化方式,其次是 Xavir。
(10)Dropout 虽然思想很简单,但效果出奇的好,首选 0.5。
2.一些建议
模型结构+训练目标:Causal Decoder+LM。有很好的 zero-shot 和 few-shot 能力,涌现效应。
layer normalization: 使用 Pre RMS Norm。
激活函数:使用 GeGLU 或 SwiGLU。
embedding 层后不添加layer normalization,否则会影响 LLM 的性能。
位置编码:使用 ROPE 或 ALiBi,ROPE 应用更广泛。
去除偏置项:去除 dense 层和 layer norm 的偏置项,有助于提升稳定性。
batch:选用很大的 batch size,动态地增加batch size 的策略,GPT3 逐渐从 32K 增加到3.2M tokens。
学习率调度:先 warmup 再衰减。学习率先线性增长,再余弦衰减到最大值的10%。最大值一般在 5e-5 到 1e-4 之间。
梯度裁剪:通常将梯度裁剪为 1.0。
权重衰减:采用 AdamW 优化器,权重衰减系数设置为 0.1Adamw 相当于 Adam 加了一个 L2正则项。
混合精度训练:采用 bfloat16,而不是 foat16 来训练。