论文地址:Improving Language Understanding by Generative Pre-Training
概述
现实世界中包含了大量的文本语料数据,然而,绝大多数语料都是无标签的。
为了充分利用这些无标签语料库,GPT1.0提出直接利用这些未标记的语料来进行生成式预训练,然后对每个特定任务进行判别式微调(在标注数据上),从而显著提升在这些任务上的性能。
文中涉及的主要NLP任务包括:
-
Textual Entailment:文本蕴含,即给定一个前提文本(premise),根据这个前提文本去推断假说文本(hypothesis)与前提文本之间的关系,关系包括蕴含和矛盾两种。蕴含关系指能从前提文本推断出假说文本,而矛盾关系则指前提文本与假锁文本相矛盾。
-
Question Answer:理解用户提出的问题并从文本或知识库中找到准确的答案。
-
Semantic Similarity Assessment:计算文本之间的相似度。
-
Document Classification:文本分类任务。
下面将对GPT-1的框架进行详细的介绍。
GPT框架
GPT-1遵循了Transformer架构,但模型仅基于Transformer的解码器构建。
模型的训练流程分为两个阶段:预训练和微调。
无监督预训练
给定无监督token语料库
U
=
{
u
1
,
…
,
u
n
}
\mathcal{U}=\left\{u_1, \ldots, u_n\right\}
U={u1,…,un},模型使用标准的语言建模目标来最大化如下似然函数:
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 k k表示上下文窗口大小,条件概率 P P P通过具有参数 Θ \Theta Θ的神经网络来建模。
想了解最大似然估计的可以参考这篇文章:一文搞懂极大似然估计
在本文中,神经网络采用的是多层Transformer编码器,该模型对输入的上下文词馈送到神经网络中,然后通过线性层生成目标词的输出分布:
h
0
=
U
W
e
+
W
p
h
l
=
transformer_block
(
h
l
−
1
)
∀
i
∈
[
1
,
n
]
P
(
u
)
=
softmax
(
h
n
W
e
T
)
\begin{aligned} h_0 & =U W_e+W_p \\ h_l & =\operatorname{transformer\_ block}\left(h_{l-1}\right) \forall i \in[1, n] \\ P(u) & =\operatorname{softmax}\left(h_n W_e^T\right) \end{aligned}
h0hlP(u)=UWe+Wp=transformer_block(hl−1)∀i∈[1,n]=softmax(hnWeT)
其中 U = ( u − k , … , u − 1 ) U=\left(u_{-k}, \ldots, u_{-1}\right) U=(u−k,…,u−1)表示词的上下文向量, n n n是层数, W e W_e We是词嵌入矩阵, W p W_p Wp是位置嵌入矩阵,两者都是可学习的。
有监督微调
在完成预训练后,GPT-1根据有监督的目标任务对预训练模型的参数进行调整。
假设存在带标签的数据集
C
\mathcal{C}
C,其中每个实例由一个输入词序列
(
x
1
,
…
,
x
m
)
(x^1, \ldots, x^m)
(x1,…,xm)和相应的标签
y
y
y组成。将输入传入预训练模型来获取输入表示
h
l
m
h_l^m
hlm,然后将其输入一个额外的线性输出层预测
y
y
y,
W
y
W_y
Wy表示该层的可学习参数:
P
(
y
∣
x
1
,
…
,
x
m
)
=
softmax
(
h
l
m
W
y
)
P\left(y \mid x^1, \ldots, x^m\right)=\operatorname{softmax}\left(h_l^m W_y\right)
P(y∣x1,…,xm)=softmax(hlmWy)
在学习的过程中需要最大化如下目标:
L
2
(
C
)
=
∑
(
x
,
y
)
log
P
(
y
∣
x
1
,
…
,
x
m
)
L_2(\mathcal{C})=\sum_{(x, y)} \log P\left(y \mid x^1, \ldots, x^m\right)
L2(C)=(x,y)∑logP(y∣x1,…,xm)
值得注意的是,作者发现将语言建模作为微调的辅助目标有助于学习,因为这可以改善有监督模型的泛化能力和加速收敛。于是,可以得到如下的优化目标:
L
3
(
C
)
=
L
2
(
C
)
+
λ
∗
L
1
(
C
)
L_3(\mathcal{C})=L_2(\mathcal{C})+\lambda * L_1(\mathcal{C})
L3(C)=L2(C)+λ∗L1(C)
其中 λ \lambda λ为权重。
可以看出,在微调的过程中,唯一需要学习的参数为 W y W_y Wy,这极大地降低了模型的训练成本,同时也能获取到足够好的效果。
特定任务的输入转换
由于NLP任务的广泛性,各类任务的输入差异显著。像文本分类之类的任务可以像上面描述的那样对模型进行微调,而对于像问答和文本蕴含之类的任务,则需要对输入进行修改,才能适配预训练模型进行有效微调。
下图中对GPT-1中的输入转换提供了一个可视化说明。所有转换都包括添加随机初始化的开始和结束标记 ( < s > , < e > ) (<s>,<e>) (<s>,<e>)。
Textual entailment
对于蕴含任务,用分隔符将前提和假设连接起来,中间用分隔符$($)$标记。
Similarity
对于相似性任务,由于两个句子没有固有的顺序,因此需要修改输入序列以包含两种可能的句子顺序(句子之间同样包含分隔符)。两个拼接的序列都独立输入到预训练模型中获取序列表示,之后进行相加后输入被馈送到线性输出层。
Question Answering and Commonsense Reasoning
对于知识问答和因果推理,输入中包含一个上下文文档 z z z、一个问题 q q q和一组可能的答案 { a k } \{a_k\} {ak}。GPT-1将将文档上下文和问题与每个可能的答案连接起来,并在其间添加分隔符,即$[z;q;$;a_k]$。每个凭借的序列同样都利用模型进行独立处理,然后通过Softmax层进行归一化,以产生可能答案的输出分布。
结语
以上便是本文的全部内容,若是觉得不错可以支持一下博主,你们的支持是博主更新的不竭动力。若是有任何问题也敬请批评指正。