首先是任务驱动了微调的发展,GPT1和BERT遵循经典的预训练+微调范式,到GPT3时期,预训练任务表现为句子接龙,给定前文持续预测下一个word,当模型参数规模和训练数据增大后,GPT3面对few shot甚至是zero shot任务的表现都超越了原本的SOTA方法。
下面是几个关于zero shot,few shot,经典微调的例子(以机器翻译问题为例):
不管是零样本,还是少样本,都没有要求更新参数,这也引发了In context learning的研究。
零样本或少样本任务看似美好,但却受task description和prompt有很大影响,因此,FLAN(Finetuned Language Models Are Zero-Shot Learners)重新利用微调,弱化task description和prompt的影响,发挥作用的就是指令微调(Instruction Fine-Tuning,IFT)。IFT数据由三个主要组成部分组成:指令、输入和输出,对于给定的指令(指令可以由人工编写),可以有多个输入和输出实例:
相比于GPT-3和经典finetune范式,FLAN的核心思想是:
这样做可以实现:当模型根据"指令"完成了微调阶段的各种任务后(将指令拼接在微调数据的前面),在面对从未见过的自然语言推理任务的指令比如"这段话能从假设中推导出来吗"时,就能更好地调动出已有的知识回答问题,其相当于通过指令微调之后,模型可以更好的做之前训练时没见过的新任务且降低了对prompt的敏感度(不需要再设计特定prompt也能激发模型更好地回答自然语言问题)。
为了让LLM具备更强的推理能力,在prompt learning的发展中出现了思维链(Chain-of-thought,CoT)。这是一种新的prompt机制,其本质是给模型看到推理步骤的prompt,让其模仿推理,从而求解简单的问题。
此后,CoT技术被应用到0-shot和few-shot任务中,并且在21年引出了"let’s think step by step"的新闻:
InstructGPT的训练包括3个阶段:
step 1,利用人类的问答对数据对GPT3进行有监督训练得到SFT模型,OpenAI设计了一个prompt dataset,里面有大量的提示样本,prompt为各种各样的问题描述,然后,找了一个团队对这个prompt dataset进行标注(本质就是人工回答问题,给每个prompt一个答案)。最终得到大小为13k的数据集,其中都是"问题-答案pair",用这个数据集有监督微调GPT3,得到SFT模型,其大小为175B。
step 2,用上一阶段的SFT模型初始化新的GPT3,叫做RM模型,继续从prompt dataset中采样prompt,注意这里是不需要step 1中的label的,具体做法上不止prompt dataset,还会扩展一些新的问题,只要问题即可。然后由SFT生成多个答案,比如4个。至于如何得到多个答案,原因在于模型每次预测一个词都有对应的概率,根据不同的概率大小可以采样出很多答案,比如通过beam search保留4个当前最优的答案(beam search相当于贪心算法的加强版,除了最好的答案外,还会保留多个比较好的答案供选择)。
接着人工(即labeler)对这4个回答的好坏进行排序(得到新的标注),排序的结果用来训练奖励模型RM,目的是学习排序结果从而理解人类的偏好。训练RM是有监督的,扩充问题并包括排序标注后的数据集大小为33k。
step 3,利用SFT模型初始化GPT3得到名称为PPO的模型,并新建一个大小为31k的只有问题的数据集,此时用PPO模型对每个问题生成4个答案,然后用RM模型进行排序(这里注意,排序结果对应一个得分,令ABCD为4个答案,比如D=C=A=B的得分是最高的,大于D>C>A>B,这个得分被称为奖励)。
通过不断更大化奖励从而优化生成策略(生成策略也就是PPO模型,生成策略更好,代表模型的回答会更好,得到的多个答案都符合人类偏好),策略优化的过程中使用PPO算法限制策略更新范围。根据优化后的策略再次生成→RM再评估→模型再优化后再生成,如此循环,直到策略最优为止。
PPO策略的目的是确保优化后的策略与优化前的策略差距不会太大,也就是让优化前后的回答差异不会太偏离,不至于step 3训练发散。
综上,step 1是SFT(有监督微调),step 2和step 3被称为RLHF,即具有人类反馈的强化学习。
上面的策略可以让GPT在单轮对话上具有出色的表现,对于多轮对话,则存在某一轮对话中的词指向上一轮对话中的某个人或物的可能,简单的解决方案是:
参考:https://blog.csdn.net/v_JULY_v/article/details/128579457