Transform和self-attention
再讲Transform之前必须先讲一下self-attention,但是再讲self-attention之前有必要讲一下attention。
attention的讲解这篇文章讲的挺好的,可以参考一下。
总的来说attention有两种划分方式:
第一种划分方式:
Spatial Attention 空间注意力(图片)和Temporal Attention 时间注意力(序列)
这种划分方式里面主要有BAM,CBAM
CBAM可以看做是通道注意力机制和空间注意力机制的串联(先通道后空间),BAM可以看做两者的并联。
SCSEcSE就是通道注意力的融合,sSE就是空间注意力的融合,scSE就是两者相加。
还有基础的SE
第二种划分方式:
Soft Attention和Hard Attention。
Soft Attention是所有的数据都会注意,都会计算出相应的注意力权值,不会设置筛选条件。Hard Attention会在生成注意力权重后筛选掉一部分不符合条件的注意力,让它的注意力权值为0,即可以理解为不再注意这些不符合条件的部分。
讲了这么多,其实所有的attention都是建立在Encode-Decode模型的基础上的。而Encode-Decode模型说白了就是两个步骤,第一步根据所有的输入计算出每个输入对应的相关输出的每一个权重值(也就是置信度),第二步对第一步Encode后的向量根据第一步计算出来的不同的权重值进行加权输出。
Self Attention与传统的Attention机制非常的不同:
传统的Attention是基于source端和target端的隐变量(hidden state)计算Attention的,得到的结果是源端的每个词与目标端每个词之间的依赖关系。
但Self Attention不同,它分别在source端和target端进行,仅与source input或者target input自身相关的Self Attention,捕捉source端或target端自身的词与词之间的依赖关系;
然后再把source端的得到的self Attention加入到target端得到的Attention中,捕捉source端和target端词与词之间的依赖关系。因此,self Attention比传统的Attention mechanism效果要好,主要原因之一是,传统的Attention机制忽略了源端或目标端句子中词与词之间的依赖关系,相对比,self Attention可以不仅可以得到源端与目标端词与词之间的依赖关系,同时还可以有效获取源端或目标端自身词与词之间的依赖关系。
self-attention的具体实现是通过三个矩阵实现的,参考自李宏毅老师的课程。
见下图:
对于输入的每一个向量通过不同的矩阵映射成三个不同的向量空间。
接下来每个输入的q向量分别于每个输入的k向量做点乘然后再做softmax得到α权值向量,然后再与各自的原始信息向量v相乘,然后加权输出。
所以总的来说:α就是计算每个输入之前的关联度,v是每个输入的信息。
Transform
Transform部分主要就是由self-attention组成的。
详见这篇博文
上面这张图就是大家都看到过的Transform的结构图了。
全图分为左右两部分,左边是encode右边是decode。
其中mult-head Attention就是self-attention的进化版,也就是每个q,k,v向量分别分出两部分,然后分别做跟self-attention相同的工作。
下面这个图很形象的表达出了transform中encode的结构。
decode部分前面有一个mask这个主要是用来mask控制t时刻前面的输入,后面的输入统一置为0.因为只能获取到当前时刻之前的输入,因此只对时刻 t 之前的时刻输入进行attention计算,这也称为Mask操作。
总的流程图如下: