大力出奇迹——GPT系列论文学习(GPT,GPT2,GPT3,InstructGPT)

说在前面

最近以GPT系列为代表的大语言模型LLM掀起了一阵热潮,许多人惊叹LLM的震撼能力,因此紧跟时代潮流,学习GPT系列论文,加深自己对LLM的理解。总的来说,GPT整体的模型架构都是以Transformer的解码器为模块进行堆叠而成。主要的新意点集中在模型训练策略,还有就是讲究一个大力出奇迹。以下内容是跟着沐神B站视频以及自己搜寻的一些资料学习并加以总结提炼得来。如有错误,欢迎指正。
B站视频:GPT,GPT-2,GPT-3 论文精读【论文精读】——李沐

1.GPT

论文:“Improving Language Understanding by Generative Pre-Training”,2018.6.

1.1 引言

在自然语言处理领域,有很多各式各样的的任务,如问答,文本分类等。然而,现有的无标签文本非常多,而有标签的文本很少,这使得在这些有标签文本训练一个好的分辨模型很难,因为数据集太少。因此GPT第一个版本主要就是为了解决这个问题而提出的一套针对语言模型的预训练方法,使得大量的无标签数据能够被使用,并且对预训练好的模型加以微调使其适用于许多的下游任务。

1.2 训练范式

无监督预训练+有监督微调

1.2.1 无监督预训练

论文中的描述是下面这段话,简单来说就是根据上文的k个单词,预测下一个最大概率的单词。
在这里插入图片描述

1.2.2 有监督微调

在得到预训练模型后,就使用有标签的数据进行微调。具体来说每一次我给你一个长为m的一个词的序列,然后告诉你这个序列它对应的标号是y,也就是每次给定一个序列预测他这个y。微调优化目标是最小化分类目标函数。
在这里插入图片描述
然后总的损失除了考虑微调损失,还考虑了预训练部分的损失,并用λ加权。
在这里插入图片描述

在这里插入图片描述

1.3 实验

实验主要关注两点。第一点是GPT在一个叫做BooksCorpus 的一个数据集上训练出来的,这个地方有7,000篇没有被发表的书。第二个是GPT整体模型,用了12层的一个Transformer 的解码器,每一层的维度是768。

2. GPT2

论文:Language Models are Unsupervised Multitask Learners,2019

2.1 引言

自从GPT提出后,Google紧随其后提出了BERT预训练模型,采用更大的模型和更大的数据,在各方面效果都要优于GPT。作为竞争对手,GPT当然是要反击的,那怎么做呢?如果单纯加大模型于增加数据量,或许能击败BERT,但是却少了些新意,因此GPT2从另外一个角度,除了加大模型和数据量,还引入了zero-shot设定,就是在做下游任务是,不需要下游任务的任何标签信息,也不需要重新训练一个模型,即在更难的一个设定上体现他的一个新意度。

2.2 模型结构

GPT2也是基于Transformer解码器的架构,作者设计了4种大小的模型,参数结构如下:
在这里插入图片描述
可以看到,最大模型的参数量已经去到了15个亿。还有一个细节就是GPT2调整了transformer解码器结构:将layer normalization放到每个sub-block之前,并在最后一个Self-attention后再增加一个layer normalization。

2.3 训练范式

采用预训练+zero-shot的训练范式。为实现zero-shot,GPT2在做下游任务时,输入就不能像GPT那样在构造输入时加入开始、中间和结束的特殊字符,因为这些特殊字符是模型在预训练时没有见过的。正确的输入应该和预训练模型看到的文本一样,更像一个自然语言。比如在做机器翻译时,直接可以输入“请将下面一段英文翻译成法语,英文文本”,由于在训练时可能已经存在很多这样的翻译文本样例,因此模型就可以实现输出一段法语。

2.4 实验

数据集:Webtext,包含4500w个链接的文本信息,总计800w的文本和40GB的文字。

训练:GPT-2去掉了fine-tuning训练,只保留无监督的预训练阶段,不再针对不同任务分别进行微调建模,而是不定义这个模型应该做什么任务,模型会自动识别出来需要做什么任务。

3.GPT3

论文:Language Models are Few-Shot Learners,2020

3.1引言

GPT2实验采用了zero-shot设定,在新意度上很高,但是有效性却比较低。而GPT3则是尝试解决GPT2的有效性,因此回到了GPT提到的few-shot设置,即模型在做下游任务时,可以看到一些任务的样例,而不是像GPT2那样啥样例都不给。此外,GPT3还是只采用无监督预训练方式,那么传统的二阶段训练方式(预训练+微调)有什么问题?二阶段训练方式在预训练好一个模型后,还需要一个与任务相关的数据集,以及跟任务相关的微调方式。这样的问题一是微调需要一个较大的有标签数据,对于一些如问答型任务,做标签是很困难的;其次就是当一个样本没有出现在数据分布里是,微调模型的泛化能力不一定好,即尽管微调效果好,也不一定说明预训练的模型泛化能力好,因为极有可能微调是过拟合了预训练的训练数据,或者说预训练训练数据和下游任务数据有一定重合性,所以效果会好一点;最后就是以人类角度来阐述为什么不用微调,就是说人类做任务不需要一个很大的数据集进行微调,比如一个人有一定的语言功底,让你去做一个别的事情,可能就是告诉你怎么做并提供几个样例就可以了,GPT3就是采用一样的思想。总的来说,GPT3就是一个参数特别大,效果也很好的一个模型。

3.2 模型结构

GPT3模型架构和GPT2是一致的,只是把transformer换成了Sparse Transformer中的结构,并提出了八种模型结构:
在这里插入图片描述
之所以用大批次是因为这样计算性能好,这样能充分利用机器的并行性,因为批次一大,每台机器的并行度就越高。对于小模型,不采用太大批次是因为小模型更容易过拟合,这样在比较小的一个批次采样数据的噪音会比较多

3.3 训练范式

采用预训练+few-shot的训练范式。复习一下GPT3提到的几个shot:zero-shot,one-shot,few-shot:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
几种训练方式简单概括如下:
1.fine-tuning:预训练 + 微调计算loss更新梯度,然后预测。会更新模型参数
2.zero-shot:预训练 + task description + prompt,直接预测。不更新模型参数
3.one-shot:预训练 + task description + example + prompt,预测。不更新模型参数
4.few-shot:预训练 + task description + examples + prompt,预测。不更新模型参数

3.4 实验

3.4.1数据集

基于common Crawl,做了数据清洗:首先是将common Crawl数据当作负例,将GPT2的数据当作正例,然后在这上面做了个很简单的逻辑回归进行分类,来判定common Crawl哪些数据是好的,如果预测到common Crawl的样例是正例,说明这条数据质量是比较高的;二是做了去重处理,采用lsh算法,可以很快判定两个集合(包含不同文档的单词)的相似性;最后是额外增加已知的一些高质量数据,就是BERT,GPT,GPT2采用的数据集都加进来。
在这里插入图片描述

3.5 局限性

1.生成长文本依旧困难,比如写小说,可能还是会重复;
2.语言模型只能看到前面的信息;
3.语言模型只是根据前面的词均匀预测下一个词,而不知道前面哪个词权重大;
4.只有文本信息,缺乏多模态;
5.样本有效性不够;
6.模型是从头开始学习到了知识,还是只是记住了一些相似任务,这一点不明确;
7.可解释性弱,模型是怎么决策的,其中哪些权重起到决定作用都不好解释
8.负面影响:可能会生成假新闻;可能有一定的性别、地区及种族歧视。

4. InstructGPT

论文:Training language models to follow instructions with human feedback,2022

4.1 引言

把自然语言模型做大并以代表他们可以更好按照用户意图来做事,大语言模型很可能会生成一些不真实的,有毒的或没有帮助的答案,显然GPT3还是没做好的。在工程中安全性,有效性是很重要的,因此提出InstructGPT,使得大语言模型的输出更符合人类意图,主要采用的方法是在人类反馈上做微调。InstructGPT总结来说就是干了两件事:一是雇佣了一批标注工人,去标注一个数据集,然后训练出来了一个模型。二是又做了一个排序的数据集,用强化学习训练了一个模型。惊喜的发现,1.3B的InstructGPT模型要优于175B的GPT3模型。

大语言模型LLM可以通过提示(prompt)的方法把任务作为输入,但是模型仍然会有一些不想要的输出,如捏造事实,生成偏见等。作者的主要观点是LLM的目标函数不是那么准确,就是真正训练的目标函数和根据人类指令安全地和有帮助的生成答案是有区别的。所以InstructGPT的出发点就是想让LLM更有帮助性和安全性。

4.2 方法

在这里插入图片描述
主要分三步走,首先是在GPT3使用人类标注数据进行微调,得到一个模型,叫做SFT,supervised fine-turning(事实上这个模型是可以用的,只不过人类标注的答案有限,不可能把各式各样或者各种任务的答案都考虑,因此有了第二步)。第二步是给定问题,让之前训练好的模型SFT生成多个答案(采用束搜索或者随机采样),然后对答案进行人工排序,得到标注后的排序序列,以此训练一个RM,即reward model奖励模型。第三步就是根据RM结果继续微调第一步的SFT,使得生成的答案得分尽可能高。以此不断强化学习

4.2.1 数据收集

1.让标注人员写一些问题和答案,包含三方面的prompt:
在这里插入图片描述
以这些数据训练了第一个InstructGPT
2. 将第一个InstructGPT发布在一个试玩平台,让用户在上面体验,以此获取用户提出的prompt。然后按用户,每个用户最多筛选200个prompt,以此获取更多的数据。
3.总共构建出三个数据集:一是标注工直接对prompt写答案获得的有标注数据集;二是一个排序的数据集,也就是上面提到的让标注工对SFT输出答案进行排序标注构建的数据;最后一个是ppo数据集供强化学习使用的,这个就无需标签。
在这里插入图片描述

4.2.2 各部分模型

  1. Supervised fine-turning(SFT)
    这部分模型简单来说就是用上述的人工标注数据在GPT3做微调得到的一个模型。作者微调设置了16个epoch,发现会有第一个epoch就过拟合了。但是优于这个模型不是直接拿去用的,二是用于初始化模型,发现过拟合也没什么问题
  2. Reward Model(RM)
    这里主要关心的是奖励怎么算。正常来说,GPT3在最后的输出层会输入softmax输出概率,但是在RM这里就不用softmax层了,而是额外加一个线性层,将输出映射到一个值上面,这个值就是reward。RM模型损失如下,采用的是逻辑回归损失:
    在这里插入图片描述这里的x相当于是prompt,而yw和yl就是模型输出的其中一对答案。其实整个目标就是尽可能使得yw的得分比yl要大,这里就是前面说的答案的一个排序的问题。K论文取9,就是生成九个答案,然后两两计算损失
  3. Reinforcement Learning(RL)
    作者这里采用的是强化学习里的PPO模型,整体的一个目标就是:最大化奖励+预训练目标函数的整体结果:
    在这里插入图片描述
    在这里插入图片描述

4.3 总结

整体来说InstructGPT就干了三件事,分别就对应上面的三个步骤。那么其实InstructGPT还是有一定的限制,比如在构建数据集上,语种的考虑不太全,模型也不是完全的安全的,还是会产生各种问题。文章主要还是提升模型的一个帮助性方面的问题,安全性还是没有太多的解决。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hilbob

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值