目录
- 微调演变
- InstructGPT的训练
微调演变
首先是任务驱动了微调的发展,GPT1和BERT遵循经典的预训练+微调范式,到GPT3时期,预训练任务表现为句子接龙,给定前文持续预测下一个word,当模型参数规模和训练数据增大后,GPT3面对few shot甚至是zero shot任务的表现都超越了原本的SOTA方法。
下面是几个关于zero shot,few shot,经典微调的例子(以机器翻译问题为例):
- 右侧是经典微调示例,预训练的模型通过特定任务数据集进行微调训练,其中会涉及梯度更新(gradient update),训练至收敛后的模型才具备良好的翻译能力。左侧是GPT3在零样本(只给出任务描述,task description),单样本(给出任务描述+一个样本),少样本(任务描述+少量样本)的情况下的工作流程。
不管是零样本,还是少样本,都没有要求更新参数,这也引发了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的核心思想是:
- 当面对给定的任务A时,首先将模型在大量的其他不同类型的任务比如B、C、D上进行微调,微调的方式是将任务的指令与输入输出进行拼接(可以理解为一种新的prompt),有监督指令微调(Supervised Instruction Fine-Tuning,SIFT)后,给出任务A的指令和输入,直接进行推断。
这样做可以实现:当模型根据"指令"完成了微调阶段的各种任务后(将指令拼接在微调数据的前面),在面对从未见过的自然语言推理任务的指令比如"这段话能从假设中推导出来吗"时,就能更好地调动出已有的知识回答问题,其相当于通过指令微调之后,模型可以更好的做之前训练时没见过的新任务且降低了对prompt的敏感度(不需要再设计特定prompt也能激发模型更好地回答自然语言问题)。
为了让LLM具备更强的推理能力,在prompt learning的发展中出现了思维链(Chain-of-thought,CoT)。这是一种新的prompt机制,其本质是给模型看到推理步骤的prompt,让其模仿推理,从而求解简单的问题。
- 左边为标准的1-shot prompt,右边为加入CoT的1-shot prompt。注意,CoT和IFT并不冲突,CoT是在数据层面增加额外的句子,IFT则是在任务层面加上指令。
此后,CoT技术被应用到0-shot和few-shot任务中,并且在21年引出了"let’s think step by step"的新闻:
InstructGPT的训练
- 其中,labeler为人工,即human。SFT,RM,PPO都是GPT3模型,但因为不同的训练方式,使其参数不同。
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在单轮对话上具有出色的表现,对于多轮对话,则存在某一轮对话中的词指向上一轮对话中的某个人或物的可能,简单的解决方案是:
- 在回答用户问题的过程中,每段对话都是一个序列,把之前的对话内容(需要对历史对话数据的规模做个限制,比如限制在8k大小,比如GPT4可以处理的上下文大小最高可达32k)都保存下来,和当前的输入一起作为新的输入给模型;得益于Transformer的自注意力机制,使得模型能够理解不同对话历史之间的依赖关系,并在生成回答时考虑到之前的对话历史,此外,模型还使用位置编码来区分每个对话历史的位置,确保模型可以正确地捕捉到对话历史的顺序信息。
参考:https://blog.csdn.net/v_JULY_v/article/details/128579457