正文
模型微调通常来说,虽然可以提高任务的效果,但通常来说,微调的成本远大于提示词调优,模型微调相对来说复杂性高、资源需求大而且成本高。
使用 OpenAI API 进行快速工程的最佳实践:
https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-the-openai-api
prompt:结构化、具体化、清晰化
在微调之前先尝试优化prompt和fewshot来探索模型能力边界,是否能解决现有问题,合适的base-model(类型和size)的选取,有了明确的效果保证后,再微调得到更加稳定的效果输出和更小的size部署等需求。
1.2.2. 数据构造
有这么一句话在业界广泛流传:
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
。所以数据的构造至关重要,需要建立对生成数据质量的把控。
在chatgpt出来后,业界最开始基于pretrain模型上做sft最受关注的工作之一,是self-instruct,蒸馏chatgpt得到高质量的sft数据,很多后来的生成sft数据的工作是以这个工作为基础。核心思想是通过建立种子集,然后prompt模型输出目标格式的数据,通过后置ROUGE-L等筛选方法去重,不断的加入种子集合,来提升产出数据的多样性和质量。
比如qwen2.5-7b是pretrain后的模型,qwen2.5-7b-instrcut是基于qwen2.5-7b做了通用的SFT微调后得到。
生成指令数据的流程由四个步骤组成。1)指令生成,2)识别指令是否代表分类任务,3)用输入优先或输出优先的方法生成实例,4)过滤低质量数据。
关注数据集的质量和丰富度:
我们提及微调更多是在通用SFT训练好的模型基础上再做领域的微调。
可以更省事的选择俄把生成好的数据,直接丢给模型去训练验证最后的效果;但是如果朝着长期做效果迭代的方向,我们需要对生成的数据是否符合预期,有更现验的判断,这也能够为后续如果微调后模型不符合预期的情况下,来有debug的依据和方法。
一方面是人来check数据质量,另外一方面是可以通过规则或者LLM大模型来做后置的数据验证,让模型来打分并给出推理过程等方式。数据量的问题上,跟数据类型的分布关系很大,需要产生不同任务下的高质量数据,更需要关注数据分布。
1.2.3.
LoRA
微调
基于已有开源大模型进行微调训练,如果采用预训练的方式对模型的所有参数都进行训练微调,由于现有的开源模型参数量都十分巨大。
PEFT
(Parameter-Efficient Fine-Tuning),即对开源预训练模型的所有参数中的一小部分参数进行训练微调,最后输出的结果和全参数微调训练的效果接近。
LoRA(论文:
LoRA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
),该方法的核心思想就是通过低秩分解来模拟参数的改变量,从而以极小的参数量来实现大模型的间接训练。(
秩是矩阵中最长的独立行数或列数)
神经网络包含很多全连接层,其借助于矩阵乘法得以实现,然而,很多全连接层的权重矩阵都是满秩的。因此,论文的作者认为权重更新的那部分参数矩阵尽管随机投影到较小的子空间,仍然可以有效的学习,可以理解为针对特定的下游任务这些权重矩阵就不要求满秩。
在涉及到矩阵相乘的模块,在旁边增加一个新的通路,通过前后两个矩阵A,B相乘,第一个矩阵A负责降维,第二个矩阵B负责升维,中间层维度为r。
其中,r<
。
将原部分跟新增的通路两部分的结果加起来作为最终的结果(两边通路的输入跟输出维度是一致的)。
此外,Transformer的权重矩阵包括Attention模块里用于计算query, key, value的Wq,Wk,Wv以及多头attention的Wo,以及MLP层的权重矩阵,LoRA只应用于Attention模块中的4种权重矩阵,而且通过消融实验发现同时调整 Wq 和 Wv 会产生最佳结果。
instructGPT提出的SFT和RLHF的流程图,在SFT模型的基础做强化学习的训练往往会提升模型的表现。
我们需要一个模型来定量评判模型输出的回答在人类看来是否质量不错,即输入 [提示(prompt),模型生成的回答] ,奖励模型输出一个能表示回答质量的标量数字。
1.把大量的prompt(Open AI使用调用GPT-3用户的真实数据)输入给第一步得到的语言模型,对同一个问题,可以让一个模型生成多个回答,也可以让不同的微调(fine-tune)版本回答。
2.让标注人员对同一个问题的不同回答排序,实验发现发现不同的标注员,打分的偏好会有很大的差异,而这种差异就会导致出现大量的噪声样本。排序的话能获得大大提升一致性。
3.这些不同的排序结果会通过某种归一化的方式变成定量的数据丢给模型训练,从而获得一个奖励模型。也就是一个裁判员。
1.3.1.
DPO训练
由于PPO需要4个模型加载,2个推理,2个训练,成本较高;而DPO只需要两个模型,一个推理一个训练。
开始训练时,reference model和policy model都是同一个模型,只不过在训练过程中reference model不会更新权重。