关于Transformer和BERT,网上已经有了很多的讲解。本博客是笔者阅读论文后,并参考了一些其他博主的思路,结合笔者本人的理解而写。文章的最后会列出一些参考博客(知乎),如有遗漏,烦请提醒。
Transformer
引言
Attention Is All You Need
文章链接
本文出自NIPS2017,一作是Ashish Vaswani,来自Google Brain。Transformer最开始是基于机器翻译任务提出的,打破了传统的RNN框架,完全依赖于注意力机制。能够很容易的并行训练,仅在8个P100上训练了12个小时,就实现了当时的新SOTA。
解析
整体结构
Transformer的结构如下图所示。还是机器翻译领域传统的Encoder-Decoder架构。
Encoder部分使用
N
=
6
N=6
N=6个Layer组成,每个Layer又包含两个sub-layer,分别是:多头注意力层(Multi-Head Attention)、前向传播层(Feed Forward)。每个sub-layer后面都添加了一个layer normalization层(出自文章),且使用了类似ResNet的跳跃连接。综上,对于输入为
x
x
x的sub-layer,它的输出是:
LayerNorm
(
x
+
Sublayer
(
x
)
)
\text{LayerNorm}(x+\text{Sublayer}(x))
LayerNorm(x+Sublayer(x))。
Decoder部分也是使用 N = 6 N=6 N=6个Layer组成,每个Layer包含三个sub-layer,分别是:带有掩码的多头注意力层(Masked Multi-Head Attention)、多头注意力层(Multi-Head Attention)、前向传播层(Feed Forward)。
注意力机制
首先介绍基于点积的注意力(Scaled Dot-Product Attention),再引申出本文中用到的自注意力(Self Attention)和多头注意力(Multi-Head Attention)。
基于点积的注意力的网络结构如下图所示,具有三个输入:
Q
Q
Q、
K
K
K和
V
V
V,分别代表
Q
u
e
r
y
Query
Query、
K
e
y
Key
Key和
V
a
l
u
e
Value
Value,这三个变量的含义下面会详细介绍。
下面,以机器翻译为例子,详细介绍注意力机制的计算过程。假设,此时模型的输入 I = " w o r d 1 w o r d 2 w o r d 3 " I="word_1 \space word_2 \space word_3" I="word1 word2 word3",使用 N N N表示单词个数,例子中 N = 3 N=3 N=3。
- Embedding
对输入的句子 I I I进行word embedding后,可以得到句子的特征 E E E,是一个 N × D i m E N \times Dim^E N×DimE的矩阵。按照下标进行索引即可得到每个单词的特征,这里使用 E i ( 1 ≤ i ≤ N ) E_i(1 \le i \le N) Ei(1≤i≤N)表示单词 w o r d i word_i wordi的特征,每个 E i E_i Ei的大小均为 1 × D i m E 1 \times Dim^E 1×DimE。 - 获取
Q
,
K
,
V
Q, K, V
Q,K,V
使用三个不同的权重矩阵 W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV,分别乘以 E E E即可得到 Q , K , V Q, K, V Q,K,V,大小分别为 N Q × D i m Q , N K × D i m K , N V × D i m V N^Q \times Dim^Q, \space N^K \times Dim^K, \space N^V \times Dim^V NQ×DimQ, NK×DimK, NV×DimV。
Q = E W Q , K = E W K , V = E W V Q = E W^Q, \space K = E W^K, \space V = E W^V Q=EWQ, K=EWK, V=EWV
直观上来看, N Q = N K = N V = N N^Q=N^K=N^V=N NQ=NK=NV=N(实际上不一定,后文会说),下面以这种假设为前提,看一下如何计算Attention。 - 计算Attention
对于单词 w o r d i word_i wordi来说,首先,通过索引得到其对应的查询向量 Q i Q_i Qi。通过矩阵乘法操作 S i = Q i K T S_i=Q_i K^T Si=QiKT可以得到一个大小为 1 × N 1 \times N 1×N的向量 S i S_i Si,而 S i [ j ] S_i[j] Si[j]即为 w o r d i word_i wordi和 w o r d j word_j wordj的Score。然后,使用 softmax \text{softmax} softmax将Score进行归一化,得到Attention Weight W i W_i Wi,大小仍是 1 × N 1 \times N 1×N,含义仍是 W i [ j ] W_i[j] Wi[j]表示 w o r d i word_i wordi和 w o r d j word_j wordj的相关性。,整个过程可以概括为(初始时 Q i Q_i Qi 的大小为 1 × D i m Q 1 \times Dim^Q 1×DimQ):
1 × D i m Q × K T → 1 × N softmax → 1 × N × V → 1 × D i m V 1 \times Dim^Q \space \space \space \underrightarrow{\times K^T} \space \space \space 1 \times N \space \space \space \underrightarrow{\text{softmax}} \space \space \space 1 \times N \space \space \space \underrightarrow{\times V} \space \space \space 1 \times Dim^V 1×DimQ ×KT 1×N softmax 1×N ×V 1×DimV
不难发现,对于每一个 Q i Q_i Qi,分别计算再将结果Concatenate和直接使用 Q Q Q进行计算得到的结果是一致的:
N × D i m Q × K T → N × N softmax → N × N × V → N × D i m V N \times Dim^Q \space \space \space \underrightarrow{\times K^T} \space \space \space N \times N \space \space \space \underrightarrow{\text{softmax}} \space \space \space N \times N \space \space \space \underrightarrow{\times V} \space \space \space N \times Dim^V N×DimQ ×KT N×N softmax N×N ×V N×DimV
上述介绍中,笔者实际上省略了论文中的一个重要操作——除以 D i m K \sqrt{Dim^K} DimK,文中给出的此操作的作用是:作者同时测试了点积注意力和additive attention(出自文章)的表现,在 D i m K Dim^K DimK很小时,两种注意力的性能接近,在 D i m K Dim^K DimK很大时,前者的表现要更出色。而随着 D i m K Dim^K DimK的增加,点积操作 Q K T QK^T QKT得到的结果会变大,经过 softmax \text{softmax} softmax后,反向传播回来的梯度会很小,会对训练过程带来阻碍,故除以 D i m K \sqrt{Dim^K} DimK进行缩放,再进行 softmax \text{softmax} softmax。综上,完整的计算Attention的过程为:
Attention ( Q , K , V ) = softmax ( Q K T D i m K ) V \text{Attention}(Q, K, V)=\text{softmax}(\frac{QK^T}{\sqrt{Dim^K}})V Attention(Q,K,V)=softmax(DimKQKT)V
现在,总结一下注意力到底做了什么。我觉得用一句话概括,就是:使用 K , V K, V K,V来获得 Q Q Q的更优表示。(以下部分参考了[2])
Q
Q
Q代表我们想要表达的内容(或序列,暂记为
X
X
X)在高维空间
A
A
A中的表达,
K
K
K代表某内容(或序列,暂记为
Y
Y
Y)在高维空间
A
A
A中的表达,
V
V
V代表某内容(或序列,暂记为
Y
Y
Y)在高维空间
B
B
B中的表达。即:
Q
=
A
(
X
)
,
K
=
A
(
Y
)
,
V
=
B
(
Y
)
Q=A(X), \space K=A(Y), \space V=B(Y)
Q=A(X), K=A(Y), V=B(Y)
也就是说,通过计算两个不同序列
X
,
Y
X, Y
X,Y在同一高维空间
A
A
A的相似度,作为权重作用在序列
Y
Y
Y在另一高维空间
B
B
B上,从而获得序列
X
X
X在高维空间
B
B
B中的表达
B
(
X
)
B(X)
B(X)。
由上面这些分析可知,在注意力模块中,必满足以下两个约束:
- D i m Q = D i m K Dim^Q = Dim^K DimQ=DimK(即: Q Q Q和 K K K在同一高维空间中,这样才可以计算相似度)
-
N
K
=
N
V
N^K = N^V
NK=NV(即:
K
K
K和
V
V
V中的“单词”(不一定限定于单词)个数相同,因为他们是同一序列在不同高维空间的表达)
自注意力
其实只有一句话, Q = K = V Q=K=V Q=K=V
多头注意力
这部分也很好理解,就是通过多组不同的
Q
,
K
,
V
Q, K, V
Q,K,V分别计算注意力,再Concat一下。这样可以学到不同空间的表示。
Positional Encoding
TO DO.
参考
[1] https://blog.csdn.net/longxinchen_ml/article/details/86533005
[2] https://zhuanlan.zhihu.com/p/104393915
BERT
引言
Pre-training of Deep Bidirectional Transformers for Language Understanding
文章链接
解析
TO DO.