self-attention
对于self-attention的理解
对于self-attention,我们直觉可能会觉得是从一个大的数据中,将我们的注意力集中在我们感兴趣的区域里, 但通过self-attention的原理可以发现,其原理更像是对于一个区域(一个向量),我们搜集其他向量中跟这个向量有关的信息。
相比于直接全部用全连接层进行输出,self-attention可以更好的保证自己的特征, 就比如对于一个序列ABCD,我们要输出A的语义, 虽然我们要综合考虑BCD的信息,但是主要的信息来源还是A带来的, 如果直接将ABCD丢进全连接层, 那么ABCD在网络里的地位是一样的, 换句话说相当于A丢失了很多自己的特征。但是对于self-attention来说,因为self-attention的原理是从BCD中找与A最相似的信息, 所以相比于全连接层,并不会丢失很多关于A的信息,这就是self-attention的优点之一。
网课笔记
self-attention下_哔哩哔哩_bilibili
对于数据,比如语义数据如何编码呢? 可以用one-hot 编码 ,但是这样相当于默认每个词之间是彼此独立的
所以针对这个弊端, 又有一种编码方式Word Enbedding
保留了一定的语义信息。
对于一个序列输入(输入由多个向量组成)其输出有以下几种形式:
self-attention
为了让每个局部a,都能考虑全局的信息,也就是要将下图中a2,a3,a4中与a1有关的信息和a1关联起来,得到b1,从a1到b1的过程就叫做self-attention,b1就相当于融合了全局信息的a1。
具体是实现方式:Dot-product 因为向量点乘能保证一定的相关性, 对于向量长度恒定的两个向量来说, 点乘的值越大其向量越接近(角度)
对于每一个q,都去跟其他的k相乘,得到a11后做soft-max处理, 这时候的a11和a12都是具体的值,
这里每个a_hot都是经过softmax后的值。
Transformer中Self-Attention以及Multi-Head Attention详解_哔哩哔哩_bilibili
最后,需要组装成b1,b1相当于
所以需要额外乘一个v向量,让其最后能组装成一个向量b1。
比如对于a1.1_hot和a1.2_hot这个来说, 由上一步得到的是(0.33, 0.67) 这里其实已经是最终b1的形式了(因为矩乘的原因)但是在我们的视角里我们只得到了a1.1_hot和a1.2_hot的值为0.33和0.67为了让其能够组合成一个向量,所以需要乘一个向量v保证最后b1的形式为:(a1.1_hot,a1.2_hot)
矩阵化:其中I是输入,0是输出
问题: 如果输入是个2x4的向量, 注意力窗口只有两个向量a1,a2。 那么输出的0的shape是什么?
相当于
* , 那么此时输出的是2X2大小的矩阵, 经过softmax后并不会改变shape 所以还是2X2的大小, 那么为了使得输入输出的shape一样, 那么只能通过V来将2X2变成2X4 也就是V的shape必须是2X4的矩阵。
MUlti-head Self-Attention
就相当于a输入进后, 再并联全连接层,使其拆分(代码中简化成直接将输入向量a均分),这样做的好处是一个向量a,里面包含很多信息,将其分组再判断其相似度,可以更精细。
在进行拆分后,正常情况下输出的b,会翻倍,比如,原本b11应该是(1,1)b21输出应该是(0,1)。拆分之后相当于做了2遍。所以多出了蓝色的b12和b22。
一般地,对于一个向量长度为t,向量个数为的2(也就是只有a1和a2)的输入来说, 其正常情况下输出的b的shape是2X2,通过一个2Xt的参数矩阵W0,将其shape变为输入的shape:2Xt 如果此时对向量拆分,变成t/u 那么输出b的shape应该是2X(2*t/u) ,因为将原本的一份b变成了t/u份, 此时再通过(2*t/u)X t 的矩阵将其变为输入的shape:2Xt
Positional Encoding
一个基本的位置编码方法:相当于对于每一个位置,都预设一个值,然后将其加在原来的输入向量a上, 这样可以希望神经网络能够学习到这个不同的值,通过这个不同的预设值来感知不同的位置。
对于在图像中的应用:
整体来看,CNN可以看成一种特殊的self-attention。 self-attention相当于用一系列的嵌套网络结构将某个向量附近的所有向量结合起来输出一个值。 而CNN相当于在一个人为定好的区域(卷积核)内将信息整合输出一个值。 所以self-attention和CNN的输入和输出是相似的, 一个是全局,一个是局部。 并且其中实现细节不一样。