前言
本文主要介绍在看李宏毅自注意机制视频的一些自我总结。
1.运行原理
图1 POS tagging
当利用全连接网络,输入一段话(I saw a saw(我看到一个锯子)),输出对应单词数目的标签(假设输出为单词的词性表示(名词,动词,形容词等)),如图1所示,这种情况下,我们很难获得正确的答案。为了使网络能够理解问题的含义,就需要考虑语句的上下文信息。可以利用滑动窗口,每个向量查看窗口(window)中相邻的其他向量的性质,其中窗口大小的选择是靠人工经验设定的。但是这种方式不能解决整条句子的分析问题。所以就引入了自注意力机制(Self-attention),其作用就是看一看输入句子中其他位置的单词,试图寻找一种对当前单词更好的编码方式。
图2 Sequence Labling
2. Self-attention
它的经典结构如图3所示,将一个语句向量送入Self-attention,产生对应个数的向量,然后再将结果送入全连接网络(FC),最终实现结果的预测(标签的输出)。
图3 Self-attention经典结构
同时也可以将图1这种结构堆叠,如图4所示。
图4 多结构堆叠
3. 运行机制
本节重点剖析Self-attention内部的计算流程,假定输入分别为、、和,输出分别为、、和。在计算时需要考虑之间的相关性(各输入对一个输出的影响),如图5所展示的样子。
图5 输出与输入的相关性
以输出和输入、、、为例,来说明相关性。利用的值,来表示与之间的相关性,如图6所示。
图6 相关性表示
接下来便是如何计算值了。这里有两个可学习的参数,分别是和,将两输入分别与和进行向量相乘,可得和,最终进项Dot-product可得到,这一过程用流程图(图7左)表述如下。
图7 α的计算流程
然后我们分别计算两两之间的关联性,流程如图8所示,首先计算出和、、,可得下式:
之后将向量点乘,便得到了之间的关联性,如下式:
图8 $\alpha_{1,2}$,$\alpha_{1,3}$和$\alpha_{1,4}的计算流程
需要说明的是也是需要计算的,然后将4个值通过softmax进行标准化,获得,,和,这些值可以同时计算得出(并行计算得出)。
图9 标准化实现
将得到的相关性分数,,和分别与输入特征相乘并相加后得到,如下所示,流程图如图10所示:
图10 Extract information based on attention scores
我们以并行化(parallel)的方式得到,,和,如下图所示:
图11 并行化处理
从本节的分析当中,我们需要学习的参数有,和,他们与输入向量相乘生成三个向量:查询向量query-vec、一个键向量key-vec和一个值向量value-vec。
可能有的读者有疑问了,设置这三个向量的用意何在或有何深意。实际上
- 对于查询向量Query而言:query是当前单词的表示形式,用于对所有其他单词(key)进行评分,我们只需要关注当前正在处理的token的query。
- 对于键向量Key而言: Key可以看做是序列中所有单词的标签,是在我们找相关单词时候的对照物。
- 对于值向量Value而言:Value是单词的实际表示,一旦我们对每个单词的相关度打分之后,我们就要对value进行相加表示当前正在处理的单词的value。
4. 通过矩阵运算实现自注意力机制
然而实际中,上文的计算是以矩阵形式完成的,以便算得更快。那我们接下来就看看如何用矩阵实现的。从上分析可知,自注意力机制可学习的参数有3个,和,,和的计算如下:
图12 $q^i$,$k^i$和$v^i$的计算
然后求得相关分数矩阵,一共有16项,即,,和,计算如图13所示:
图13 ${{\alpha}_{1,1}}$,${{\alpha}_{1,2}}$,${{\alpha}_{1,3}}$和${{\alpha_{1,4}}}$的计算]
图14 并行化运算(矩阵)
然后求解,,和,如下所示
图15 求解${b^1}$,${b^2}$,${b^3}$和${b^4}$
以上就是矩阵化的计算的过程,这一点和卷积神经网络类似,其特点是高效快速,很适合GPU和FPGA等设备进行计算。
最后我们对整个计算过程进行一个简单的归纳,定义、、和,可学习参数分别为、和和输出。通过以上公式定义可得、和,计算如下:
之后便是求解注意力矩阵和(标准化之后),在上文图14,我们已经进行了分析,所以不在赘述,直接给出公式:
最终得到输出的计算如下:
整个过程的简单归纳,如图16所示:
图16 自注意机制矩阵化计算流程
可能大家对上文的表述不太理解,我们可以换种方式进行表述,假设有两个输入单词以thinking machine为例,首先我们构建一个嵌入矩阵,其中$$
5. 多头注意力
上文实际上是单头注意力,其实在Transform中,应用更多的是多头注意力,那什么是多头注意力呢?其实特别简单,就是在分出来的、和,再一次进行分支操作,有多少个分支,就叫做多少个头,图17是一个双头注意力模型,和之前相比,可学习参数不仅仅只有、和这三个,还有、、、、和,需要计算公式有:
图17 双头注意力模型
此时的和如17图所示,即利用、、以及、、计算,利用、、以及、、计算
图18 ${b^{i,1}}$和${b^{i,2}
在得到和之后,在引入一个矩阵,进行运算可得到输出,如图19所示:
图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]