大语言模型作为一个被验证可行的方向,其 “大” 体现在训练数据集广,模型参数和层数大,计算量大,其价值体现在通用性上,并且有更好的泛化能力。相较于传统特定领域训练出来的语言模型,有更广泛的应用场景。这篇文章参考 Google 和 OpenAI 相关论文及部分作者的补充,结合我的理解尝试用大家普遍看得明白的语言,对其技术发展和主要实现进行解析。
在 Transformer 提出之前,自然语言处理领域的主流模型是循环神经网络(RNN,recurrent neural network),使用递归和卷积神经网络进行语言序列转换。2017 年,谷歌大脑团队在人工智能领域的顶会 NeurIPS 发表了一篇名为 “Attention is all you need” 的论文,首次提出了一种新的简单网络架构,即 Transformer,它完全基于注意力机制 (attention),完全摒弃了循环递归和卷积。
递归模型通常沿输入和输出序列的符号位置进行计算,来预测后面的值。但这种固有的顺序性质阻碍了训练样例内的并行化,因为内存约束限制了样例之间的批处理。而注意力机制允许对依赖项进行建模,而无需考虑它们在输入或输出序列中的距离。
Transformer 避开了递归网络的模型体系结构,并且完全依赖于注意力机制来绘制输入和输出之间的全局依存关系。 在八个 P100 GPU 上进行了仅仅 12 个小时的训练之后,Transformer 就可以在翻译质量方面达到新的最先进水平,体现了很好的并行能力。成为当时最先进的大型语言模型(Large Language Model, LLM)。
总结两个核心突破:
下图是论文提到的 Transformer 模型,对编码器和解码器使用堆叠式的自注意力和逐点式、全连接层,分别如图 1 的左半部分(编码器)和右半部分(解码器)所示,相关技术细节后面会重点讲到。
Transformer 模型
OpenAI 基于该工作基础上发展了 GPT(Generative Pre-training)生成式预训练模型,这里借用网上一张图简单改过,相关细节将在后面展开。
GPT 的发展
2018 年,OpenAI 公司发表了论文 “Improving Language Understanding by Generative Pre-training”,
使用的模型有两个阶段,第一阶段是无监督预训练,基于海量的文本集通过 Transformer 学习一个大容量的语言模型,第二阶段基于标注数据进行参数微调。得到的一般任务不可知模型(或称为通用模型)优于经过判别训练的模型,在论文选定的 12 种数据集中有 9 个取得更好效果。 在 GPT-1 中,采用了 12 层 Transformer 的结构作为解码器,每个 Transformer 层是一个多头的自注意力机制,然后通过全连接得到输出的概率分布。
这次实践对 OpenAI 来讲,我觉得是奠定了他们往这个路线发展的核心因素,主要有几个重点突破:
1、证明了通用模型训练具有很大的价值潜力。之前用于学习特定任务的标注数据难以获得,导致模型效果不能持续提升,而通过 Transformer 无监督训练 少量标注数据的 Finetune 就取得了更优的效果。
2、论文尝试增加 Transformer 中间层, 在从 2 层到 12 层的数量增加中,平均每增加 1 层能够提升 9% 的准确性。加上 Transformer 本身具备并行能力,这在 GPU 上无疑潜力巨大。
3、论文发现在第二步的 Finetune 中添加语言建模作为辅助学习目标,能够提高监督模型的泛化能力,并加速收敛。说明在更海量的数据集时,模型会更收益于辅助学习目标。
生成式预训练初现潜力 GPT-1
虽然论文摘要重点强调了该模型在缺少标注数据情况下对特定任务的优势,但其实以上三点发现对 OpenAI 后续技术路线影响重大。但 GPT-1 在生成长文本时,仍然会出现信息遗忘和重复等问题,和特定领域的模型对比还有很多不足。
2019 年,OpenAI 发表了最新进展,一篇 “Language Models are Unsupervised Multitask Learners” 的论文。重点实践了更大的模型更广的数据集具有更好的泛化能力。GPT-1 是 12 层的 transformer,BERT 最深是 24 层的 transformer,GPT-2 则是 48 层,共有 15 亿个参数的 transformer,训练集叫 WebText,是从 4500 万个链接提取文本去重后,得到 800 万文档共 40GB 文本。
论文认为现有系统用单个任务来训练的单个领域数据集,是缺乏模型泛化能力的主要原因,因此在更广的数据集上,GPT-2 采用了多任务(multitask) 的方式,每一个任务都要保证其损失函数能收敛,不同的任务共享主体 transformer 参数。
最终训练出来的模型在不需要任何参数和模型改动下,在 zero-shot(零样本)任务中,在 8 个数据集中有 7 个表现为业界最优,这个泛化能力可以说已经很强大了,并且在机器翻译场景取得亮眼结果,GPT 也是在 2.0 出来后,开始备受关注。
之前的模型要在特定领域有更好表现,依然需要上千条标注样本数据来进行 finetune,很大程度影响了模型的通用性,而人类能够根据前面一句话知道语境(in-context),从而正确回答问题。GPT3 就通过调大参数 (1750 亿)来测试 in-context 学习能力,并在没有 finetune 情况下得到以下数据。在参数不断增加的同时,分为三种场景看回答准确率表现:Zero-shot(0 样本),One-shot(只给一个标准样本),Few-shot(少量标准样本,1000 条左右)。下图可以看到模型参数和样本集对正确性的影响,随着参数增多,Few-shot 相比 Zero-shot 的提升效果在拉大,说明越大的参数对样本具有更强的泛化能力。
三种场景
模型参数和样本集对正确性的影响
论文做了不同参数的验证工作,n (params) 是参数梳理,n (layers) 是模型层数,d (model) 是 FFN 层数的 1/4,d (head) 是多注意头的维数,所有测试使用的上下文 token 数是 2048。
验证结果
GPT-3 在 GPT-2 追求无监督和零次学习的特征基础上进行了改进,转而追求无监督模式下的 few-shot (少量学习)。GPT-3 采用了 96 层的多头 Transformer,上下文窗口大小提升至 2048 个 token ,基于更大的数据集 45TB 的文本数据训练,在多个 NLP 数据集上实现了出色的性能。GPT-3 更多的工作在工程问题上,比如数据污染处理,GPU 并行时减少节点间网络交互和负载均衡等。
论文测试了超过 24 中场景,GPT-3 在许多 NLP 数据集上实现了强大的性能,包括翻译、问题回答和完形填空任务,以及一些需要实时推理或领域适应的任务,如解读单词、在句子中使用新单词或执行 3 位数字算术。论文还表明,在 few-shot 设置下,GPT-3 可以生成人类评估者难以区分的新闻文章。
2022 年 3 月,OpenAI 再次发表论文 “Training language models to follow instructions with human feedback”,通过人工反馈和微调,使语言模型与用户对各种任务的意图保持一致。并推出了 InstructGPT 模型,InstructGPT 是基于 GPT-3 的一轮增强优化,所以也被称为 GPT-3.5。尽管 GPT3.5 还会犯一些简单的错误,但论文工作表明利用人类反馈进行微调是一个很有前景的方向。
论文提供了一种方法,能通过对人类反馈进行微调,使语言模型在广泛的任务应用中更好地遵从使用者意图。从一组人工编写的 prompts 和通过 OpenAI API 提交的 prompts 开始,论文收集了所需模型行为的标记样本数据集,并使用监督学习对 GPT-3 进行微调。然后,论文对模型输出进行人工排名,使用来自人类反馈的强化学习(Reinforcement Learning from Human Feedback,RLHF)进一步微调这个监督模型。InstructGPT 模型的参数为 1.3B,而 GPT-3 模型的参数为 175B,约为 InstructGPT 模型的 130 倍,但 InstructGPT 模型的输出却优于 GPT-3 模型的输出。
训练过程首先聘请了 40 个承包商来标注数据,收集提交给 OpenAI 的 prompts 的人工答案样本集,以及一些人工写的 prompts 作为训练监督学习的基线。然后,在更大的 prompts 集上对比 OpenAI 的输出,并人工标记差距,据此训练出一个奖励模型 (Reward Model) 来预测人类喜好的输出。最后用 PPO 来最大化这个奖励模型和 fine-tune 对监督模型的效果。这部分具体技术细节将在后面展开。论文认为模型如果有价值观的话,体现更多的是标注者的价值观念而不是更广泛人的价值观。
对人类任务意图的识别,是一个非常重要的能力。ChatGPT 采用 InstructGPT 相同结构的模型,针对 Chat 进行了专门的优化, 同时开放到公众测试训练,以便产生更多有效标注数据。基于人类反馈的强化学习(RLHF)是 ChatGPT 区别于其他生成类模型的最主要特点,该法帮助模型尽量减少有害的、不真实的及有偏见的输出,提升自然沟通效果。 同时,为了更好地支持多轮对话,ChatGPT 引入了一种基于堆栈的上下文管理的机制,帮助 ChatGPT 跟踪和管理多轮对话中的上下文信息,从而在多轮对话中生成连贯自然的回复。
Google 的论文比较简短,看到刘岩推荐的 Jay Alammer 对 Transformer 的讲解,这里也做了部分引用,这里希望用大家看得懂的话,抽取主要技术细节讲清楚。
从数学或机器学习的角度来看,语言模型都是对词语序列的概率相关性分布的建模,即利用已经说过的语句(语句可以作为数学中的向量)作为输入条件,预测下一个时刻不同语句甚至语言集合出现的概率分布。 GPT 生成式预训练模型也是根据语料概率来自动生成回答的每一个字,ChatGPT 在此基础上通过使用基于人类反馈的强化学习(Reinforcement Learning from Human Feedback,RLHF)来干预增强学习以取得更好效果。
本文重点介绍 Transformer 核心结构和技术点,略过训练优化部分。
Transformer 本质上是一个 Encoder-Decoder 架构,包括编码组件和解码组件。比如在机器翻译任务中,将一种语言的一个句子作为输入,然后将其翻译成另一种语言的一个句子作为输出。编码组件和解码组件可以有很多层,比如 Google 刚提出时的论文用的是 6 层,后面 GPT-1 是 12 层,然后到 GPT-3 是 96 层。
Encoder-Decoder 架构
每个编码器由两个子层组成:Self-Attention 层(自注意力层)和 Position-wise Feed Forward Network(前馈网络,缩写为 FFN),每个编码器的结构都是相同的,但是它们使用不同的权重参数。编码器的输入会先流入 Self-Attention 层。它可以让编码器在对特定词进行编码时使用输入句子中的其他词的信息(可以理解为:当我们翻译一个词时,不仅只关注当前的词,而且还会上下文关注其他词的信息)。
解码器也有编码器中这两层,但是它们之间还有一个编解码注意力层(即 Encoder-Decoder Attention),其用来帮助解码器关注输入句子中需要关注的相关部分。
Encoder-Decoder Attention
对文本处理和通常的 NLP 任务一样,首先使用词嵌入算法(Embedding)将每个词转换为一个词向量 (vector)。在 Transformer 论文摘要提到词嵌入向量的维度是 512,所有编码器都会接收到包含多个大小为 512 的向量列表 (List of vectors)。嵌入仅发生在最底层的编码器中,其他编码器接收的是上一个编码器的输出。这个列表大小是我们可以设置的参数 —— 基本上这个参数就是训练数据集中最长句子的长度。对输入序列完成嵌入操作后,每个词都会流经编码器内的两层,然后逐个编码器向上传递。
编码器对文本的处理
之前说 Transformer 的自注意机制突破了文本关注距离的限制,因此非常关键。先看这样一个句子:
The animal didn't cross the street because it was too tired
这个句子中的 "it" 代表什么意思,是 animal,还是 street 还是其他?这个对人来说很容易,但对模型来说不简单。self-Attention 就是用来解决这个问题,让 it 指向 animal。通过加权之后可以得到类似图 8 的加权情况,The animal 获得最大关注。
Self-Attention 原理
在 self-attention 中,每个单词有 3 个不同的向量,它们分别是 Query 向量( Q ),Key 向量( K )和 Value 向量( V ),长度均是 64。它们是通过 3 个不同的权值矩阵由嵌入向量 X 乘以三个不同的权值矩阵 W^Q , W^K ,W^V 得到,其中三个矩阵的尺寸也是相同的。均是 512×64 。
Query,Key,Value 的概念取自于信息检索系统,举个简单的搜索的例子来说。当你在某电商平台搜索某件商品(年轻女士冬季穿的红色薄款羽绒服)时,你在搜索引擎上输入的内容便是 Query,然后搜索引擎根据 Query 为你匹配 Key(例如商品的种类,颜色,描述等),然后根据 Query 和 Key 的相似度得到匹配的内容(Value)。
self-attention 中的 Q,K,V 也是起着类似的作用,在矩阵计算中,点积是计算两个矩阵相似度的方法之一,因此式 1 中使用了 QK^T 进行相似度的计算。接着便是根据相似度进行输出的匹配,这里使用了加权匹配的方式,而权值就是 query 与 key 的相似度。
Multi-headed attention 增强了自注意能力,其一是扩展了关注的位置,使之同时关注多个不同位置,其二是它为注意力层提供了多个 “表示子空间”,如论文用了 8 个注意头,那就有 8 组不同的 Q/K/V 矩阵,每个输入的词向量都被投影到 8 个表示子空间中进行计算。
具体流程如下图,“Thinking Machines" 的词向量经过最下面那层编码器后,使用不同的权重矩阵进行 8 次自注意力计算,就可以得到 8 个不同的 Z 矩阵(0-7)。然后将 8 个 Z 矩阵拼接起来,和权重矩阵 W0 相乘,就得到最终的矩阵 Z,这个矩阵包含了所有注意力头的信息。这个矩阵会输入到 FFN 层。
矩阵会输入到 FFN 层
现在重新看之前的例子,在多注意头机制下,"it" 关注的词有哪些,顶部的 8 种颜色代表 8 个注意头,可以看到有个注意头最关注 "the animal",另一个注意头关注 "tired",从某种意义上说,模型对 “it” 这个词的表示融入了 “animal” 和 “tired” 的表示。
多注意头机制
ChatGPT 的背后是大型语言模型 (Large Language Model,LLM) 生成领域的新训练范式:RLHF (Reinforcement Learning from Human Feedback) ,即基于来自人类反馈的强化学习来优化语言模型。关于 RLHF 训练有个 TAMER 框架(Training an Agent Manually via Evaluative Reinforcement)值得参考。
GPT3 训练后的大语言模型是根据概率分布,计算出下一个最大可能的词,他不管事实逻辑上的准确性,也没有所谓的意识,所以有时会一本正经地胡说八道。RLHF 是用生成文本的人工反馈作为性能衡量标准,或更进一步用该反馈作为奖励来优化模型,使得在一般文本数据语料库上训练的语言模型能和复杂的人类价值观对齐。具体步骤如下:
首先,我们使用经典的预训练目标训练一个语言模型。对这一步的模型,OpenAI 在其第一个流行的 RLHF 模型 InstructGPT 中使用了较小版本的 GPT-3。然后进行以下步骤:
GPT-3 本身无法识别人类指令蕴含的不同意图,也很难判断生成内容是否高质量。为了解决这一问题,训练过程是从数据集中随机抽取问题,由标注人员给出高质量答案,相当于提供了一系列人工编写的 prompts 和对应的答案数据集。然后用这些人工标注好的数据集微调 GPT3.5 模型,获得 SFT 模型 (Supervised Fine-Tune)。
训练方法:根据第一阶段的模型,随机抽取问题,给出多个不同的回答,人工选出最优答案进行标注,有点类似教学辅导。将高质量答案的奖励值进入下一轮强化学习 RL,训练一个奖励模型来预测人类偏好的输出。
RM 的训练是 RLHF 区别于旧范式的开端。这一模型接收一系列文本并返回一个标量奖励,数值上对应人的偏好。我们可以用端到端的方式用 LM 建模,或者用模块化的系统建模 (比如对输出进行排名,再将排名转换为奖励) 。这一奖励数值将对后续无缝接入现有的强化学习 RL 算法至关重要。
使用 PPO 优化奖励模型的策略。使用奖励模型的输出作为标量奖励,并使用 PPO 算法对监督策略进行微调,以优化该奖励。
训练方法:PPO 的核心目的是将在线的人工学习转为离线学习,机器自己给自己打分。利用第二阶段训练好的奖励模型,在数据集中随机抽取问题,使用 PPO 模型生成多个回答,并用上一阶段训练好的 RM 模型分别给出质量分数。把回报分数按排序依次传递,产生策略梯度,通过强化学习的方式更新 PPO 模型参数。
最后步骤 2 和步骤 3 可以循环迭代,可以不断完善模型。
PPO 算法补充说明:
长期以来出于工程和算法原因,人们认为用强化学习训练 LM 是不可能的。而目前多个组织找到的可行方案是使用策略梯度强化学习 (Policy Gradient RL) 算法、近端策略优化 (Proximal Policy Optimization,PPO) 微调初始 LM 的部分或全部参数。PPO 算法已经存在了相对较长的时间,有大量关于其原理的指南,因而成为 RLHF 中的有利选择。
我们将微调任务表述为 RL 问题。首先,该策略 (policy) 是一个接受提示并返回一系列文本 (或文本的概率分布) 的 LM。这个策略的行动空间 (action space) 是 LM 的词表对应的所有词元 (一般在 50k 数量级) ,观察空间 (observation space) 是可能的输入词元序列 (词汇量 ^ 输入标记的数量,比较大) 。奖励函数是偏好模型和策略转变约束 (Policy shift constraint) 的结合。
PPO 算法确定的奖励函数具体计算如下:将提示 x 输入初始 LM 和当前微调的 LM,分别得到了输出文本 y1, y2,将来自当前策略的文本传递给 RM 得到一个标量的奖励 rθ。将两个模型的生成文本进行比较,计算差异的惩罚项,惩罚每个训练批次中生成大幅偏离初始模型的 RL 策略,以确保模型输出合理连贯的文本。
PPO 算法确定的奖励函数
总体来说,ChatGPT 在人工标注的 prompts 和回答里训练出 SFT 监督策略模型,再通过随机问题由模型给出多个答案,然后人工排序,生成奖励模型,再通过 PPO 强化训练增强奖励效果。最终 ChatGPT 能够更好理解指令的意图,并且按指令完成符合训练者价值观的输出。
最后,大语言模型作为一个被验证可行的方向,其 “大” 体现在数据集广泛,参数和层数大,计算量大,其价值体现在通用性上,有广泛的应用场景。大语言模型能够发展,主要还是模型具备很好的并行扩展性,随着数据量和计算量的增加,主要挑战在工程和调优上。海外除了 GPT、还有 LLama、PaLM 等,国内目前也有很多相应的研究,因为很多基础技术以前就存在,最近国内追赶速度也很快,我们预期国内半年左右能够到 GPT 3.5 水平。NineData 也非常看好这个方向,并且已经将大语言模型应用到 NineData 平台的 SQL 开发中,支持通过自然语言直接查找、变更数据,提供数据库问题和知识问答、数据库 SQL 优化建议等多项能力,后续我们还将推出更多有价值的功能,欢迎登陆使用。
https://www.ninedata.cloud
Model Predictive Emissions Control of a Diesel Engine Airpath: Design and Experimental Evaluation