要说近些年来最火的深度学习模型,十个人中会有九个人说是Transformer。Transformer的通用性与易训性使得其在自然语言处理领域大方异彩。自2017年提出以来,近5年来大量NLP领域的创新均是基于transformer进行的,例如我们熟知的BERT,GPT2等,均取得良好的实验效果。本篇博客介绍transformer的结构,并提出自己对模型结构的看法。
目录
transformer结构
transformer最初被应用在文本翻译中,即输入一段文本sequence,输出其翻译文本sequence。一个sequence由多个token组成,每个token本身就是一个向量,一个sequence可以理解成是一个向量序列,其中每个元素是向量,元素之间有顺序关系。transformer有2个最核心的模块:encoder和decoder,二者均使用了attention机制和残差神经网络结构。
上面这张图你从各种各样讲解transformer的博客中都能看见,它就是transformer的完整结构。事实上encoder和decoder的框架设计并不是transforme的创新点,在transformer之前的GAN和a utoencoder均有encoder+decoder的设计。transformer最核心的创新点在于:只使用attention机制,避免使用循环神经网络和卷积网络,从而增加并行性,提升速度。1
encoder
encoder即是一个编码器,其作用是获得一个输入的中间表示。其有3个核心要点:
- multi-head attention机制
- add & Norm 归一化
- add & Norm 残差结构
multi-head attention
这个模块是transformer摆脱RNN的关键,在整个transformer中应用广泛,不仅在encoder中使用,也在decoder中有使用。在介绍multi-head attention之前,我们先要了解self-attention机制。self-attention机制最核心的想法是通过计算相关性(也可以理解成相似性)来获得每个value的权重,进而得到一个加权平均的表示。聪明的你一定猜到了,这里的相关性即是attention的由来,哪个元素的相关性大,则其获得的attention则越多。multi-head attention是在self-attention基础上的变形。self-attention可以用公式表示成:
a
t
t
e
n
t
i
o
n
=
s
o
f
t
m
a
x
(
Q
K
T
/
(
d
k
)
)
V
attention=softmax(QK^T/\sqrt(d_k))V
attention=softmax(QKT/(dk))V
这里的
Q
Q
Q、
K
K
K、
V
V
V是矩阵,举例来说如果
Q
Q
Q、
K
K
K、
V
V
V是2 * 3的矩阵,那么
Q
K
T
QK^T
QKT的矩阵代表每个
q
q
q (1 * 3) 和
k
k
k(1 * 3)之间的相似度,其规模为2 * 2,其
i
,
j
i,j
i,j元代表第
i
i
i条
q
q
q与第
j
j
j条
k
k
k的相关性。softmax层使得2 * 2矩阵的每一行求和为1,从而在与V矩阵相乘时得到的结果矩阵Z中每一行是
v
v
v (1 * 3)的加权平均。
multi-head attention即将多个attention的的结果矩阵拼接在一起,得到一个基于不同attention模型的结果拼接。
m
u
t
l
i
_
a
t
t
e
n
t
i
o
n
=
c
o
n
c
a
t
(
a
t
t
e
n
t
i
o
n
1
(
Q
,
K
,
V
)
,
a
t
t
e
n
t
i
o
n
2
(
Q
,
K
,
V
)
,
.
.
.
a
t
t
e
n
t
i
o
n
h
(
Q
,
K
,
V
)
mutli\_attention=concat(attention_1(Q,K,V), attention_2(Q,K,V),...attention_h(Q,K,V)
mutli_attention=concat(attention1(Q,K,V),attention2(Q,K,V),...attentionh(Q,K,V)
当然上述表示与论文中的表示等价:
M
u
l
t
i
H
e
a
d
(
Q
,
K
,
V
)
=
C
o
n
c
a
t
(
h
e
a
d
1
,
.
.
.
,
h
e
a
d
h
)
W
O
MultiHead(Q, K, V ) = Concat(head1, ..., headh)W^O
MultiHead(Q,K,V)=Concat(head1,...,headh)WO
h
e
a
d
i
=
A
t
t
e
n
t
i
o
n
(
Q
W
i
Q
,
K
W
i
K
,
V
W
i
V
)
headi = Attention(QW_i^Q , KW_i^K , VW_i^V )
headi=Attention(QWiQ,KWiK,VWiV)
add&Norm归一化
add&Norm层的主要功能有2个:一个是add代表的残差结构,一个是Norm代表的归一化。我将分成2个部分介绍。
一提到归一化我们可以想到的种类有至少2种:BatchNormalization和LayerNormalization,在encoder中使用的是LayerNormalization而非BatchNormalization。LN是在同一个样本中不同神经元之间进行归一化,而BN是在同一个batch中不同样本之间的同一位置的神经元之间进行归一化。attention机制得到的中间表示的信息体现在完整的向量中,而非每个单独的维度,因而使用BN将每个维度进行归一化并无意义2。
add&Norm残差结构
add代表残差结构,引入残差结构可以有效防止深度神经网络在训练中发生退化问题。直观上,模型越复杂则表达能力越好,但同时训练难度也增加。随着模型复杂度从0增加,增加到一定程度,模型所达到的最佳损失loss会逐渐减小,但随着模型复杂过度,模型的损失函数反而会增加。
如何理解退化的产生?举例来说,当一个模型最佳层数是10层,但我们在设计模型的时候并不知道应该设计多少层,我们设计了20层,这就比最佳层数多了10层,我们要想训练出好结果,必然要训练出来恒等映射,这无疑增加了训练难度。引入残差层后输出结果是模型结果和输入的结果之和(这也解释了为什么残差网络结构的简称是add,这里的add就是指残差网络的结构由2部分相加而成)通过引入残差网络,我们只需要训练出来一个参数全为0的模型即可使得这层网络在功能上与恒等映射等价。在实践层面,网络参数的最初初始化就是全0,我们不需要训练这层即可达到这层是恒等映射的效果3。
decoder
decoder与encoder结构中的不同在于masked multi-head attention,这个结构与encoder中的multi-head attention进一步做了改变,引入了mask机制,用于隐藏信息。
masked multi-head attention
mask一共有2种:padding mask和sequence mask,它们有不同的设计目的。
padding mask的设计考虑到不同的sequence长度不同,但为了进入模型必须对齐成一样长度,对于规模小于模型要求的输入,尾部进行的填充是无意义的,我们需要一个信息位来告知模型这些位是填充的并没有实际意义,以防止模型受填充信息扰乱。在encoder和decoder中均使用了padding mask。
sequence mask仅使用在decoder中,这点与padding mask有所不同。decoder模型的输入仅仅是部分结果,而非全部,通过引入sequence mask可以将未来信息隐藏起来。
feed forward
feed forward是指全连接层,即MLP。Transformer将这里设计成,先通过线性变换将输入扩大维度,然后使用maxpool进行过滤,最后进行线性变化获得与输入同样维度的结果,使用的激活函数是ReLU。论文中给出的公式如下:
F
F
N
(
x
)
=
m
a
x
(
0
,
x
W
1
+
b
1
)
W
2
+
b
2
FFN(x) = max(0, xW1 + b1 )W2 + b2
FFN(x)=max(0,xW1+b1)W2+b2
训练方法
除了encoder和decoder这两个重要的模块外,transformer还有一个输出层用于输出翻译的结果。训练过程中,encoder得到input的中间表示,decoder得到完整翻译结果的中间表示,输出层根据完整翻译结果的中间表示,得到输出结果的概率分布,从而最终得到概率最大的结果作为翻译结果。损失函数为decoder的输入和输出层的结果之间的差异,整个模型的训练目标是得到损失函数最小的模型参数4。
这张图详细给出了transformer中的数据流动情况,可以看到decoder的输入是encoder的输出(Enc-2 Out)和output的编码结果(Dec-1 Out),二者进入Decoder-2后得到的Dec-2 Out进入后面的输出层,得到每个单词的概率,然后根据概率得到最终的输出6。
模型响应
现在我们已经有一个训练好的Transformer模型,我们将如何从input的sequence得到其翻译的结果?
看上图右下角3代表开始进行翻译,start token输入到decoder中与encoder输出的Enc-2 Out一同进入Decoder-2得到一个已有信息的编码Dec-2 Out,其进入输出层,得到概率得到第一个翻译的结果De,这个翻译的结果与start token一同作为下一个单词预测的输入。下一轮预测Nada时,3的内容即为start De这两个token。
响应过程的特点是,其decoder模型的输入会随着预测结果而得到扩充但Enc-2 Out并不会改变,只有deco der模型会在响应过程中得到使用。
参考
[1] Transformer详解
[2] 十分钟理解Transformer
[3] 史上最小白之Attention详解
[4] 史上最小白之transformer详解
[5] 详解transformer
[6] 碎碎念:Transformer的细枝末节