阅读文献:“Improving Language Understanding by Generative Pre-Training”
Introduction
从原始文本中有效学习的能力对于降低有监督学习是极为重要的。
从无标记文本中提取相比于词级别的信息更多的信息主要有两个困难:
- 找不到一个合适的损失函数,不同的任务可能需要不同的损失函数。
- 对于如何最有效地将这些学习到的表征转移到目标任务上,目前还没有达成共识。有的是变换模型架构,有的是使用复杂的学习方案等等。
本文提出了一个半监督的学习方法,包括无监督的预训练和有监督的微调。目标是学习一个全面的特征,以至于只要进行较小的更改就能应用于各种任务中。
这个模型(不是专门为某个任务训练的)在12个任务中有9个都优于专门训练的模型。
Related Work
半监督学习:近几年已经有人证明了在大量无标签的语料上训练的词向量有效地提升了各种各样的任务的表现。这种方法主要是捕获词级的信息,然而本文主要捕获更高级的预料信息。
无监督的预训练:无监督的预训练的目标是为了找到一个好的初始化的权重。本文主要做的工作就是与训练一个语言模型,然后再使用有监督地微调。LSTM模型的限制了预测能力,相反,Transformer模型运行捕获更大范围的语言结构。
辅助训练目标:无监督的预训练学习了与目标任务相关的几个语言方面。
Framework
训练包含两步:第一步是在大的文本语料库上训练一个语言模型。第二部是微调操作。
Unsupervised pre-training
给一个语料库中的token序列U={
u
1
,
…
,
u
n
u_1,\dots,u_n
u1,…,un},使用一个标准的语言模型目标最大化这个可能性:
L
i
(
U
)
=
∑
i
l
o
g
P
(
u
i
∣
u
i
−
k
,
…
,
u
i
−
1
;
θ
)
L_i(U)=\sum_ilogP(u_i|u_{i-k},\dots,u_{i-1};\theta)
Li(U)=i∑logP(ui∣ui−k,…,ui−1;θ)
k是文本窗口大小,条件概率P被使用一个带有参数
θ
\theta
θ的神经网络建模。(每次拿出来K个词语,然后用这k个词语预测下一个词语是啥)。也就是给定K个词,给定模型,然后预测下一个词语是啥。
为什么加log?log相加,等于内部数据相乘,也就是概率相乘,这样能够获得整个文本的联合概率。
本实验用了一个多层Transformer解码器(Transformer的解码器使用的是掩码注意力机制,只看到这个词之前的词,所以只能使用解码器)。这个模型应用了一个多头自注意力的操作在输入的文本token上,然后进行positon-wise feedforward层去产生一个目标标记的输出。
h
o
=
U
W
e
+
W
p
h_o=UW_e+W_p
ho=UWe+Wp
h l = T r a n s f o r m e r B l o c k ( h l − 1 ) ∀ i ∈ [ i , n ] h_l=TransformerBlock(h_{l-1})\forall i\in [i,n] hl=TransformerBlock(hl−1)∀i∈[i,n]
P ( u ) = s o f t m a x ( h n W e T ) P(u)=softmax(h_nW_e^T) P(u)=softmax(hnWeT)
假设要预测第u个词,那么先把前面k个词拿出来作为U,然后进行一个投影(Word2Vec),然后加上位置信息得到 h 0 h_0 h0,然后做n层的Transformer块。然后再做一个投影加softmax。
和Bert的区别:GPT是根据前面的词语进行预测,Bert是根据前面和后面的词语预测。GPT的难度更大,但是天花板更高。
Supervised fine-tuning
假设C为一个有标签的数据集,每一条数据包含一个输入token的序列(一句话):
x
1
,
…
,
x
m
x^1,\dots,x^m
x1,…,xm和一个标签y。输入通过预训练模型去获得最终的transformer块的
h
l
m
h_l^m
hlm,然后是一个带有参数
W
y
W_y
Wy的线性输出层,去预测y:
P
(
y
∣
x
1
,
…
,
x
m
)
=
s
o
f
t
m
a
x
(
h
l
m
W
y
)
P(y|x^1,\dots,x^m)=softmax(h_l^mW_y)
P(y∣x1,…,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,\dots,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)
接下来的任务:把各种各样的子任务表示成一个序列(X)加上一个标号(y)的形式。
工作中使用的Transformer架构和训练目标图:
其中的Start、Extract都是特殊的token,输入Transformer以后获得extract位置的向量。不管其他任务怎么变,预训练好的Transformer模型是不会变的。