一、背景信息:
GPT是2018 年 6 月由OpenAI 提出的预训练语言模型。
GPT可以应用于复杂的NLP任务中,例如文章生成,代码生成,机器翻译,问答对话等。
GPT也采用两阶段的训练过程,第一阶段是无监督的方式来预训练生成式的语言模型,第二阶段根据特定任务进行微调。
GPT的网络架构使用的是多层Transformer Decoder改的结构。
二、整体结构:
GPT 使用Transformer的 Decoder 结构,并进行了一些改动,GPT 中的Decoder只保留了原Decoder中的第一个Attention模块Mask Multi-Head Attention。
GPT堆叠了12个Transformer的Decoder
模块作为解码器,然后通过全连接得到输出的概率分布。
GPT中采用的是单向的语言模型
,即通过上文预测当前的词,而Decoder中的Masked Multi Self-Attention可以起到遮掩待预测的下文内容的效果。
GPT 处理不同任务时的输入变换
GPT模型由输入嵌入层
、多层Transformer Decoder
以及输出层
这三个部分组成。
其中
1、输入嵌入层: 将输入的文本序列转换为词向量、位置向量并将二者相加得到输入向量。
2、多层Transformer Decode: 其中每一层由以残差和的方式做LayerNorm的掩码多头自注意力机层与以残差和的方式做LayerNorm的双层前馈神经网络组成。
X
o
u
t
p
u
t
=
X
o
u
p
u
t
−
o
r
i
⊗
X
M
a
s
k
X
=
L
a
y
d
e
r
N
o
r
m
(
X
o
u
t
p
u
t
+
M
a
s
k
M
u
l
t
i
H
e
a
d
A
t
t
e
n
t
i
o
n
(
X
o
u
p
u
t
)
)
X
=
F
e
e
d
F
o
r
w
o
r
d
(
X
)
=
m
a
x
(
0
,
X
W
1
+
b
1
)
W
2
+
b
2
\begin{matrix} \\X_{output}=X_{ouput-ori }\otimes X_{Mask} \\X = LayderNorm(X_{output} + MaskMultiHeadAttention(X_{ouput})) \\X = FeedForword(X) = max(0, XW_{1} + b_{1})W_{2} + b_{2}\begin{matrix}\end{matrix} \end{matrix}
Xoutput=Xouput−ori⊗XMaskX=LayderNorm(Xoutput+MaskMultiHeadAttention(Xouput))X=FeedForword(X)=max(0,XW1+b1)W2+b2
3、输出层: GPT模型的输出层通常为一个全连接层,将多层解码器的输出转换为对应的单词概率分布。
- 分类任务(Classification):将起始和终止token加入到原始序列两端,输入transformer中得到特征向量,最后经过一个全连接得到预测的概率分布。
- 自然语言推理(Entailment):将前提(premise)和假设(hypothesis)通过分隔符(Delimiter)隔开,两端加上起始和终止token。再依次通过Transformer多层Decoder和全连接得到预测结果。
- 语义相似度(Similarity):输入的两个句子,正向和反向各拼接一次,然后分别输入给Transformer多层Decoder,得到的特征向量拼接后再送给全连接得到预测结果;
- 多项选择(MutipleChoice):将n个选项的问题抽象化为n个二分类问题,即每个选项分别和内容进行拼接,然后各送入Transformer多层Decode和全连接中,最后选择置信度最高的作为预测结果。
三、GPT训练
GPT的训练包含无监督预训练
和有监督fine-tune
两个阶段。
GPT的无监督预训练:
假设未标注的词汇集合为
U
=
{
u
1
,
u
2
,
.
.
.
u
n
}
U = \left \{ {{u_{1},u_{2},...u_{n}}}\right \}
U={u1,u2,...un},GPT模型的优化目标是对参数进行最大似然估计:
L
1
(
U
)
=
∑
i
l
o
g
P
(
u
i
∣
u
1
,
.
.
.
,
u
k
−
1
;
Θ
)
L_{1}(U) = \sum_{i}^{} log P(u_{i}|u_{1},...,u_{k-1};\Theta )
L1(U)=i∑logP(ui∣u1,...,uk−1;Θ)
其中,k是滑动窗口的大小, P 为条件概率,
Θ
\Theta
Θ为条件概率的参数, 参数更新采用随机梯度下降(SGD)方法。
下面是整个过程的公式示例:
{
h
0
=
U
W
e
+
W
p
h
l
=
T
r
a
n
s
f
o
r
m
e
r
D
e
c
o
d
e
r
B
l
o
c
k
(
h
l
−
q
)
P
(
u
)
=
s
o
f
t
m
a
x
(
h
n
W
e
T
)
\left\{\begin{matrix}h_{0} = UW_{e} + W{p} \\h_{l} = TransformerDecoderBlock(h_{l-q}) \\P(u) = softmax(h_{n}W_{e}^{T} ) \end{matrix}\right.
⎩
⎨
⎧h0=UWe+Wphl=TransformerDecoderBlock(hl−q)P(u)=softmax(hnWeT)
输入嵌入层:
W e W_{e} We是token的词向量Embedding矩阵, W p W_{p} Wp是位置编码的Embedding矩阵,二者求和得到输入向量矩阵 h 0 h_{0} h0多层Transformer Decode:
TransformerDecoderBlock指多层Decoder模块输出层:
通过Softmax函数将输出的词向量转换为对应的单词概率分布
GPT的有监督fine-tune:
预训练后,需要针对特定任务进行有监督Fine-Tuning。
这里以一个文本分类任务举例,展示GPT在某一任务有监督微调的过程。
假设带标注的数据集C中的输入序列X为
[
x
1
,
.
.
.
,
x
m
]
[x^{1},..., x^{m}]
[x1,...,xm];模型的输出y是一个分类标签;
h
l
m
h_{l}^{m}
hlm代表Decoder层最后的输出;
W
y
W_{y}
Wy代表输出层的Softmax参数。
L
2
(
C
)
L_{2}(C)
L2(C)是分类任务的最大似然函数,
L
3
(
C
)
L_{3}(C)
L3(C)是整体的最大似然函数;GPT 在微调的时候需要同时考虑预训练的损失函数,因此微调的训练目标是最大化似然函数
L
3
(
C
)
L_{3}(C)
L3(C).
{
P
(
y
∣
x
1
,
.
.
.
,
x
m
)
=
s
o
f
t
m
a
x
(
h
l
m
W
y
)
L
2
(
C
)
=
∑
x
,
y
l
o
g
P
(
y
∣
x
1
,
.
.
.
,
x
m
)
L
3
(
C
)
=
L
2
(
C
)
+
λ
×
L
1
(
C
)
\left\{\begin{matrix}P(y|x^{1},..., x^{m}) = softmax(h_{l}^{m}W_{y}) \\L_{2}(C) = \sum_{x,y}^{} log P(y|x^{1},..., x^{m}) \\L_{3}(C) = L_{2}(C) + \lambda \times L_{1}(C) \end{matrix}\right.
⎩
⎨
⎧P(y∣x1,...,xm)=softmax(hlmWy)L2(C)=∑x,ylogP(y∣x1,...,xm)L3(C)=L2(C)+λ×L1(C)
Reference
1.Attention Is All You Need
2.BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
3.Improving Language Understanding by Generative Pre-Training