前言
ChatGPT刚刚发布之初,我对这个被许多媒体号称将要取代搜索引擎的聊天机器人是持怀疑态度的。因为同作为AI从业者,太清楚AI在NLP上的缺陷了,因此一度觉得:估计也会和之前的那些玩具产品一样昙花一现吧。
然而现实总是能粉碎无知者的傲慢,随后的几天,在深度体验了ChatGPT之后,我竟逐渐变成了它的重度用户,这个聊天机器人无疑是有史以来最好的,甚至犹如从天而降的外星科技一般颠覆了所有其他NLP从业者的想象,对于回答已经成熟的知识点已经大有替代搜索引擎的能力。
对于这样一个划时代的产品,我们非常有必要去了解它的构建原理,因为它即将可以替代大量的人类工作并成为人类生活中不可分割的一部分。尽管OpenAi没有公布任何与ChatGpt相关的论文和技术训练细节,但我们可以从其所谓的兄弟模型InstructGPT以及网络上公开的碎片化的情报中寻找到实现ChatGpt的蛛丝马迹。
根据OpenAI所言,ChatGpt相对于InstructGPT的主要改进在于收集标注数据的方法上,而整个训练过程没没有什么区别,因此,可以推测ChatGPT的训练过程应该与InstructGPT的类似,大体上可分为3步:
- 预训练一个超大的语言模型
- 收集数据,训练一个奖励模型
- 使用强化学习方法微调优化语言模型
预训练超大语言模型
从GPT/Bert开始,预训练语言模型基本遵循这样一个两段式范式,即通过自监督方式来预训练大模型。然后再在此基础上,在下游具体任务上进行fine-tuning(微调)。其中GPT因为用的是单向Transformer解码器,因此偏向于自然语言生成,而Bert用的是双向Transformer编码器,因此偏向于自然语言理解。因为Bert的及时开源和Google在业界的强大影响力,外加业务导向的AI应用公司所追求的快速落地能力,那个时候绝大多数的从业者都更加看好Bert,哪怕是openai发布的GPT2也是反响平平,这也为后来的落后埋下了伏笔。
通过这种方式得到的语言模型,其Capability(能力)是单一的,即翻译模型只能翻译,填空模型只能填空,摘要模型只能做摘要… 为了进一步向通用语言模型靠齐,GPT2开始引入更多的任务进行预训练,即将各种任务都统统加进预训练中去。这样做的好处是让模型对语言的理解更贴近于语言本身而非任务,即同样的语言文本,它包含的信息应该是具有通用性的,就如同人脑一样对各种知识做到融会贯通,比如模型在阅读理解中学到的知识或许对翻译也是有帮助的。这样一来,模型的Capability显然就得到了极大的扩展,但由此带来的负面影响也是显而易见的,模型并不如人脑那么灵光,也许搞不清楚人类输入到底想要它干什么,也因此时长出现诸如想要它翻译时它却给你进行摘要这样驴唇不对马嘴的情况,也就是说这种模型存在严重的Alignment(对齐)问题。
为了解决这个问题,GPT3又引入了in-context learning的训练方式,即在训练时给模型添加一些prompt(提示),指导模型它该做些什么。
InstructGPT是基于一个小规模GPT3来进行微调的。在这第一步微调中,OpenAI使用了优质的人工生成数据,这显然是十分昂贵的。而且这一步的微调实际用到的数据规模非常少,因此可能这里的微调并非必不可少,也有一些项目是使用原始的语言模型的。大概只要是足够大的语言模型,作为基础的语言模型便能取得一定效果。目前也并没有证据表明哪种预训练语言模型是最好的,Anthropic使用的transformer预训练模型是100亿到520亿参数的,DeepMind使用的是2800亿参数的Gopher 。
有人做过相关的研究,这种引导学习的方式,需要在超大模型上才能表现出效果:
这也从侧面印证了从GPT3开始的语言模型的发展,已经与缺乏资源的普通人无关了,自然语言处理的发展已经全面进入了超大语言模型时代。
尽管这种种改进使得语言模型在Alignment问题上得到了一定程度的缓解,但这种程度终究还是无法跟人的想法足够对齐,这也是以前的聊天机器人总是沦为玩具的原因。他们在实际应用中十分的不稳定,时不时会暴露出以下缺陷:
- 提供无效回答:没有遵循用户的明确指示,答非所问。
- 内容胡编乱造:纯粹根据文字概率分布虚构出不合理的内容。
- 缺乏可解释性:人们很难理解模型是如何得出特定决策的,难以确信回答的准确性。
- 内容偏见有害:模型从数据中获取偏见,导致不公平或不准确的预测。
为了进一步提高模型的稳定性和对齐能力,研究人员试图将强化学习引入其中。但由于机器难以衡量自然语言输出的质量好坏,这个研究方向一直发展缓慢,并且不被专业人员看好。直到财大气粗的OpenAI说:那就让人参与训练吧,然后重金招了一堆专业的训练师。于是就有了RLHF(Reinforcement Learning with human feedback)方法,而ChatGPT将彻底将这个方法发扬光大。
偏好模型
回想一下原始的强化学习框架,Agent要基于环境给出的奖励信号来不断优化自身的策略。那么在我们的聊天机器人的场景下,显然语言模型作为一个Agent,它基于用户输入上下文语境(Environment)来输出文本(action)。那么由什么来定义这个奖励函数呢?正如前文所言,只有人才能够评估输出文本的好坏,那么就让人来充当这个奖励函数,这就是所谓的human feedback。但是这个更新过程需要不断进行,显然不能让人一直在哪打分,那不妨就搞一个深度学习模型,去学习人类评估输出质量的过程,于是便有了奖励模型(Reward Model),上述的学习框架就变成了这样:
显然奖励模型实际上就是去学习人类的偏好,因此也被叫作偏好模型。他的基本目标就是获得一个打分模型,接收一系列的文本,并输出一个标量奖励,这个奖励以数字的形式代表了人类对输入输出好坏的偏好。关键在于这个模型应当输出一个标量奖励,这样方可与现有的RL算法无缝对接。奖励模型基本上是基于其他的语言模型或者是通过Transformer开始从头训练。
OpenAI使用用户以往通过GPT API提交的prompt,然后使用初始语言模型来生成一系列的新文本作为提示生成对(prompt-generation pairs)。然后再由人类训练师来对初始LM生成的文本进行排序。虽然我们最初的想法是让人类直接给这些输出进行打分,但这在实践中是很难做到的,人的不同打分标准容易导致这些分数跟实际有所偏差,而排序同样可以用来比较多个模型输出的质量,并且能够创建一个更好的正则化数据集。有很多中方法用于对文本进行排序,一种比较成功的方式是让用户比较语言模型基于同一个prompt输出的不同文本,通过两个模型的输出比较,再使用Elo系统来生成模型和输出之间的相对排名,这样就能将排名标准化为我们所需的标量奖励信号。
至此,RLHF系统的两个前置条件就达成了,接下来就是使用RL来进一步微调语言模型了。
强化学习微调
尽管业界几乎已经宣告强化学习不适用于语言模型,但仍旧有许多机构和科研人员在探索强化学习微调全部或部分语言模型参数的可行性。大概这就是孔子所说的“知其不可而为之”吧,或许正是这种对真理的执著追求与坚持成就了ChatGPT。ChatGPT使用的是自家成熟的SOTA模型PPO来进行语言模型微调的,目前在语言模型上取得成功的RL算法貌似也只有PPO,那么接下来就让我们来看一下这个微调过程是如何被描述成一个RL问题的。
显然,策略(Policy)是一个语言模型,它接受Prompt返回文本序列(或者只是文本上的概率分布)。策略的动作空间是语言模型词汇表对应的所有token(通常在50000左右量级),观测空间则是所有可能输入的token序列(于是状态空间在词汇表大小^输入token大小的量级),奖励函数则由上述的偏好模型和策略转移约束共同决定。于是整个过程大概是这样的:
- 从训练集采样一个prompt:
- 从原始的语言模型产生一个文本序列 ,从当前微调迭代的语言模型产生一个文本序列
- 把当前策略产生的文本 输入到偏好模型,得到一个标量奖励
- 将文本 与 进行对比,一般使用KL散度来计算它们之间的差异 ,这个作为一种变化约束,来防止模型生成能够欺骗偏好模型却胡言乱语的文本
- 结合 和 就得到用于RL更新的最终的奖励函数: ,不过OpenAI在训练InstructGPT时,还这个基础上还添加了额外的在人类标注集合上的预训练梯度
- 接下来就是跟普通PPO一样通过最大化当前批次的回报来进行在线更新
如果你对PPO不甚了解,可以参考我以前写的这篇文章:深入理解TRPO和PPO算法
经过语言模型和偏好模型的不断自我迭代,语言模型将如同alphago那样不断的自我进化,最终达到一个超乎想象的效果。
总结
- ChatGPT以其卓越的表现将RLHF方法重新带入到了研究人员的视野,接下来会再更多的场合发光发热,RLHF是一个好东西,值得所有从业者研究。
- RLHF再很大程度上解决了语言模型的对齐问题,使通用大模型走进人们的生活成为可能,但由于严重依赖人工注释者的偏好,这将影响到模型的公平性。

Loading Comments...