首页 >> 大全

Transformer的详细深入理解

2023-06-20 大全 45 作者:考证青年

一、前言

网络架构架构由 等人在 Is All You Need一文中提出,并用于的机器翻译任务。但是该模型并没有用到以往的RNN或CNN网络架构,而是采用注意力机制。这个模型广泛应用于NLP领域,例如机器翻译,问答系统,文本摘要和语音识别等等方向。

为方便编写,以下的模型简称T模型

二、的整体架构

上图就是T模型的大致流程,可以看到,它分为编码器和解码器,其中编码器和解码器中中各有六个Block。

三、T模型的大致流程如下 3.1第一步

获取输入句子的每一个单词的表示向量 X,

X由单词的 (就是从原始数据提取出来的) 和单词位置的 相加得到。

图形如下:

3.2第二步

将得到的单词表示向量矩阵x 传入 中,经过 6 个 block 后可以得到句子所有单词的编码信息矩阵 C,如下图。单词向量矩阵用Xn*d 表示, n 是句子中单词个数,d 是表示向量的维度 (论文中 d=512)。每一个 block 输出的矩阵维度与输入完全一致。

3.3第三步

第三步:将 输出的编码信息矩阵 C传递到 中, 依次会根据当前翻译过的单词 1~ i 翻译下一个单词 i+1,如下图所示。在使用的过程中,翻译到单词 i+1 的时候需要通过 Mask (掩盖) 操作遮盖住 i+1 之后的单词。

上图 接收了 的编码矩阵 C,然后首先输入一个翻译开始符 “”,预测第一个单词 “I”;然后输入翻译开始符 “” 和单词 “I”,预测单词 “have”,以此类推。这就是T模型的大致流程

四、T模型的详细流程 4.1T模型的输入

4.1.1 单词

单词的 有很多种方式可以获取,例如可以采用 、Glove 等算法预训练得到,也可以在 中训练得到。

4.1.2 位置

中除了单词的 ,还需要使用位置 表示单词出现在句子中的位置。因为 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要。所以 中使用位置 保存单词在序列中的相对或绝对位置。

位置 用 PE表示,PE 的维度与单词 是一样的。PE 可以通过训练得到,也可以使用某种公式计算得到。在 中采用了后者,计算公式如下:

其中,pos 表示单词在句子中的位置,d 表示 PE的维度 (与词 一样),2i 表示偶数的维度,2i+1 表示奇数维度 (即 2i≤d, 2i+1≤d)。

使用这种公式计算 PE 有以下的好处:

使 PE 能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有 20 个单词,突然来了一个长度为 21 的句子,则使用公式计算的方法可以计算出第 21 位的 。

可以让模型容易地计算出相对位置,对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。

将单词的词 和位置 相加,就可以得到单词的表示向量 x,x 就是 的输入。

4.2Self-(自注意力机制)

上图是论文中 的内部结构图,左侧为 block,右侧为 block。但这不是T模型的结构图,它只是一个Block,而T模型里面共有12个Bolck

红色圈中的部分为 Multi-Head ,是由多个 Self-组成的,可以看到 block 包含一个 Multi-Head ,而 block 包含两个 Multi-Head (其中有一个用到 )。Multi-Head 上方还包括一个 Add & Norm 层,Add 表示残差连接 ( ) 用于防止网络退化,Norm 表示 Layer ,用于对每一层的激活值进行归一化。

因为 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 叠加就可以组成 。

第一个 block 的输入为句子单词的表示向量矩阵,后续 block 的输入是前一个 block 的输出,最后一个 block 输出的矩阵就是编码信息矩阵 C,这一矩阵后续会用到 中。

4.结构

上图红色部分为 的 block 结构,与 block 相似,但是存在一些区别:

包含两个 Multi-Head 层。

4.4.1 第一个 Multi-Head

block 的第一个 Multi-Head 采用了 操作,因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。下面以 “我有一只猫” 翻译成 “I have a cat” 为例,了解一下 操作。

下面的描述中使用了类似 的概念,在 的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如下图所示。首先根据输入 “” 预测出第一个单词为 “I”,然后根据输入 “ I” 预测下一个单词 “have”。

可以在训练的过程中使用 并且并行化训练,即将正确的单词序列 ( I have a cat) 和对应输出 (I have a cat ) 传递到 。那么在预测第 i 个输出时,就要将第 i+1 之后的单词掩盖住,注意 Mask 操作是在 Self- 的 之前使用的,下面用 0 1 2 3 4 5 分别表示 “ I have a cat ”。

第一步:是 的输入矩阵和 Mask 矩阵,输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。在 Mask 可以发现单词 0 只能使用单词 0 的信息,而单词 1 可以使用单词 0, 1 的信息,即只能使用之前的信息。

第二步:接下来的操作和之前的 Self- 一样,通过输入矩阵X计算得到Q,K,V矩阵。然后计算Q和 KQ的转置乘积 。

第三步:在得到其乘积之后需要进行 ,计算 score,我们在 之前需要使用Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:

得到 Mask [QKT] 之后在 Mask [QKT]上进行 ,每一行的和都为 1。但是单词 0 在单词 1, 2, 3, 4 上的 score 都为 0

第四步:使用 Mask [公式]与矩阵 V相乘,得到输出 Z,则单词 1 的输出向量 [公式] 是只包含单词 1 信息的。

第五步:通过上述步骤就可以得到一个 Mask Self- 的输出矩阵 ,然后和 类似,通过 Multi-Head 拼接多个输出, 然后计算得到第一个 Multi-Head 的输出Z,Z与输入X维度一样。

4.4.2 第二个 Multi-Head

block 第二个 Multi-Head 变化不大, 主要的区别在于其中 Self- 的 K, V矩阵不是使用 上一个 block 的输出计算的,而是使用 的编码信息矩阵 C 计算的。

根据 的输出 C计算得到 K, V,根据上一个 block 的输出 Z 计算 Q (如果是第一个 block 则使用输入矩阵 X 进行计算),后续的计算方法与之前描述的一致。

这样做的好处是在 的时候,每一位单词都可以利用到 所有单词的信息 (这些信息无需 Mask)。

4.4.3 预测输出单词

block 最后的部分是利用 预测下一个单词,在之前的网络层我们可以得到一个最终的输出 Z,因为 Mask 的存在,使得单词 0 的输出 Z0 只包含单词 0 的信息,如下:

根据输出矩阵的每一行预测下一个单词

这就是 block 的定义,与 一样, 是由多个 block 组合而成。

五、 总结

与 RNN 不同,可以比较好地并行训练。

本身是不能利用单词的顺序信息的,因此需要在输入中添加位置 ,否则 就是一个词袋模型了。

的重点是 Self- 结构,其中用到的 Q, K, V矩阵通过输出进行线性变换得到。

中 Multi-Head 中有多个 Self-,可以捕获单词之间多种维度上的相关系数 score。

侵联删,谢谢!

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了