

对拆分后的语句x = [batch_size, seq_len]进行以下操作
通过输入部分
x: [batch_size, seq_len, embedding_dim]

将
a
i
a_i
ai分别与上面三个矩阵相乘,得到三个向量
q
i
,
k
i
,
v
i
q_i, k_i, v_i
qi,ki,vi
如果要计算第1个字向量与句子中所有字向量的注意力:
将查询向量
q
1
q_1
q1与 所有的字向量的键向量
k
i
k_i
ki相乘得到
a
l
p
h
a
10
,
a
l
p
h
a
11
,
.
.
.
,
a
l
p
h
a
1
,
s
e
q
l
e
n
alpha_{10}, alpha_{11},...,alpha_{1,seqlen}
alpha10,alpha11,...,alpha1,seqlen
将这写数值进行softmax处理后, 分别与
v
i
v_i
vi相乘再合加得到最终结果
b
1
b_1
b1

Add是用了残差神经网络的思想,也就是把Multi-Head Attention的输入的a矩阵直接加上Multi-Head Attention的输出b矩阵(好处是可以让网络训练的更深)得到的和 b ˉ \bar{b} bˉ矩阵
再在经过Layer normalization(归一化,作用加快训练速度,加速收敛)把
每一行(也就是每个句子)做归一为标准正态分布,最后得到
b
^
\hat{b}
b^
BN 和 LN:

把Add & Layer normalization输出 b ^ \hat{b} b^,经过两个全连接层,再经过Add & Layer normalization得到最后输出 o 矩阵
比如我们在中英文翻译时候,会先把"我是学生"整个句子输入到Encoder中,得到最后一层的输出后,才会在Decoder输入"S I am a student"(s表示开始),但是"S I am a student"这个句子我们不会一起输入,而是在T0时刻先输入"S"预测,预测第一个词"I";在下一个T1时刻,同时输入"S"和"I"到Decoder预测下一个单词"am";然后在T2时刻把"S,I,am"同时输入到Decoder预测下一个单词"a",依次把整个句子输入到Decoder,预测出"I am a student E"
Decoder 的 Multi-Head Attention 的输入来自两部分,
K,V 矩阵来自Encoder的输出,
Q 矩阵来自 Masked Multi-Head Attention 的输出
