本文作为自己学习李宏毅老师2021春机器学习课程所做笔记,记录自己身为入门阶段小白的学习理解,如果错漏、建议,还请各位博友不吝指教,感谢!!
全连接网络的输入是一个向量,但是当输入是一个变长的向量序列时,就不能再使用全连接网络了。这种情况通常可以使用卷积网络或循环网络进行编码来得到一个相同长度的输出向量序列。
基于卷积或循环网络的序列编码都是一种局部的编码方式,只建模了输入信息的局部依赖关系。虽然循环网络理论上可以建立长距离依赖关系,但是由于信息传递的容量以及梯度消失问题,实际上也只能建立短距离依赖关系。
要建立输入序列之间的长距离依赖关系,可以通过如下两种方法:
- 增加网络的层数,通过一个深层网络来获取远距离的信息交互;
- 使用全连接网络。
全连接网络是一种非常直接的建模远距离依赖的模型,但是如上边所说无法处理变长的输入序列。不同的输入长度(此处指的是向量序列的长度),其连接权重的大小也是不同的。这种情况我们就可以利用注意力机制来“动态”地生成不同连接地权重,即自注意力模型(Self-Attention Model)。
输入/输出
- 自注意力模型输入:如下图所示,左侧的变长的输入序列即是自注意力模型的输入数据,注意这个向量序列的长度不是固定的。
- 自注意力模型输出:自注意力模型的输出有三种情况:
- 输出序列长度和输入序列长度一样,这种情况下,输入序列中的向量和结果序列中的元素一一对应,也就是为每一个输入序列中的向量给出一个label。如下图所示:
- 输出序列的长度为1,此时相当于一个分类人物,比如像对正面/负面评论的分析。如下图所示:
- 输出序列的长度是不定的,这种情况其实也就是Seq2Seq模型,比如机器翻译。如下图所示:
Attention函数
因为要建立输入向量序列的长依赖关系,所以模型要考虑整个向量序列的信息。如上边左图所示,Self-Attention的输出序列长度是和输入序列的长度一样的,对应的输出向量考虑了整个输入序列的信息。然后将输出向量输入到Fully-Connected网络中,做后续处理。当然Self-Attention可以和Fully-Connected交替使用多次以提高网络的性能,如上边右图所示。
上边我们提到,Self-Attention可以使用多次,那么输入可能是整个网络的输入,也可能是前一个隐藏层的输出,这里我们使用 [ a 1 , a 2 , a 3 , a 4 ] [a^1, a^2, a^3, a^4] [a1,a2,a3,a4]来表示输入,使用 b 1 b^1 b1表示输出为例。
首先Self-Attention会计算 a 1 a^1 a1分别与 [ a 1 , a 2 , a 3 , a 4 ] [a^1, a^2, a^3, a^4] [a1,a2,a3,a4]的相关性 [ α 1 , 1 , α 1 , 2 , α 1 , 3 , α 1 , 4 ] [\alpha_{1,1}, \alpha_{1,2}, \alpha_{1,3}, \alpha_{1,4}] [α1,1,α1,2,α1,3,α1,4]。相关性表示了输入 [ a 1 , a 2 , a 3 , a 4 ] [a^1, a^2, a^3, a^4] [a1,a2,a3,a4]对 a 1 a^1 a1是哪一个label的影响大小。而相关性 α \alpha α的计算方式共有Dot-product和Additive两种。
Dot-product
在Dot-product中,输入的两个向量,左边的向量乘上矩阵 W q W^q Wq得到矩阵 q q q,右边的向量乘上矩阵 W k W^k Wk得到矩阵 k k k,然后将矩阵 q q q和矩阵 k k k对应元素相乘并求和得到相关性 α \alpha α。
Additive
在Additive中同样也是先将两个输入向量与矩阵 W q W^q Wq和矩阵 W k W^k Wk相乘得到矩阵 q q q和 k k k。然后将矩阵 q q q和 k k k串起来输入到一个激活函数(tanh)中,在经过Transform得到相关性 α \alpha α。
Self-Attention计算过程
为了提高模型能力,自注意力模型经常采用查询-键-值(Query-Key-Value,QKV)模型,其计算过程如下所示:
- 首先计算 a 1 a^1 a1与 [ a 2 , a 3 , a 4 ] [a^2, a^3, a^4] [a2,a3,a4]的关联性 α \alpha α(实践时一般也会计算与 a 1 a^1 a1自己的相关性)。以Dot-product为例,我们分别将 [ a 1 , a 2 ] [a^1, a^2] [a1,a2], [ a 1 , a 3 ] [a^1, a^3] [a1,a3], [ a 1 , a 4 ] [a^1, a^4] [a1,a4]作为Dot-product的输入,求得对应的相关性 [ α 1 , 2 , α 1 , 3 , α 1 , 4 ] [\alpha_{1,2}, \alpha_{1,3}, \alpha_{1,4}] [α1,2,α1,3,α1,4],如下图所示:
- 计算出 a 1 a^1 a1跟每一个向量的关联性之后,将得到的关联性输入的softmax中,这个softmax和分类使用的softmax时一样的,得到对应数量的 α ′ \alpha' α′。(当然这里使用ReLU或其他激活函数代替softmax也是可以的,根据实际效果来)
- 先将 [ a 1 , a 2 , a 3 , a 4 ] [a^1, a^2, a^3, a^4] [a1,a2,a3,a4]每一个向量分别乘上矩阵 W v W^v Wv得到新的向量 v 1 , v 2 , v 3 , v 4 v^1, v^2, v^3, v^4 v1,v2,v3,v4,然后把 v 1 , v 2 , v 3 , v 4 v^1, v^2, v^3, v^4 v1,v2,v3,v4都乘上Attention的分数 α ′ \alpha' α′,然后相加得到 b 1 = ∑ i α 1 , i ′ v i b^1 = \sum_{i} \alpha'_{1, i}v^i b1=∑iα1,i′vi
假设 a 1 a^1 a1和 a 2 a^2 a2的关联性很强,则由这两个向量计算得到的 α 1 , 2 ′ \alpha'_{1,2} α1,2′的值就很大,最后求得的 b 1 b^1 b1的值,就可能会比较接近 v 2 v^2 v2。所以哪一个向量的Attention的分数最大,那一个向量的 v v v就会主导最后计算出来的结果 b b b。
未完待续……
参考资料:
《神经网络与深度学习》 邱锡鹏
转载:https://blog.csdn.net/sykai1/article/details/116379983