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)=i∑logP(ui∣ui−k,…,ui−1;Θ)
其中,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(hl−1)∀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=u−k,...,u−1 表示左侧窗口的词汇向量,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的原因。
当语言模型训练结束后,就可以将其迁移到具体的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(y∣x1,...,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,y∑logP(y∣x1,...,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模型,最后接一层线性层得到每个输入的预测值。
具体的方法可以查看下图,可以发现,对这些任务的微调主要是:
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中使用的单向 Transformer 模型,而这篇文章的目的就是尽可能利用单向Transformer的优势,做一些BERT使用的双向Transformer所做不到的事。那就是通过上文生成下文文本。
**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。
GPT-2训练了4组不同的层数和词向量的长度的模型,见表:
参数量 | 层数 | 词向量长度 |
---|---|---|
117M(GPT-1) | 12 | 768 |
345M | 124 | 1024 |
762M | 36 | 1280 |
1542M | 48 | 1600 |
效果如下:
可以看出随着模型的增大,模型的效果是不断提升的。模型仍欠拟合,后续还会加大数据量,做大做强。
在训练的时候,采用了多任务的方式,不单单只在一个任务上进行学习,而是多个,每一个任务都要保证其损失函数能收敛,不同任务是共享主题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(output∣input,task)
例如可以直接输入:(“自然语言处理”, 中文翻译)来得到我们需要的结果(“Nature Language Processing”),因此提出的模型可以将机器翻译,自然语言推理,语义分析,关系提取等10类任务统一建模为一个分类任务,而不误再为每一个子任务单独设计一个模型。
当我们说GPT2是基于Transformer Decoder的时候,我们在说什么?
Transformer结构及其应用详解–GPT、BERT、MT-DNN、GPT-2
情境学习(in-context learning):在被给定的几个任务示例或一个任务说明的情况下,模型应该能通过简单预测以补全任务中其他的实例。即,情境学习要求预训练模型要对任务本身进行理解。情境学习三种分类的定义和示例如下:
few-shot learning
one-shot learning
zero-shot learning
本文研究内容:本文训练了一个拥有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:来自猎人暗黑大陆的模型