gpt 进程
- GPT-1 用的是无监督预训练 + 有监督微调,只有简单的单向语言模型任务;
- GPT-2用的是纯无监督预训练,使用更多的数据,更大的模型,又新增了几个辅助的训练任务;
- GPT-3 沿用了 GPT-2 的纯无监督预训练,但是数据大了好几个量级。它使用45TB的超大规模数据,175B的超大参数量模型。另外加入了Meta-learning的训练任务,提高了Few shot和Zero-shot任务上的表现;
- InstructGPT加入了近两年流行的prompt-learning。另外更重要的是,加入了强化学习,即RLHF(Reinforcement Learning from Human Feedback),基于人工反馈机制的强化学习,也是后面着重介绍的模块。
- ChatGPT:目前没有开源代码或论文参考,从网上的推测来看,应该是在InstructGPT的基础上,进一步优化了多轮对话效果。与其前身InstructGPT相比,ChatGPT试图减少有害和误导性的回复。
ChatGPT的训练过程有三步,RLHF技术主要涉及第二步和第三步的内容:
- 利用gpt自回归式的语言模型在大规模的语料上进行无监督的预训练,得到生成模型;
- 然后人工对用户提示文本后,GPT生成句子的结果进行打分。产生形式为(提示文本,GPT生成句子,得分)的数据集,训练打分模型;
- 最后利用强化学习的方式 让打分模型去优化生成模型的效果。
chatgpt效果如此好,主要可以归结于两个原因:
- 训练语料的质量、多样性。openai搭建了40多人的团队去收集和标注数据。而且训练一个gpt3.5大约要花1000多w美刀,所以数据和算力不容忽视。
- 基于强化学习的训练方式。其中训练的2、3步被学术界叫做 Reinforcement Learning From Human Feedback 。其实就利用人类的反馈去优化 你的目标模型,让模型输出更符合人类直觉的结果。chatgpt 采用PPO算法利用打分模型去进一步优化生成模型。
强化学习背景知识
1 基础概念
强化学习需要一个交互的过程,而且要解决的是序列决策问题。这里如果要展开还会涉及到马尔科夫决策过程。
强化学习有许多在游戏上的应用。用熟悉的super mario来举个例子,我们可以操纵的游戏角色mario是可以交互的智能体agent,游戏中每一帧的画面中要交互的场景即enviroment,游戏角色依据当前环境做出新的动作,而环境会对角色的每个动作作出反馈,例如吃到了金币会有加成,而被击中则不是一个好消息,这样的反馈可以量化为奖励reward,这种奖励值可以帮助学习如何选择最合适的动作,也就是在交互中学习。
特点
这张图说明了强化学习与我们熟悉的监督学习、无监督学习的关系。强化学习是和监督学习,非监督学习并列的第三种机器学习方法。
与熟悉的监督学习比较,来说明强化学习的一些特点:
- 强化学习处理的大多数是序列数据,其很难像监督学习的样本一样满足独立同分布。在强化学习的训练过程中,时间非常重要。因为我们得到的是有时间关联的数据(sequential data),而不是独立同分布的数据。在机器学习中,如果观测数据有非常强的关联,会使得训练非常不稳定。这也是为什么在监督学习中,我们希望数据尽量满足独立同分布,这样就可以消除数据之间的相关性。
- 在强化学习过程中,没有非常强的监督者(supervisor),只有奖励信号(reward signal)。并且奖励信号是延迟的.
- 强化学习智能体会从环境中获得延迟的奖励,即环境会在很久以后才告诉我们之前所采取的动作到底是不是有效的。因为我们没有得到即时反馈,所以智能体使用强化学习来学习就非常困难。当我们采取一个动作后,如果使用监督学习,就可以立刻获得一个指导,比如,我们现在采取了一个错误的动作,正确的动作应该是什么。而在强化学习中,环境可能会告诉我们这个动作是错误的,但是它并不会告诉我们正确的动作是什么。而且更困难的是,它可能是在一两分钟过后才告诉我们这个动作是错误的。所以这也是强化学习和监督学习不同的地方。
- 强化学习会试错探索,它通过探索环境来获取对环境的理解。学习器并没有告诉我们每一步正确的动作应该是什么,学习器需要自己去发现哪些动作可以带来最多的奖励,只能通过不停地尝试来发现最有利的动作。智能体获得自己能力的过程,其实是不断地试错探索(trial-and-error exploration)的过程。探索(exploration)和利用(exploitation)是强化学习中非常核心的问题。其中,探索指尝试一些新的动作,这些新的动作有可能会使我们得到更多的奖励,也有可能使我们“一无所有”;利用指采取已知的可以获得最多奖励的动作,重复执行这个动作,因为我们知道这样做可以获得一定的奖励。因此,我们需要在探索和利用之间进行权衡,这也是在监督学习中没有的情况。
- 智能体的动作会影响它随后得到的数据,这一点是非常重要的。在训练智能体的过程中,很多时候我们也是通过正在学习的智能体与环境交互来得到数据的。所以如果在训练过程中,智能体不能保持稳定,就会使我们采集到的数据非常糟糕。我们通过数据来训练智能体,如果数据有问题,整个训练过程就会失败。所以在强化学习中一个非常重要的问题就是,怎么让智能体的动作一直稳定地提升。用下棋来举个形象的例子,在监督学习中,棋手的上限往往取决于老师的上限,也就是俗话说的”和臭棋篓子下棋,越下越臭“;而在强化学习的设置下,即使有着资质平平甚至有些笨的起点,也有自己和自己下,有朝一日悟道飞升的可能性。
强化学习和非监督学习的区别:
也还是在奖励值这个地方。非监督学习是没有输出值也没有奖励值的,它只有数据特征。同时和监督学习一样,数据之间也都是独立的,没有强化学习这样的前后依赖关系。
总结:
- 监督学习是从外部监督者提供的带标注训练集中进行学习,也就是由任务驱动型;
- 非监督学习是一个典型的寻找未标注数据中隐含结构的过程,也就是数据驱动型;
- 强化学习则更偏重于智能体与环境的交互, 这带来了一个独有的挑战 ——“试错(exploration)”与“开发(exploitation 利用)”之间的折中权衡,智能体必须开发(利用)已有的经验来获取收益,同时也要进行试探,使得未来可以获得更好的动作选择空间,也就是说可以从错误中学习。
文本生成中的强化学习
文本生成的问题,可以建模为一个token空间上的序列决策问题(选择一个token后继续选择另一个token)
- State:对话上下文
- Action:回复的token space上的token
- Reward:生成的质量判别
- Episode:一次完整的解码生成回复的过程
强化学习的分类
强化学习可以分为基于值的方法、基于策略的方法和actor-critic方法这三类。
-
基于值函数的学习方法要学习一个价值函数, 去计算每个动作在当前环境下的价值,目标就是获取最大的动作价值,即我每一步采取回报最大的动作和环境进行互动。Value-Based的方法输出的是动作的价值,选择价值最高的动作。适用于非连续的动作。常见的方法有Q-learning、Deep Q Network和Sarsa。其基础网络结构如下图所示,在编码网络之后,直接用一个全连接层来为每个状态输出一个分数。
-
基于策略梯度的学习方法去学习策略函数,去计算当前前环境下每个动作的概率,目标是获取最大的状态价值,即该动作发生后期望回报越大越好。Policy-Based的方法直接输出下一步动作的概率,根据概率来选取动作。但不一定概率最高就会选择该动作,还是会从整体进行考虑。适用于非连续和连续的动作。常见的方法有Policy gradients。从图中可以看出来,在全连接层之后还有一个softmax层,从而将打分转化成概率。
-
Actor-Critic 融合了上述两种方法,价值函数和策略函数一起进行优化。价值函数负责在环境学习并提升自己的价值判断能力,而策略函数则接受价值函数的评价,尽量采取在价值函数那可以得到高分的策略。
PPO算法
PG算法之前,主流的基于价值的强化学习算法,在给定一个状态下,计算采取每个动作的价值,我们选择在所有状态下具有最大的期望奖励的行动。如果我们省略中间的步骤,即直接根据当前的状态来选择动作,也就引出了强化学习中的另一种很重要的算法,即策略梯度(Policy Gradient, PG)。也就是说,其目的是是直接建模与优化Policy
策略梯度它通过观测信息选出一个行为直接进行反向传播,利用reward奖励直接对选择行为的可能性进行增强和减弱,好的行为会被增加下一次被选中的概率,不好的行为会被减弱下次被选中的概率。
PG算法,我们有一个agent,他与环境互动,然后学习更新,这个过程中的policy都是同一个。因此,当我们更新参数之后,之前计算的策略的所有概率就都不对了,这时候就需要重新去采样。之前采样出来的数据都不能用了,换句话说,过程中的数据都只能用一次。这就造成了policy gradient会花很多时间在采样数据上,因为所有的数据都只能更新一次,更新一次之后就要重新采样。
PPO算法的改进原因。我们希望可以用一个旧策略收集到的数据来训练新策略,这意味着我们可以重复利用这些数据来更新策略多次,效率上可以提升很多。具体来说,PPO算法利用重要性采样的思想,在不知道策略路径的概率p的情况下,通过模拟一个近似的q分布,只要p同q分布不差的太远,通过多轮迭代可以快速参数收敛。
近线策略优化算法PPO 即属于AC框架下的算法,在采样策略梯度算法训练方法的同时,重复利用历史采样的数据进行网络参数更新,提升了策略梯度方法的学习效率。PPO重要的突破就是在于对新旧策略器参数进行了约束,希望新的策略网络和旧策略网络的越接近越好。近线策略优化的意思就是:新策略网络要利用到旧策略网络采样的数据进行学习,不希望这两个策略相差特别大,否则就会学偏。
文本摘要+RLHF, NIPS 2020
涉及:
- 论文:Learning to summarize from human feedback
- ChatGPT技术精要,RLHF相关论文笔记(一)——Learning to summarize from human feedback
这篇论文解决的问题聚焦在不合理的评价指标上,在文本生成领域这同样是一个棘手的问题。随着语言模型变得越来越强大,训练和评估越来越受到用于特定任务的数据和指标的限制。例如,摘要任务训练模型使用ROUGE等一些自动化指标进行评估,但这些指标都不能完全刻画我们对摘要质量的需求。传统的通过监督学习和最大化对数似然并不是一个好的方法。因为在摘要、翻译等任务中,可能同时有几个相差很大的输出文本都是高质量的输出,而最大化对数似然只会迫使模型输出去接近训练集reference里的那个版本的文本。这篇文章专注于英文摘要任务,不采用极大化词的对数似然损失,而是利用收集到的human feedback数据通过监督学习专门训练一个打分模型来直接捕获人类的偏好,然后再使用这个模型通过强化学习来训练生成模型。
ChatGPT中的RLHF
第一步是花钱招人给问题(prompt)写回答(demonstration),使用经典的预训练目标训练一个语言模型GPT3。这一步大家都懂,就不用说了。这一步可以多训几个版本,第二步会用到。
这一步里比较值得说的就是预训练模型的选择。首先,我们。对这一步的模型,OpenAI 在其第一个流行的 RLHF 模型 InstructGPT 中使用了较小版本的 GPT-3; Anthropic 使用了 1000 万 ~ 520 亿参数的 Transformer 模型进行训练;DeepMind 使用了自家的 2800 亿参数模型 。
这里可以用额外的文本或者条件对这个 LM 进行微调,例如 OpenAI 对 “更可取” (preferable) 的人工生成文本进行了微调,而 Anthropic 按 “有用、诚实和无害” 的标准在上下文线索上蒸馏了原始的 LM。这里或许使用了昂贵的增强数据,但并不是 RLHF 必须的一步。由于 RLHF 还是一个尚待探索的领域,对于” 哪种模型” 适合作为 RLHF 的起点并没有明确的答案。
接下来,我们会基于 LM 来生成训练奖励模型的数据,并在这一步引入人类的偏好信息。
在第二部中,针对问题的多个回答,我们可以使用多个模型来产生,包括初始模型、finetune模型和人工模型等,然后使用奖励模型/偏好模型来对这些回答进行打分。这个奖励模型接收prompt和response两个文本作为输入,输出一个标量奖励。奖励模型的训练是RLHF流程中非常重要的一个环节,实际上是一个监督学习过程。
在RM的训练过程中,我们可以从Prompt数据集中选取一些数据作为训练集,在输入初始模型后,可以产生多个response,这些response可以是多个语言模型生成的,也可以是generate之后采样得到的,只要保证这些response是针对同一个prompt生成的即可。接下来,我们需要对这些response进行排名,人工对这些回答进行排序,按照一些标准(比如可读性、正确性等)进行排序。这里需要注意,我们不直接对文本标注分数来训练RM,因为标注者的价值观不同会导致标注分数不准确且存在噪音。相反,我们使用排名来比较多个模型的输出,并构建更好的规范数据集。
对于排名方式,一种成功的方式是对不同模型在相同提示下的输出进行比较,并使用Elo系统建立一个完整的排名。使用pair-wise loss将rank计算为具体的分数,然后归一化为标量奖励值。InstructGPT论文使用的是pair-wise loss,也可以使用经典的ELO算法来实现。通过这些排名结果,我们可以得到针对同一个prompt的response的分数,这些分数将被用于训练RM模型。需要注意的是,这些训练数据集可以从预定义数据集中采样生成,也可以通过Amazon Mechanical Turk等渠道获得。
最后,这一奖励模型的训练对于RLHF算法的无缝接入非常重要。我们可以用端到端的方式使用LM来建模,也可以使用模块化的系统建模。这一奖励数值对于后续的RL算法来说至关重要。
接下来是最后一步:利用 RM 输出的奖励,用强化学习方式微调优化 LM。
最后一阶段是强化学习微调阶段。在这一步中,数据集规模更大,且不再需要人工参与。这一步的方法可以概括为以下四个部分:
首先,使用第一阶段监督模型的参数来初始化PPO模型的参数。接着,使用PPO模型生成回答,并使用第二阶段的RM模型对回答进行评估和打分。最后,通过打分,更新训练PPO模型的参数。
让我们将微调任务表述为强化学习问题。我们认为输入的prompt是状态(state),输出的response是动作(action),想要得到的策略(policy)就是怎么从prompt生成action能够得到最大的reward,也就是拟合人类的偏好。
这个策略的行为空间(action space)是语言模型(LM)的词表对应的所有词元,通常在50k数量级左右。所有的状态是可能的输入词元序列,也比较大(词汇量 ^ 输入标记的数量)。奖励函数是偏好模型和策略转变约束(Policy shift constraint)的组合。
PPO算法确定的奖励函数具体计算如下:将prompt输入初始LM和当前微调的LM,分别得到了输出文本。将来自当前策略的文本传递给RM,得到一个标量的奖励。将两个模型生成的文本进行比较,计算差异的惩罚项。在来自OpenAI、Anthropic和DeepMind的多篇论文中,该惩罚项被设计为输出词分布序列之间的KL散度的缩放。这一项被用于惩罚RL策略在每个训练批次中生成大幅偏离初始模型的文本,以确保模型输出合理连贯的文本。如果去掉这一惩罚项,可能会导致模型在优化中生成乱码文本来愚弄奖励模型提供高奖励值。此外,OpenAI在InstructGPT上实验了在PPO添加新的预训练梯度,以保证RL模型能够保留好的语言模型能力。可以预见到,随着RLHF研究的进展,奖励函数的公式会继续进化。
作为一个可选项,RLHF可以通过迭代RM和策略共同优化。随着策略模型的更新,用户可以继续将输出和早期的输出进行合并排名。Anthropic 在他们的论文中讨论了迭代在线 RLHF,其中策略的迭代包含在跨模型的 Elo 排名系统中。这样引入策略和 RM 演变的复杂动态,代表了一个复杂和开放的研究问题。
对这一部分,已经有许多非常优秀且深入的解析,例如以下两篇:
- https://huggingface.co/blog/rlhf* 官方中文翻译:ChatGPT 背后的“功臣”——RLHF 技术详解
- 从零实现ChatGPT——RLHF技术笔记
继续学习
强化学习一:基础部分
ChatGPT背后的技术-基于人类反馈的强化学习(RLHF) 理论篇
李宏毅 (Hung-yi Lee) 课程
李宏毅深度强化学习(国语)课程(2018) :bilibili
ChatGPT 背后的“功臣”——RLHF 技术详解