Transformer的详细深入理解( 二 )


因为 Self-是的重点 , 所以我们重点关注 Multi-Head A
以及 Self- , 首先详细了解一下 Self- 的内部逻辑 。
4.2.1 Self- 结构
Self- 结构
上图是 Self- 的结构 , 在计算的时候需要用到矩阵Q(查询),K(键值),V(值) 。在实际中 , Self- 接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个block 的输出 。而Q,K,V正是通过 Self- 的输入进行线性变换得到的 。
4.2.2 Q, K, V 的计算
Self- 的输入用矩阵X进行表示 , 则可以使用线性变阵矩阵WQ,WK,WV计算得到Q,K,V 。计算如下图所示 , 注意 X, Q, K, V 的每一行都表示一个单词 。
4.2.3 Self- 的输出
得到矩阵 Q, K, V之后就可以计算出 Self- 的输出了 , 计算的公式如下:
Self- 的输出
公式中计算矩阵Q和K每一行向量的内积 , 为了防止内积过大 , 因此除以 [公式] 的平方根 。Q乘以K的转置后 , 得到的矩阵行列数都为 n , n 为句子单词数 , 这个矩阵可以表示单词之间的强度 。下图为Q乘以 [公式]  , 1234 表示的是句子中的单词 。
Q乘以K的转置的计算
得到[公式] 之后 , 使用计算每一个单词对于其他单词的系数 , 公式中的是对矩阵的每一行进行  , 即每一行的和都变为 1.
对矩阵的每一行进行
得到矩阵之后可以和V相乘 , 得到最终的输出Z 。
Self- 输出
上图中矩阵的第 1 行表示单词 1 与其他所有单词的系数 , 最终单词 输出 , 如下图所示:
4.2.4 Multi-Head
在上一步 , 我们已经知道怎么通过 Self- 计算得到输出矩阵 Z , 而 Multi-Head是由多个 Self- 组合形成的 , 下图是论文中 Multi-Head的结构图 。
Multi-Head
从上图可以看到 Multi-Head包含多个 Self- 层 , 首先将输入X分别传递到 h 个不同的 Self- 中 , 计算得到 h 个输出矩阵Z 。下图是 h=8 时候的情况 , 此时会得到 8 个输出矩阵Z 。
多个 Self-得到 8 个输出矩阵 之后 , Multi-Head将它们拼接在一起 () , 然后传入一个层 , 得到 Multi-Head最终的输出Z 。
Multi-Head的输出
可以看到 Multi-Head输出的矩阵Z与其输入的矩阵X的维度是一样的 。
4.结构
上图红色部分是的block 结构 , 可以看到是由 Multi-Head , Add & Norm, Feed , Add & Norm 组成的 。刚刚已经了解了 Multi-Head的计算过程 , 现在了解一下 Add & Norm 和 Feed部分 。
4.3.1Add & Norm
Add & Norm 层由 Add 和 Norm 两部分组成 , 其计算公式如下:
其中 X表示 Multi-Head或者 Feed的输入 , (X) 和 (X) 表示输出 (输出与输入 X 维度是一样的 , 所以可以相加) 。
Add指 X+(X) , 是一种残差连接 , 通常用于解决多层网络训练的问题 , 可以让网络只关注当前差异的部分 , 在中经常用到:
Norm指 Layer  , 通常用于 RNN 结构 , Layer会将每一层神经元的输入都转成均值方差都一样的 , 这样可以加快收敛 。
4.3.2 Feed
Feed层比较简单 , 是一个两层的全连接层 , 第一层的激活函数为 Relu , 第二层不使用激活函数 , 对应的公式如下 。
X是输入 , Feed最终得到的输出矩阵的维度与X一致
4.3.3 组成
通过上面描述的 Multi-Head , Feed , Add & Norm 就可以构造出一个block ,  block 接收输入矩阵  , 并输出一个矩阵。通过多个block 叠加就可以组成。