GPT的发展历程及训练困难

释放双眼,带上耳机,听听看~!
探讨GPT的发展历程,训练困难以及技术应用,从GPT到ChatGPT,对AI技术和NLP领域的影响

本文改自我的某课程作业报告,尤其参考了 跟李沐学AI 的系列视频,在此表示由衷感激
鉴于本人的知识水平,此文可能有谬误或不严谨之处,如有发现,敬请指正

前言

去年 12 月,ChatGPT 火遍全网,其优异的对话能力和广泛的应用能力让人惊叹。不知为何,最近它又一次广泛传播起来。秉持着蹭个热度的态度,我把这篇文章尝试发到了掘金上。在这篇文章中,我们将从 ChatGPT 往回看,回顾 GPT 的发展历程,看看这一神奇技术背后的变迁历史。

鉴于截至目前,ChatGPT 论文尚未发表,本文内容将包含 GPT、GPT-2、GPT-3 以及 InstructGPT。

GPT

GPT 提出于 2018 年 6 月,彼时,据大名鼎鼎的 Transformer 论文发表正好接近一周年。在 GPT 论文的摘要里,作者指出,目前的 NLP 领域中存在大量无标记的数据,其数量远远大于有标记的数据。因此,作者提出了 GPT,一种基于 Transformer 的语言模型,其目的是利用大量无标记数据来预训练语言模型(Generative Pre-Training),之后在目标任务上做微调,从而完成对应的任务。GPT 的核心思想是,通过 Transformer 的解码器来学习上下文信息,通过 Transformer 的解码器来生成下一个词。在训练过程中,GPT 通过最大化下一个词的概率来学习语言模型。

困难

相较于之前的模型,GPT 在训练时面临着两个主要困难:一是因为 NLP 任务的多样性,损失函数很难选择。尽管有多种现有的目标函数可以选择,但它们在不同的任务上的表现有很大的差异性,难以被用在这样一个更宽泛的任务中;二是不同的任务对于文本有不同的表示,如何把同一个文本表示用于最终的子任务中也成了值得思考的事情。 对于上述的两个困难,作者均尝试找到了相应的解决方式:对于目标函数,作者将其分为了两个部分,综合后做最终结果;而对于不同任务,作者通过加入“起始/结尾/抽取”符号来把文本构造成相对统一的形式,以此使得模型可以更好的泛化。

训练

GPT 的模型是基于 Transformer 构建的,有趣的是,可能因为当时 Transformer 尚未被广泛使用,作者还单独解释了为什么要选择它而不是传统的 RNN 系列模型。作者发现,相较于 RNN,Transformer 模型所学到的内容更具有鲁棒性,能够更好的抽取出句子和段落中的语义信息。

损失函数

正如上文已提到过的,GPT 的损失函数为两部分,具体包括无监督预训练和有监督微调。

无监督的预训练

对于给定的无标注数据,我们按词将其分为 u1,u2,…,unu_1, u_2, …, u_n,n 为总词数。我们可以训练一个语言模型,对参数进行最大似然估计,如下:

L1(U)=∑ilog⁡P(ui∣u1,…,uk−1;Θ)L_1(U)=∑_ilog P(u_i|u_1,…,u_{k−1};Θ)

式中,P 为条件概率,k 为窗口的大小。对于上面的式子,我们给定 u1,u2,…,uk−1u_1, u_2, …, u_{k-1} 和模型,尝试去预测第 k 个词出现的概率。把这个过程重复,并将得到的概率的对数相加(取对数后概率本身就相乘,也就是联合概率),就可以得到第一个目标函数。

具体到 GPT 上,作者使用了 Transformer 的解码器来做模型。相较于编码器能够看到所有的文本,解码器由于 Mask 的存在,导致仅能看到预测词及之前的输入,与文本预测的任务相契合。

有监督的微调

预训练之后,我们还需要针对特定任务做微调。在这里,给定文本序列 x1,x2,…,xmx^1,x^2,…,x^m 和标签 yy ,我们构造:

P(y∣x1,…,xm)=softmax(hlmWy)L2(C)=∑x,ylog⁡P(y∣x1,..,xm)P(y|x^1,…,x^m)=softmax(h_l^mW_y) L_2(C)=sumlimits_{x,y}log P(y|x^1,..,x^m)

我们把 x1,x2,…,xmx^1,x^2,…,x^m 输入 Transformer 模型,得到最上层最后一个时刻的输出 hlmh_l^m ,将其通过 Softmax 层(参数为 WyW_y )进行分类,最后用交叉熵计算损失,而这也等价于最大似然 L2L_2

作者说,尽管我们其实只关心分类精度,不过如果把 L1L_1 也放进来,效果也很好。这也能提高训练速度和模型的泛化能力。因此,作者使用了 Multi-Task Learning,在微调的时候也考虑预训练的损失函数,让它同时最大似然 L1 和 L2。这就是最终的目标函数:

L3(C)=L2(C)+λ∗L1(C)L_3(C)=L_2(C)+lambda*L_1(C)

这里使用的 L1 还是之前语言模型的损失,不过使用的数据不是前面无监督的数据 U ,而是使用当前任务的数据 C ,而且只使用其中的 X ,而不需要标签 y。

不同任务的统一表示

损失函数有了,接下来就是第二个困难:把不同子任务的输入表示为同样的形式。作者很巧妙的通过插入分隔符完成了这一任务,如下图所示:

GPT的发展历程及训练困难

上图给出了 NLP 任务中常见的四种形式:分类、蕴含、计算相似度和多选一,并展示了如何把它们构造成类似的形式。比如对于计算相似度的任务,输入就被表示为两个对称的序列,分别通过 Transformer 后将结果相和送入到线性层中,得到最终的输出结果。

实验

数据集

GPT 训练所用的数据集被称为 BooksCorpus,这是一个包含 7000 篇未发表的、不同领域的书籍构成的数据集。

模型

GPT 使用了 12 层的 Transformer 的解码器,每一层的维度为 768。

结果

GPT 在推理、问题回答、语义相似度、分类等多种任务上均取得了很好的成绩,在多个数据集的多项结果上均取得了最高的精度。

作者还研究了传递不同数量的无监督层到后面的微调层对最终结果的影响,并在最后尝试探讨了 Zero-Shot 下模型的表现。这也引出了之后的 GPT-2。

GPT-2

GPT-2 发布于 2019 年 2 月,而夹在它与 GPT 之间的,还有一项重要的成果:BERT。有趣的是,如果看 BERTBASEBERT_{BASE} 模型的结构,会发现它与 GPT 有几分相像:解码器换成了编码器,而层数和维度均与 GPT 设置的相同;而对于更大的 BERTLARGEBERT_{LARGE} 模型,它的模型层数相对于 BERTBASEBERT_{BASE} 翻倍、维度变成了它的 1.3 倍,最终总参数达到了前者的约 3 倍——而它的训练数据集则达到了 GPT 的 4 倍。在这样“大力出奇迹”的比较下,BERT 取得了超过了 GPT 的成绩,这也让 GPT-2 在这一方面更进一步。

变化

相较于 GPT,GPT-2 主要有下面的变化:

  • 大: 训练所用的数据集和模型都更大了。
  • Zero-Shot: GPT-2 对下游任务使用 Zero-Shot,而不是 GPT 的有监督学习
  • Prompt: 对于样本的处理不再使用分隔符来统一表示,而是直接使用类似自然语言形式,即 Prompt

下面分别从这三方面做讲述。

数据集

谈到数据集,作者说,前面的研究所使用的材料包括新闻、维基百科、小说等,而要构造更大的数据集,则需要向另外的方向想办法。在这里,作者使用 Common Crawl 项目所爬取的网站,并且依据 Reddit(新闻聚合网页,由用户提交并由他人通过 “karma” 的形式来判断内容的优质程度)上 “karma” 大于等于 3 的标准进行爬取,最后得到了大约 4500 万个网页,抽取它们的内容得到最后的数据集。最后,数据集大概包含了 800 万个文本,大小达到了 40 GB。

模型

GPT-2 的模型在结构上基本类似于 GPT,不过在一些小的地方做了更改,添加了类似于残差网络中的 Layer Normalization。相较于前一代,GPT-2 的主要区别就在于模型更大了。作者训练的 4 种模型如下表:

GPT的发展历程及训练困难

可以看到,最大的模型中层数已经达到了 48 层,宽度也到了 1600,总参数更是达到了 15 亿之多。

Zero-Shot

之前的模型(比如 GPT)对下游任务需要使用有标注数据集做微调,这带来了两个问题:一是对不同的下游任务,重新训练不可缺少;二是有标号的数据集收集起来较无标注的会难很多。GPT-2 在下游任务中直接去掉了微调的过程,而是使用预训练模型来完成任务,并且在多项数据上获得了和 GPT、BERT 等近似的结果。

Prompt

由于采用了 Zero-Shot 的方式,GPT-2 并没有像它的前一代一样,使用分隔符统一表示形式——后者因为会出现模型从未见过的符号(分隔符),可能会影响模型的效果。相反,作者使用了类似自然语言的形式表示任务,比如,对于一个翻译任务,它可能被表示为:

translate to Chinese, English text, Chinese text

上述例子中的最前面部分(translate to Chinese)即表示此任务的大概提示,在后面的文献中被称为 Prompt。

作者也花了部分篇幅讨论这样的 Prompt 有效的原因。他说,一是如果模型足够强大,它应该能够理解 Prompt 并正确给出结果;二是这样的表示本身也在数据集中有类似的例子,模型能够学习到。

实验

论文对 GPT-2 进行了许多不分方向的实验,包括 Children’s Book Test、LAMBADA、Winograd Schema Challenge、Reading Comprehension、Summarization、Translation 等多种子任务。结果表明了 GPT-2 优秀的通用性,在多项测试中均取得了良好的成绩。在附录中,论文还给出了大量样例,清晰的展示出 GPT-2 生成的效果。

讨论

尽管 GPT-2 在许多任务上表现不俗,作者也指出,它在很多其他任务上也仍有很大的进步空间,Zero-Shot 的实际表现还不足以用到实际的生产中。即使在一些他们已经评估过的项目中,GPT-2 也只有在特定情况下才能达到基线水平。

Zero-Shot 的方法虽然展示了 GPT-2 的基础水平,但倘若加上微调,它的天花板目前仍未可知。作者在最后说,他们准备探讨在某些数据集上微调后的表现,以期解决一些 BERT 中存在着的问题。而下一步,就是 GPT-3。

GPT-3

使用 Zero-Shot 的 GPT-2 在有效性上略有欠缺,而 GPT-3 则又再次转回了类似 GPT 的策略,只是使用 Few-Shot ,即给样本但控制数量。同时,GPT-3 延续了“做大做强”的态度,再一次拉高了模型的参数,达到了最大 1750 亿的程度;也因为这样庞大的参数数量,GPT-3 在微调时并不更新模型参数(也就是不计算梯度),以降低整个训练过程的复杂度。

从结果来看,GPT-3 在许多 NLP 数据集上都取得了优异的结果,展现出了强大的能力;它甚至能用来撰写一些虚假的文章,并使得人类都难以区分它们是由 AI 还是真人完成。

问题

论文列举了三点当前 NLP 模型中遇到的问题:一是许多领域难以收集大量有标注的数据;二是较大的模型不一定就在某些范围外数据集上表现好,它们之所以在某些任务上表现得比较好,有可能是因为训练的数据集与测试集有一定重合性;三是人类并不需要大量的有监督数据来学习,一些简短的提示和示例就可能达到效果。

Few-Shot

针对上面的问题,GPT-3 使用了 Few-Shot 的模式。论文中有一张图很好地解释了 Few-Shot、One Shot 和 Zero-Shot 间的区别,如下:

GPT的发展历程及训练困难

如上图,Zero-Shot 在任务描述和 Prompt 之间没有任何样例,而 One-Shot 有一条,Few-Shot 有多条(但并不大量)。

模型

GPT-3 的基本结构类似于 GPT-2,但将其做了类似于 Sparse Transformer 的改动。类似于 GPT-2,GPT-3 也有多个版本的模型,它们有着不同的层数和总参数。如下表所示:

GPT的发展历程及训练困难

如上,GPT-3 的模型从 12 层一直到最大的 96 层,模型深度从 768 到 12288,总参数更是从 1.25 亿飙升至 1750 亿,足足比 GPT-2 大了 100 倍!

训练数据

由于模型的庞大,GPT-3 的数据集也相应的十分庞大。作者在 Common Crawl 数据的基础上,首先过滤出和另一个高质量数据集(也就是 GPT-2 过滤过的数据集)相似的数据,并将相似度较高的文章做去重,最后再加上之前已有的高质量数据集,得到了最终的数据集。

实验

GPT-3 的论文使用了大量篇幅描述不同实验和结果,简而言之,在许多任务上,GPT-3 取得了高于其他所有模型的结果,甚至在某些结果上已经十分接近人类。类似于 GPT-2,模型越大,其各项结果就越好。作者还展示了一些由 GPT-3 生成的文本,在阅读时已经能明显的感受到其流畅度与可读性。

事实上,由于 GPT-3 的出色水平,在其开放 API 后,依托其产生的应用就层出不穷,从作诗、问答、写代码,GPT-3 带来了大范围的应用开发与社会讨论度。我也是从这时候开始了解到 GPT 系列的存在的。

局限

在文章最后,作者也列出了不少 GPT-3 存在的局限性。部分如下所示:

  • 长文本生成较弱,上下文无法做到连续
  • 预测词时权重均衡,即对于不重要的助词和重要的关键词没法做区分
  • 仅学习文本资料,缺少视频资料和真实的物理交互
  • 低效。GPT-3 的预训练文本远远大于人类学习所需要的样本
  • 无法解释性

最后,作者也讨论了更深远的影响。作者指出,GPT-3 可能被用于生成虚假消息、垃圾邮件、论文造价等非法行为,而且由于语料库中资料的问题,GPT-3 在诸如性别、种族、地域等问题上会有一定程度的歧视。最后,由于 GPT-3 巨大的模型,其训练带来的能耗问题也不容小觑。

InstructGPT

正如上面已经提到的,单纯把模型变大并不能让它们真正符合用户的预期,模型可能会生成虚假、有毒或者无用的结果。因此,InstructGPT 使用人类的反馈来使模型和人类的意图对齐。在最终结果上,作者发现,在人类评判下,13 亿参数的 InstructGPT 甚至要好于 1750 亿参数的 GPT-3。它生成的结果更真实可行、有毒结果更少,并且在公开 NLP 数据集上也没有性能上的显著下降。

训练过程

InstructGPT 的训练大概分为三个阶段,如下所示:

GPT的发展历程及训练困难

步骤一

在问题(Prompt)数据集中随机抽取一条(比如“向一个 6 岁小孩解释什么是 NLP”),让标注员针对这一问题写下答案,并将得到的数据用于 GPT-3 的微调当中,得到模型 SFT。

步骤二

对于一个 Prompt,让模型生成多个答案,然后让标注员针对生成的答案由好到坏排序,使用这些数据训练一个模型 RM,使得它能够对它们打分,并且打分后的排序符合人类评判的排序。

具体来说,RM 模型的结构是在 GPT-3 的基础上去掉最后的 Unembedding Layer,并加上线性层得到的,使用的模型参数量为 60 亿(减少计算量,而且作者发现 1750 亿的模型不稳定)。

为了使排序正确,RM 使用 Pairwise Ranking Loss 作为损失函数,并使用 K = 9 进行两两比较,总共 36 对。

步骤三

微调模型 SFT,当它生成新的答案时,使用 RM 模型对其打分,结果会用于优化 STF 的参数,使得最终的得分升高。

数据集

训练初始模型时用到的 Prompt 来自三个方面:标注人员编写的任意任务、标注人员编写的指令和多个问答对、用户希冀的应用场景相关 Prompt。在初步训练出第一个 InstructGPT 后,OpenAI 将其放在了网页的 Playground 上,收集用户的问题并按一定规则做筛选,得到了更多的 Prompt。

收集到的 Prompt 被分为了 3 个数据集,分别用于训练 SFT、RM 和 PPO,训练集大小分别为 13k、33k 和 31k。

结果

总的来说,InstructGPT 的结果在许多方面优于 GPT-3,具体如下:

  • 研究人员显著地倾向于 InstructGPT 生成的文本
  • InstructGPT 在结果的真实性上好于 GPT-3
  • InstructGPT 相较 GPT-3 更不容易输出有毒的结果,但是在偏见上没有提升
  • 未参与数据标注的人员也认为 InstructGPT 的结果更好
  • InstructGPT 显示出了良好的泛化性,比如在“代码解释”这一任务上表现良好

不过,InstructGPT 仍然会犯一些简单的错误,比如错误执行指令、编造事实、给出不确定的答案等。

局限

论文作者也指出了一些模型的局限性。首先是方法上,因为整个数据的标注人员为 OpenAI 合作的 40 名人员,和真实的用户上还是存在一定差异(比如 90% 以上的标注语言为英文,因此在其他语言上可能就相对较弱);其次是模型也并非完全的与人类意愿对齐、也可能会产生有毒的或者错误的数据,在某些问题上还持有歧视的态度。

总结

总的来说,GPT 作为一系列模型,在 Transformer 的基础上做改进,通过不同的微调形式和庞大的数据集,逐步发展壮大,获得了愈来愈令人惊讶的结果。GPT 1 -> 3 的发展让人感受到了“做大做强”的暴力美学,而 InstructGPT 又让大家看到了“质大于量”的效果。目前,ChatGPT 蓬勃发展、火速出圈,微软甚至已经开始将 GPT-4 集成于 Bing 中,为下一代搜索引擎探出了新的一步。作为一名普通的 ChatGPT 用户,一名深受 Copilot 帮助的 Coder,我对 GPT 的未来充满期待,更对 AI 的未来充满期待。从 AlexNet 到如今,短短 10 年,深度学习的技术已是日新月异;我很好奇,下一个十年后,这些神经网络编织成的复杂模型会构造出怎样令人惊奇的旷世之作。

参考资料

[1] Radford A, Narasimhan K, Salimans T, et al. Improving language understanding by generative pre-training[J]. 2018.

[2] Radford A, Wu J, Child R, et al. Language models are unsupervised multitask learners[J]. OpenAI blog, 2019, 1(8): 9.

[3] Brown T B , Mann B , Ryder N , et al. Language Models are Few-Shot Learners[J]. 2020.

[4] Ouyang L, Wu J, Jiang X, et al. Training language models to follow instructions with human feedback[J]. arXiv preprint arXiv:2203.02155, 2022.

上述四篇即为 GPT~InstrcutGPT 对应论文

[5] HeptaAI. ChatGPT内核:InstructGPT,基于反馈指令的PPO强化学习[EB/OL]. (2022-12-07)[2023-01-15]. zhuanlan.zhihu.com/p/589747432.

[6] 跟李沐学AI. 【视频合集】AI论文精读[EB/OL]. (2023-01-12)[2023-01-15]. space.bilibili.com/1567748478/….

[7] 中森. GPT系列论文阅读笔记[EB/OL]. (2022-02-08)[2023-01-15]. zhuanlan.zhihu.com/p/412351920.

[8] yimenren. GPT-1,GPT-2和GPT-3发展历程及核心思想,GTP-4展望[EB/OL]. (2022-01-03)[2023-01-15]. blog.csdn.net/yimenren/ar….

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

基于深度学习的高精度汽车自行车检测识别系统

2023-12-18 3:51:14

AI教程

最新Code LLM数据集发布:The Stack

2023-12-18 5:51:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索