GPT系列:GPT, GPT-2, GPT-3精简总结 (模型结构+训练范式+实验)

时间:2024-10-28 07:16:19

???? 花一个小时快速跟着 人生导师-李沐 过了一遍GPT, GPT-2, GPT-3。下面精简地总结了GPT系列的模型结构+训练范式+实验,并补充了一些视频里没有的细节,方便大家学习。
⭐ GPT很简单,看完这篇包你懂。

文章目录

  • 1、GPT
    • 1.1、模型结构:
    • 1.2、范式:预训练 + finetune
    • 1.3、实验部分:
  • 2、GPT-2
    • 2.1、模型结构
    • 2.2、范式:预训练 + zero-shot
      • zero-shot, one-shot, few-shot的区别:
    • 2.3、实验
    • 2.4、与GPT-1的区别
  • 3、GPT-3
    • 3.1、模型结构:
    • 3.2、范式:预训练 + few-shot
    • 3.3、实验
    • 3.4、GPT-3局限性
    • 3.5、与GPT-2区别

1、GPT

  • 2018
  • 论文:《Improving Language Understanding by Generative Pre-Training》, OpenAI

1.1、模型结构:

GPT基于transformer的decoder结构,原transformer的decoder包含2个attention:cross-attention(k,v来自encoder,q来自decoder),mask multi-head attention。gpt只用了mask multi-head attention。

在这里插入图片描述

1.2、范式:预训练 + finetune

也是自监督预训练 (语言模型)+微调的范式。

  • 预训练:用的是标准的语言模型的目标函数,即似然函数,根据前k个词预测下一个词的概率。
    在这里插入图片描述

  • 微调:用的是完整的输入序列+标签。目标函数=有监督的目标函数+λ*无监督的目标函数。
    在这里插入图片描述

  • 改变输入形式【通过在序列前后添加 [Start] 和 [Extract] 特殊标识符来表示开始和结束,序列之间添加必要的 [Delim] 标识符来表示分隔】,接上对应下游任务的层,就可实现不同下游任务。【注:利用最后一层的最后一个token的输出,接下游层即可完成各类任务】。

  • 特别地,大家可能会有个疑问点,且大多数人都不知道,gpt是如何实现生成任务(decode阶段,非训练阶段)的呢?我去看了一下gpt2的源码

⭐ 第一步:它是将整个序列输入gpt,然后取最后一层的最后一个token的输出作为下一轮的输入,同时保存这一轮中所有12层的k, v向量。
⭐ 第二步:单个token输入后,得到它的q, k, v向量,k,v向量更新(和上一轮的k,v向量在seq_len维度上拼接),然后进行注意力计算,同时保存这一轮中所有12层的k, v向量。【这就是past_key_values机制,实际上,在目前大多数可用于进行文本生成任务的预训练模型中,都存在past_key_values机制,比如Google的T5模型、Facebook的Bart模型等,因此理解了past_key_values机制,对于理解T5、Bart等模型也会有帮助。】
在GPT的生成过程中,每一轮的输入是单个token,而不是整个已经生成的文本序列。这是因为GPT使用了past_key_values机制,可以在每一轮生成时,将之前已经生成的文本序列的信息编码到past_key_values中(即k,v向量中。)。
⭐ 第三步:此时,相当于输入gpt的只有一个token了,所以从第二步开始,后面每次的输入都是只有一个token,由于k,v向量每一轮都在更新,所以每一轮k,v向量长度会加1。

past_key_values机制为何只保存了k,v?
在这里插入图片描述

????总而言之,一句话:past_key_values机制是为了不重复计算已生成过的序列,高效~

1.3、实验部分:

  • 使用BookCorpus数据集训练,包括7000篇未发表的书
  • 模型使用12层trm的解码器,每层维度768

2、GPT-2

  • 2019
  • 《Language Models are Unsupervised Multitask Learners》, OpenAI

2.1、模型结构

  • GPT-2也是基于transformer的decoder结构。但和gpt1有所区别,区别在于layer-norm的位置有所调整【左图为gpt1, 右图为gpt2】,也就是将layer-nore放在了每个残差块的里面即输入位置。反正呢,这样的操作在实验中证明是为了减少预训练过程中各层之间的方差变化,使梯度更加稳定。
    在这里插入图片描述

  • 输入序列的最大长度从 512 扩充到 1024。

2.2、范式:预训练 + zero-shot

  • GPT-2可以在zero-shot设定下实现下游任务,即不需要用有标签的数据再微调训练。
  • 为实现zero-shot,下游任务的输入就不能像GPT那样在构造输入时加入开始、中间和结束的特殊字符,这些是模型在预训练时没有见过的,而是应该和预训练模型看到的文本一样,更像一个自然语言。
  • 可以通过做prompt的方式来zero-shot。例如机器翻译和阅读理解,可以把输入构造成,“请将下面的一段英语翻译成法语,英语,法语”。
  • 为何zero-shot这种方式是有效的呢?从一个尽可能大且多样化的数据集中一定能收集到不同领域不同任务相关的自然语言描述示例,数据集里就存在展示了这些prompt示例,所以训练出来就自然而然有一定zero-shot的能力了。

zero-shot, one-shot, few-shot的区别:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.3、实验

  • 数据从Reddit中爬取出来的优质文档,共800万个文档,40GB。
  • GPT-2参数量1.5B,15亿。
  • 模型越大,效果越好。
  • 所以考虑用更多的数据,做更大的模型,于是GPT-3应运而生。

2.4、与GPT-1的区别

  • 1、模型结构上,layer-norm的位置有所调整;参数初始化的方式有所改变。
  • 2、gpt2主推zero-shot, 而gpt1主推pre-train+finetune;
  • 3、数据量加大,gpt2(40G), gpt1(5G);
  • 4、gpt2最大模型为15亿参数,gpt1最大模型为1亿参数。

3、GPT-3

  • 2020

  • 《Language Models are Few-Shot Learners》, OpenAI

  • GPT-2虽然提出zero-shot,比bert有新意,但是有效性方面不佳。GPT-3考虑few-shot,用少量文本提升有效性。

  • 总结:GPT-3大力出奇迹!

3.1、模型结构:

  • GPT基于transformer的decoder结构。
  • GPT-3模型和GPT-2一样,但GPT-3应用了Sparse Transformer中的attention结构。
    在这里插入图片描述

sparse attention 与传统 self-attention(称为 dense attention) 的区别在于:

  • dense attention:每个 token 之间两两计算 attention,复杂度 O(n²)
  • sparse attention:每个 token 只与其他 token 的一个子集计算 attention,复杂度 O(n*logn)

sparse attention 除了相对距离不超过 k 以及相对距离为 k,2k,3k,… 的 token,其他所有 token 的注意力都设为 0,如下图所示:

使用 sparse attention 的好处主要有以下两点:

  1. 减少注意力层的计算复杂度,节约显存和耗时,从而能够处理更长的输入序列;

  2. 具有“局部紧密相关和远程稀疏相关”的特性,对于距离较近的上下文关注更多,对于距离较远的上下文关注较少;

关于 sparse attention 详情可参考《Generating Long Sequences with Sparse Transformers》。

3.2、范式:预训练 + few-shot

论文尝试了如下下游任务的评估方法:few-shot learning(10-100个小样本);one-shot learning(1个样本);zero-shot(0个样本);其中few-shot效果最佳。

  • fine-tuning:预训练 + 训练样本计算loss更新梯度,然后预测。会更新模型参数
  • zero-shot:预训练 + task description + prompt,直接预测。不更新模型参数
  • one-shot:预训练 + task description + example + prompt,预测。不更新模型参数
  • few-shot(又称为in-context learning):预训练 + task description + examples + prompt,预测。不更新模型参数

3.3、实验

  • GPT-3参数量1750亿。
  • 爬取一部分低质量的Common Crawl作为负例,高质量的Reddit作为正例,用逻辑回归做二分类,判断质量好坏。接下来用分类器对所有Common Crawl进行预测,过滤掉负类的数据,留下正类的数据;去重,利用LSH算法(用于判断两个集合的相似度,经常用于信息检索);
  • 加入之前gpt,gpt-2,bert中使用的高质量的数据

3.4、GPT-3局限性

  • 1、生成长文本依旧困难,比如写小说,可能还是会重复;
  • 2、语言模型只能看到前面的信息;
  • 3、预训练语言模型的通病,在训练时,语料中所有的词都被同等看待,对于一些虚词或无意义的词同样需要花费很多计算量去学习,无法区分学习重点;
  • 4、只有文本信息,缺乏多模态;
  • 5、样本有效性不够;
  • 6、模型是从头开始学习到了知识,还是只是记住了一些相似任务,这一点不明确;
  • 7、可解释性弱,模型是怎么决策的,其中哪些权重起到决定作用?
  • 8、负面影响:可能会生成假新闻;可能有一定的性别、地区及种族歧视

3.5、与GPT-2区别

  • 1、模型结构上来看,在gpt2的基础上,将attention改为了sparse attention。
  • 2、效果上远超gpt2,生成的内容更为真实。
  • 3、gpt3主推few-shot,而gpt2主推zero-shot。
  • 4、数据量远大于gpt2:gpt3(45T,清洗后570G),gpt2(40G)。
  • 5、gpt3最大模型参数为1750亿,gpt2最大为15亿。