GPT1、GPT2、GPT3原理

GPT-1:无监督学习

GPT-1原理介绍

GPT模型主要包含两个阶段,第一个阶段,先利用大量未标注的语料预训练一个语言模型,接着,在第二个阶段对预训练好的语言模型进行微改,将其迁移到各种有监督的NLP任务,并对参数进行fine-tuning。

预训练模型(无监督)

给定一个没有标注的大语料,记每一个序列为 u = u 1 , . . . , u n u = {u_1, ..., u_n} u=u1,...,un,GPT通过最大化以下似然函数来训练语言模型:
L 1 ( U ) = ∑ i log ⁡ P ( u i ∣ u i − k , … , u i − 1 ; Θ ) L_{1}(\mathcal{U})=\sum_{i} \log P\left(u_{i} \mid u_{i-k}, \ldots, u_{i-1} ; \Theta\right) L1(U)=ilogP(uiuik,,ui1;Θ)

其中,k 表示上下文窗口的大小,这里计算每个单词的预测概率时,只考虑左侧窗口大小的词汇信息(单向Transformer),在GPT中,作者基于一个12层的Transformer decoder作为语言模型的结构,并将decoder的中间那层线性变换删除,其结构和计算过程如下:
请添加图片描述

GPT用的结构和Transformer的encoder、decoder都不一样,encoder是两个线性层,但是没有masked,decoder是三个线性层,有masked。

请添加图片描述
h 0 = U W e + W p h_{0} =U W_{e}+W_{p} h0=UWe+Wp
h l = t r a n s f o r m e r b l o c k ( h l − 1 ) ∀ i ∈ [ 1 , n ] h_l = transformer_block(h_{l - 1}) ∀i ∈ [1,n] hl=transformerblock(hl1)i[1,n]
P ( u ) = s o f t m a x ( h n W c T ) P(u) = softmax(h_nW_c^T) P(u)=softmax(hnWcT)

其中, U = u − k , . . . , u − 1 U={u_{-k}}, ... , u_{-1} U=uk,...,u1 表示左侧窗口的词汇向量,n表示Transformer的层数, W e W_e We 表示词向量矩阵, W p W_p Wp表示position embedding矩阵,在GPT中,作者对position embedding矩阵进行随机初始化,让模型自己学习,而不是采用正弦余弦函数进行计算。(原Transformer用的三角函数)

从GPT的计算公式来看,其实跟Transformer基本是一样的,只是对每个时间步,都只考虑左侧窗口大小的上下文信息。

由于使用了Masked Self-Attention,所以每个位置的词都不会“看见”后面的词,也就是预测的时候是看不见“答案”的,即避免了see themselves 的问题,保证了模型的合理性,这也是为什么OpenAI采用了单向Transformer的原因。

fine-tuning(有监督)

当语言模型训练结束后,就可以将其迁移到具体的NLP任务中,假设将其迁移到一个文本分类任务中,记此时的数据集为 C ,对于每一个样本,其输入为 x 1 , . . . , x m x^1, ..., x^m x1,...,xm,输出为 y y y。对于每一个输入,经过预训练后的语言模型后,可以直接选取最后一层Transformer最后一个时间步的输出向量 h l m h_l^m hlm,然后在其后面接一层全连接层,即可得到最后的预测标签概率:
P ( y ∣ x 1 , . . . , x m ) = s o f t m a x ( h l m W y ) P(y | x^1, ..., x^m) = softmax(h_l^m W_y) P(yx1,...,xm)=softmax(hlmWy)

其中, W y W_y Wy为引入的全来凝结层的参数矩阵。因此,可以得到在分类任务中的目标函数:
L 2 ( C ) = ∑ x , y l o g P ( y ∣ x 1 , . . . , x m ) L_2(C) = \sum_{x,y} logP(y | x^1, ..., x^m) L2(C)=x,ylogP(yx1,...,xm)

在具体的NLP任务中,作者在fine-tuning时也把语言模型的目标引入到目标函数中,作为辅助函数,作者发现这样操作可以提高模型的通用能力,并且加速模型手来你,其形式如下:
L 3 ( C ) = L 2 ( C ) + λ ∗ L 1 ( C ) L_3(C) = L_2(C) + λ * L_1(C) L3(C)=L2(C)+λL1(C)

其中 λ一般取0.5。

可以发现,在fine-tuning阶段,此时新增的参数只有最后一层全连接层的参数 W y W_y Wy,这比ELMo算法要容易得多。

不过,上面这个例子知识对与文本分类任务,如果是对于其他任务,比如文本蕴涵、问答、文本相似度等,那么GPT该如何进行微调呢?

  • 文本蕴涵:对于文本蕴涵任务(文本间的推理关系,问题-答案),作者用一个$负号将文本和假设进行拼接,并在拼接后的文本前后加入开始符 start 和结束符 end,然后将拼接后的文本直接传入预训练的语言模型,在模型再接一层线性变换和softmax即可。

  • 文本相似度:对于文本相似度任务,由于相似度不需要考虑两个句子的顺序关系,因此,为了反映这一点,作者将两个句子分别与另一个句子进行拼接,中间用“$”进行隔开,并且前后还是加上起始和结束符,然后分别将拼接后的两个长句子传入Transformer,最后分别得到两个句子的向量表示 h l m h_l^m hlm,将这两个向量进行元素相加,然后再接如线性层和softmax层。

  • 问答和尝试推理:对于问答和尝试推理任务,首先将本经信息与问题进行拼接,然后再将拼接后的文本一次与每个答案进行拼接,最后依次传入Transformer模型,最后接一层线性层得到每个输入的预测值。

具体的方法可以查看下图,可以发现,对这些任务的微调主要是:

  • 增加线性层的参数
  • 增加起始符、结束符和分隔符三种特殊符号的向量参数
    请添加图片描述

小结

  • GPT其实跟ELMO非常相似,只是把语言模型直接迁移到具体的NLP任务中,因此,更容易进行迁移学习。
  • 不过GPT主要还是针对文本分类和标注性任务,如果对于生成任务,比如机器翻译等,则其结构也没法进行很好的迁移。

https://zhuanlan.zhihu.com/p/69290203
GPT原理介绍
Radford A, Narasimhan K, Salimans T, et al. Improving language understanding by generative pre-training[J]. 2018.

GPT-2:多任务学习

GPT-2继续沿用了原来在GPT中使用的单向 Transformer 模型,而这篇文章的目的就是尽可能利用单向Transformer的优势,做一些BERT使用的双向Transformer所做不到的事。那就是通过上文生成下文文本。

GPT-2的改进

**1. 去掉了fine-tuning层:**不再针对不同任务分别进行微调建模,而是不定义这个模型应该做什么任务,模型会自动识别出来需要做什么任务,是很通用的设计。

**2. 增加数据集:**GPT-2手机了更加广泛,数量更多的语料组成数据集。该数据集包含800万个网页,大小为40G。这些数据是经过过滤后得到的高质量文本。

**3. 增加网络参数:**GPT-2将Transformer堆叠的层数增加到48层,隐层的维度为1600,参数量达到了15亿。(5倍于BERT的参数量)

**4. 调整Transformer:**将layer normalization放到每个sub-block之前,并在最后一个self-attention后再增加一个layer normalization。

  1. 此外,GPT-2将词汇表数量增加到50257个;最大的上下文大小从GPT-1的512提升到了1024 tokens;batch-size增加到512.

模型参数

  • 同样使用了使用字节对编码构建字典,字典的大小:50257
  • 滑动窗口大小:1024
  • batch-size:512
  • Layer Normalization移动到了每一块的输入部分,在每个self-attention之后额外添加了一个Layer Normalization
  • 将残差层的初始化值用 1 ( N ) \frac{1}{\sqrt(N)} ( N)1进行缩放,其中N是残差层的个数

GPT-2训练了4组不同的层数和词向量的长度的模型,见表:

参数量层数词向量长度
117M(GPT-1)12768
345M1241024
762M361280
1542M481600

效果如下:
请添加图片描述
可以看出随着模型的增大,模型的效果是不断提升的。模型仍欠拟合,后续还会加大数据量,做大做强。

为什么GPT-2能够适应多任务?

在训练的时候,采用了多任务的方式,不单单只在一个任务上进行学习,而是多个,每一个任务都要保证其损失函数能收敛,不同任务是共享主题Transformer参数的,进一步提升模型的泛化能力,因此在即使没有fine-tuning的情况下,依旧有非常不错的表现。

在fine-tuning有监督任务阶段,GPT-2根据给定输入与任务来做出相应的输出,那么模型就可以表示成下面这个样子:
p ( o u t p u t ∣ i n p u t , t a s k ) p(output | input, task) p(outputinput,task)
例如可以直接输入:(“自然语言处理”, 中文翻译)来得到我们需要的结果(“Nature Language Processing”),因此提出的模型可以将机器翻译,自然语言推理,语义分析,关系提取等10类任务统一建模为一个分类任务,而不误再为每一个子任务单独设计一个模型。

当我们说GPT2是基于Transformer Decoder的时候,我们在说什么?
Transformer结构及其应用详解–GPT、BERT、MT-DNN、GPT-2

GPT-3:海量参数

Abstract

  • 提出问题:最近的许多研究都表明pre-train模型搭配下游任务fine-tune在许多情况下效果显著,但是微调过程需要大量的样本。这一框架不符合人类的习惯,人类只需要少量的示例或说明便能适应一个新的NLP下游任务。
  • 主要贡献:本文证明了通过增大参数量就能让语言模型显著提高下游任务在Few-shot(仅给定任务说明和少量示例)设置下的性能,即证明了大规模语言模型使用元学习策略的可能和fine-tuning策略的非必要性
  • 具体贡献:
  1. 训练了包含175billion参数(以往非稀疏语言模型的10倍大小)的GPT3自回归语言模型,并在多个数据集上测试没有fine-tune过程的性能表现。
  2. 虽然GPT3在文本翻译、问答系统、完型填空、新词使用和代数运算等任务表现不错,但在阅读理解和推理任务数据集上的表现仍有待提高。
  3. 由于GPT-3的训练依赖于大量的网页语料,所以模型在部分测试数据集上可能出现方法论级别的data containation问题。
  4. GPT3能够编写出人类难以区分的新闻文章,本文讨论了该能力的社会影响力。

Introduction

  • 提出问题:许多基于RNN或Transformer结构的语言模型通过“pre-train + fine-tune”过程在阅读理解、问答系统等任务中有不俗的性能。然而本文认为上述架构最大的问题在于必须拥有大量的下游任务fine-tune样本才能取得很好的性能。因此,本文基于下述原因认为移除fine-tune是必要的:
  1. 每一个新的任务都需要大量的标记数据不利于语言模型的应用的。
  2. 提升模型表征能力的同时降低数据分布的复杂度是不合理的。比如,大模型并不能在样本外推预测时具有好效果,这说明fine-tune导致模型的泛化性降低了。
  3. 人类在接触一个下游语言任务时不需要大量的样本,只需要一句对新任务的描述或者几个案例。人类这种无缝融合和切换多个任务的能力是我们当前自然语言技术所欠缺的。
  • 模型移除fine-tune有2个解决方案:
  1. meta-learning(如图1.1):模型在训练阶段具备了一系列模式识别的能力和方法,并通过在预测过程中利用这些能力和方法以快速适应一个下游任务。最近的一些研究尝试通过称为in-context learning的方法来实现上述过程,然而效果距离期待的相差甚远。
  2. Large scale transformers:Transformer语言模型参数的每一次增大都会让文本理解能力和其他的NLP下游任务的性能得到提升。此外,有研究指出描述许多下游任务性能的log损失能让模型的性能和参数之间服从一个平滑趋势。考虑到in-context learning会将学习到的知识和方法存在模型的参数中,本文假设:模型的情境学习能力也会随着参数规模的增长而增长

情境学习(in-context learning):在被给定的几个任务示例或一个任务说明的情况下,模型应该能通过简单预测以补全任务中其他的实例。即,情境学习要求预训练模型要对任务本身进行理解。情境学习三种分类的定义和示例如下:

  • few-shot learning

    • 定义:允许输入数条反例和一则任务说明
    • 示例:向模型输入“这个任务要求将中文翻译为英文。你好->hello,再见->goodbye,购买->purchase,销售->”,然后要求模型预测下一个输出应该是什么,正确答案应为“sell”。
  • one-shot learning

    • 定义:只允许输入一条范例和一则任务说明
    • 示例:向模型输入“这个任务要求将中文翻译为英文。你好->hello,销售->”,然后要求模型预测下一个输出应该是什么,正确答案应为“sell”。
  • zero-shot learning

    • 定义:不允许输入任何范例,只允许输入一则任务说明
    • 示例:向模型输入“这个任务要求将中文翻译为英文。销售->”,然后要求模型预测下一个输出应该是什么,正确答案应为“sell”。
  • 本文研究内容:本文训练了一个拥有175billion参数的自回归语言模型(GPT-3),并利用两组NLP数据集和一些全新的数据集评估了模型的情境学习能力和快速适应新任务能力。对于每一个任务,作者都测试了模型“few-shotlearning”,“one-shot learning”和“zero-shot learning”三种条件的性能。虽然GPT-3也支持fine-tune过程,但本文并未测试。

具体GPT-3论文内容看参考文献1,写得非常好,不想再复制粘贴了,直接去原链接[1]看。

参考文献:
[1] GPT-3阅读笔记:Language Models are Few-Shot Learners
[2] 词向量之GPT-1,GPT-2和GPT-3
[3] 听李宏毅点评GPT-3:来自猎人暗黑大陆的模型

  • 10
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GPT2LMHeadModel是指基于GPT-2预训练模型的语言模型,该模型可以用于生成自然语言文本。在Transformers库中,GPT2LMHeadModel是一个Python类,可以通过实例化该类来构建一个GPT-2模型。 与其他深度学习模型一样,GPT2LMHeadModel包含了一个前向传播计算图和一个反向传播计算图。在前向传播计算图中,输入数据首先被经过多层Transformer编码器的GPT-2模型处理,然后通过一个线性层,也就是LM Head,生成下一个词的概率分布;在反向传播计算图中,根据模型输出和真实标签计算损失,并通过反向传播算法更新模型参数。 在使用GPT2LMHeadModel时,可以通过以下方式加载预训练模型: ```python from transformers import GPT2LMHeadModel # 加载GPT-2模型 model = GPT2LMHeadModel.from_pretrained('gpt2') ``` 在以上代码中,我们使用`from_pretrained()`方法加载了一个预训练的GPT-2模型,该模型使用了默认的参数设置。此外,你还可以自定义参数来构建一个不同大小的GPT-2模型,例如: ```python from transformers import GPT2LMHeadModel, GPT2Config # 自定义参数 config = GPT2Config(n_embd=768, n_layer=12, n_head=12) # 构建自定义的GPT-2模型 model = GPT2LMHeadModel(config) ``` 在以上代码中,我们自定义了GPT-2模型的参数,包括嵌入层大小、Transformer层数、注意力头数等,然后使用这些参数实例化了一个自定义的GPT-2模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值