原本链接:https://mp.weixin.qq.com/s/R8EwUppkQg4igal_5h6E0Q
一、前言
2022 年 11 月,OpenAI 发布了大规模语言模型的又一力作:ChatGPT,瞬间引爆学术界和舆论场,有人用它编写贺词发送祝福,有人用它吟诗作赋冒充诗人,有人用它编写代码ctrlcv,还有人套路它走向罪恶恐怖如斯,如此强大的 AI 对话模型 ChatGPT,作为大规模预训练语言模型的集大成者,到底是天才的一蹴而就,还是技术的厚积薄发,本文跟大家聊聊这些光鲜的背后发展历程。
二、大规模语言模型
计算机要实现自然语言处理 NLP,大致有两方面的工作:自然语言理解(Natural Language Understanding,NLU)和自然语言生成(Natural Language Generation,NLG)。
在 2017 年之前,也就是 Transformer 提出之前,大家实现 NLP 的思路,主要是在特定任务上训练「静态词向量 + RNN」,总的来说 RNN 非常难以训练,需要大量数据样本,才能获得效果稍好的模型,还会出现大量其他问题,例如梯度问题、长句子表现极差,这时就有大佬想到,如果先预训练一下 RNN,获得一个通用的语言模型,然后在下游任务上微调预训练好的 RNN,这样大概率会更容易获得有效的模型,这便是大规模预训练语言模型的初衷。
时过境迁,NLP 领域陆续出现了一些使用预训练的探索性方法,例如 Semi-supervised Sequence Learning、ULMFiT,但是模型方法真实效果一直处在不温不火的状态,直至 Transformer 提出。
2017 年 6 月,Google 在《Attention is all you need》中提出 Transformer,Attention 大杀四方、惊为天物。Transformer 由输入、输出、编码器、解码器组成,其中编码器由 6 个编码器层组成,每个编码器层有两个子层:「多头自注意力层 + 规范化层 + 残差连接」和「前馈全连接层 + 规范化层 + 残差连接」,解码器也由 6 个解码器层组成,每个解码器层有三个子层:「多头自注意力层 + 规范化层 + 残差连接」、「多头注意力层 + 规范化层 + 残差连接」和「前馈全连接层 + 规范化层 + 残差连接」。传统 RNN 及其变体只能按照序列顺序来计算词之间的语义特征和句法结构,距离越远且特征损耗越大,而 Attention 能直接跨越计算任意两个词的特征联系,这种高质高效的创新设计成为了后续各种学术和工程的讨论主题。
2018 年 6 月,恰好距离 Transformer 提出一年,另一个注定伟大的公司,微软投资的 OpenAI 发布了 GPT(Generative Pre-Training)初代,模型主体采用了 Transformer 的解码器层,去除了中间子层「多头注意力层 + 规范化层 + 残差连接」,共堆叠了 12 个编码器层,Attention 头数 12,词向量长度 768,预训练数据 5 GB,参数量 1.17 亿。GPT 初代的训练核心延续了「无监督的预训练 + 有监督的微调」,在无监督的预训练阶段,使用海量无标注语料训练语言模型,生成预训练模型。在微调阶段,利用特定任务的标注语料对预训练模型做微调,以完成特定任务上的适配。
同年 10 月,Google 发布 BERT,技惊四座、一时无两。在模型结构方面,BERT 采用了 Transformer 的编码器层,堆叠了 12 个编码器层,词向量维度 768,Attention 头数 12。相比 GPT 初代,BERT 是典型的文本理解模型。BERT 之前的预训练语言模型,只能使用左边的文本,或者右边的文本,但是下游任务中文本理解需要同时考虑两边,例如在序列标注任务中,我们需要两边的词来确定中间词的词性、实体关系。针对这个问题,Google 设计了预训练任务 Masked Language Model,在训练 BERT 时,遮盖 15% 的输入单词,然后根据上下文预测遮盖词,这样就可以利用上下文进行建模,来预测被遮盖的单词,我们已经将目标词遮盖掉了,不管是从左向右看,还是从右向左看,都看不到目标词。
2019 年 2 月,OpenAI 又发布了 GPT-2,相对 GPT 初代,GPT-2 没有结构上的创新,堆叠了更多的 48 个编码器层,词向量长度 1024,预训练数据 40 GB,参数量 15 亿。总的来说,GPT-2 添加了更多的训练任务、更多的训练数据、更多的模型参数。
2020 年 5 月,OpenAI 马不停蹄又发布了 GPT-3,从 GPT 初代到 GPT-3,全部采用 Transformer 架构,模型结构没有本质的创新。GPT-3 堆叠了 96 个编码器层,Attention 头数 96,词向量长度 12888,预训练数据 45 TB,参数量达到了惊人的 1750 亿,使用了更多的训练数据、更多的模型参数。在模型训练方面,GPT-3 发生了很大变化。在 GPT-3 之前,不同的 NLP 任务需要模型适配,采用「预训练模型 + 下游任务微调」的训练范式。而 GPT-3 采用「预训练模型 + 情景学习(In-context Learning,ICL)」,在情景学习阶段,模型不需要更新参数。所谓情景学习,简单来说就是通过向模型喂入一个任务提示 (prompt),并加入少量示例,模型就可以自动生成相关任务的答案。微调需要一定数量的监督学习数据,而情景学习只需要少量甚至不需要模型适配数据。因此,对于复杂任务,我们可以使用「少样本学习(Few-shot Learning)」,即模型推理时,提供问题描述和 10-100 个示例供模型参考,模型不更新参数。对于简单任务,我们可以使用「一次学习(One-shot Learning)」,即提供问题描述和 1 个示例供模型参考,或者「零次学习(Zero-shot Learning)」,仅提供问题描述,模型也不再更新参数。很显然,这种方法更具优势。
接下来就是本文的主角 ChatGPT。
三、ChatGPT 与强化学习
前面讲的 GPT-3 并不完美,在实际生产环境中,它给出的内容不一定是真实合理的,模型根本无法判断自身输出结果的正确性。同时,由于模型是基于大批量文本的预训练得来,所以具有一定的偏向性,有时生成的某些语句带有种族歧视或者暴力倾向等问题,毕竟大规模数据不是人力可以进行筛选的。针对这些问题,OpenAI 设计了 ChatGPT,并提出了 3H 优化目标:有用的(Helpful)、可信的(Honest)、无害的(Harmless)。
在模型训练方面,ChatGPT 使用了强化学习策略。第一步,构建一个 prompt dataset,包含大量提示文本,对 GPT-3 进行监督学习微调。
第二步,对第一步微调后的 GPT-3 进一步推理 prompt dataset 任务,获得多个结果,交给人工进行标注排序,用标注的结果训练一个奖励模型(reward model),用于接下来校正 GPT-3 的输出结果。在这一步中,OpenAI 雇用了 40 个外包公司进行人工标注,也就是所谓的「人类反馈强化学习」(Reinforcement Learning from Human Feedback,RLHF),在训练中使用人类反馈,以最小化无益、失真或偏见的输出结果。
第三步,再拿 GPT-3 推理 prompt dataset 任务,用第二步获得的奖励模型对 GPT-3 推理结果进行打分,也就是强化学习计算 reward,最后交给策略来更新梯度。正如通过比赛结果来判定 AlphaGo 下棋正确与否,ChatGPT 的回答是否正确,是通过奖励模型来确定。
ChatGPT 之所以会这么成功,本身依靠 GPT-3 继续精调,同时融入了强化学习,优化方向变得可控,再加 40 个外包公司的辅助 buff,拥有了大量优质的人工标注数据。
与此同时,ChatGPT 训练成本也是巨大的。尽管官方没有具体公布,我们可以参考 GPT-3 的训练所需:1200 万美刀的训练费用,31 个分工明确的协作者,28 万个 CPU,1 万个 GPU,45 TB 训练数据,维基百科的全部数据仅占 0.6 %,ChatGPT 肯定有过之无不及。如此之高的训练成本,意味着 ChatGPT 不能够被轻易复制,这不 Google Bard 首秀就不幸翻车了,市值暴跌 7 千亿。