目录
1. GPT-1
1.1 无监督预训练
1.2 有监督的微调
2. GPT-2
3. GPT-3
4. InstructGPT
1. Supervised Fine-Tuning (SFT)
2. Reward Modeling (RM)
3. Reinforcement Learning (RL)
这篇写给自己的总结会相对比较简短,因为 GPT 系列的每篇论文都很长,我只是了解了一下大致的思路和演化过程,相对而言的重点会放在 InstructGPT 上。
GPT:Improving Language Understanding by Generative Pre-Training
GPT-2:Language Models are Unsupervised Multitask Learners
GPT-3:Language Models are Few-Shot Learners
InstructGPT:Training language models to follow instructions with human feedback
在一切之前,先贴出一个我请 ChatGPT 帮我总结的 GPT 系列演化的表格:
下面这张表格来自:ChatGPT/InstructGPT详解 - 知乎 (zhihu.com)
我也参考了这位博主的博客:【论文阅读】InstructGPT: Training language models to follow instructions with human feedback_orangerfun的博客-CSDN博客
1. GPT-1
GPT 第一代主要特点是:无监督预训练 + 下游任务微调。
1.1 无监督预训练
GPT 系列模型是从左到右的单向语言模型,在每个时间步骤只考虑了来自历史文本的信息,使用的是 Transformer 的解码器(Decoder)部分,生成下一个单词的概率分布。简单来说,GPT 模型产生的文本是逐字或逐词地生成的,每个单词的概率分布是由之前生成的单词所决定的,类似于“词语接龙”。
如上面的目标函数(最大似然)所示,unsupervised corpus of tokens 指的是一段未经标注、未经分类的文本语料库,其中包含了大量的单词、短语、句子等语言单位(也称为“tokens”),GPT 模型通过使用这些 “tokens” 作为输入数据来进行预训练。Unsupervised pre-training 的目标函数被定义为最大化目标序列的概率,它在预测下一个单词的时候,需要考虑之前看到的 k 个单词。
在进行 unsupervised pre-training 时,没有显式地给定输入/输出对(input/output pairs),也就意味着没有标注数据进行监督训练。因此将这种方式称为“无监督”训练。在这种情况下,模型需要仅从输入数据中学习语言的模式和规律,并尽可能地预测下一个单词,这样就能最大化目标序列的概率。
1.2 有监督的微调
就是针对下游目标任务,在有标签的数据集上进行微调。
如上图所示,作者将一系列的 NLP 任务都转化成了固定结构的输入和输出模式。
作者认为,把第一部分的目标函数也包括在内一起进行参数微调,会提升监督模型的泛化能力,加速收敛。
2. GPT-2
GPT 第二代在模型和算法上没有特别多的改变,主要扩大了模型和数据集的规模,以期待在 zero-shot 的多任务情境中获得性能提升。
3. GPT-3
GPT 第三代主要采取的是 in-context learning 的方法,不再需要通过 fine-tuning 的方法调整预训练模型的参数,而是直接在 zero-shot、one-shot、few-shot 三种情境中进行 in-context learning。
4. InstructGPT
因为 OpenAI 并没有放出 ChatGPT 的相关论文,InstructGPT 被认为是与 ChatGPT 较为接近的模型,所以我相对更关注它的方法。
据我的直观感受,InstructGPT 最主要的思想是希望大语言模型能够能够 "align with human",即生成的各种文本能够更加符合人类的预期。
InstructGPT 主要有三个训练阶段,如下图所示:
1. Supervised Fine-Tuning (SFT)
雇佣标注人员根据 prompt 人工生成数据,在此基础上进行有监督的微调。
2. Reward Modeling (RM)
学习标注人员对语言模型输出的打分,训练出一个符合人类预期的、可以给语言模型的输出进行打分的 reward model。
作者将 SFT 模型的最后不是 embedding 的那一层替换掉,输入 prompt 和对该 prompt 生成的答案,输出一个标量得分。针对每一个 prompt,会让模型输出 K 个答案,然后使用 pairwise ranking loss 训练这个 reward model:
对于每一个输入 prompt 和两个不同的回复 和 ,计算其得分 和 ,然后将这两个得分相减,并使用 sigmoid 函数将结果映射至 0 到 1 之间的范围内,最后使用 log 函数对这个值取自然对数。该损失函数的目标是最大化正确的比较任务和错误的比较任务之间的差距,以便更好地评估生成模型的性能。
3. Reinforcement Learning (RL)
第三步是利用第二步训练得到的 reward model,采取 Proximal Policy Optimization (PPO) 算法进行强化学习,进一步优化模型。
原始的 PPO 核心算法如下图所示:
(论文:Proximal Policy Optimization Algorithms)
PPO 算法的核心思想是通过在策略更新过程中限制新策略和旧策略之间的相对改变幅度(通过控制 KL 散度的方式),来保证策略更新的稳定性(—— ChatGPT)。
在 InstructGPT 中,目标函数为:
其中,黄色部分对应了 PPO 算法的目标函数, 是待学习的参数,第一项 是希望给定 prompt ,希望模型给出的答案 在 reward model 的得分可以更高(更新 以更符合人类预期);第二项是 KL 散度的约束,希望当前训练的 RL 模型不会过于偏离 SFT 模型。
绿色部分是从预训练分布中进行采样,将预训练得到的模型梯度引入 RL 模型中,进一步提升模型性能。
一直令我困惑的是,我无法将 InstructGPT 中的 PPO 算法与原始的 PPO 算法对应起来,所以我去问了 ChatGPT,它的回答是(我修改了一些内容):
“尽管上述目标函数公式中与传统 PPO 算法相比有一些不同,但是它仍然可以被看作是 PPO 算法的变种或扩展。原因在于,这个目标函数公式与 PPO 算法具有一些相似的特性和思想。
首先,上述目标函数公式中包含了一个 KL penalty,这个惩罚项也是 PPO 算法中采用的一种方式。KL penalty 的作用是通过约束新旧策略之间的 KL 散度来保证更新策略时的稳定性,并避免更新过于剧烈以至于破坏已有的良好策略。因此,KL penalty 可以帮助防止模型过度拟合或过度优化,提升模型的泛化性能。
其次,在上述目标函数公式中,reward term 与传统 PPO 算法中使用的 Advantage 函数等价。Advantage 函数的作用是通过减去一个基线值来计算出每个状态动作对的优势值,从而更加准确地估计出策略的效果,并在更新策略时进行优化。类似地,reward term 也可以看做是对行为的评价,并通过更新网络参数来优化策略。”
(如果可能的话,希望进一步了解一下 GPT 数据集的构成和筛选,感觉很值得探讨。)