Transformer模型是什么?( 二 )


Q, K, V 的计算
3.3 Self- 的输出
得到矩阵 Q, K, V之后就可以计算出 Self- 的输出了,计算的公式如下:
Self- 的输出
公式中计算矩阵Q和K每一行向量的内积,为了防止内积过大,因此除以dk的平方根 。Q乘以K的转置后,得到的矩阵行列数都为 n,n 为句子单词数,这个矩阵可以表示单词之间的强度 。下图为Q乘以KT,1234 表示的是句子中的单词 。
Q乘以K的转置的计算
得到QKT之后,使用计算每一个单词对于其他单词的系数,公式中的是对矩阵的每一行进行,即每一行的和都变为 1.
对矩阵的每一行进行
得到矩阵之后可以和V相乘,得到最终的输出Z 。
Self- 输出
上图中矩阵的第 1 行表示单词 1 与其他所有单词的系数,最终单词 1 的输出Z1等于所有单词 i 的值Vi根据系数的比例加在一起得到,如下图所示:
Zi 的计算方法
3.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 个输出矩阵Z1到Z8之后,Multi-Head将它们拼接在一起(),然后传入一个层,得到 Multi-Head最终的输出Z 。
Multi-Head的输出
可以看到 Multi-Head输出的矩阵Z与其输入的矩阵X的维度是一样的 。
4.结构
block
上图红色部分是的block 结构,可以看到是由 Multi-Head ,Add & Norm, Feed , Add & Norm组成的 。刚刚已经了解了 Multi-Head的计算过程,现在了解一下 Add & Norm 和 Feed部分 。
4.1 Add & Norm
Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:
Add & Norm 公式
其中X表示 Multi-Head或者 Feed的输入,(X) 和 (X) 表示输出 (输出与输入X维度是一样的,所以可以相加) 。
Add指X+(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在中经常用到:
残差连接
Norm指 Layer,通常用于 RNN 结构,Layer会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛 。
4.2 Feed
Feed层比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,对应的公式如下 。
Feed
X是输入,Feed最终得到的输出矩阵的维度与X一致 。
4.3 组成
通过上面描述的 Multi-Head , Feed , Add & Norm 就可以构造出一个block,block 接收输入矩阵X(n×d),并输出一个矩阵O(n×d) 。通过多个block 叠加就可以组成。
第一个block 的输入为句子单词的表示向量矩阵,后续block 的输入是前一个block 的输出,最后一个block 输出的矩阵就是编码信息矩阵 C,这一矩阵后续会用到中 。
编码句子信息
5.结构
block
上图红色部分为的block 结构,与block 相似,但是存在一些区别:
5.1 第一个 Multi-Head
block 的第一个 Multi-Head采用了操作,因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词 。通过操作可以防止第 i 个单词知道 i+1 个单词之后的信息 。下面以 "我有一只猫" 翻译成 "I have a cat" 为例,了解一下操作 。
下面的描述中使用了类似的概念,不熟悉的童鞋可以参考以下上一篇文章 模型详解 。在的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如下图所示 。首先根据输入 "" 预测出第一个单词为 "I",然后根据输入 " I" 预测下一个单词 "have" 。