GPT,GPT-2,GPT-3、InstructGPT学习

GPT,GPT-2,GPT-3、InstructGPT学习

ChatGPT

最近朋友圈被chatGPT疯狂刷屏,围绕这GPT系列的技术变革被翻了出来,今天来看看OpenAI的GPT系列。

2020年的时候有一篇博客冲到了 Hacker News的第一名,Hacker News 是在技术圈里面影响力最大的一个新闻汇聚网站,所有人都可以分享自己喜欢的文章,读者可以对这些文章进行点赞或者是评论。Hacker News 根据你点赞的个数和评论来进行排名,这篇文章能排到第一位,意味着大家还是挺喜欢的。

《Feeling unproductive? Maybe you should stop overthinking》标题是说你是不是感觉工作没有状态,也许你就是应该停止想太多。这是一个非常鸡汤的标题。这篇文章篇幅还挺长的,结构也比较清晰,还有配图,很像人类编写的。紧接着这件事上了MIT的技术评论杂志《MIT Technology Review》,这是一个老牌的技术杂志,报道中说一个大学生用AI生成了一篇博客骗过了成千上万人。在过去几年里最出圈的模型应该就是GPT-3了。GPT-3也被大家玩出了新花样,2020年7月份,已经有人利用GPT-3写游戏,完成问答,生成代码。GPT-3来做图灵测试、以及后来GitHub Copilot,可以直接通过注释直接生成代码。再到VScode直接集成chatGPT。

 
 

大家可以在GPT3-Demo上看到更多的应用,最新消息必应要融合GPT-4与chatGPT。应用还有利用GPT-3来写文章,以及近阶段比较流行的图像生成。OpenAI还推出了一个GPT-3的API,使得你可以调用这个模型开发自己应用。

 

GPT的核心是拿Transformer的解码器训练预训练语言模型,子任务在预训练基础上进行微调。Bert拿Transformer的编码器进行训练,对比的是GPT的解码器。

 

原作者吸取了前面的教训,他们收集了一个更大的数据集训练了一个更大的模型GPT-2,模型比BERT-large要大。如果只是简单的训练一个大的模型,那么新颖度肯定是有问题的,所以作者还是沿着自己的技术路线,继续使用transformer的解码器,深入挖掘语言模型的潜力,并且发现非常适合做zero-short。GPT-2的效果并没有那么惊艳,于是一年三个月后,又推出了GPT-3。GPT-3对GPT-2的改进就是数据和模型都大了100倍,做出了炸裂的效果。Bert解决的更多的是效果问题,微调就可以取得效果还不错的结果。而GPT立足解决更大的问题,更难的技术路线,后面也可以看到,他们做了很多的实验,GPT就是沿着自己的技术路线做好预训练。GPT

 

标题是使用通用的预训练来提升语言的理解能力,GPT的来自Generative Pre-Training首字母组合。一作作者Alec Radford,可以在Google Scholar上看到,Alec Radford做了很多方面的研究,DCGAN目前是引用最多的,另外就是PPO这个强化算法,还有其他工作。最后是Ilya即AlexNet的作者二作,后来去了OpenAI担任了CTO。摘要:

 

在自然语言理解里面,有很多不一样的任务,虽然有大量的数据集,但很多没有标注的,在这些数据上训练出好的模型比较难,可用的数据太少了。作者想在未标注的数据先训练预训练模型,在子任务中在训练微调模型,来解决问题。预训练在计算机视觉中8-9年前就已经很成熟了,NLP在这方面还没有取得大的进展,原因是NLP没有大量的标注数据,导致很长一段时间NLP没有大的进展,直到后面的BERT、GPT出来,在未标注数据上预训练迈出了一大步,而后zero-short又在GPT中取得了进展,前几年一直的CV在独领风骚,这几年明显NLP越来越火,同时CV和NLP也是技术相互借鉴,各种技术点都是来回穿插。在微调的时候,构造跟子任务相关的输入,从而使我们只要很少的改变模型的架构就可以。这个在bert出现之前还是比较新颖的。从创新度来讲,GPT的价值要远高于BERT的。导言:

 

导言中提到,怎么更好的利用无监督文本,当时最成功的模型还是词嵌入模型。在使用无标注文本的时候遇到了一些困难:

怎么确定优化目标函数,有一堆文本,选择什么样的损失函数,(语言模型、机器翻译、文本相似性)但是没有发现某一特别好的目标函数在其他任务上表现也比较好。目标函数跟子任务的相关度可能影响子任务的效果。

怎么把学到表示迁移到子任务上

模型是基于Transformer架构的,为啥这里不使用RNN?其实作者对比了Transformer,发现Transformer学到的feature更稳健一些,原因是更结构化的记忆。

架构部分主要讲述了下面三个问题:

1、怎么在没有标注的数据上训练模型

2、怎么进行微调

3、怎么对每个子任务表示我的输入

目标函数是标准的语言模型目标函数:

 
 

其实公式很简单,就是依据前面看到的词,预测第i个词的概率,这里提到一下Transformer中主要有Decoder和Encoder,对比bert选择的编码器,GPT选择了解码器,解码器的特点是,只能看到前面的词,后面的词由于掩码都是0。从任务来看GPT的难度就更高,预测未来当然要比完形填空更难。比如预测明天的股价远比告诉你了今天的股价让你预测昨天的股价要难的多。这也是GPT在效果上比bert要差一些的原因之一。如果GPT真的能对预测做的比较好,比完形填空要强大的多。作者一直不断坚持,把模型做大,才出现了GPT-3的效果,作者选取了更难的技术路线,所以天花板必然更高。

 
 
 

这里的目标函数有两个,一个是预测序列下一个词的目标函数,一个是子任务分类的目标函数。太简单了,这里就不过多赘述了。有监督的微调,NLP里四大常见的应用。分类、包含、相似度计算、多选。

 

从图上可以看出,每次的输入都是有start和extract的标识的,表示开始和要提取的内容,中间还可以用delim进行分割。是拿最后一层的输出对应的transformer的输出,经过线性模型如softmax,完成子任务。

 

实验中还提到,是在BookCorpus的数据集上训练出来的,里面有7000多本未发表的书,模型的结构是12层的transformer的解码器,每一层维度是768。算法中我们一般比较关心两个地方。

多大的模型 模型复杂度

多大的数据集 数据集规模

 

对比BERT-base,12层的layer,每一层768的维度。BERT-large则是24层,宽度是1024,复杂度增加了3倍。BERT是怎么做到的?BERT中提到使用了有20亿个词的Wikipedia的数据集和BookCorpus的数据集,数据上整整大了3倍,在这样的数据集上训练了比GPT大3倍的模型。所以效果会好一些。

 

GPT2当你发现你的工作被别人用更大的模型更大的数据集打败了,如果是我们自己会怎么回应?

标题:语言模型是无监督的多任务学习,一作和大老板都没变。想象场景,用了一个解码器,训练了一个不错的模型,效果不错,结果几个月后被人用编码器和更大的模型更大的数据打败了,要怎么反击?首先不能换解码器,因为已经站好队了,如果换编码器,说明编码器真的好,之前的工作就浪费了,因为一作是解码器,所以这个技术路线不能变,还是要沿着解码器的路线走,怎么反击?更大的模型更大的数据?感觉发paper就没啥意义了,没有创新点。而且变大了,如果效果不好,肯定打脸。这就是GPT-2当时面临的严峻形势。摘要

摘要:首先做了一个新的数据集,数据集是百万级别的文本,相比之前的Wikipedia和BookCorpus,数据集更大了,训练了15亿参数的Transformer,而bert的参数才3.4亿参数,但是很可惜的是在更大的数据更大的模型下,可能对比bert的优势并不大,作者找了另外一个观点叫做zero-short,之前在GPT中也提到过zero-short。导言:现在一个主流的途径就是对一个任务收集数据,然后在上面训练模型做预测。这是因为模型的泛化不是很好,就是一个数据集在一个应用上训练的很好,很难直接用到下一个任务上面。文中提到了一个多任务学习的概念,就是在训练模型的时候,同时看到多个数据集,而且可能会通过多个损失函数来达到一个模型能够在多个任务上都能用的效果。后来出来了BERT、GPT预训练对应的场景,但是还是会存在有两个问题:

对每一个下游任务,得去重新训练模型

也得收集有标注的数据才可以

GPT还是要做语言模型,但是在做下游任务的时候,会用一个叫做Zero-short的设定。在做下游任务的时候,下游任务不需要标注数据,也不要训练我的模型,这样任何地方都可以使用,研究要找新的角度。

bert ->偏向工程落地,解决实际任务

GPT ->偏向研究,从语言本身出发

现在要做zero-short,出现了新的问题,在做下游任务的时候,模型不能被调整了,但是还引入一些模型之前没见过的符号,模型就会感到困惑,所以在这个设定下,我们在构造下游任务的输入时,就不能引入那些模型没有见过的符号,而是要使得整个下游任务的输入跟之前预训练看到的文本一样。也就是说你的输入形式应该更像一个自然的语言。文中给出了两个例子:

机器翻译,如果你想把英语翻译成法语,你可以给出一个实例,首先是根据格式把英语翻译成法语,模型学会了这种模式,在你下次给出英语和等号的时候,就可以翻译成法语。

文中还给出了了一个阅读理解的例子,其实和上面的例子相似,就是让模型学习这种模式。有点给小朋友教学举例子的意思。

作者觉得只要你的模型足够强大,它能理解你那提示符是干什么用的,也有可能在文本里面,这样子的对话场景比较常见,可能本来就出现在训练集里。

数据:构造更大的数据集才可以,找到一个common crawl项目,这个项目主要是一个公开的网页爬取项目,爬取网上的网页,现在这个项目应该到达了TB级别,这是目前能够很方便下载到的最大的一个文本数据集,但是这里的数据不太好用,信噪比比较低,不能标出有效的数据,这里作者就选择了一个大家网上过滤好的一些网页,这里就选用了reddit,reddit是一个美国排名很靠前的新闻聚合网页,他的想法是说每个人可以去提交你感兴趣的一些网页,然后把你分门别类的放到每一个类别下面,接下来reddit的用户就对你投票,喜欢或者不喜欢,然后进行评论,会产生一个karma的指标。这里坐着选取了所有的3个karma值以上的内容。最终得到了4500万链接,然后抽取了文本内容,大概是800万文本,40GB的文本。

有了大量的数据,模型就可以做更大了,作者一共设计了四个模型,第一模型有12层,每一层宽度是768,一共一亿个可学习的变量,来自于BERT或者之前的GPT。

这里可以看到,层数逐渐增大,模型逐渐复杂,最大的模型整整48层,宽度由最初的768变到了1600,得到了15亿参数的模型。

文章后面的对比主要是对比其他zero-short的效果,意义不大,毕竟你用大别人很多倍的模型和数据。虽然比其他模型好,但是一些地方效果还比较差,文中说的比较委婉,使用更大的模型、更大的数据,模型的性能才能够突破。使最终效果跟有监督训练的效果一样,这就是GPT-2留下的有效性问题。

论文的价值=新颖度 * 有效性 * 解决问题的大小 GPT-3:

标题:叫做few-short learner的语言模型。GPT-3要解决的就是GPT-2有效性的问题,又回到了GPT开始考虑的few-short上,不再去追求卷精度,few-short的意思是给你一些样本,样本不会太多,只要你的样本在可控的范围里,这个成本就是非常低的。可以看到一作跑到了后边,都是在做实验。摘要:

我们训练了一个1750亿参数的模型,比之前所有的那些非稀疏的大了10倍,这里为什么要对比非稀疏的模型,是因为稀疏的模型,里面很多0,0都算进模型参数量里也可以非常大,所以对比的是非稀疏的模型。模型已经很大了,那么做子任务的时候,如果需要去训练模型的话,那么成本很高的。所以GPT-3的模型在做子任务的时候不做梯度更新,即使在few-short的情况下,给一些样本,GPT-3也不是用微调,因为微调总是去算梯度的。模型大了,去算梯度代价是很大的。做子任务不再做微调,是为了区分GPT-2,就生成很多文章。这个论文更像是一个技术报告,一般论文很少六七十页。

导言:近些年来,nlp里面大家都使用预训练好的语言模型,然后再做微调,解决下游任务,这其中会有一些问题,每个子任务还是需要一个跟子任务相关的数据集,而且要跟任务相关的微调,具体的列出了三个问题,

需要一个大的数据集需要去标注泛化能力:有个样本没有出现在预训练数据里,模型的泛化性不一定比小模型好,在微调上面效果很好的话,也不能说明预训练模型好,很有可能是过拟合训练数据,这些数据正好与下游任务的数据有一定的重合。

对比人类:人类不需要太多的文本就可以做一个任务,而模型需要很多数据

GPT,GPT-2,GPT-3、InstructGPT学习

面对这些要解决这些问题,作者提出了解决办法,称之为meta-learning

meta-learning 真的训练大的模型,效果还不错,泛化能力还不错上下文的学习 应用不需要告诉样本,也能学到不错的效果

这里又重新说了一下promt,其实跟GPT-2中讲到的一样,可以学到语言里这种内在的模式。

这里是效果对比图,把1.3B变成175B,效果飞升啊,这里主要看到的是模型大小和准确率的关系图。

这里给出了zero-short、one-short、few-short,其实就是不给样本、给一条样本和给出几条样本。具体原理跟之前讲到的一样,这些样本是不参与训练模型的、模型是不计算梯度的。作者希望的是模型在做前向推理的时候,能够通过注意力机制,去处理比较长的序列信息,从而抽取出来有用信息,能够帮助做下面的事情,这就是文中说到的上下文的学习。可以理解为模型已经学到了知识,你只需要按照描述或者引导告诉模型你需要什么。

设计了8个不同大小的模型,每一行表示一个模型,层数、维度的增加构建了大的模型,层数增加了,宽度也应该增加,我们知道计算的复杂度跟宽度是平方关系,跟层数是线性关系,这样可以快速造出要学习的参数量,最后一个模型每批是320 万样本,这个一般的电脑是没办法处理的。那么大的数据需要更多的数据才可以。所以GPT-3的学习是非常耗成本的。

数据:训练数据是基于common crawl 的数据,考虑到common crawl里的数据质量低,用起来比较困难,文中采用了另外一个办法。

common crawl样本为负,reddit为正,训练分类模型,预测为正的则放到训练集里

里面存在大量重复的内容,文中根据局部敏感哈希,把相似度高的文本去掉

加入已知高质量的数据集,比如之前GPT-2中使用的数据

分布式训练,分为数据和模型两方面:

模型分割数据分割

文中提到的是使用的V100训练模型,实际使用的是DGX-1,带宽是非常高的。效果评估:

true false

Beamsearch bleu

评估也都是常用的评估方法。

最后提到了模型局限性:

文本生成上面:写长篇幅的内容,能力还不足,比如说写部小说,中间缺少剧情的推进。

在一些结构和算法上的局限性,这是一个语言模型,不能向BERT一样可以双向都可以看到。

不能告诉你哪些词比较重要,比如考试划重点等,模型很难给出。

模型很大,但是怎么样得到你输入的哪些权重真的起到了作用,很难给出结果。

GPT-3可能的一些影响:

安全性:团队是有社会责任感的,提出了安全方面。比如论文造假。

性别歧视:比如女士更容易出现beautiful,是否更关注女性的外表偏见性:

种族问题:文中图表显示,对黑人的问题最严重,亚洲人反而还可以宗教问题

GPT-3能耗比较高,文中说训练了1750亿参数,可谓是暴力出奇迹。

InstructGPT

ChatGPT目前还没有论文出来,但是官网说chatGPT使用的是跟instructGPT一样的方法。

InstructGPT:

文章发表于2022年3月4号,标题是训练语言模型使得他们能够服从人类的一些指令。也就是希望通过你的描述指令,直接可以进行生成。摘要:还是说把模型变大并不代表说他们会更好的去按照用户的意图来做事,大的语言模型很有可能生成一些不真实、有害的或者一些没有帮助的信息,也就是模型没有和人类站在同一个角度。工业界部署,有效性、安全性,这些都是相当重要的。

2015年谷歌把黑人识别成了猩猩,3年后Gorillas就去掉了,不识别,6年后 facebook又道歉了,黑人加灵长类标签,微软小冰机器人也出现过类似问题,公式分析不准确被吐槽。灵活性好的同时,可控性可能危险后来直接导致了很多应用的下线,这些方面不考虑好,很容易出现大坑。?其实也有chatGPT不实的消息,只是大家对创业型公司容忍度比较高。文中提到怎么将模型和人类的认知拉齐,具体的方法就是 fine tuning with human feedback,就是在人类的反馈上做微调。这里微调用的是human feedback,而不是label的data。

具体的就是在OpenAI API上收集到各种问题,然后用这些标注工具把答案给写出来,这样就标注了一个数据集,在这个数据集上,对GPT-3进行一个微调。这还远远后不够,接下来又收集了一些问题,直接喂给模型,模型输出几种答案,人在给这几种结果进行排序,然后根据强化学习再训练一个模型,这就是instructGPT。文中作者发现1.3B的模型参数好过最大参数的GPT-3(1750亿参数),就是1%大小的模型效果反而更好一些,还发现instructGPT能在真实性、有害性上表现的更好一些,可能在公开的数据集上这种问题更少一些吧。所以学到了这种内在的知识。但是在另外的一些公开数据集上,instructGPT会犯一些错误。

作者团队的目标

helpfulhonest

harmless

这里可以看到作者选用了强化学习,OpenAI其实就是做强化学习出家的,这篇文章里其实几位作者都是做强化学习的。

step1:人类写问题和答案,就有了标注数据,微调GPT-3叫SFT(有监督的微调),这是训练的第一个模型,其实这时候已经可以正常用了,问题是人写答案是很昂贵的,很难把各种各样的答案都写出来,做了第二件事

step2:给问题,让之前训练好的模型给答案(其实就是根据概率采样,beamsearch),模型生成4个答案,让人来标注答案的好坏,根据好坏得分来训练一个排序模型,就是RM模型。

step3:继续调SFT,使他产生的答案尽可能的跟人类的答案一样

如果第一步答案足够多的话,其实是不需要后面过程的,但是考虑到去写一个答案做生成式的标注远远复杂于给答案排序,因为排序属于是判别式的标注。三步后训练而来的,就是instructGPT。模型有一定泛化性,现在看来chatGPT更多的是一个玩具,而不是一个工具,工具的要求:保证你的可用性,正常的地方不能出错。后面主要讲数据是怎么标注来的,以及怎么去除里面的名字信息等。chatGPT尽早的玩起来,也可以得到更多的数据。数据规模:

人写答案:13000条

RM模型:33000条

强化模型:31000条

大家利用他们的API都做了哪些工作,可以看到占比最大的还是生成,然后是问答。我觉得其他并没有太多新颖的地方,还有一个小点就是

这里k=9,之前是k=4,作者发现k=9,对训练计算并不是大量增加的,原因是ranker的损失函数可以每一次计算,都进行存储结果,然后每次计算都直接取出就可以。

这里想起来之前做逻辑回归的时候,sigmod函数定义域是 正负无穷,值域是(0,1),正好可以作为f函数,通过图中观察,怎么简化 ?在(0,1)的值域中x的主要取值为(-6,6)中 ,所以当x不在 (-6,6)内时,可以直接简化0,1返回取值,进一步优化,即使在(-6,6)中的计算复杂度也很高,这时候可以通过的setting bins方式优化,将(-6,6)分为1000个区间段,当x落在区间段内,直接返回计算结果。进一步节省计算资源。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容