大模型(LLMs)学习笔记(3)——微调篇

文摘   2024-12-16 00:37   河北  

微信号:
python__matlab


后台滴滴小英熊学长欧~

目录:

一. 监督微调SFT

二. 大模型微调技巧





一.监督微调SFT

1.SFT开发流程

(1)根据业务场景调整提示词。
(2)选择大模型。
(3)准备数据集。

2.训练数据要注重什么?

确保回答格式和风格的统一,训练数据的格式和风格越统一,越能最大限度地发挥模型在具体任务的效果上限。这在 LIMA、Yl、 ReformattedAlignment 的论文中都有提到。数据集既要包含难也要包含易:数据集应同时包含容易错的“Difficult”边界数据,但也要包含常规的“Easy”数据,以确保模型能够处理各种难度级别的样本。注意任务的多样性和标签的平衡。例如,若两个任务难度相当,但任务1的数据占比远大于任务2,那么微调后的模型在处理任务2时可能表现不佳避免引入模型在预训练阶段未接触过的知识:以减少模型产生幻觉的风险。

3.模型的选择

在效率和资源都达标和到位的情况上,优先用大size的模型进行实验和微调,因为大size 的模型在容错性上比小 size 的好太多。尽管大尺寸模型也可能存在多任务不稳定、标签不平衡等问题,但其表现通常会比小尺寸模型更为稳定。

4.幻觉问题

幻觉问题是影响业务精准度的一个重要因素,它常导致召回率尚可,精确率却偏低。实际体验下来,不论开源还是闭源模型,都容易“过度联想”,从而在某些业务场景下无法使用。
https://dl.acm.org/doi/abs/10.1145/3571730
https://arxiv.org/abs/2311.05232

5.BERT和LLM不同

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选取。

在某些特定场景下,全量调优(fulltuning)确实表现更佳,但优势并不明显。在数据量有限且应用场景不多的情况下,为了保持模型的泛化能力Lora 方法表现得最为稳定。考虑到泛化性,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.那些参数可以调

Loss function、Learning rate、 Batch size、Epochnumber、Optimizer、 Activationfunction、Weightsinitialization、使用 Regularization、Validation、使用的GPU 个数。

(1)Loss function 是 Model 和数据之外,第三重要的参数。具体使用 MSE、Cross entropy、Focal 还是其他自定义,需要具体问题具体分析。

(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.一些建议

(1)模型结构

模型结构+训练目标:Causal Decoder+LM。有很好的 zero-shot 和 few-shot 能力,涌现效应。

layer normalization: 使用 Pre RMS Norm。

激活函数:使用 GeGLU 或 SwiGLU。

embedding 层后不添加layer normalization,否则会影响 LLM 的性能。

位置编码:使用 ROPE 或 ALiBi,ROPE 应用更广泛。

去除偏置项:去除 dense 层和 layer norm 的偏置项,有助于提升稳定性。


(2)训练配置

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 来训练。



英熊学长会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!有任何matlab和python相关的问题都可以在后台滴滴小英熊学长欧~

 

点下【在看】给小编加鸡腿

MatpyMaster
Matlab、Python程序定制。擅长专业:电子信息、通信工程、人工智能、电子电力。可进行算法复现,论文复现,如有需要加V:Matpy_Master
 最新文章