文章目录
1 背景
Transformer是谷歌大脑在2017年底发表的论文attention is all you need中所提出的 seq2seq 模型。现在已经取得了大范围的应用和扩展,而 BERT 就是从 Transformer 中衍生出来的预训练语言模型。
- 相比于LSTM、RNN模型,这些模型是迭代的、串行的,必须等上一时刻计算过程完成才能进入下一时刻的计算。而Transformer则可做到并行计算,所有位置的字符是同时计算的,这样大大提高了计算效率。
- 相比于Seq2Seq+Attention模型,Transformer与他们都具备Encoder和Decoder结构,但是后者Decoder模块的计算仍然无法做到并行计算。并且受限于文本长度,把源文本的所有语义信息全集中为一个Context Vector向量的做法是有缺陷的。
- Transformer采用自注意力机制计算语义信息,同时添加位置编码来理解语言的顺序。
2 模型结构
与普通Seq2Seq模型一样,Transformer主要分为两大部分,Encoder和Decoder。其模型结构如下图所示。

Encoder 负责把输入(语言序列)隐射成隐藏层(下图中第 2 步用九宫格代表的部分),然后Decoder再把隐藏层映射为自然语言序列。
值得注意的是,Transformer的Encoder和Decoder不再是单层结构,数据将经过多层Encoder传递,得到的结果作为第一层Decoder的输入,再经过多层Decoder传递得到最终输出。
接下来文章将对图中的各子模块分别详细说明。
3 Encoder模块
Transformer含有多层结构相同的Encoder Block,单层Encoder Block结构如下所示。

3.1 位置编码
由于Transformer模型采用的是并行计算的方式,不可避免地,各单词的语义顺序也即位置信息无法被保留。因此本文作者考虑为每个单词增加代表该单词位置的编码,进而与单词的词嵌入值相加作为模型的输入。
同时,Positianal Encoding的设计应考虑以下几个方面:
- 不同位置对应不同的数值;
- 距离相同的两个单词,其位置编码的差值也应当相等;
- 它的值应当有上下限,且不能太大或太小,否则容易使模型忽视词嵌入部分数值的分量。
最终,作者为位置编码设计的公式为:
P
E
(
p
o
s
,
2
i
)
=
s
i
n
p
o
s
(
1
e
5
)
2
i
/
d
m
o
d
e
l
PE(pos,2i) = sin \frac{pos}{(1e5)^{2i/d_{model}}}
PE(pos,2i)=sin(1e5)2i/dmodelpos
P E ( p o s , 2 i + 1 ) = c o s p o s ( 1 e 5 ) 2 i / d m o d e l PE(pos,2i+1) = cos \frac{pos}{(1e5)^{2i/d_{model}}} PE(pos,2i+1)=cos(1e5)2i/dmodelpos
公式中
- p o s pos pos 表示文本中单词的位置,取值范围是 [ 0 , m a x _ s e q _ l e n − 1 ] [0, max\_seq\_len-1] [0,max_seq_len−1]。
- 2 i 2i 2i 或 2 i + 1 2i+1 2i+1 表示位置编码中对应的维度序号, 2 i 2i 2i 表示在偶数维度上采用正弦公式计算, 2 i + 1 2i+1 2i+1 表示在奇数维度上采用余弦公式计算。
- d m o d e l d_{model} dmodel 等于Embedding层的维度。
根据这一公式,
t
t
t 时刻某单词的位置编码
p
⃗
t
\vec{p}_t
pt 的表示为:
p
⃗
t
=
[
s
i
n
(
w
0
⋅
t
)
c
o
s
(
w
0
⋅
t
)
s
i
n
(
w
1
⋅
t
)
c
o
s
(
w
1
⋅
t
)
⋮
s
i
n
(
w
d
2
−
1
⋅
t
)
c
o
s
(
w
d
2
−
1
⋅
t
)
]
d
∗
1
\vec{p}_t = \left[ \begin{matrix} sin(w_0 \cdot t) \\ cos(w_0 \cdot t) \\ sin(w_1 \cdot t) \\ cos(w_1 \cdot t) \\ \vdots \\ sin(w_{\frac{d}{2}-1} \cdot t) \\ cos(w_{\frac{d}{2}-1} \cdot t) \\ \end{matrix} \right]_{d*1}
pt=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡sin(w0⋅t)cos(w0⋅t)sin(w1⋅t)cos(w1⋅t)⋮sin(w2d−1⋅t)cos(w2d−1⋅t)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤d∗1
3.2 自注意力机制
经过Word Embedding和Positional Encoding后,模型Encoder的输入记为 X X X,其维度为 s e q _ l e n ∗ e m b e d _ s i z e seq\_len*embed\_size seq_len∗embed_size。
接着定义三个矩阵 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV,使用这三个矩阵对输入 X X X 进行线性变换,得到查询矩阵 Q Q Q, 键矩阵 K K K, 值矩阵 V V V。
最终Encoder单层的输出为:
Z
=
s
o
f
t
m
a
x
(
Q
K
T
d
)
V
Z = softmax(\frac{QK^T}{\sqrt d}) V
Z=softmax(dQKT)V
3.3 多头注意力
每组 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV 可以产生一个输出 Z Z Z,那么定义多组 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV 则可以得到多组输出矩阵 Z Z Z。
多头注意力的思想类似CNN中使用多层卷积核,将模型分为多个头、形成多个子空间,可以让模型去关注不同方面的信息,最后再将各个方面的信息综合起来。
3.4 Layer Normalization
沿Embedding方向对数据进行标准化处理的过程,即为Layer Normalization。
- 沿Embedding方向而不是Sequence方向,是因为不同句子的长度不一样,经过Padding补充的0的个数也不一样,沿Sequence方向标准化其结果不具有统一性。
- Layer Normalization的作用是加快模型训练速度、加速参数收敛。
3.5 Encoder整体结构
总结一下,每层Encoder Block的计算步骤包括:
(1) 对位置编码和词嵌入进行相加
X
=
E
m
b
e
d
(
i
n
p
u
t
)
+
P
E
(
i
n
p
u
t
)
X = Embed(input)+PE(input)
X=Embed(input)+PE(input)
(2) 自注意力计算
Q
=
X
W
Q
T
K
=
X
W
K
T
V
=
X
W
V
T
Q = XW_Q^T \quad K = XW_K^T \quad V = XW_V^T
Q=XWQTK=XWKTV=XWVT
Z = s o f t m a x ( Q K T d ) V Z = softmax(\frac{QK^T}{\sqrt{d}})V Z=softmax(dQKT)V
(3) Add & LayerNorm
X
a
t
t
n
=
L
a
y
e
r
N
o
r
m
(
X
+
Z
)
X_{attn} = LayerNorm(X + Z)
Xattn=LayerNorm(X+Z)
(4) Feed Forward Network
X
h
i
d
d
e
n
=
L
i
n
e
a
r
(
R
e
l
u
(
L
i
n
e
a
r
(
X
a
t
t
n
)
)
)
X_{hidden} = Linear(Relu(Linear(X_{attn})))
Xhidden=Linear(Relu(Linear(Xattn)))
(5) Add & LayerNorm
X
o
u
t
p
u
t
=
L
a
y
e
r
N
o
r
m
(
X
a
t
t
n
+
X
h
i
d
d
e
n
)
∈
R
b
a
t
c
h
_
s
z
∗
s
e
q
_
l
e
n
∗
h
i
d
d
e
n
_
s
z
X_{output} = LayerNorm(X_{attn} + X_{hidden}) \in R^{batch\_sz*seq\_len*hidden\_sz}
Xoutput=LayerNorm(Xattn+Xhidden)∈Rbatch_sz∗seq_len∗hidden_sz
4 Decoder模块

Transformer的Decoder模块,主要包含三个部分:
- Masked Multi-Head Self-Attention
- Multi-Head Encoder-Decoder Attention
- Feed Forwad Netwok
与Encoder层一样,以上每个子模块的输出均会通过一个Add&Layer进行残差连接与特征标准化。
4.1 Masked Multi-Head Self-Attention
在传统Seq2Seq模型中,Decoder模块使用的是RNN模型。因此在训练过程中输入 t t t 时刻单词,模型看不到未来时刻的单词。
但Transformer Decoder抛弃了RNN,使用Self-Attention机制,因此我们需要对Decoder的输入进行Mask处理。其具体实现过程如下所示。
-
Masked Scores
为了使Attention计算时模型仅知晓当前时刻与之前时刻的单词,可定义一下三角全为 0 0 0、上三角全为 − i n f -inf −inf 的矩阵。计算时将该矩阵与原Scaled Scores矩阵相加即可。

-
Masked-Softmax
利用 e − i n f = 0 e^{-inf} = 0 e−inf=0 的性质,因此设计Mask矩阵时将上三角定义为 − i n f -inf −inf。如此在做Softmax时,上三角部分的概率被转化为0。

4.2 Multi-Head Encoder-Decoder Attention
这一部分的计算流程与Masked Self-Attention唯一的区别在于,使用Encoder模块的输出作为该模块 K , V K,V K,V 的输入、使用Masked Self-Attention模块的输出作为该模块 Q Q Q 的输入。
5 总结
到此为止,Transformer的内容已经介绍完了,我们用一张图展示其完整结构。

本文介绍了Transformer模型,它是谷歌提出的seq2seq模型,相比LSTM、RNN和Seq2Seq+Attention可并行计算,提高效率。模型主要分Encoder和Decoder两部分,文章详细阐述了Encoder的位置编码、自注意力机制等模块,以及Decoder的Masked Multi-Head Self-Attention等模块。
- transformer&spm=1001.2101.3001.5002&articleId=111880016&d=1&t=3&u=f1a48449ab48472dafff2c0ff45dec83)
696

被折叠的 条评论
为什么被折叠?



