Attention is all your need 详解

什么是Attention

在 seq to seq 模型中, 我们常常在 decoder 阶段加入Attention 机制, 主要是对于decoder 的隐含层输入, 引入更多的有关 encoder 序列中, 中间步骤的信息. 在这里就不详细解释了, 我们将Attention 从模型中剥离出来, 以通俗的解释上来看什么是 Attention机制. 对于一个 Attention 机制, 我们通常有一个 Query, 键值Keys, 以及每个 Key对应的Values 三部分组成, 通俗的解释就是, 我们Query 往往与多个 Keys 相关, 我们希望计算出对每个 Keys 的相关性的相对大小, 然后用这个数值, 作为我们期望获得的 Values 的权重, 最后计算得到最后的 Attention Value. 可以用下面的图表示出来,


Query
Query
Value1
Value1
Value2
Value2
Value3
Value3
Value4
Value4
Key1
Key1
Key2
Key2
Key3
Key3
Key4
Key4
Attention
Value
Attention...

用公式表示就是:
\[ \text{ Attention(Query, source) }=\sum_{i=1}^{L_{x}} { similarity (Query, Key_{i} ) * {Value} _ { i } } \]
更加具体可以用下面的图解释,


Query
Query
Key1
Key1
Key2
Key2
Key3
Key3
Key4
Key4
Attention
Value
Attention...
F(Q,K)
F(Q,K)
F(Q,K)
F(Q,K)
F(Q,K)
F(Q,K)
F(Q,K)
F(Q,K)
S1
S1
S2
S2
S3
S3
S4
S4
SoftMax 归一化
SoftMax 归一化
a1
a1
a2
a2
a3
a3
a4
a4
X
X
X
X
X
X
X
X
Value1
Value1
Value2
Value2
Value3
Value3
Value4
Value4

Softmax 之前, 我们计算 S1, S2, S3, S4 的时候可以通过相关性计算, 比较常见的就是 cos 计算相关性:
\[ { Similarity (Query, Key_{i} ) }=\frac{\text { Query*Key}_{i}}{ { ||Query|| * ||Key_{i} || }} \]
Softmax 我们就采用 softmax 函数,
\[ a_{i}=\operatorname{softmax}\left(\operatorname{sim}_{i}\right)=\frac{e^{s i m_{i}}}{\sum_{j=1}^{L_{x}} e^{s i m_{j}}} \]
然后加权就可以获得最后的数值, AttentionValue.

接下来, 我们看看论文中的 Attention 是如何构造的.

Scaled Dot-Product Attention

上面讲的是在通常情况下的 Attention, 其实这里Scaled Dot-Product Attention很好理解, 就是讲 Query, Key, Value 变成多个向量组成的矩阵, 也就增加计算的并行性, 同时代表了模型同时进行了多个中Attention, 这里用文章中的图表示就是如下所示:

MatMul
MatMul
SoftMax
SoftMax
Mask(opt.)
Mask(opt.)
Scale
Scale
MatMul
MatMul
Q
Q
K
K
 V
 V

计算公式也很明显,
\[ \text { Attention }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V \]

Multi-Head Attention

我们首先看下文章给出的 Multi-Head Attention 的计算公式, 然后一步步的说明, 在以前的例子中, 我们的 Attention 都是只做一次, 设想一下, 如果我们对同一个 Query, Keys, Values 做多次 Attention 结果毫无疑问是一样的, 那么我们怎样才能获得多次 Attention 的效果, 使得最后算出的结果更加准确呢? 这一步大大增加了模型的复杂度, 引入了更多的变量, 同时也带来了好处, 通常的 Attention 有一个条件, 那就是 Key 与 Query 必须是维度相同的向量, 如果来自维度不同的向量, 就无法使用 Attention 获取有用的信息, Multi-Head Attention主要就是针对该问题, 我们规定一个模型中标准向量 \(d_{model}\) , 其唯独是 model, 文中取的 model 为 64*8 . 因此我们的 Query, Key, Value 的维度均为 model, 或者我们遇到 Q 与 K 的维度不同的时候, 我们可以用下面的公式来计算
\[ \text { head }_{\mathrm{i}}=\text { Attention }\left(Q W_{i}^{Q}, K W_{i}^{K}, V W_{i}^{V}\right) \]
表示为一个 Attention, 如果不引人矩阵 $ W_{i}^{Q} $ , \(W_{i}^{K}\) , \(W_{i}^{V}\) 的话, 那么多个Attention 是一样的, 引入之后, 文章使用了 h = 8, 共 8 个 Attention,
\[ \text { MultiHead }(Q, K, V)=\text { Concat }\left(\text { head }_{1}, \ldots, \text { head }_{\mathrm{h}}\right) W^{O} \]
所以这几矩阵的维度就十分明显了,
\[ W_{i}^{Q} \in \mathbb{R}^{d_{\text {model }} \times d_{k}}, W_{i}^{K} \in \mathbb{R}^{d_{\text {model }} \times d_{k}}, W_{i}^{V} \in \mathbb{R}^{d_{\text {model }} \times d_{v}}, W^{O} \in \mathbb{R}^{h d_{v} \times d_{\text {model }}} \]
这就相当于有了 8 个不同的 Attention 对同一个 Q, K, V, 进行计算, 然后归一化.

Self_Attention 机制

传统的 seq to seq 的 Attention 机制是, 在decoder 阶段, Attention encoder 最后一层的输出, 将这个结果结合 context vector 作为decoder 的输入, self-attention 其实就是 encoder attend 自身, 在transformer 模型中, 我的理解是下面的简化模型对应的是一层 encoder 阶段,


I
I
like
like
Playing
Playing
Soccer
Soccer
Embedding
Embedding
X1
X1
X2
X2
X3
X3
X4
X4
FFN
FFN
Attention
Attention
Y1
Y1

扫描二维码关注公众号,回复: 9427509 查看本文章

对于每一层的encoder, 都有一个对应的 Feed-Forward Networks, FFN 采用的是两次线性变换, 中间加一个 ReLU 激活函数, 用公式表示就是:
\[ \mathrm{FFN}(x)=\max \left(0, x W_{1}+b_{1}\right) W_{2}+b_{2} \]
FFN 也可以直接用核为1 的 CNN 实现, 这里的结果是什么呢? 注意, 在 transformer里没有 RNN, 我们 encoder 最后的结果必须是一个context vector, 而不仅仅是 Attention 的输出, 而在这里使用 ReLU 激活函数, 也使得模型更加的稀疏

decoder 阶段的self-Attention 以及 mask 机制

decoder 初始的计算结果也是根据encoder 最后一步的编码输出来计算的, 但是对于decoder 的self-attention, 却没有将未来的信息作为 attention 的来源, 因为我们更多的是参考以及翻译的信息, 我画了一个自己理解的图,

I
I
like
like
Playing
Playing
Soccer
Soccer
Encoder
Encoder
Y1
Y1
Y2
Y2
Y3
Y3
Y4
Y4
Z11
Z11
Z12
Z12
Z22
Z22

上述就是 Transformer 模型中最主要的部分, 那就是 Attention 机制的使用, 接下来, 我们再关注一下模型整体, 如下图所示,


Inputs
Inputs
Input
Embedding
Input...
Multi-Head
Attention
Multi-Head...
Add & Norm
Add & Norm
Feed Forward
Feed Forward
Add & Norm
Add & Norm
Mask
Multi-Head
Attention
Mask...
Add & Norm
Add & Norm
Multi-Head
Attention
Multi-Head...
Add & Norm
Add & Norm
Feed Forward
Feed Forward
Add & Norm
Add & Norm
Linear
Linear
Softmax
Softmax
Inputs
Inputs
Ouput
Embedding
Ouput...

需要注意的是 decoder 阶段, 分成了两个阶段, 我在Self_attention 那里的图中没有体现出来, 也就是说 self-attention 与 对 encoder 结果的 attention 是分成两个阶段的, 先进行了self-attention, 然后对encoder 的结果进行 attention. 同样要经过一个 FFN,

ADD & Norm 阶段

其他的内容以及芦墟搞清楚了,现在就剩下

猜你喜欢

转载自www.cnblogs.com/wevolf/p/12369176.html
今日推荐