1、EncoderVSDecoder:Bert与GPT1之战
2、Zero-shot:GPT2
3、大力出奇迹的奇迹:GPT3
4、总结
2017年,Google推出Transformer,利用Attention完全替代过往深度学习中的Recurrence和Convolutions
结构,直白地展现出了“大一统模型”的野心,"xxxisALLyouneed"也成了一个玩不烂的梗。
2018年6月,openAI推出基于TransformerDecoder改造的第一代GPT(GenerativePre-Training),有效证明了在NLP领域上使用预训练+微调方式的有效性。紧随其后,同年10月Google推出基于TransformerEncoder部分的Bert,在同样参数大小的前提下,其效果领跑于GPT1,一时成为NLP领域的领头羊。
不甘示弱的openAI在4个月后,推出更大的模型GPT2(GPT1:110M,Bert:340M,,GPT2:1.5B),同时,openAI也知道,光靠增加模型大小和训练数据集来获得一个和Bert差不多效果的模型,其实是没有技术含量的。于是,在GPT2里,openAI引入zero-shot并证明了其有效性。
此后,openAI在LLM上义无反顾地走了下去,在2020年6月推出巨人GPT3,参数量高达175B,各类实验效果达到顶峰,(据说)一次训练费用为1200w美元,“贵”也成了普通工业界踏足GPT系列的壁垒之一。
在CV里,pre-training+fine-tune的方式盛行已久:先用海量有标注的数据集,通过有监督的训练生成一个预训练模型,然后通过下游任务,在这个模型上做微调。但是在NLP中,这个方式一直很难做起来,原因是:
Transformer出世后,模型对文字上下文的理解能力得到显著增强,在这一铺垫下,GPT1诞生了,它的整体设计思路如下:
确定好了总体设计思想,接下来就是详细的技术实践了。GPT1的预训练模型基本遵循TransformerDecode部分的结构,去除掉和Encoder做cross-attention的部分,如下图:
观察Decoder和Encoder部分的Attention,可以发现:
两者计算细节上的区别如下:
普通Attention:
MaskedAttention:这里的+号并不表示数值相加,只表示在相对位置上是否存在遮挡。数字1表示需要遮挡的位置。可以看出模型只能看到它前面的文字
有了一个预训练模型,我们就可以做fine-tune了。在这里,我们让模型做4种有监督的学习:
前文说过,在fine-tune阶段,我们希望能够尽量减少模型架构的改动,因此,论文中采用了如下方法,对这四种监督任务的输入输出做了统一:
左边是GPT1一个block的基本架构(前文说过,基本等同于Transformer的Decoder部分,去掉cross-attention)。右边则是四种监督任务输入输出的大一统方式。我们以第一个Classification任务为例:
在整个过程里,模型需要额外训练的参数,就是最后一层Linear层,以及特殊符号的embedding,同时在整体参数上做gradientupdates,可以说改动是非常小的。
GPT1的模型参数为L=12,H=768,A=12,这个设置和后来Bert-Base一模一样,但后者的效果要好上很多。原因之一是,GPT采用Masked-Attention,对模型和训练数据的要求会更高,因为模型能读到的信息只有上文。而采用普通Attention的Bert在训练阶段就能同时读到上下文。这个性质决定了GPT模型越来越大的趋势。但是,长远来看,Masked-Attention是push模型更好理解文字的重要手段,毕竟在现实中,我们更希望培养模型知上文补下文,而不是单纯地做完形填空。
Bert的整体架构如下:
EncoderVSDecoder,BertVSGPT1,战火已经拉开,但是此时GPT1仍处在劣势。前面说过,基于Decoder的模型,模型和数据量越大,效果越好。但如果只做到这一点,从技术上来说又太逊色了,性价比也不高。因此,openAI从训练数据上进行改进,引入了zero-shot这一创新点,GPT2就诞生了。
GPT2的核心思想是:只要我的数据够多够好,只要我的模型够大够强。我可以直接去掉fine-tune,训练出一个通用的模型。
要了解这一点,我们先来看Zero-shot,One-shot和Few-shot的区别:
GPT2希望通过喂给模型Zero-shot类型的样本,不告诉模型“做什么”,“怎么做”,让模型自己去体会。但是,你总不能让所有的数据都长成图例里Zero-shot那样吧,那和去标注数据有什么区别?所以,这时候,语言的魅力就来了。一段普通的文字里,可能已经蕴含了“任务描述”、“任务提示”和“答案”这些关键信息。比如,我想做英法文翻译这件事,那么我从网上爬取的资料里可能有这样的内容:
”I’mnotthecleverestmanintheworld,butliketheysayinFrench:Jenesuispasunimbecile[I’mnotafool].“Ihatetheword‘perfume,”’Burrsays.‘It’ssomewhatbetterinFrench:‘parfum.’如果我把这样的文本喂给GPT,它是不是就能在学习文字接龙的过程里,领悟到英法互译这一点?如果我的数据集又多又棒,那GPT自主揣摩的能力是不是就能更强?所以,GPT2在训练数据上,玩出了花样。它从著名的在线社区Reddit上爬取训练数据(数据具有一定的问答特性),并按社区用户的投票结果筛选出优质的内容。在这个方式下,训练出了1.5B的GPT2,效果基本与Bert差不多。从实用性的角度上,GPT2并没有带来突破,但是,zero-shot的训练方式,却有效证明了NLP领域训练出一个完全通用模型的可行性,这一刻开始,LLM走AIGC的路初见萌芽,因为整个训练流程看起来就像是模型自主学习知识。
Zero-shot的方式被GPT2认证可行后,openAI就不得不开始考虑模型是否能真正做到强大了,毕竟现在只是和Bert持平而已。这一刻openAI开始悟过来,既然LLM要一路走到底,既然模型之大避免不了,那不如来得更彻底一些。GPT3沿用了去除fine-tune,只做通用模型的思路,同时技术上小做替换(sparseTransformer),然后在训练数据中引入Few-shot(毕竟完全不给模型任何显性提示,效果确实没达到预期),最终生成了一个大小高达175B的庞然大物,当然效果也是一骑绝尘的。
当你读到这里的时候,你已经发现了,GPT系列越写越短,和GPT的越来越大成正比。这也证实了GPT发展的核心思想:大力出奇迹。
GPT3.5会单独开一个篇章来讲解,来介绍GPT是怎么能写出代码的。回到GPT家族的总结上:
1、GPT的核心思想是:在NLP领域做pre-traning+fine-tune的框架,解决现实中缺乏文本标注的问题。
2、GPT基于TranformerDecoder,Bert基于TransformerEncoder。在训练阶段,GPT只能看见上文,Bert可以看见上下文。这也注定了GPT需要把模型做大,训练数据做丰富,才能达到超越Bert的效果。
3、从GPT2到GPT3,Zero-shot和Few-shot的方式使得模型能够去除fine-tune部分,训练一个通用的语言模型。