前言

本文主要介绍在看李宏毅自注意机制视频的一些自我总结。

1.运行原理

Transformer之Self-attention_全连接

图1 POS tagging

当利用全连接网络,输入一段话(I saw a saw(我看到一个锯子)),输出对应单词数目的标签(假设输出为单词的词性表示(名词,动词,形容词等)),如图1所示,这种情况下,我们很难获得正确的答案。为了使网络能够理解问题的含义,就需要考虑语句的上下文信息。可以利用滑动窗口,每个向量查看窗口(window)中相邻的其他向量的性质,其中窗口大小的选择是靠人工经验设定的。但是这种方式不能解决整条句子的分析问题。所以就引入了自注意力机制(Self-attention),其作用就是看一看输入句子中其他位置的单词,试图寻找一种对当前单词更好的编码方式。

Transformer之Self-attention_Self_02


图2 Sequence Labling

2. Self-attention

它的经典结构如图3所示,将一个语句向量送入Self-attention,产生对应个数的向量,然后再将结果送入全连接网络(FC),最终实现结果的预测(标签的输出)。

Transformer之Self-attention_全连接_03


图3 Self-attention经典结构

同时也可以将图1这种结构堆叠,如图4所示。

Transformer之Self-attention_窗口大小_04


图4 多结构堆叠

3. 运行机制

本节重点剖析Self-attention内部的计算流程,假定输入分别为Transformer之Self-attention_算法_05Transformer之Self-attention_人工智能_06Transformer之Self-attention_算法_07Transformer之Self-attention_全连接_08,输出分别为Transformer之Self-attention_Self_09Transformer之Self-attention_人工智能_10Transformer之Self-attention_窗口大小_11Transformer之Self-attention_窗口大小_12。在计算时需要考虑之间的相关性(各输入对一个输出的影响),如图5所展示的样子。

Transformer之Self-attention_人工智能_13


图5 输出与输入的相关性

以输出Transformer之Self-attention_Self_09和输入Transformer之Self-attention_算法_05Transformer之Self-attention_人工智能_06Transformer之Self-attention_算法_07Transformer之Self-attention_全连接_08为例,来说明相关性。利用Transformer之Self-attention_算法_19的值,来表示Transformer之Self-attention_算法_05Transformer之Self-attention_全连接_08之间的相关性,如图6所示。

Transformer之Self-attention_人工智能_22


图6 相关性表示

接下来便是如何计算Transformer之Self-attention_算法_19值了。这里有两个可学习的参数,分别是Transformer之Self-attention_算法_24Transformer之Self-attention_全连接_25,将两输入分别与Transformer之Self-attention_算法_24Transformer之Self-attention_全连接_25进行向量相乘,可得Transformer之Self-attention_算法_28Transformer之Self-attention_窗口大小_29,最终进项Dot-product可得到Transformer之Self-attention_算法_19,这一过程用流程图(图7左)表述如下。

Transformer之Self-attention_窗口大小_31


图7 α的计算流程

然后我们分别计算两两之间的关联性,流程如图8所示,首先计算出Transformer之Self-attention_全连接_32Transformer之Self-attention_人工智能_33Transformer之Self-attention_Self_34Transformer之Self-attention_窗口大小_35,可得下式:
Transformer之Self-attention_算法_36

之后将向量点乘,便得到了之间的关联性,如下式:
Transformer之Self-attention_人工智能_37

Transformer之Self-attention_算法_38


图8 $\alpha_{1,2}$,$\alpha_{1,3}$和$\alpha_{1,4}的计算流程

需要说明的是Transformer之Self-attention_Self_39也是需要计算的,然后将4个值通过softmax进行标准化,获得Transformer之Self-attention_人工智能_40Transformer之Self-attention_窗口大小_41Transformer之Self-attention_窗口大小_42Transformer之Self-attention_算法_43,这些值可以同时计算得出(并行计算得出)。

Transformer之Self-attention_算法_44


图9 标准化实现

将得到的相关性分数Transformer之Self-attention_人工智能_40Transformer之Self-attention_窗口大小_41Transformer之Self-attention_窗口大小_42Transformer之Self-attention_算法_43分别与输入特征相乘并相加后得到Transformer之Self-attention_窗口大小_49,如下所示,流程图如图10所示:
Transformer之Self-attention_算法_50

Transformer之Self-attention_人工智能_51


图10 Extract information based on attention scores

我们以并行化(parallel)的方式得到Transformer之Self-attention_窗口大小_49Transformer之Self-attention_全连接_53Transformer之Self-attention_算法_54Transformer之Self-attention_全连接_55,如下图所示:

Transformer之Self-attention_Self_56


图11 并行化处理

从本节的分析当中,我们需要学习的参数有Transformer之Self-attention_算法_24Transformer之Self-attention_全连接_25Transformer之Self-attention_窗口大小_59,他们与输入向量相乘生成三个向量:查询向量query-vec、一个键向量key-vec和一个值向量value-vec。

Transformer之Self-attention_人工智能_60


可能有的读者有疑问了,设置这三个向量的用意何在或有何深意。实际上

  • 对于查询向量Query而言:query是当前单词的表示形式,用于对所有其他单词(key)进行评分,我们只需要关注当前正在处理的token的query。
  • 对于键向量Key而言: Key可以看做是序列中所有单词的标签,是在我们找相关单词时候的对照物。
  • 对于值向量Value而言:Value是单词的实际表示,一旦我们对每个单词的相关度打分之后,我们就要对value进行相加表示当前正在处理的单词的value。

4. 通过矩阵运算实现自注意力机制

然而实际中,上文的计算是以矩阵形式完成的,以便算得更快。那我们接下来就看看如何用矩阵实现的。从上分析可知,自注意力机制可学习的参数有3个Transformer之Self-attention_算法_24Transformer之Self-attention_全连接_25Transformer之Self-attention_窗口大小_59Transformer之Self-attention_Self_64Transformer之Self-attention_全连接_65Transformer之Self-attention_全连接_66的计算如下:

Transformer之Self-attention_窗口大小_67

图12 $q^i$,$k^i$和$v^i$的计算

然后求得相关分数矩阵,一共有16项,即Transformer之Self-attention_人工智能_68Transformer之Self-attention_窗口大小_69Transformer之Self-attention_全连接_70Transformer之Self-attention_算法_71,计算如图13所示:

Transformer之Self-attention_算法_72

图13 ${{\alpha}_{1,1}}$,${{\alpha}_{1,2}}$,${{\alpha}_{1,3}}$和${{\alpha_{1,4}}}$的计算]

Transformer之Self-attention_全连接_73

图14 并行化运算(矩阵)

然后求解Transformer之Self-attention_窗口大小_49Transformer之Self-attention_全连接_53Transformer之Self-attention_算法_54Transformer之Self-attention_全连接_55,如下所示

Transformer之Self-attention_全连接_78

图15 求解${b^1}$,${b^2}$,${b^3}$和${b^4}$

以上就是矩阵化的计算的过程,这一点和卷积神经网络类似,其特点是高效快速,很适合GPU和FPGA等设备进行计算。

最后我们对整个计算过程进行一个简单的归纳,定义Transformer之Self-attention_人工智能_79Transformer之Self-attention_Self_80Transformer之Self-attention_人工智能_81Transformer之Self-attention_全连接_82,可学习参数分别为Transformer之Self-attention_算法_24Transformer之Self-attention_全连接_25Transformer之Self-attention_窗口大小_59和输出Transformer之Self-attention_Self_86。通过以上公式定义可得Transformer之Self-attention_算法_87Transformer之Self-attention_全连接_88Transformer之Self-attention_算法_89,计算如下:
Transformer之Self-attention_窗口大小_90
之后便是求解注意力矩阵Transformer之Self-attention_全连接_91Transformer之Self-attention_窗口大小_92(标准化之后),在上文图14,我们已经进行了分析,所以不在赘述,直接给出公式:
Transformer之Self-attention_人工智能_93
最终得到输出Transformer之Self-attention_Self_86的计算如下:
Transformer之Self-attention_算法_95

整个过程的简单归纳,如图16所示:

Transformer之Self-attention_人工智能_96

图16 自注意机制矩阵化计算流程

可能大家对上文的表述不太理解,我们可以换种方式进行表述,假设有两个输入单词以thinking machine为例,首先我们构建一个嵌入矩阵,其中$$

5. 多头注意力

上文实际上是单头注意力,其实在Transform中,应用更多的是多头注意力,那什么是多头注意力呢?其实特别简单,就是在分出来的Transformer之Self-attention_Self_64Transformer之Self-attention_全连接_65Transformer之Self-attention_全连接_66,再一次进行分支操作,有多少个分支,就叫做多少个头,图17是一个双头注意力模型,和之前相比,可学习参数不仅仅只有Transformer之Self-attention_算法_24Transformer之Self-attention_全连接_25Transformer之Self-attention_窗口大小_59这三个,还有Transformer之Self-attention_Self_103Transformer之Self-attention_人工智能_104Transformer之Self-attention_全连接_105Transformer之Self-attention_人工智能_106Transformer之Self-attention_算法_107Transformer之Self-attention_窗口大小_108,需要计算公式有:
Transformer之Self-attention_算法_109

Transformer之Self-attention_算法_110

图17 双头注意力模型

此时的Transformer之Self-attention_Self_111Transformer之Self-attention_算法_112如17图所示,即利用Transformer之Self-attention_Self_113Transformer之Self-attention_Self_114Transformer之Self-attention_窗口大小_115以及Transformer之Self-attention_Self_113Transformer之Self-attention_Self_117Transformer之Self-attention_窗口大小_118计算Transformer之Self-attention_Self_111,利用Transformer之Self-attention_算法_120Transformer之Self-attention_Self_121Transformer之Self-attention_全连接_122以及Transformer之Self-attention_算法_120Transformer之Self-attention_人工智能_124Transformer之Self-attention_算法_125计算Transformer之Self-attention_算法_112

Transformer之Self-attention_算法_127


Transformer之Self-attention_Self_128

图18 ${b^{i,1}}$和${b^{i,2}

在得到Transformer之Self-attention_Self_111Transformer之Self-attention_算法_112之后,在引入一个矩阵Transformer之Self-attention_人工智能_131,进行运算可得到输出Transformer之Self-attention_全连接_132,如图19所示:

Transformer之Self-attention_算法_133

图19 模型最终输出

6. 参考

[1]多头自注意力机制:https://zhuanlan.zhihu.com/p/484524337
[2]台大李宏毅自注意力机制和Transformer详解:https://www.bilibili.com/video/BV1v3411r78R/?spm_id_from=333.337.search-card.all.click&vd_source=e3e56f2c8b99f0309ca6937cefb13991
[3][BERT通俗笔记:从Word2Vec/Transformer逐步理解到BERT]