GPT发展历程
在回答这个问题之前,首先要搞清楚ChatGPT的发展历程。
- GPT-1用的是无监督预训练+有监督微调。
- GPT-2用的是纯无监督预训练。
- GPT-3沿用了GPT-2的纯无监督预训练,但是数据大了好几个量级。
- InstructGPT在GPT-3上用强化学习做微调,内核模型为PPO-ptx,下面的论文会详细分析。
- ChatGPT沿用了InstructGPT,但是数据大了好几个量级。
ELMO用Bi-LSTM,GPT用transformer的Decoder,BERT用transformer的Encoder;
ELMO:双向,GPT:单向,BERT:双向;
ELMO:解决一词多义,GPT:特征更丰富,BERT:双向/多任务训练/能捕捉更长距离的依赖;
GPT:适合文本生成等任务(NLG任务),BERT:适合预测任务(NLU任务);
GPT-1的问题
- fine-tune只能用到特定任务中,如果fine-tune一个分类任务,不能用到句子相似度中去。我们能不能用一个模型做所有NLP的任务,能不能尽量加所有的任务。
- 目标:language model去解决任何NLP的任务,这就是后续GPT2和GPT3的改进。
针对GPT-1的问题,GPT-2作了如下改进:
-
去掉了fine-tuning层:不再针对不同任务分别进行微调建模,而是不定义这个模型应该做什么任务,模型会自动识别出来需要做什么任务。
主打zero-shot
像下面这样一个机器翻译的样本转换成一个句子,一个QA的问答对也转换成一个句子,GPT2就只优化语言模型的损失。
-
其次在预训练阶段,GPT-2采用了多任务的方式,不单单只在一个任务上进行学习,而是多个,每一个任务都要保证其损失函数能收敛,不同的任务是共享主体transformer参数的,该方案是借鉴了之前微软的MT-DNN,这样能进一步的提升模型的泛化能力,因此在即使没有fine-turning的情况下依旧有非常不错的表现。
-
从模型的规模和参数量上说,GPT有1.17亿的参数量,而GPT2将Transformer堆叠的层数增加到48层,隐层的维度为1600,,参数量达到了15亿(最大的GPT-2模型);而Bert参数量也只有3亿。
-
模型结构方面,GPT2的结构类似于GPT,仍然使用单向的 Transformer 模型,只做了一些局部修改:
- 将归一化层移到Block的输入位置;
- 在最后一个自注意力块之后加了一层归一化
- 同时在residual层初始化的时候,将其乘了 1 / N 1/\sqrt{N} 1/N.这里的N是residual的层数。
GPT2对比GPT3:
- GPT-3结构和GPT-2一样,但是数据约为GPT-2的1000倍,模型参数约为GPT-2的100倍,暴力出奇迹,使得效果很惊艳。
- GPT-3不再追求极致的zero-shot学习,即不给你任何样例去学习,而是利用少量样本去学习。
主打few-shot
- 由于GPT-3庞大的体量,在下游任务进行fine-tune的成本会很大。因此GPT-3作用到下游子任务时,
不进行任何的梯度更新或fine-tune。
缺点:
- 虽然效果比GPT-2好很多,但是在文本生成上还是比较弱的。假如让GPT-3生成一个很长的文本,可能给了几段之后,就会重复起来
结构和算法的局限性。GPT-3是语言模型,不能像bert那样双向看。 - 均匀地预测下一个词。不能判断哪个词重要,哪个词不重要,导致语言模型可能会花很长时间去学习一些常见的虚词,不像人类学习的划重点。
- 样本有效性不够。基本上把整个网络上的文章下载下来了。
做few-shot时,模型真的是根据你给的样本从头学习的吗?这样碰到训练样本上没有出现的任务,也能够泛化过去;还是根据这些样本,从训练记忆里找出相关的,认出了这个任务,那拼的就是训练数据的大小了。
为什么采用Decode only架构?
- 训练效率和工程实现
- Encoder的双向注意力存在低秩问题
- 参数少一半(推理成本)
- decoder-only 有较强的zero-shot表现
输入部分的注意力改为双向不会带来收益,Encoder-Decoder架构的优势很可能只是源于参数翻倍。
GPT1
- 完整的Transformer模型包括encoder和decoder,
- 而
GPT只使用了decoder部分
,且因为少了encoder,所以和原始的Transformer decoder相比,不再需要encoder-decoder attention层
- 根据下游任务,进行输入的转换,主要有四种情况:
GPT2
GPT-2将词汇表数量增加到50257个;最大的上下文大小 (context size) 从GPT的512提升到了1024 tokens;batchsize增加到512。
训练任务方面,GPT2“剔除”了fine-tune任务,只保留了语言模型部分的训练。它不是简单的删掉fine-tune,而是将诸多下游任务根据各自的特点,规划成语言模型的训练。这样一来,语言模型的训练实际上反而涵盖了更多的NLP finetune任务,使得最终的语言模型学到的东西更丰富,有更多样的应用(在很多zero-shot任务中表现优异)。
InstructGPT
总结来看,就是结合了监督学习和强化学习。
-
监督学习先让GPT-3有一个大致的微调方向,强化学习用了AC(Actor-Critic)架构里面的PPO(Proximal Policy Optimization)更新方法来更新GPT-3的参数。
-
PPO是OpenAI的baseline method,可以说使用PPO是InstructGPT非常自然的一个选择。
InstructGPT的这种训练方法的提出就是为了解决AI的毒性和不忠实性
,因为人工标注数据的时候特别关注了这一块的优化,从结果来看在忠实性上InstructGPT已经比GPT-3提升了不少。
论文里提到,微调的数据考虑了大量安全方面的case,甚至邀请了DeepMind安全专家组共同研究。但是题主说的毁灭人类计划书的这个case诱导性还是比较强,模型在诱导attack的case下能力还是不足的,这也在论文的5.3节和5.4节讨论到了。随着模型能够存储的有效知识越来越多,模型的可靠性会越来越重要,这估计会引来一大堆研究。总体而言,目前模型的毒性还比较高,需要进一步的探索。
方法
为了使我们的模型更安全、更有帮助和更一致,我们使用了一种称为基于人类反馈的强化学习 (RLHF)
的现有技术。 在我们的客户向 API 提交的提示中,[1] 我们仅使用通过 Playground 提交给 2021 年 1 月部署的早期版本 InstructGPT 模型的提示。我们的人工注释者会从所有提示中删除个人身份信息,然后再将其添加到训练集。
我们的标签提供所需模型行为的演示,并对我们模型的几个输出进行排名。 然后我们使用这些数据来微调 GPT-3。
过程简述:
我们首先收集关于提交给我们 API 的提示的人工编写演示数据集,并使用它来训练我们的监督学习基线。 接下来,我们收集了一个数据集,该数据集包含两个模型输出在更大的 API 提示集上的人工标记比较。 然后我们在这个数据集上训练一个奖励模型 (RM) 来预测我们的标签者更喜欢哪个输出。 最后,我们使用此 RM 作为奖励函数并微调我们的 GPT-3 策略以使用 PPO 算法最大化此奖励。
对这一过程的一种思考方式是,它 “解锁 "了GPT-3已经具备的能力,但仅通过提示工程难以激发”
- 这是因为我们的训练程序相对于预训练期间学到的东西,教给模型新能力的能力有限,因为相对于模型预训练,它使用的计算和数据不到2%。
泛化的设置
我们的程序使我们的模型行为与我们的标签人员和我们的研究人员的偏好相一致,前者直接产生用于训练我们的模型的数据,后者则通过书面说明、对具体例子的直接反馈和非正式对话向标签人员提供指导。
- 它也受到我们的客户和我们的API政策中隐含的偏好的影响。我们选择了那些在识别和回应敏感提示的能力的筛选测试中表现良好的标签人员。然而,这些对数据的不同影响来源并不能保证我们的模型与任何更广泛群体的偏好相一致。
我们进行了两个实验来调查这一点。
- 首先,我们使用没有产生任何训练数据的被扣留的标签者来评估GPT-3和InstructGPT,发现这些标签者喜欢InstructGPT模型的输出的比率与我们的训练标签者差不多。
- 第二,我们在来自我们的标签者的一个子集的数据上训练奖励模型,发现它们在预测不同子集的标签者的偏好方面有很好的概括性。这表明,我们的模型并没有完全过度适应我们的训练标签者的偏好。然而,还需要做更多的工作来研究这些模型在更广泛的用户群体中的表现,以及它们在人类对所需行为有分歧的输入中的表现。
局限
- 尽管取得了重大进展,我们的InstructGPT模型还远未完全统一或完全安全;它们仍然产生有毒或有偏见的输出,编造事实,并在没有明确提示的情况下产生性和暴力内容。
- 现在,InstructGPT被训练成遵循英语指令;因此,它偏向于讲英语的人的文化价值观。
RLHF
构建安全 AI 系统的一个步骤是消除人类编写目标函数的需要,因为对复杂目标使用简单代理,或者将复杂目标弄错一点,可能会导致不良甚至危险的行为。 通过与 DeepMind 的安全团队合作,我们开发了一种算法,可以通过告知两种提议的行为中哪一种更好来推断人类的需求。
- 使用少量人类反馈来解决现代 RL 环境
请注意,反馈不需要与环境的正常奖励函数保持一致:
- 例如,我们可以训练我们的代理在 Enduro 中精确地与其他汽车保持平衡,而不是通过超过它们来最大化游戏分数。
- 有时我们还发现,从反馈中学习比使用正常奖励函数的强化学习效果更好,因为人类比编写环境奖励的人更好地塑造奖励。
step1:
step2:
关于模型选择方面,RM 可以是另一个经过微调的 LM,也可以是根据偏好数据从头开始训练的 LM。例如 Anthropic 提出了一种特殊的预训练方式,即用偏好模型预训练 (Preference Model Pretraining,PMP) 来替换一般预训练后的微调过程。因为前者被认为对样本数据的利用率更高。但对于哪种 RM 更好尚无定论。
关于训练文本方面,RM 的提示 - 生成对文本是从预定义数据集中采样生成的,并用初始的 LM 给这些提示生成文本。Anthropic 的数据主要是通过 Amazon Mechanical Turk 上的聊天工具生成的,并在 Hub 上 可用,而 OpenAI 使用了用户提交给 GPT API 的 prompt。
关于训练奖励数值方面,这里需要人工对 LM 生成的回答进行排名。起初我们可能会认为应该直接对文本标注分数来训练 RM,但是由于标注者的价值观不同导致这些分数未经过校准并且充满噪音。通过排名可以比较多个模型的输出并构建更好的规范数据集。
对具体的排名方式,一种成功的方式是对不同 LM 在相同提示下的输出进行比较,然后使用 Elo 系统建立一个完整的排名。这些不同的排名结果将被归一化为用于训练的标量奖励值。
step3:
让我们首先将微调任务表述为 RL 问题。
- 首先,该 策略 (policy) 是一个接受提示并返回一系列文本 (或文本的概率分布) 的 LM。
- 这个策略的 行动空间 (action space) 是 LM 的词表对应的所有词元 (一般在 50k 数量级) ,
- 观察空间 (observation space) 是可能的输入词元序列,也比较大 (词汇量 ^ 输入标记的数量) 。
- 奖励函数 是偏好模型和策略转变约束 (Policy shift constraint) 的结合。
模型相关
- 我们然后使用三种不同的技术训练模型
监督微调(SFT)
我们使用监督学习在我们的标签演示中微调 GPT-3。 我们训练了 16 个epochs,使用余弦学习率衰减和 0.2 的残差丢失。 我们根据验证集上的 RM 分数进行最终的 SFT 模型选择。 与 Wu 等人类似 (2021),我们发现我们的 SFT 模型在 1 个时期后对验证损失过度拟合; 然而,我们发现尽管存在这种过度拟合,但更多时期的训练有助于 RM 分数和人类偏好评级。
奖励建模 (RM)
从移除了最终反嵌入层的 SFT 模型开始,我们训练了一个模型来接收提示和响应,并输出标量奖励。 在本文中,我们只使用 6B RM,因为这样可以节省大量计算,而且我们发现 175B RM 训练可能不稳定,因此不太适合用作 RL 期间的值函数(有关更多详细信息,请参见附录 C)。
在 Stiennon 等人 (2020) 的研究中,RM 在同一输入的两个模型输出之间进行比较的数据集上进行训练。
他们使用交叉熵损失,将比较作为标签——奖励的差异代表人类贴标签者更喜欢一种反应的对数几率。
- 最后,由于 RM 损失对于奖励的变化是不变的,我们使用偏差对奖励模型进行归一化,以便在进行 RL 之前,标记器演示的平均得分为 0。
为什么要训练这样一个reward model呢?当然,人类可以扮演Environment的角色,衡量模型输出每句对话的好坏(reward),但这需要大量的人工成本。所以,不妨训练好一个reward model,可以省去人工标注的麻烦。
强化学习 (RL)
再次跟随 Stiennon 等人 (2020),我们使用 PPO 在我们的环境中微调了 SFT 模型(Schulman 等人,2017)。 该环境是一个 bandit 环境,它呈现随机的客户提示并期望对提示的响应。 给定提示和响应,它会产生由奖励模型确定的奖励并结束episode。 此外,我们在每个token上添加了 SFT 模型的每个token的 KL penalty,以减轻奖励模型的过度优化。
值函数从 RM 初始化。 我们称这些模型为“PPO”。
我们将 PPO 模型的性能与我们的 SFT 模型和 GPT-3 进行了比较。 我们还与 GPT-3 进行了比较,当它被提供一个 few-shot 前缀以“提示”它进入指令跟随模式(GPT-3-prompted)时。
我们还在 FLAN(Wei 等人,2021 年)和 T0(Sanh 等人,2021 年)数据集上将 InstructGPT 与微调 175B GPT-3 进行了比较,这两个数据集都包含各种 NLP 任务,并对于每个任务结合了自然语言指令(数据集在包含的 NLP 数据集和使用的指令风格方面有所不同)。 我们分别在大约 100 万个示例上对它们进行微调,并选择在验证集上获得最高奖励模型分数的检查点。 有关更多training的详细信息,请参阅附录 C。
PPO
说ppo之前,要说PG算法(策略梯度),用一个奖励函数度量策略的好坏,在强化学习中,我们使用神经网络来拟合策略参数
,对所得的策略参数进行一个更新
-
PG方法一个很大的缺点就是参数更新慢,因为我们每更新一次参数都需要进行重新的采样,这其实是中on-policy的策略,即我们想要训练的agent和与环境进行交互的agent是同一个agent;
-
与之对应的就是off-policy的策略,即想要训练的agent和与环境进行交互的agent不是同一个agent
简单来说,就是拿别人的经验来训练自己。举个下棋的例子,如果你是通过自己下棋来不断提升自己的棋艺,那么就是on-policy的,如果是通过看别人下棋来提升自己,那么就是off-policy的
- 折扣因子
- 优势函数
- 重要性采样:收集数据时用到的参数是 θ ′ \theta' θ′,训练是更新的参数是 θ \theta θ,所以就需要引入重要性采样来修正这二者之间的偏差,这也就是前面要引入重要性采样的原因
-
Proximal Policy Optimization 近端策略优化(PPO)
文章
-
问题定义
-
PPO
-
关键点:目标散度
评估
要评估我们的模型“对齐”的程度,我们首先需要弄清楚对齐在这种情况下的含义。
目标是训练根据用户意图行事的模型。 有帮助、诚实、无害。
我们使用两个指标来衡量真实性——模型关于世界的陈述是否真实:
(1) 评估我们的模型在封闭域任务上编造信息的倾向(“幻觉”也就“hallucinations”)
(2) 使用 TruthfulQA 数据集( 林等人,2021)。 不用说,这只抓住了真实真正含义的一小部分。
定量评估:我们可以将定量评估分为两个独立的部分
- API 分布评估。 我们的主要指标是人类对一组提示的偏好评级,这些提示来自与我们的训练分布相同的来源。 当使用来自 API 的提示进行评估时,我们只选择我们未包含在培训中的客户的提示。
- 对公共 NLP 数据集的评估。 我们评估两种类型的公共数据集:那些捕捉语言模型安全性方面的数据集,特别是真实性、毒性和偏见,以及那些捕捉传统 NLP 任务(如问答、阅读理解和摘要)的零样本性能的数据集。
对准性研究
对准的目的:使人工智能系统与人类意图保持一致
吸取对齐研究的经验教训:
相对于预训练,增加模型对齐的成本是适度的。
RLHF 在使语言模型对用户更有帮助方面非常有效,比模型大小增加 100 倍更有效。- 我们已经看到一些证据表明 InstructGPT 将“遵循指令”泛化为我们不对其进行监督的设置,例如非英语语言任务和与代码相关的任务。 这是一个重要的属性,因为让人类监督模型执行的每项任务的成本高得令人望而却步。
我们能够减轻微调带来的大部分性能下降。
为了避免激励未来的高性能人工智能系统与人类意图保持不一致,需要具有低对齐税的对齐技术。 为此,我们的结果对于 RLHF 作为一种低税对准技术来说是个好消息。我们已经从现实世界的研究中验证了对齐技术。
如何调整对准的偏好
- 首先,我们正在调整我们的训练贴标机提供的演示和偏好,他们直接生成我们用来微调模型的数据。
- 其次,我们正在调整我们的偏好。我们编写标记说明,标记者在编写演示和选择他们喜欢的输出时用作指南,并且 我们在共享聊天室中回答他们关于边缘案例的问题。
- 第三,我们的训练数据由 OpenAI 客户发送给 OpenAI API Playground 上的模型的提示决定,因此我们隐含地与客户认为有价值的东西保持一致,在某些情况下,他们的最终用户认为当前使用的有价值的东西 的API。
- 第四,OpenAI 的客户并不代表所有潜在或当前的语言模型用户——更不用说所有受语言模型使用影响的个人和群体了。
数据集
- plain:标注人员自己去想一些问题出来
- few-shot:标注人员想一些instruction,然后给一些输入输出的实例
- user-based:根据用户提出的一些想让应用实现的功能(waitlist applications)来构建任务
- 用这些prompt数据来设计第一个instructGPT模型,然后把这个模型拿出来放到PlayGround上让大家去使用,从而收集更多的prompt数据。这样就构建了如下三个数据集:
- 让标注人员直接把prompt的答案写出来,这就构成了训练SFT(supervised finetuning model)的数据 (13k样本)
- 让标注人员把模型的输出排序,这就构成了训练RM(reward model)的数据 (33k样本)
- 根据RM的标注来生成训练强化学习模型的数据(31k样本)
InstructGPT学习:知乎文章
https://zhuanlan.zhihu.com/p/589747432
HMM
像交通信号灯一样,某一个状态只由前一个状态决定,这就是一个一阶马尔可夫模型。而像天气这样,天气状态间的转移仅依赖于前 n 天天气的状态,即状态间的转移仅依赖于前 n 个状态的过程
。
- 这个过程就称为n 阶马尔科夫模型。
不通俗的讲,马尔可夫模型(Markovmodel)描述了一类重要的随机过程,随机过程又称随机函数,是随时间而随机变化的过程。
在马尔可夫模型中,每个状态代表了一个可观察的事件,所以,马尔可夫模型有时又称作可视马尔可夫模型(visibleMarkovmodel,VMM),这在某种程度上限制了模型的适应性。
对于盲人来说也许不能够直接获取到天气的观察情况,但是他可以通过触摸树叶通过树叶的干燥程度判断天气的状态。于是天气就是一个隐藏的状态,树叶的干燥程度是一个可观察的状态,于是我们就有了两组状态,一个是不可观察、隐藏的状态(天气),一个是可观察的状态(树叶),我们希望设计一种算法,在不能够直接观察天气的情况下,通过树叶和马尔可夫假设来预测天气。
在隐马尔可夫模型(HMM)中,我们不知道模型具体的状态序列,只知道状态转移的概率,即模型的状态转换过程是不可观察的。
- 因此,该模型是一个双重随机过程,包括模型的
状态转换
和特定状态下可观察事件的随机
。
HMM可以拆分成三个基本问题:评估,解码,参数学习
评估:
前向算法,后向算法
解码:
- 即:发现“最优”状态序列能够“最好地解释”观察序列
在给定模型 λ = [ π , A , B ] \lambda=[\pi,A,B] λ=[π,A,B]和观察序列 O O O 的条件下求概率最大的状态序列 – Viterbi 算法: 动态搜索最优状态序列
- 每个时刻都求得每个状态的概率,并求得最大概率对应的上一时刻的状态。
参数学习:
- 如果产生观察序列 O 的状态已知(即存在大量标注的样本), 可以用最大似然估计来计算 λ \lambda λ 的参数
- 如果不存在大量标注的样本:期望值最大化算法(Expectation-Maximization, EM)
CRF
为了让我们的分类器表现的更好,可以在标记数据的时候,可以考虑相邻数据的标记信息
。这一点,是普通的分类器难以做到的。而这一块,也是CRF比较擅长的地方。
自然语言处理中的词性标注(POS Tagging)就是非常适合CRF使用的地方。词性标注的目标是给出一个句子中每个词的词性(名词,动词,形容词等)。而这些词的词性往往和上下文的词的词性有关,因此,使用CRF来处理是很适合的,当然CRF不是唯一的选择,也有很多其他的词性标注方法。
-
随机场是由若干个位置组成的整体,当给每一个位置中按照某种分布随机赋予一个值之后,其全体就叫做随机场
-
马尔科夫随机场是随机场的特例,它假设随机场中某一个位置的赋值仅仅与和它相邻的位置的赋值有关,和与其不相邻的位置的赋值无关。
-
CRF是马尔科夫随机场的特例(条件随机场),它假设马尔科夫随机场中只有X和Y两种变量,X一般是给定的,而Y一般是在给定X的条件下的输出。这样马尔科夫随机场就特化成了条件随机场。
-
在十个词的句子的词性标记中,词有十个,词性也是十个,因此,如果假设它是一个马尔科夫随机场,那么它也就是一个linear-CRF。
特征函数分为两类:节点特征函数和局部特征函数
- 第一类是
定义在Y节点上的节点特征函数
,这类特征函数只和当前节点有关
- 第二类是
定义在Y上下文的局部特征函数
,这类特征函数只和当前节点和上一个节点有关,记为:
- 回到特征函数本身,每个特征函数定义了一个linear-CRF的规则,则其系数定义了这个规则的可信度。所有的规则和其可信度一起构成了linear-CRF的最终的条件概率分布。
- 前者将序列标注看成是 n 个 k 分类问题,后者将序列标注看成是 1 个 k^n 分类问题。