GPT系列是openai的工作,但是似乎跟google的transformer和bert影响差距比较大,可能的原因是因为bert在同等大小下效果可能比较好,又或者是因为bert和transformer主要是专精于某一领域,而GPT想要解决更大的问题。
文章链接
GPT:language_understanding_paper.pdf (openai.com)
GPT2:Language Models are Unsupervised Multitask Learners (openai.com)
GPT3:Language Models are Few-Shot Learners
GPT3并不是一篇paper而是一篇技术报告所以比较长,但是其中的核心点并没有文章长度那么长。
GPT
将transformer的解码器提取出来进行使用。
为什么预训练在之前比较少?
因为数据比较少,虽然可能数据条数是相似的,但是图片包含的信息是远远多于一条文本或者一个句子包含的信息的
区别
之前的工作需要对特定的任务进行微调改变模型,现在我们的仅仅需要改变我们的输入。
难点
1.我们不知道使用什么目标,因为我们的任务是不固定的所以使用什么目标函数是一种困难。
2.我们怎么有效的将我们的表示迁移到子任务上面
我们使用类似半监督的方式进行训练
我们为什么使用transformer
我们发现transformer的句子表示更加的稳定,更加适合多种任务的共同使用。其实当时transformer刚出来几个月选择rnn还是transformer并不是那么明显。
模型
没有标号文本做训练
我们的文本是,我们的语言模型是,这里对连乘取了对数变成了连加。是窗口大小。
我们使用的是transformer的解码器,因为有mask的存在导致我们只能看到前边的单词。
输入时单词的嵌入加上位置编码。计算每层的输入和输出。然后使用softmax计算分数。和BERT的区别是能否看到未来的状态,GPT的目标更加难。
微调
我们的模型目的是计算,虽然我们在微调的时候仅仅关注的是文本分类的精度也就是,但是我们发现对于,将预测下个词和对文本进行标号共同预测效果是更好的,也就是
之后我们的难点就变成了如何将多样的NLP任务变成序列和
多种任务表示
1.分类,我们分类评价好坏我们增加一个start和extract
2.蕴含,输入话是否包含我们假设的信息,我们举个例子,A给B一束玫瑰,然后我们的假设是A喜欢B,模型输出假设对、错、或者毫无关系。我们增加start delim extract
3.相似,我们判断文本内容是否相似,因为相似是双向的关系,所以我们输入两个序列也就是调换顺序,同时也增加start delim extract
4.问答,我们构造多个句子,也就是由多少个答案我们输入多少个序列,同时也增加start delim extract。
我们的核心点就是transformer的结构是不进行改变的。
GPT2
因为bert出现,效果远远超过GPT1的效果,所以作者对模型进行了进一步的改进。
作者认为自己的解码器仍然十分好bushi
作者面临的问题是可能我使用了一种非常大的模型,但是效果可能依然没有bert好.
所以文章提出的核心点是zero-shot
摘要
之前的模型大部分都是在监督训练集下进行训练,但是我们证明了在无监督情况下表现效果也可以很好。
在无监督模型下,模型参数大小很重要,参数呈对数对效果产生影响。
介绍
现在大部分的模型具有:监督、大数据集、大模型的特点
我们之前的很多微调模型都是使用多数据集的模型进行的训练,也就是一个工作收集一个数据集。
多任务学习
我们想要模型更具有鲁棒性,也就是不需要什么显示的标记就可以实现需要的功能,也就是同时看多个数据集,拥有多个损失函数,使得模型可以完成多个任务。
之前的工作是对(数据集和训练目标)对进行采样训练
zero-shot
也就是我们的模型在下游训练时不对文本进行标注,在不同的任务不需要对模型进行训练。
一点点分析
因为之前我们引入的是一些分割信息,同时模型是会进行微调的,所以模型会对这些分隔符产生一些需要的输出,但是GPT2并不会下游微调,所以我们不能引入分隔符,因为模型不认识。
方法
对于简单的一般语言建模,我们的模型一般是
对于的单一模型一般是
对于我们的模型需要加入我们需要的任务,也就是
在以前的工作,一般是在模型级别进行修改,也就是对不同的任务使用参数不同的模型处理,现在我们改进成(task,input,output)输入对,也就是(zero——shot)
我们认为对于模型的输出并不需要显式的进行监督,因为对于我们可以简单的假设,因为在监督和不监督是在同一个空间中进行的,所以无监督的全局最小值也是监督的全局最小值。(虽然有点扯淡但似乎很有道理。)然后我们的问题就变成了在当前数据集下我们的这种多任务训练能否收敛的问题。实验证明,我们的假设是正确的,虽然收敛速度会变慢。
数据集
因为我们需要巨大的训练数据,我们可以从网络中找到巨大的训练数据,但是对于数据质量面临着巨大的问题。
一开始分析Common Crawl,但是噪声很难去除。
然后我们分析Reddit,是一个新闻聚合网页,用户可以对信息质量进行评分
我们观察训练数据集,出现了很多任务要求,比如“把下列句子翻译成英文,我爱你,i love you。”这种句子
我们设计了四个不同大小的模型,这并不重要
输入
我们尝试了字节级别的输入,但是发现字节级别的输入效果是弱于单词级别输入的,这在直觉上很容易理解。
字节对输入,这是在单词和字符级别中间的一种有效的插入。但是在实现的时候一般是使用unicode进行编码的。
然而,直接将BPE应用于字节序列会导致合并无法达到最优解,因为BPE使用贪婪算法来构建词汇表。我们发现BPE包含了许多像dog这样的常用的词,因为它们出现在许多变体中,比如dog,dog?dog!,这些其实使用一个dog词就可以很好的表示。为了防止这种情况的出现,我们在每个单词之间加入空格,防止任何两个单词之间词汇合并。
细节
因为模型深度非常大,所以我们使用了对剩余层使用了一种优化技巧,也就是乘以,N是有多少个层。
GPT3
在GPT1我们发现我们仅仅提供少量样本微调就可以进行产生巨大的数量提升,GPT2我们前进一步,也就是我们可以直接使用预训练模型就可以解决下游任务。对于文章的价值,其实是新意度* 效果 *问题大小。
GPT3在下游任务不做任何微调和梯度更新,同时GPT3模型参数十分巨大。其实文章是一篇技术报告。
我们的问题:
1.之前需要对数据需要标注,会产生影响
2.对于训练数据中未包含的数据可能效果比较差(可能并不算一个大问题bushi)
3.人类并不需要很多的学习就可以完成一个新任务
元学习,多任务学习,in—context learning 上下文学习
元学习就类似学习多个任务。
输入
few—shot learning我们提供比较少的样本,特殊情况就是one-shot和zero-shot
zero-shot:从中文翻译成英文:我爱你->
one-shot:从中文翻译成英文:我爱你->i love you ,你爱我->
我们并不对参数更新在测试的时候,我们的目的是使用注意力机制可以注意到前面的例子,这也是我们称为上下文学习的原因。
我们使用了很大的宽度,我们的GPT3是比较扁一点,因为对于深度模型,我们在深度增加,肯定也需要增加宽度。
我们这使用了和facebook不同的结论,我们增加batch_size,但是减小了learning_rating,但是facebook表示需要增大learning rating,为什么?
因为batch越大,梯度越接近真实梯度,所以我们可以使用较大的学习率而不导致抖动
为什么我们最近发现似乎大模型并不会太多过拟合?
我们的大模型可以搜索到较小模型的架构。不过比较玄学bushi
数据集
我们使用类似二分类,也就是将高质量作为正类,将低质量作为负类,如果接近正类我们就保留,接近负类我们就扔掉。
同时我们使用去重
我们的采样概率也是不同的,因为我们尽量采样高质量数据。
局限性
1.对于文本生成是比较困难,虽然它可以很轻松的实现对主题任务的表示,但是对推进剧情比较困难。
2.GPT只能单向观察顺序
3.模型均匀的学习数据和输出,所以浪费太多时间在虚词上,真实中我们并不太关心虚词
4.缺少视频图片各种因素。
5.样本量非常大,但是人类并不需要这种数据。
6.我们是从头学到了这种任务还是记住了这种任务?
7.偏见问题,我们不展开说
8.能耗
分辨
在之前我见过不少有关如何分辨人和GPT文本的判断,似乎是在困惑度来说,人的文本有一个困惑度的突然峰值,而GPT的生成比较均匀平滑,关于困惑度评价生成模型,可以看困惑度。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情