ChatGPT 近期横空出世并获得巨大成功,我们来扒一扒背后的一些技术改进。
CoT (Chain of Thought)
Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
ChatGPT 具有很强的逻辑推理能力。并且它能够将复杂的内容,通过拆解,分成多个小的步骤,一步步地进行推理,获得最后的答案,这种能力被称为思维链 (CoT)。
Few-shot-CoT
但 CoT 有个天然的缺陷,它是靠着例子去激励模型生成解题过程+答案的,但如果是zero-shot的场景呢?
Zero-shot-CoT
画风突变,只是新增了一句 “Let’s think step by step”,LLM (Large Language Model) 就完成了推理问题。具体效果看下图的实验结果:
事实上这是一个 pipeline,也就是说 “Let‘s think step by step” 这句话,只是通过这个 prompt 让 LLM 尽可能生成一些思考过程,然后再将生成的 rationale 和 question 拼在一起,重新配合一个 answer 指向的 prompt 如 “The answer is ” 来激励模型生成答案。
作者还做了解释,说明这句 “Let’s think step by step” 是经过验证的,比如对比下面的其他的 instruction,尤其那些不相关的和误导的,效果就非常差,说明 LLM 真的是在理解这个 instruction 的意思。
我理解这个 instruction 给了一个启示,让 LLM 一点点去生成思路和过程,然后再把生成的中间结果拼进输入中,context 就包含此前生成的中间结果,生成质量也会因为 context 而变得更高。
CoT 能力从何而来
模型在训练的时候并没有针对逻辑推理以及思维链做特定的设计。而目前普遍的观点认为,逻辑推理和思维链很可能和两个因素相关,第一个是模型的体量,第二个是模型是否在代码数据上进行过训练。
模型量级
下面这张图展示了思维链能力与模型体量的关系,GSM8K, SVAMP 和 MAWPS 是三个需要逻辑推理的数学应用题数据集。
-
思维链的能力(蓝色实线)在模型体量够大的时候产生了效果上的突变;
-
思维链的能力在模型够大的前提下,效果超过了标准的指令(Standard prompting,黑色实线)方法;
-
思维链的能力在模型够大的情况下,可以接近甚至超过有监督的方法(橙色虚线)。
训练数据
我们再来看看ChatGPT的进化树:
初代 GPT3 的模型思维链推理的能力很弱甚至没有。 code-davinci-002 和 text-davinci-002 是两个拥有足够强的思维链推理能力的模型。而 text-davinci-001 模型,虽然经过了指令微调,但第一版思维链论文报告说,它的它思维链推理的能力非常弱 —— 所以指令微调可能不是思维链存在的原因,代码训练才是模型能做思维链推理的最可能原因。
-
遵循指令和零样本泛化的能力都可能已经存在于****基础模型中,后来才通过指令微调来解锁
-
模型的复杂推理能力可能是在预训练阶段通过代码数据注入
IFT (Instruction Fine-Tuning)
Multitask Prompted Training Enables Zero-Shot Task Generalization
简介
指令微调 (Instruction Fine-Tuning, IFT) 是针对每个任务,单独生成 instruction (hard token),通过在若干个 full-shot 任务上进行微调,然后在具体的任务上进行评估泛化能力(zero-shot),其中预训练模型参数是 unfreeze 的。IFT 激发语言模型的理解能力,通过给出更明显的指令,让模型去理解并做出正确的反馈。
通常,基础模型的语言建模目标不足以让模型学会以有用的方式遵循用户的指令。模型创建者使用指令微调 方法来达到该目的,该方法除了使用情感分析、文本分类、摘要等经典 NLP 任务来微调模型外,还在非常多样化的任务集上向基础模型示范各种书面指令及其输出,从而实现对基础模型的微调。
这些指令示范由三个主要部分组成 —— 指令、输入和输出。输入是可选的,一些任务只需要指令,如上文使用 ChatGPT 做开放式文本生成的示例。当存在输入时,输入和输出组成一个实例 (instance)。给定指令可以有多个输入和输出实例。IFT 可以总结为收集不同任务的 (instruction, instance) 对,然后在语言模型中 fine-tuning。
IFT 的训练数据通常是人工编写的指令及用语言模型自举 (bootstrap) 生成的实例的集合。在自举时,先使用少样本技术输入一些样本给 LM 用于提示它 (如上图所示),随后要求 LM 生成新的指令、输入和输出。每一轮都会从人工编写的样本和模型生成的样本中各选择一些送给模型。虽然具体到 ChatGPT 到底使用了多少没有确切的信息公开,但可以确定的是在数量级上一定远比用来进行无监督训练的网页、百科和书籍所构成的数据集要小非常多。
这种指令也被称为 prompt,实际上对话中的用户输入、问答中的问题也是一种 prompt。只需要相对少量的人工标注的 prompt 数据就能达到让模型按照指令做出回复的目的,这一点背后其实隐含了 prompt 的泛化能力。可以想象一下,如今全世界都在不停的向 ChatGPT 提问,所提的问题也必定是千奇百怪的,这些问题其实就是一个个的 prompt。但用来对 ChatGPT 进行指令微调的 prompt 肯定不会有这么多,这说明模型在学习到了一定量的 prompt 和相应的答案以后具有了泛化能力。
然而,经过指令微调的 LM 并不总是能生成有帮助的或者安全的响应。这种行为的例子包括通过总是给出无益的回应来逃避,例如 “对不起,我不明白。” 或对敏感话题的用户输入生成不安全的响应。为了减轻这种行为,模型开发人员使用有监督微调 (Supervised Fine-tuning,SFT),在高质量的人类标注数据上微调基础语言模型,以提高有用性和无害性。
SFT 和 IFT 联系非常紧密。指令微调可以看作是有监督微调的一个子集。在最近的文献中,SFT 阶段经常被用于提高响应的安全性,而不是接在 IFT 后面提高指令相应的具体性。将来,这种分类和划分应该日臻成熟,形成更清晰的使用场景和方法论。
文章FLAN-PaLM/T5 (arxiv.org/pdf/2210.11… FLAN 的精华的基础上,加入了 CoT 的数据来做 finetune:
经过 IFT 后的模型,其实不论在 CoT 任务和非 CoT 任务上其实都表现得最好,而且做 zero-shot 优势更是巨大。这也进一步证明了 CoT 是可以和当前流行的 instruction fine-tuning 无缝衔接的。
一些限制
我们再讨论下 IFT 的一些限制:
-
收集各种任务的 ground-truth 数据成本很高
-
语言模型的客观性和人的偏好无法匹配
-
一些任务 (例如:生成开放式结局故事) 没有标准正确答案
RLHF (Reinforcement Learning from Human Feedback)
Training language models to follow instructions with human feedback
人类反馈强化学习,该方法使用基于人类偏好的标注数据来微调模型。这一训练方式是大型语言模型 (LLM) 生成领域的新范式。过去几年里各种 LLM 根据人类输入提示 (prompt) 生成多样化文本的能力令人印象深刻。然而,对生成结果的评估是主观和依赖上下文的,例如,我们希望模型生成一个有创意的故事、一段真实的信息性文本,或者是可执行的代码片段,这些结果难以用现有的基于规则的文本生成指标 (如 BLUE 和 ROUGE) 来衡量。除了评估指标,现有的模型通常以预测下一个单词的方式和简单的损失函数 (如交叉熵) 来建模,没有显式地引入人的偏好和主观意见。RLHF 的核心思想是使用强化学习的方式直接优化带有人类反馈的语言模型。RLHF 使得在一般文本数据语料库上训练的语言模型能和复杂的人类价值观对齐。
ChatGPT 对 RLHF 的解释:
举个例子
先聊聊 RLHF 对人的偏好进行优化,举个训练总结模型的例子:
对一个语言模型的示例,假设我们对每一个总结进行打分,分数越高越好。
: An earthquake hit San Francisco. There was minor property damage, but no injuries.
: The Bay Area has good weather but is prone to earthquakes and wildfires.
现在我们需要最大化语言模型输出的示例得到的分数:
首先做一个梯度的迭代:
我们想要得到期望的形式,这样在实际计算中我们用多次采样的平均值就能作为期望的近似值:
通过log导数链式法则:
将上面右式写成期望的形式:
将梯度放入期望的表达式:
得到更新公式:
现在,对于任意不可导的奖励函数我们都可以训练语言模型去最大化期望奖励。此时还有一个问题,不同的标注人员打分的偏好会有很大的差异,而这种差异就会导致出现大量的噪声样本。若改成标注排序,则发现不同的标注员的打分一致性就大大提升了。
对于一个 pair 比较模型:
表示 winning sample,表示 losing sample,应该比得分高。
于是现在我们有一个预训练语言模型,一个奖励模型,初始化一个模型,是我们想要优化的参数,我们通过强化学习的方法优化以下奖励:
后面一项 KL 散度惩罚项保证不会发散得离原预训练模型太远。
RLHF分解
RLHF** **是一项涉及多个模型和不同训练阶段的复杂概念,这里我们按三个步骤分解:
预训练语言模型 (Language Model, LM)
首先,我们使用经典的预训练目标训练一个语言模型 (例如GPT)。这里可以用额外的文本或者条件对这个 LM 进行微调 (对应上图中的step1),具体做法是:让真人根据不同的指令 Prompt 写真实的、无害的、有用的回答。实际操作过程中,为了保证这些内容的质量,会给写回答的标注人员一些规范性的指引,然后让已经经过预训练的 GPT 模型在这些人类编辑的数据上继续训练。 这里或许使用了昂贵的增强数据,但并不是 RLHF 必须的一步。
奖励模型 (Reward Model, RM) 的训练
这一步 (对应上图中的step2) 是让预训练后的模型根据不同的 Prompt 生成多个不同的回答,并由人来给这些回答按照好与差的标准来排序。这里需要人工对 LM 生成的回答进行排名。起初我们可能会认为应该直接对文本标注分数来训练 RM,但是由于标注者的价值观不同导致这些分数未经过校准并且充满噪音,通过排名可以比较多个模型的输出并构建更好的规范数据集。对具体的排名方式,一种成功的方式是对不同 LM 在相同提示下的输出进行比较,然后使用 Elo 系统建立一个完整的排名。这些不同的排名结果将被归一化为用于训练的标量奖励值。然后用这些标注了优劣之分的数据训练一个打分模型,让它可以自动给更多的数据进行排序打分。
基于 RL 进行 LM 优化
最后一步 (对应上图中的step3) 是利用这个打分模型作为强化学习中的环境反馈,以策略梯度强化学习 (Policy Gradient RL)算法和近端策略优化 (Proximal Policy Optimization, PPO) 的方式对已经微调后的 GPT 模型进行训练。首先,该策略 (policy) 是一个接受提示并返回一系列文本 (或文本的概率分布) 的 LM。这个策略的行动空间 (action space) 是 LM 的词表对应的所有词元 (一般在 50k 数量级) ,观察空间 (observation space) 是可能的输入词元序列,也比较大 (词汇量 ^ 输入标记的数量) 。奖励函数是偏好模型和策略转变约束 (Policy shift constraint) 的结合。PPO 算法确定的奖励函数具体计算如下:将提示输入初始 LM 和当前微调的 LM,分别得到了输出文本 ,将来自当前策略的文本传递给 RM 得到一个标量的奖励。惩罚项是两个模型的生成文本进行比较计算的差异,一般设计为输出词分布序列之间的 Kullback–Leibler (KL) 散度,即。这一项被用于惩罚 RL 策略在每个训练批次中大幅偏离初始模型,以确保模型输出合理连贯的文本,如果去掉这一惩罚项可能导致模型在优化中生成乱码文本来愚弄奖励模型以提供高奖励值。最后根据 PPO 算法,我们按当前批次数据的奖励指标进行优化 (来自 PPO 算法 on-policy 的特性) 。PPO 算法是一种信赖域优化 (Trust Region Optimization, TRO) 算法,它使用梯度约束确保更新步骤不会破坏学习过程的稳定性。
实际在 InstructGPT 的训练中,还将预训练梯度混合到 PPO 梯度中,以修复公共 NLP 数据集上的性能回归。表示预训练分布,表示学习到的 RL 策略,表示经过 SFT 的预训练模型。
What’s next?
RLHF 目前还是个未完全探索的领域,虽然效果超过了 IFT,但数据的获取仍然成本很高。
-
RL from AI FeedBack? Constitutional AI: Harmlessness from AI Feedback
-
Finetuning LMs on their own outputs Large Language Models Can Self-Improve