赞
踩
视频讲解:GPT,GPT-2,GPT-3 论文精读【论文精读】_哔哩哔哩_bilibili
论文链接:
GPT: https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf
GPT-2: https://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdf
GPT-3: https://arxiv.org/pdf/2005.14165.pdf
文章标题:Improving Language Understanding by Generative pre-Training
摘要
在自然语言理解里,有很多不一样的任务,虽然我们有很多大量的没有标记的文本文件,标好的数据是比较少的,这使得我们要去在标好的数据上,训练出分辨模型的话,会比较困难,因为数据相对较少。
如何解决这个问题:
1、先在未标记的数据上训练一个预训练模型,这个预训练模型是一个语言模型;
2、接下来再在标好的子任务上训练一个分辨的微调模型
(这个在计算机视觉领域,八九年前就已经是主流的算法,但在NLP领域一直没有流行,因为在NLP领域没有像imagenet那么大规模标好的数据。
虽说在机器翻译领域也许能够做到100万量级,但一个句子和一个图片不在一个尺度上面,一张图片含有的信息,那个像素的信息比一个句子里面能去抽取的信息来的多得多,所以一张图片可能能换10个句子,这也就意味着至少有一千万级别的句子级别的标好的数据集才能够训练比较大的模型,这导致在很长一段时间里,深度学习在NLP领域的进展没有那么顺利,直到GPT和后面BERT的出现,才打开局面。 这里还是像CV那样先训练好预训练模型再做微调,不一样的是使用未标记的文本,然后GPT系列后面的文章在做zero shot走了另外一大步,如果说前面五年CV在引领整个潮流的话,那最近几年的创新可以看到来自NLP领域,而且这些创新也在反馈回CV,比如之前读过的MAE这篇文章,就是把BERT用回在计算机视觉上面)
跟之前工作的区别是,在微调的时候构造跟任务相关的输入,从而使得只要很少的改变模型的架构就可以了。
1、引言
怎么样更好的利用无监督的文本,以前最好的模型还是词嵌入模型。
用未标记的数据的困难:(1)不知道用什么样的优化目标函数,一堆文本的损失函数不知道到底是什么样子,虽然有很多选择,比如机器翻译或者文本一致性,但是并没有发现某一个目标函数在一些任务上特别好,只是在一个任务上比较好,主要取决于目标函数和任务的相关度有多高;(2)怎样有效的把学到的文本的表示传递到下游的子任务上面(NLP领域子任务差别较大,没有一个简单有效的方式,使得一种表示能够一致的牵引到所有的子任务中。)
GPT提出了一个半监督的方法,在未标记的文本上面训练一个比较大的语言模型,然后再在子任务上面微调
模型基于transformer架构。跟RNN模型相比,transformer在迁移学习时学到的feature更稳健一些,可能是因为transformer更有结构化的记忆,使其能够处理更长的文本信息,从而能够抽取出更好的句子层面和段落层面的语义信息。在做迁移的时候,用的是一个跟任务相关的输入表示,
3、模型
怎样在未标记的数据上训练模型,怎么样微调,每个子任务的输入如何表示
3.1 未标记的数据上做预训练
假设有一个未标记的文本U={u1,…,un}(每个词表示成ui,它是个有序的信息,不会交换词的顺序)GPT 使用一个标准的语言模型的目标函数来最大化下面的似然函数:
(具体来说语言模型 预测第i个词出现的概率,第i个词记为ui,把ui前面的k个词,ui-k到ui-1,k代表上下文窗口的大小,输入序列的长度,每次取出k个连续的词,再预测k个词后面的词是什么。)
即预测是用一个模型,这个模型在记成Θ的地方,给定k个词,预测这k个词下一个词的概率,把每一个这样的词(i范围为1-n)的最大概率,全部加起来就得到目标函数,这个地方即为L1(代表第一个目标函数)
这些参数采用随机梯度下降进行训练。
在我们的实验中,我们使用了一个muti-layer Transformer解码器的语言模型,这是Transformer的一个变体。
h0 = UWe + Wp
预测词u的概率,把前面k个词 U=(,……,)做词嵌入投影,加上位置编码,得到第一层输入
3.2 微调
给定一个长为m的词序列x1,……,xm,以及其对应的标签y,预测y的概率。
步骤:把词序列放进前面训练好的模型里面,然后得到transformer块的最后一层输出(即hm对应的输出),再乘以输出层,再做一个softmax,就得到其概率。
此外,我们还发现,将语言建模作为微调的辅助目标有助于学习,改进监督模型的泛化,加速收敛。使用这样的辅助目标提高了性能。具体来说,我们优化了以下目标(权重为λ):
L3(C)=L2(C)+λ∗L1(C)
总的来说,我们在微调过程中需要的唯一额外参数是Wy和分隔符标记的嵌入(下面在3.3节中描述)。
微调时有两个目标函数,第一个是给定一个序列预测下一个词,第二个是给定完整序列,预测序列对应的标号。
3.3 特定的输入转换
第一类是最常见的分类,给定一句话或者一段文本,来判断其对应的标号,比如说一个用户对一个产品的评价,是正面的还是负面的。
这里的做法是,把要分类的一段文字在前面放一个初始的词元,后面加一个抽取的词元(extract),然后做成一个序列,序列放进transformer的解码器里,然后模型对最后一个词抽取的特征放进一个线性层里,线性层投影到要标号的空间,比如说要做10分类,线性层输出大小为10,在训练的时候,对每一个文本和标号对,把文本变成上图所示的序列,然后标号发放在线性层后面参加训练,在预测的时候,只拿到序列的信息,直接做预测即可。
与之前语言模型有一点区别,线性层是新加的,在微调的时候,重新构造了一个新的线性层,里面的全都可能是随机初始化的,它输出的大小和标号的大小是一致的
第二类是蕴含,就是给定一段话,再问一个假设,然后看前面这段话,有没有蕴含假设提出来的东西。例如:a送给b一束玫瑰,假设是a喜欢b,那么我前面这句话是支持这个假设的,若假设是a讨厌b,那么前面这段话是不支持这个假设的,这个假设就不成立;若假设是a和b是邻居,那么可以说前面这个假设既不支持也支持。
所以这个就是三分类的问题,给定两段文本,然后做一个三分类的问题,在表达的时候就是把这两个文本串成一个长的序列,
GPT2:Language Models are Unsupervised Multitask Learners
做了一个新的百万级别的数据集webtext,比之前的wikipedia和bookscorpus更大。提出zero-shot的设定。
现在一个主流的途径就是对一个任务收集一个数据集,然后再在上面训练好的模型做预测,因为现在模型的泛化性不是很好,在一个数据集上训练好的模型很难直接用到下一个模型上面。
多任务学习:在训练一个模型的时候,同时看多个数据集,而且可能会通过多一个损失函数,来达到一个模型能够在多个任务上都可以使用。
GPT-2还是做语言模型,但是在做到下游任务的时候,会用到zero-shot的设定,zero-shot是说在做到下游的任务的时候,不需要下游任务的任何标注信息,也不需要训练我的模型,好处是,只要训练一个模型在任何地方都能用。
在GPT的时候,预训练语言模型时,是在自然的文本上训练的,但在下游任务时对输入进行了改造,加入了开始符、结束符和分隔符,这些符号模型在之前并不知道,但是因为有微调的环节,所以模型会认识这些符号。
现在要做zero-shot的问题是:在做下游任务的时候,模型不能被调整,若引入之前模型没有见过的符号的话,模型并不认识,所以在构造下游任务的输入时,不能引入模型没有见过的符号,而是要使得整个下游任务的输入,跟之前预训练的输入文本一样。
例子:
机器翻译:若想把英语翻译成法语,可以把句子表达成这个形式(translate to French(作用:特殊的分隔词),英语文本,法语文本)
阅读理解:(answer the question(设计的提示),文章,问题,答案)
GPT3:Language Models are Few-Shot Learners
GPT 3尝试解决GPT2的有效性,所以又回到了GPT一开始考虑的few-shot的设定,即不再去追求极致的零样本,在一个子任务上不给任何样例。
摘要:
训练了一个自回归模型GPT3,有1750亿个可学习的参数,比之前所有非稀疏的模型(稀疏的模型是说整个权重可以是稀疏的,里面有大量的0,但如果模型有很多0的话,把0算进去,模型也算是特别大)不同,不会存在很多0,
因为成本太高,所以GPT3在作用在子任务的时候,不做任何的梯度更新或者微调,就算是在零样本的情况下,给定一些样本,GPT3也不是用微调,因为微调总是去算梯度,那么大的模型,算梯度是非常困难的事情,GPT3不需要做任何的梯度更新,也是其一大特点
GPT3能生成一些新闻类的文章,而且人类读起来是很难区分的
GPT2与GPT的不同:把normalization放到前面,可以反转的词元。
GPT2与GPT3区别:把sparse transformer里面的改动拿出来,设计了8个不同大小的模型,
有正反例,去掉相似的数据集
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。