0 前言 – 长期主义的胜利
ChatGPT火了这么久,笔者后知后觉地抽空读完了GPT系列的论文,读完最大的感受是:ChatGPT的成功不是偶然,而是长期主义的胜利!为什么这么说呢?读者跟我一起从GPT系列的论文里了解GPT的发展过程,寻找它成功的原因吧~
1 缘起 – Transformer成为主流之一
要谈GPT,就必须要先弄明白Transformer是什么,因为所有GPT的基础模型都是Transformer,可以说没有Transformer,大概率就没有GPT,更不用说ChatGPT了。到底是什么技术是这么牛,搭起了GPT的底座呢?答案是:注意力机制。
注意力机制(Attention)是从人类身上观察到的一种认知能力(果然人类才是最牛的):自动聚焦的能力。比如人类可以从一幅画中自动聚焦到自己关心的部分,又比如在嘈杂的环境中,人类可以自动听取自己关心的声音。注意力机制最早被用在语言模型中,是为了找到一句话中最重要的字词。比如“我今早上吃了个鸡蛋”这句话中可能对语义理解有关键作用的主要是“早上”、“鸡蛋”等字词。
2015年前后,NLP领域的深度模型是卷积神经网络(CNN)和循环神经网络(RNN)的天下,Attention更像一个插件,弥补这两类模型在语言建模方面的不足。直到2017年一篇Google的论文*《Attention is all you need》*横空出世,提出了用全Attention的方式建模语言特征的模型Transformer,克服了CNN和RNN模型存在的长距离依赖问题,而且大部分的计算可以并行化,大大提升了计算效率。至此,Attention甩掉了“插件”的标签,开始成为主流框架之一。
图1-1 Transformer框架图(来源于论文*《Attetnion is all you need》*)
Transformer也是序列到序列的框架,由编码器和解码器组成,如上图所示。编码-解码结构用于对话生成、机器翻译等任务比较多,如下图所示,模型的输入是一个问句词语序列 “吃饭了吗” ,输出是针对该问题的答案词语序列“刚吃完”。编码器和解码器就是按照我们一般的对话思路设计的,我们一般在对话交流时,会先理解这整句话,对机器来说,理解就是编码成合适的特征表示。理解之后,就会按照意思输出回答的序列,对机器来说,就是根据编码的特征和已经生成的文本部分解码出下一个词。
图1-2 编码-解码结构示意图
当然了,Transformer在Attention的设计上还花了很多心思,这里就不展开了,感兴趣可以去看下原论文或者原论文的精读哟~咱们接着往下。
2 初心 – GPT被提出
在GPT出现之前,自然语言处理(NLP)领域的主流做法是“一任务一模型”,什么意思呢,就是分类任务(如情感分类、事件分类等)有分类的模型,抽取任务(实体抽取、关系抽取等)有抽取的模型,生成任务(翻译任务、摘要生成任务等)有生成的模型等等。那个时候大家想的比较多的是怎么提升某个模型在某种任务上的表现,但是GPT的作者们在思考,如何能够让一个模型能够支持所有的自然语言处理类任务呢?像人类, “现存的最智能NLP模型”,不需要一个任务一个脑子对吧?不管是什么NLP任务,人类都能够用语言回答,并且,人类有基础的知识储备,能够理解不同任务的指令,生成合适的回答。
此外,他们还注意到,word2vec等词向量在无监督的预先训练的过程中,能够学习到一些自然语言的知识(如图2-1所示),并且,word2vec的引入会让一些NLP任务的模型有更好的表现。
图2-1 word2vec词向量热力图,man与boy明显更相似(图源网络)
于是,他们就想,是不是可以利用无监督的语料信息也能预先训练一个模型,提前学习到一些知识,并且这个模型能够应用到通用NLP任务上?那难点就来了:什么样的模型结构能够支持通用的NLP任务呢?什么样的优化目标能够让无监督学习到的知识对所有NLP任务都有帮助呢?
为解决上述问题,GPT开创性地提出了“预训练+微调”的NLP模型训练范式,之后就被各种模型争相沿用,NLP模型进入到了“预训练模型”百花齐放的时代。
2.1 “预训练“:用无监督的语料预先训练
GPT采用的预训练就是在1)Transformer decoder的基础上,用大量2)没有标注的自然语言语料,以3)语言模型建模的优化目标训练模型。
1)首先是为什么用Transformer作为基础模型,论文里有明确地给出两点原因:i.相比于RNN,能够建立长距离依赖,ii.在大量任务上表现突出;但是为什么只选择decoder,论文中也没有给出非常明确的解释,只是模糊地提到他们是基于实验结果选择的decoder。所以笔者专门去问了下ChatGPT,它的部分回答如图2-2所示。
图2-2 ChatGPT解释为什么只用了Transformer的decoder
2)为了让预训练的过程能够学习到更多高质量的语料,GPT的预训练是在百亿级别的语料上来训练的,这些无标注的语料主要有两个来源:BooksCorpus数据集和Word Benchmark数据集。前者包含了7000本未出版的多种题材的图书,后者则是多达百亿量级的ELMo的训练语料。前者因为是图书,因此需要模型学习建模文本的长距离依赖信息。
3)考虑到要通过预训练来让模型学习到一些基础的语言理解能力,GPT采用的优化目标就是通用的语言模型建模目标:
L1(U)=∑ilogP(ui∣ui−k,…,ui−1;Θ)L_1(U)=sum_{i}logP(u_i|u_{i-k},…,u_{i-1};Theta)
其中,kk表示上下文文本的学习长度,即每次最多可以同时建模多少个词;PP则是由参数集合ΘTheta组成的神经网络模型,这里就是Transformer。
2.2 “微调“:用特定领域的标注数据再次训练
在特定任务上,预训练模型的表现不佳,毕竟没有特定任务的标注数据,于是在预训练之后,GPT增加了微调的过程,其实就是用相对于预训练语料量级的少量有标注数据,在预训练之后的模型上增加了对模型参数的微微调整(模型的学习率为2.5×10-4)。
微调的亮点在于,如何用一个生成式基础模型支持通用的自然语言处理任务,这可以用论文中的一张图解释清楚。
图2-3 GPT微调任务结构设计(来源于GPT论文*《Improving Language Understanding by Generative Pre-Training》*)
生成式任务就不需要展示了,毕竟GPT本身就是一个语言生成模型,主要是如何用生成式模型实现自然语言理解式的任务。图中可以看到,不论是分类、推理、相似性判断还是多选,GPT现在输入文本时加入不同的分隔符来分割文本,并且在最后一个词经过Transformer建模的表示基础上加了一层线性层,学习不同类别的概率分布,因为最后一个token的表示融合了全句所有的信息。
整个训练范式了解下来,读者们可以看到,虽然GPT的论文里,作者将他们提出的模型称为一种半监督的方法,但是其实跟当时的半监督方法相差较远,只是用到的训练语料与半监督有些接近,都是部分无标签+部分有标签。
非常值得一提的是,GPT打破了传统的自然语言模型的训练框架,创造性地提出了“预训练+微调”范式,初步实现了一个基础模型能够解决通用自然语言处理任务的愿景,在模型的通用性方向的发展上迈出了一大步。
虽然GPT是开创性的工作,但是提到“预训练+微调”,被更多地想到的模型其实是BERT。为什么BERT能够超越GPT大行其道,“失落”的GPT该何去何从?咱们下回继续聊。