GPT-1 论文《Improving Language Understanding by Generative Pre-Training》总结
以下是在读了GPT-1论文之后进行一个简单的总结,如果有不对的地方,还望指出。
前言
自然语言理解包括各种各样的任务,比如文本蕴含(textual entailment),问答(question answering), 语义相似性判断(semantic similarity assessment),和文本分类(document classification)。尽管没标注的文本语料数据有很多,但是有标注的针对特定任务的数据很少,这样就使得训练一个足够优秀的模型是比较困难的。作者在这篇论文中提出的解决这个问题的办法是先在大量无标注的文本语料数据上训练出一个生成式的预训练语言模型(generative pre-training of a language model),然后在特定的任务上进行针对性的微调(fine-tuning)。
We demonstrate that large gains on these tasks can be realized by generative pre-training of a language model on a diverse corpus of unlabeled text, followed by discriminative fine-tuning on each specific task.
同时,作者认为与之前的方法相比,他们在微调的时候利只要对输入进行一些调整,就能够在对模型架构改动最小的同时,实现更有效的迁移。
下面主要介绍一下模型的设计方案
设计方案
GPT-1模型主要使用的是Transformer
架构的解码器(decoder)部分。使用 Transformer
的原因是它相比于RNN可以更好的处理文本之间的长距离依赖问题以及在各种任务的迁移上Transformer
表现都更加稳定。
正如我们之前提到的,整个设计框架分为两个阶段,第一个阶段是在大量的无标记语言文本上学习高容量的语言模型,紧接着是微调阶段,在这个阶段,会使用有标记的数据调整模型适应特定的任务。第一阶段属于无监督的预训练阶段,第二阶段属于是有监督的微调阶段。下面主要讲一下这两个阶段的设计思路。
无监督预训练
给定一些无监督的语料文本(token),
U
=
U
1
,
.
.
.
,
U
n
U = {U_1,...,U_n}
U=U1,...,Un ,作者使用标准的语言模型的目标函数来最大化如下似然函数即
L
1
(
U
)
=
∑
i
l
o
g
P
(
U
i
∣
U
i
−
k
,
.
.
.
,
U
i
−
1
;
θ
)
L_1(U) = \sum_{i}logP(U_i | U_{i-k},..., U_{i-1};\theta)
L1(U)=i∑logP(Ui∣Ui−k,...,Ui−1;θ)
k
k
k表示的是上下文窗口大小,
θ
\theta
θ是我们的模型(Transformer
中的解码器)。简单来说这个函数就是在预测第
i
i
i个词出现的概率。 在已知第
i
i
i个词前的
k
k
k个词以及我们的模型后,求位置
i
i
i出现概率最大的词。
整个模型架构可以用如下数学公式表示:
h
0
=
U
W
e
+
W
p
h
l
=
t
r
a
n
s
f
o
r
m
e
r
(
h
l
−
1
)
∀
i
∈
[
1
,
n
]
P
(
u
)
=
s
o
f
t
m
a
x
(
h
n
W
e
T
)
\begin{aligned} h_0 &= UW_e + W_p \\ h_l &= transformer(h_{l-1}) \forall i \in [1,n] \\ P(u) &= softmax(h_nW_e^T)\\ \end{aligned}
h0hlP(u)=UWe+Wp=transformer(hl−1)∀i∈[1,n]=softmax(hnWeT)
在这里作者给出了一个示例,假设要预测第
u
u
u个词是什么,那么就需要先提取第
u
u
u个词之前所有的词,即为
U
=
(
u
−
k
,
.
.
.
,
u
−
1
)
U = (u_{-k},...,u_{-1})
U=(u−k,...,u−1),然后做线性投影,
W
e
W_e
We是词向量嵌入矩阵,
W
p
W_p
Wp是位置矩阵。接下来我们要做n层Transformer模块,每一层都是把上一层的输出作为输入。最后把第n层的输出拿出来,再结合权重
W
e
W_e
We做一个softmax概率分布。
监督微调
在经过之前的无监督训练模型以及结合目标函数后,我们需要调整参数来适应有监督的特定任务。就如下面这个公式表示的那样
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)
x
1
,
.
.
.
x
m
x^{1},...x^{m}
x1,...xm是输入向量序列,
y
y
y是标签。这些输入经过了我们之前的预训练模型后,在最后的transformer
块中的激活层,紧接着他们会被喂给另外单独的线性层结合参数
W
y
W_y
Wy来预测y。
同样这也给了我们如下的目标函数来最大化优化。
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)
在整个微调阶段,所需要的额外的参数只有
W
y
W_y
Wy和词嵌入的分隔符。
特定任务输入转化
作者在这里提出针对某些语言任务,比如文本分类,可以直接微调上面描述的模型,但是一些别的语言任务,比如问答,或者文本蕴含,它们有更结构化的输入,所以需要在面对这些特定的任务的时候对输入数据做一些处理。作者对输入数据进行的一些转化处理,如下图所示:
-
文本蕴含,作者是将前提 p p p和猜想 h h h 拼接在一起,在中间加入了分割符。
-
相似性:对于相似性任务,被比较的两个句子之间没有固有的顺序。为了反映这一点,我们修改输入序列,使其包含两个可能的句子顺序(中间有一个分隔符),并分别处理它们以产生两个序列表示 h l m h_l^m hlm,这两个表示在输入到线性输出层之前会进行逐元素相加。
-
问题回答和常识推理:对于这些任务,我们得到一个上下文文档 z,一个问题 q,以及一组可能的答案 a k a_k ak。我们将文档上下文和问题与每个可能的答案连接起来,并在中间加入一个分隔符标记,得到 [z; q; $; ak]。我们的模型独立处理这些序列,然后通过 softmax 层进行归一化,以产生可能答案的输出分布。
结论
通过作者提出的框架(生成式预训练及微调),在12项数据集中,9项取得了更好的成绩。作者同时也认为无监督的预训练方式是机器学习研究长期的研究方向。通过作者提出的框架,模型,很好的解决了文本的长距离依赖问题。作者也希望这样的无监督预训练-微调方式能够进一步在自然语言理解及其他领域大放异彩。