Self-attention
Self-attention
整体架构
每次输入的Sequence长度不一样,但输出数量要与输入数量相同 (例如:词性标注)
- 目的:考虑整个input sequence的上下文资讯
- Self-attention输出也要接入FC得到结果
图中用红颜色括号标起来的vector考虑了整个sequence的内容,此时Fully-connect考虑了整个Sequence的内容
可以将网络进行叠加:Fully-Connect与Self-attention交替使用
Self-attention处理整个Sequence的内容
Fully-Connect专注处理某个位置的内容
运行原理
- 输入:可以是整个网络的input,也可以是做过某些处理
- 输出:考虑了整个Sequence产生的
- 先计算Q,K,V,后计算attention score,再根据其score对v做weight sum来抽取重要信息
计算attention score
以求出 a1 的输出 b1 为例子
Self-attention目的是为了考虑整个Sequence,但是又不是所有的Sequence的内容都是重要的,所以需要进行判断相关性
计算两个向量的关联程度 α \alpha α的方法
左边的Dot-product常用在了Tranformer中
在Self-attention中计算attention score: α \alpha α
可以不用Soft-max,有时会用ReLU
- 此时得到attention score α ‘ \alpha^‘ α‘ (计算过程是上面的:Dot-product)
根据attention score来抽取重要的信息
- 由公式:当关联性越高,对应的 α \alpha α很大,最后得到的b就越接近关联程度越高的对应的 v 向量
从矩阵乘法的角度思考
- q,k,v的计算
由之前的每个图中计算q,k,v向量的公式,从矩阵乘法角度看,整体可以简化
- 计算attention score
由之前图中的公式可以得到: α = k T ∗ q \alpha=k^T * q α=kT∗q,对全部的 α \alpha α使用矩阵乘法进行简化即可得图中计算
- 抽取信息
- 注意vi 与 ki 产生的 α ‘ \alpha^` α‘相乘
- 总结
先产生q,k,v;再根据q找出相关的位置;再对v做weight sum
进阶版本 - Multi-head Self-attention
定义相关性时,是使用q去找相关的k
但相关这件事有不同的定义,所以需要不同的q负责不同的相关性
以 2个heads 为例子:
以下进行求解结果矩阵O中一个元素 b i b^i bi
不同的 head 分别计算,计算过程如之前内容一样
b i , j b^{i,j} bi,j:
j 表示:第 j 个heads产生的b;
i 表示:第 j 个heads中第i个q (即 q i , j q^{i,j} qi,j) 去与对应的k计算产生的b
此时会得到两个结果矩阵,再将两个拼接起来,再乘以一个矩阵的转置得到最后的结果
相当将 b i , j 1 b^{i,j1} bi,j1与 b i , j 2 b^{i,j2} bi,j2进行了拼接(即:对应 i i i 相同的 b 都拼接在一起),再经过计算后得到了 b i b^i bi
最后的结果O是 多个由 b b b 组成 (如1heads中的图示)
- 上述拼接操作可以理解为:将第 i i i个q ( q i q^i qi) 所在多个heads产生的b (b^{i,…}) 全部进行拼接
Positional Encoding - 加入位置信息
- Self-attention的过程可以看到,并没有位置相关的信息
为每一个位置设置不同的positional vector,将其加到输入a上
但产生positional vector是一个在研究的问题
参考论文:Learning to Encode Position for Transformer with Continuous Dynamical Model
应用
- NLP
- Self-attention for Speech - Truncated Self-attention
- for Image
对于Self-attention处理:图中矩阵可以看成5*10个vector,每个vector是3维向量
Self-attention VS. CNN
CNN是简化版的Self-attention
CNN考虑的是一个receptive field的信息
Self-attention考虑的是整个图片的信息
Self-attention会考虑每个向量的相关性,所以其receptive field可以看出自己学习出来的
而CNN的receptive field是自己指定的
相关论文:
Self-attention相比CNN更加的flexible,需要更多的data,否则更可能over fitting
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OsoiaNK8-1635337818356)(C:/Users/pc/AppData/Roaming/Typora/typora-user-images/image-20211027200700993.png)]
Self-attention VS. RNN
RNN没有办法并行化产生输出,只能一个接一个输出;
Self-attention可以并行化输出
RNN当结果要考虑比相对较远输入的位置时,比较难以考虑到;
Self-attention可以很好的对输入位置比较远的向量进行考虑
RNN每个输出只考虑了其左边的输入,没有考虑右边的输入
Self-attention则考虑了整个Sequence