1.预训练一个超大的语言模型;
2.收集人工打分数据,训练一个奖励模型;
3.使用强化学习方法微调优化语言模型。
1、预训练超大语言模型
从GPT/Bert开始,预训练语言模型基本遵循这样一个两段式范式,即通过自监督方式来预训练大模型。然后再在此基础上,在下游具体任务上进行fine-tuning(微调)。其中GPT因为用的是单向Transformer解码器,因此偏向于自然语言生成,而Bert用的是双向Transformer编码器,因此偏向于自然语言理解。因为Bert的及时开源和Google在业界的强大影响力,外加业务导向的AI应用公司寄希望的快速落地能力,那个时候绝大多数的从业者都更加看好Bert,哪怕是openai发布的GPT2也是反响平平,这也为后来的落后埋下了伏笔。
这种两段式的语言模型,其Capability(能力)是单一的,即翻译模型只能翻译,填空模型只能填空,摘要模型只能做摘要等等,要在实际任务中使用,需要各自在各自的数据上做微调训练,这显然很不智能,为了进一步向类似人类思维的通用语言模型靠齐,GPT2开始引入更多的任务进行预训练,这里的创新之处在于它通过自监督的模型来做监督学习的任务。经过这样训练的模型,能在没有针对下游任务进行训练的条件下,就在下游任务上有很好的表现。也就是说Capability有了较大的扩展,但此时的Alignment(对齐)还相对较弱,实际应用上还不能完全去除fine-tuning,算是为zero-shot leaning(零样本学习)奠定了基础。为了解决Alignment问题,GPT3使用了更大的模型,更多的数据,并优化了in-context learning(上下文学习)的训练方式,即在训练时去拟合接近人类语言的Prompt(提示),以指导模型它该做些什么,这进一步提升了模型zero-shot learning的能力,总而言之,语言模型在朝着越来越大的方向发展。
图1 不同参数规模语言模型zero-shot效果对比
正如上面GPT3论文中的对比图所示,zero-shot极度依赖于大语言模型(LLM),可以说从GPT3开始的语言模型的发展,已经与缺乏资源的普通人无关了,自然语言处理的发展已经全面进入了超大语言模型时代,但这并不影响我们去理解和借鉴其思想。
ChatGPT也正是依赖于一个大规模的语言模型(LLM)来进行冷启动的,具体过程如图2所示:
图2 初始化预训练语言模型
显然,由于参与初始模型微调的人工生成数据量很少,对于整个语言模型的训练数据而言是沧海一粟,因此初始化语言模型时,这一步的微调对ChatGPT整体而言大概是可有可无的。
尽管经过精心设计的LLM的Capability和Alignment均已达到非常好的水平,但是仅仅凭借预训练或加一些监督文本微调得到的语言模型终究还是无法应对人类所生活的真实语言环境的复杂性,这种模型在实际应用中时长会暴露以下缺陷:
- 提供无效回答:没有遵循用户的明确指示,答非所问。
- 内容胡编乱造:纯粹根据文字概率分布虚构出不合理的内容。
- 缺乏可解释性:人们很难理解模型是如何得出特定决策的,难以确信回答的准确性。
- 内容偏见有害:模型从数据中获取偏见,导致不公平或不准确的预测。
- 连续交互能力弱:长文本生成较弱,上下文无法做到连续。
2、训练人类偏好模型
为了进一步增强语言模型的效果,人们试图将强化学习引入到语言模型之中。但由于机器难以衡量自然语言输出的质量好坏,这个研究方向一直发展缓慢,并且不被专业人员看好。尽管DeepMind早就提出了RLHF(Reinforcement Learning with human feedback)的训练方法,但也一直没有在实际产品中看见成效。OpenAI在InstructGPT中用一个小规模的GPT3模型通过RLHF微调后产生了比原始大GPT3更好的效果见证了RLHF的强大,随后的ChatGPT真正将RLHF发扬光大。
图3 原始RL框架
回想一下原始的强化学习框架,Agent要基于环境给出的奖励信号来不断优化自身的策略。那么在我们的聊天机器人的场景下,显然语言模型作为一个Agent,它基于用户输入上下文语境(Environment)来输出文本(action)。那么由什么来定义这个奖励函数呢?正如前文所言,只有人才能够评估输出文本的好坏,那么就让人来充当这个奖励函数,这就是所谓的human feedback。但是这个更新过程需要不断进行,显然不能让人一直在哪打分,那不妨就搞一个深度学习模型,去学习人类评估输出质量的过程,于是便有了奖励模型(Reward Model),如图4所示。
图4 奖励(偏好)模型训练框架
奖励模型实际上就是去学习人类的偏好,因此也被叫作偏好模型。他的基本目标就是获得一个打分模型,接收一系列的文本,并输出一个标量奖励,这个奖励以数字的形式代表了人类对输入输出好坏的偏好。关键在于这个模型应当输出一个标量奖励,这样方可与现有的RL算法无缝对接。奖励模型基本上是基于其他的语言模型或者是通过Transformer从头开始训练。
OpenAI使用用户以往通过GPT API提交的prompt,然后使用初始语言模型来生成一系列的新文本作为提示生成对(prompt-generation pairs)。然后再由人类训练师来对初始LM生成的文本进行排序。虽然我们最初的想法是让人类直接给这些输出进行打分,但这在实践中是很难做到的,人的不同打分标准容易导致这些分数跟实际有所偏差,而排序同样可以用来比较多个模型输出的质量,并且能够创建一个更好的正则化数据集。有很多种方法用于对文本进行排序,一种比较成功的方式是让用户比较语言模型基于同一个prompt输出的不同文本,通过两个模型的输出比较,再使用如Elo rating system(Elo系统)之类的方式来生成模型和输出之间的相对排名,这样就能将排名标准化为我们所需的标量奖励信号。
至此,RLHF系统的两个前置条件就达成了,接下来就是使用RL来进一步微调语言模型了。
3、强化学习微调
尽管业界已经近乎宣告强化学习不适用于语言模型,但仍旧有许多机构和科研人员在探索强化学习微调全部或部分语言模型参数的可行性,OpenAI就是其中最具代表性的。ChatGPT使用的是OpenAI自己提出的成熟的SOTA强化学习模型PPO来进行语言模型微调的,目前在语言模型上取得成功的RL算法也只有PPO,那么接下来就让我们来看一下这个微调过程是如何被描述成一个RL问题的。
显然,策略(Policy)是一个语言模型,它接受Prompt返回文本序列(或者只是文本上的概率分布)。策略的动作空间是语言模型词汇表对应的所有token(通常在50000左右量级),观测空间则是所有可能输入的token序列(于是状态空间在词汇表大小^输入token大小的量级),奖励函数则由上述的偏好模型和策略转移约束共同决定。于是整个过程大概是这样的:
➪ 从训练集采样一个prompt:;
➪ 从原始的语言模型产生一个文本序列,从当前微调迭代的语言模型产生一个文本序列;
➪ 把当前策略产生的文本输入到偏好模型,得到一个标量奖励;
➪ 将文本与进行对比,一般使用KL散度来计算它们之间的差异,这个作为一种变化约束,来防止模型生成能够欺骗偏好模型却胡言乱语的文本;
➪ 结合和就得到了用于RL更新的最终的奖励函数:,不过OpenAI在训练InstructGPT时,还在这个基础上还添加了额外的在人类标注集合上的预训练梯度;
➪ 接下来就是跟普通PPO一样通过最大化当前批次的回报来进行在线更新。
图5 强化学习微调框架
语言模型经过PPO算法的不断自我迭代,外加奖励函数的不断人工纠偏,这个语言模型将如同AlphaGo那样不断完成进行自我进化,最终达到令人惊艳的效果。
4、总结
1️⃣ ChatGPT向业界证明了GPT路线的优越性。实际上从GPT3开始,GPT技术路线在通用人工智能上已经成为一种演进趋势。
2️⃣ ChatGPT以其卓越的表现将RLHF方法重新带入到了研究人员的视野,接下来可能会在更多的场合发光发热,比如将RLHF与图像领域的Diffusion结合,或将碰撞出意想不到的火花。
3️⃣ RLHF在很大程度上解决了语言模型的对齐问题,使通用大模型走进人们的生活成为可能,但由于严重依赖人工标注者的偏好,这将影响到模型的公平性,或存在安全隐患。
👇参考文献
[1] Paul Christiano, Jan Leike, Tom B. Brown et al.Deep reinforcement learning from human preferences. arXiv preprint arXiv:1706.03741.
[2] Long Ouyang, Jeff Wu, Xu Jiang, Diogo Almeida et al.Training language models to follow instructions with human feedback. arXiv preprint arXiv:2203.02155.
[3]《Illustrating Reinforcement Learning from Human Feedback (RLHF)》,https://huggingface.co/blog/rlhf.
[4] John Schulman, Filip Wolski, Prafulla Dhariwal, et al.Proximal Policy Optimization Algorithms. arXiv preprint arXiv:1707.06347.