OpenAI-GPT原理详解
本文参考
一、前言
本文对论文《Improving Language Understanding
by Generative Pre-Training》做一个解析。
一个对文本有效的抽象方法可以减轻NLP对有监督学习的依赖。目前大多数深度学习方法依靠大量的人工标注信息,这限制了在很多领域的应用。此外,即使在可获得相当大的监督语料情况下,以无监督学习的方式学到的表示也可以提供显着的性能提升。到目前为止,最引人注目的证据是广泛使用预训练词嵌入来提高一系列NLP任务的性能。
二、基础知识
三、OpenAI GPT
3.1 OpenAI GPT 原理
本文提出一种半监督的方式来处理语言理解的任务。使用非监督的预训练和监督方式的微调。我们的目标是学习一个通用的语言标示,可以经过很小的调整就应用在各种任务中。这个模型的设置不需要目标任务和非标注的数据集在同一个领域。
GPT是“Generative Pre-Training”的简称,从名字看其含义是指的生成式的预训练。GPT也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过Fine-tuning的模式解决下游任务。
GPT的预训练过程,其实和ELMO是类似的,主要不同在于两点:首先,特征抽取器不是用的RNN,而是用的Transformer,上面提到过它的特征抽取能力要强于RNN,这个选择很明显是很明智的;其次,GPT的预训练虽然仍然是以语言模型作为目标任务,但是采用的是单向的语言模型,所谓“单向”的含义是指:语言模型训练的任务目标是根据 [公式] 单词的上下文去正确预测单词
W
i
W_i
Wi,
W
i
W_i
Wi 之前的单词序列Context-before称为上文,之后的单词序列Context-after称为下文。ELMO在做语言模型预训练的时候,预测单词
W
i
W_i
Wi同时使用了上文和下文,而GPT则只采用Context-before这个单词的上文来进行预测,而抛开了下文。
3.2 OpenAI GPT模型结构
OpenAI-GPT提出一种半监督的方式来处理语言理解的任务。使用非监督的预训练和监督方式的微调。模型的目标是学习一个通用的语言表示,可以经过很小的调整就应用在各种任务中。这个模型的设置不需要目标任务和非标注的数据集在同一个领域。模型有两个过程。
3.2.1 非监督预训练
非监督:
通过前k-1个词预测第k个词,从前往后,不断前进,属于单向的预测。此处记整个无监督训练的任务为L1。
处理非监督文本
(
u
1
,
u
2
,
.
.
.
,
u
m
)
(u_1,u_2,...,u_m)
(u1,u2,...,um)的普通方法是用语言模型去最大化语言模型的极大似然。
L 1 ( X ) = ∑ i l o g P ( u i ∣ u i − k , . . . , u i − 1 : θ ) L_1(X)=\sum_ilogP(u_i|u_{i-k},...,u_{i-1}:\theta) L1(X)=i∑logP(ui∣ui−k,...,ui−1:θ)
文章中使用的是多层(12层)Transformer的decoder的语言模型。这个多层的结构应用multi-headed self-attention在处理输入的文本加上位置信息的前馈网络,输出是词的概率分布。
h
0
=
U
W
e
+
W
p
h_0=UW_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 ) h_l=transformer\_block(h_{l-1}) hl=transformer_block(hl−1)
P
(
u
)
=
s
o
f
t
m
a
x
(
h
n
W
e
T
)
P(u)=softmax(h_nW^T_e)
P(u)=softmax(hnWeT)
这里
U
=
(
u
k
,
u
k
−
1
,
.
.
.
,
u
1
)
U=(u_k,u_k-1,...,u_1)
U=(uk,uk−1,...,u1)是tokens的上下文。
n是网络层数
W
e
W_e
We是tokens的embedding矩阵。
W
p
W_p
Wp是tokens的位置embedding矩阵
P
(
u
)
P(u)
P(u)是通过softmax输出的一个概率
3.2.2 监督微调fine-tuning
这个阶段要对前一个阶段模型的参数,根据监督任务进行调整。我们假设有标签数据集
C
C
C,里面的结构是
(
x
1
,
x
2
,
.
.
.
,
x
m
,
y
)
(x_1,x_2,...,x_m,y)
(x1,x2,...,xm,y)。输入
(
x
1
,
x
2
,
.
.
.
,
x
m
)
(x_1,x_2,...,x_m)
(x1,x2,...,xm)经过我们预训练的模型获得输出向量
h
l
m
h_l^m
hlm,然后经过线性层和softmax来预测标签。
P
(
y
∣
x
1
,
x
2
,
.
.
.
,
x
m
)
=
s
o
f
t
m
a
x
(
h
l
m
W
y
)
P(y|x_1,x_2,...,x_m)=softmax(h_l^m{W_y})
P(y∣x1,x2,...,xm)=softmax(hlmWy)
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)
我们增加了语言模型去辅助微调,提高了监督模型的结果。最后的损失函数可以标示为
L 3 ( C ) = L 2 ( C ) + λ L 1 ( C ) L_3(C)=L_2(C)+\lambda{L_1(C)} L3(C)=L2(C)+λL1(C)
3.2.3 改造OpenAI GPT用于下游NLP任务
输入变换
对于有些任务,像文本分类,我们能够直接用上文的模型进行微调。另外的任务,问答系统,需要构造输入的句子对,或者三个文档。由于我们的预训练模型需要连续的文本序列,我们需要改变这种多句文本的输入。
- 文本含义:用$链接前后两个文本
- 相似度:对于相似度的问题,由于没有文本内部的先后顺序。我们可以有两个输入 T e x t 1 Text1 Text1$ T e x t 2 Text2 Text2和 T e x t 2 Text2 Text2$ T e x t 1 Text1 Text1,输出的表示向量在加起来。
- 问答系统:有 C o n t e x t Context Context和 A n s w e r 1 , . . . , A n s w e r N Answer1,...,AnswerN Answer1,...,AnswerN,我们可以组合成 N N N个 C o n t e x t Context Context$ A n s w e r i Answer_i Answeri输入,获得 N N N个输出,在通过linear后softmax出概率分布。
GPT缺点:
单向语言模型
BERT使用双向语言模型,训练模型和GPT相同。(下一章准备写)