GPT
GPT
- Transformer:2017/6
- GPT:2018/6
- BERT:2018/10
- GPT2:2019/2
- GPT3:2020/5
gpt标题:通过通用的预训练来提升语言能力(generative pre-training)
摘要
自然语言中有标号的数据是非常少的。在标号的数据上训练比较难。所以可以现在没有标号的数据上训练一个预训练语言模型。然后在标号的数据上做微调。
在微调的时候构造和任务相关的输入,从而使得只要很少改变我们的模型就可以了。因为文本和图片不一样。这里我们只需要改变输入的形式就可以了,而不需要改变模型。最后在12个任务里9个能sota。(后来被bert超越了)。
介绍
在用没有标号文本的时候有俩个困难
- 不是知道用什么样的优化函数。(给一堆文本预测损失函数)每个目标函数在不同的问题上有不同的表现。
- 怎么把学到的文本表示传递到下游的子任务里面
因为NLP的子任务差别还是比较大的,没有简单的同一方式可以迁移到子任务上面。
GPT提出了一个半监督(semi-supervised)的方法,然后在没有标号的文本上面训练一个比较大的语言模型。然后在子任务上做微调(有监督)。
在当时半监督学习是比较火的。但是我们现在叫这个方法为自监督(self-supervised)。
GPT是基于Transformer架构的(当时Transformer还没那么火),对比Transformer和RNN。Transformer生成的东西更加的稳健。作者认为可能是Transformer有更结构化的信息。
框架(模型本身)
这一章有三节:分别是怎么在没有标号的数据上训练模型,怎么微调,怎么样对子任务表示我的输入。
无监督预训练
假设有一段文本,其中每个词表示为$u_i$整个就是$\mathcal{U}={u_1,....,u_n}$。其中是由序列信息的。GPT使用标准语言模型的目标函数。
语言模型需要预测第i个词出现的概率。也就是说每次拿k个连续的值,然后预测后面的那个词是谁。也就是说训练一个模型可以最大概率的输出,和文本一样的文章。GPT最大化下面这个似然函数。其中的k就是窗口大小,是一个超参数。如果想让模型更强k就要取的更长(成千甚至上万)。
$$ L_1(\mathcal{U})=\sum_i\log P(u_i|u_{i-k},\ldots,u_{i-1};\Theta) $$
将所有的预测结果相加,就得到了损失函数。(因为取了log所以做加法)
其中$\Theta$指的是这个模型,也就是Transformer的解码器。编码器和解码器最大的不同在于编码器拿到序列,对第i个元素抽特征可以看到整个系列的所有元素。而解码器只能看到当前元素和之前的元素。这里和bert不一样,因为bert做的是完形填空,所以用的是编码器。因此GPT给出的任务要更难一点。因此GPT在效果上比bert要差一些。但对来说,如果真的难完成这个任务,那么效果也会比完形填空任务的来的好。(天花板高)
有监督微调
在微调的时候是有标号的。每次给定长为m的序列。给出这个序列对应的标号是y。也就是预测它是y的可能性。
也就是把整个序列放进训练好的gpt模型中,拿到Transformer块最后的输出。对应的$h_m$的输出。在乘以一个输出层,再进行softmax函数
$$ P(y|x^1,..,x^m)=softmax(h_l^mW_y) $$
$$ L_2(\mathcal C)=\sum_{(x,y)}logP(y|x^1,...,x^m) $$
同时它在微调的时候因为效果不错,加入了之前的目标函数。也就是说这里有俩个目标函数。
第一个目标函数是给定序列,预测序列的下一个词。还有给定完整的序列,预测序列对应的标号(lable)。
那么如何把NLP中的不一样的任务转换成我们想要表示的形式呢?
特定序列输入变换
假设是一个分类问题,比如判断句子正负面:这里的做法是,将分类的词前面放一个初始的词元,后面放一个抽取的词元作为序列放进Transformer的解码器里。让模型抽取特征之后放到线性层里。其中这里的线性层是后面加的。里面的权重是在微调的时候随机初始化的。其中蓝色的词元是特殊记号。
如果是蕴含问题(给一段话,问一个问题。看看提出问题能不能支持这个问题三分类,支持,不支持,无法判断):然后将前提和假设一起进行编码。中间的这个是分割符。
第三个应用是是不是相似,这个问题在搜索引擎中经常会用到。将文字1和2分别按照先后顺序进入Transformer,得到输出然后做加法,来进行二分类问题。
第三个应用是一个多选题。给出问题和各种答案分别送进Transformer。然后对每个答案算标量之后进行softmax。
可以看到不管输入如何的改变,输出的时候接的Transformer模型不会改变。
实验
12层的decoder,每个维度是768(这里和bert是一样的)。bert large是24个encoder,维度是1024。
bert也用了GPT一样的bookscorpus(8亿),此外还用了25亿个词的wikipedia数据集。所以bert的数据集大小是GPT的4倍。训练的模型比GPT大三倍(bert large)
GPT2
标题:语言模型是无监督的多任务学习器。
摘要
GPT2制作了一个新的数据集叫做webText。有百万级别web页面1.5B(Billions)个文本。GPT2中主要的买点是zero-shot
介绍
多任务学习就是一个模型看多个数据集,然后使用多个损失函数。
现在的主流的途径就是对一个任务收集一个数据集,在上面做预测,因为现在的模型的泛化性并不好。GPT2和bert存在的问题是,对于每一个下游的任务还是需要重新训练模型,而且还是需要有标号的数据。拓展到新任务上还是有一定的成本。GPT2除了在做语言模型外,在下游任务会进行zero-shot,也就是不需要任何下游任务的信息,并且不需要再次训练模型。
在gpt预训练的时候是在自然语言上进行训练的,在微调的时候加入了构造好的输入(开始符,结束符,分割符)。模型在微调的时候认识这个符号是什么意思。但是做zero-shot的时候,不能引入模型之前没见过的符号。所以在构造输入的时候,和预训练看到的内容是一样的,也就是说输入的更像自然语言。作者给了俩个例子。
第一个例子是机器翻译。如果把英语翻译成法语,我们可以添加Translate to french,english text,french text。如果做阅读理解的化,我们可以甚至一个提示叫做回答这个问题,接下来是对应的哪个文本,最后是答案。如果模型足够强大,就能理解提示符想要让模型干的事情。而且在文本中这样的事情也很常见。
gpt2使用的是reddit,然后爬取了前三的文章。800w个文档 40GB的text。 其中会有很多法语和英语之间交错的对话。比如说,我认为xxx这句法语翻译成英语应该是怎么样。gpt做了四个版本
参数 | 层 | 模型维度 |
---|---|---|
117M(等于bert) | 12 | 768 |
245M(等于bert large) | 24 | 1024 |
762M | 36 | 1280 |
1542M | 48 | 1600 |
GPT3
大语言模型是Few-shot的学习。GPT3上面做了非常多的实验。
摘要
稀疏的优点是在不增加计算量的前提下增加参数量。
gpt3模型有1750亿个可学习参数,比之前任何的非稀疏语言模型大10倍。gpt3在子任务的时候也不做任何的微调。gpt3可以生成新闻的文章,而且让人类难以分辨。GPT3有63页。所以它不是论文而是技术报告。
介绍
现在大家都是用预训练好的语言模型再做微调。但是对于每个子任务都需要标号数据集,而且即便是下游数据集也可能涵盖面没有那么广。没有覆盖到的特例效果可能也不是很好。GPT3中重新定义了mata learning(元学习):训练很大的模型,让模型在不同任务之间快速适应和泛化的学习方法。
in-context learning:有训练样本也不改变权重。
最近的模型参数变得越来越大,GPT用三个方法进行评估:
- few-shot:使用10-100的训练样本
- one-shot
- zero-short
微调是训练好预训练模型之后,然后每次给一个小样本,然后计算损失。
如果在zero-shot中就是在前面加一个提示词:把英语翻译成法语。然后加一个箭头,这个箭头就是提示(prompt)。
one-shot就是在之间插入一个英语单词
但是这样的话,每次few-shot的时候,需要重新输入一遍数据。
gpt3模型和gpt2模型是很像的。数据量非常大,在批量大小增加的情况下,学习率是往下降的。
相对于gpt2来说,用了sparse Transformer
gpt3使用了common crawl数据集(因为数据集不干净),先过滤这个数据集。
在这里进行了一个分类,将gpt2爬下来的数据集做了正类,common crawl(过滤后的)做了负类。让分类器判断是正还是负进行过滤。最后留下来了common crawl高质量的数据集。此外还进行了一次去重的过程(LSH算法)。并把bert之类的数据集也拿过来了。
虽然用了common crawl的数据集,但是用了不一样的采样率。所以其实common crawl 也就比webtext2大了3倍。
评估
评估的时候用上下文的学习,用k个样本。它的提示词用的是anwer:或者A:使用true和false而不是0和1。评估开放式的话用束搜索去找到比较好的答案。
结论
限制:
在生成文本还是比较弱的,(比如写小说)。结构和算法上也有局限性(不像bert)。而且在预测的时候预测的词,有些词可能更重要,有些词可能不重要。而且GPT的学习仅限于文字。样本有效性不高。
此外并不确定,到底是不是从头开始学,还是只是记住了训练集中的样本(因为样本太大了)。而且训练起来很贵。GPT3中的很多输出都是无法解释的。
讨论:
对于人和社会会产生很多影响。比如散步谣言,编论文,新闻稿。此外不同的预料还有不同的偏见。
此外能耗也是相当夸张的。
GPT4
gpt4能接受多模态的输入,文本图片。它和真实世界中的人比还是不行的。但是在很多学术性的任务上能达到甚至超过人类的水平。
输出只能是文本。GPT4甚至能通过律师资格考试(排前10%,之前是后10%)律师资格证在国外由很高的地位。open ai在22年八月份就完整了GPT4训练,之后半年的时间都在准备和调整。并且利用了GPT3用户部分的反馈。open ai用训练了GPT3.5集群训练了GPT4(重新设计的)。open ai 发现gpt4的训练前所未有的稳定。可以准确预测模型训练的结果。正常的情况是在较小的数据集上做消融实验看效果。但在语言模型中,由于数据集太大了小规模可以运行很好的参数不一定在大规模上运行的很好。大模型的涌现能力在小模型也是无法观测的。但是open ai在这次工作中表示在小规模验证的内容可以迁移到大规模数据集上。
训练过程
gpt4也是使用预测文章中的下一个词的方式去训练的。并使用了公开的网络数据。也包括了购买回来的数据。数据规模非常大。因为预训练的模型有很多错误,为了和人的意图一致。并且安全可控。所以使用RLHF的技术进行了微调。
模型的能力看起来向是在预训练过程中得到的,但是RLHF并不能提高那些考试的成绩。RLHF用来进行控制,让模型更能知道我们的意图。按照我们喜欢的结果进行回答。
可预测的缩放
GPT4关键的问题就是构建深度学习的infra。所以open ai使用了内部的代码库,在gpt刚开始训练的时候就可以预测到最终的loss。
open ai发现最后loss曲线可以被准确的拟合出来。但是也有很多能力是不能完全预测的。比如inverse scaling prize里的任务,计算成本增加,任务增大。效果越来越差。但是gpt4的表现比3.5的好了非常多。
就比如给个不公平的赌约,然后这次赢钱了。问gpt赌还是不赌。
在平常的对话中3.5和4差距很小。但在深度一些的领域gpt4来的更好。open ai对这些数据作了回答。open ai还拿了俩个版本,一个预训练的时候有这些考试数据,一个预训练的时候没有这些考试数据。进行推理,取最低分。
gpt4在数学考试上发挥的不好。还有一些文学考试。基本上就是翻来覆去的空话大话。
还让GPT做各种不同语言的选择题目。26个语言中有24个比之前的gpt3.5来的好。
多语言的性能和语料库不直接成正比,有些小众语言也能获得不错的效果。
gpt还可以做文档的润色和校验,但是最后还是需要人工进行校验。
视觉输入
gpt可以允许用户定义视觉文本,还有视觉文本混合任务。并且有不错的表现。甚至截图一张法语的问题也能得到不错的效果。并且用来做文章总结效果也很好。
gpt4还在视觉任务上和sota进行对比。表现依然不错。
但是可以让gpt给出能生成画的代码,然后运行这些代码。还可以不断的对于生成的画进行改进。
可操作性
可以让GPT模拟人格和用户讲话,
限制
GPT并不是完全可靠的。特别是在高风险领域中不应该使用(比其他的模型大幅度提高)。此外之前的偏见还是存在,缺少2021年9月之后的数据。
gpt4非常自信。哪怕是错的情况下也很自信。
风险
openai进行了各种风险测试。让gpt拒绝不合理的要求。
GPT还使用自己给自己提升性能(之前的分类器)。GPT4能比gpt3.5少回答百分之几82不该回答的问题。但是做不到完全的阻止。
结论
gpt模型在不断的变强。open ai还发了文章讨论chatgpt对于就业市场的影响。