注意力机制基础

理论

首先回忆一下卷积

一、卷积基于的两个原则

1、平移不变性

一个分类器,比如说我想识别小丁,那这个分类器进行分类的时候,应该是对于位置信息不敏感的,也就是说无论小丁出现在图片上的哪个位置,我用训练好的分类器,参数不变都是可以识别出哪个是小丁的

2、局部性

就是我不需要看到全局的信息,只需要看到周围一部分信息就行了

二、从全连接层应用上面连个原则变成卷积层

先说结论:

从全连接层 pytorch封装的注意力 pytorch注意力机制_卷积

变成卷积层 pytorch封装的注意力 pytorch注意力机制_pytorch封装的注意力_02

变换过程:

类比在简单的全连接层,输入的x是有k个特征的向量,,w是二维矩阵大小(k * i),输出h是有i个特征的向量

现在我们的输入是x一张图片,二维矩阵,那么参数w变成了四维,输出h也是一个二维矩阵,

k,l相当于像素本身的信息,i,j相当于像素的位置信息

pytorch封装的注意力 pytorch注意力机制_pytorch封装的注意力_03

这里v是w的重新表示 pytorch封装的注意力 pytorch注意力机制_pytorch_04

然后根据平移不变性,参数v应该不依赖于i,j的信息,所以pytorch封装的注意力 pytorch注意力机制_卷积核_05

pytorch封装的注意力 pytorch注意力机制_学习_06

再根据局部性,并不需要我们看那么远的信息,即限制了a,b的大小(上下或者左右动),当动的范围超过pytorch封装的注意力 pytorch注意力机制_pytorch封装的注意力_07就不要了

pytorch封装的注意力 pytorch注意力机制_pytorch封装的注意力_02

总结:平移不变性解释了为什么我可以用同一个卷积核扫过整张图片

局部性解释了,为什么我要用那么大的一个卷积核

注意力机制

简单来说卷积关注的是一个像素点周围,也就是卷积核大小的信息,但这些信息未必是最应该被关心的,注意力机制则是显示的考虑随意线索(意思是有意关心的线索)

  • 随意线索被称之为查询
  • 每一个线索是一个值(value)和不随意线索(key)的对
  • 通过注意力池化层有偏向性的选择某些输入

pytorch封装的注意力 pytorch注意力机制_pytorch封装的注意力_09

具体注意力机制是怎么发展成现在的样子呢?

一、非参的注意力池化层
  • 给定数据pytorch封装的注意力 pytorch注意力机制_pytorch封装的注意力_10
  • 平均池化层是最简单的方案:pytorch封装的注意力 pytorch注意力机制_pytorch_11
    这里pytorch封装的注意力 pytorch注意力机制_卷积_12是query,即一个新数据进来的时候,关注的是所有信息的平均
  • 更好的方案是60年代提出的Nadaraya-Waston回归
    pytorch封装的注意力 pytorch注意力机制_pytorch封装的注意力_13
    pytorch封装的注意力 pytorch注意力机制_卷积_14:query
    pytorch封装的注意力 pytorch注意力机制_卷积_15:key
    pytorch封装的注意力 pytorch注意力机制_卷积_16:value

K是核函数,类似SVM,用来计算新数据x(query)和旧数据pytorch封装的注意力 pytorch注意力机制_卷积_17(key)之间的距离,相当于对所有给定数据算百分比权重 (像softmax),乘对应的value,思想上像KNN

如果K使用高斯核pytorch封装的注意力 pytorch注意力机制_卷积_18

那么pytorch封装的注意力 pytorch注意力机制_pytorch封装的注意力_19

pytorch封装的注意力 pytorch注意力机制_pytorch_20

二、参数化注意力机制

在之前的基础上引入可学习的w

pytorch封装的注意力 pytorch注意力机制_卷积核_21

学习一个w来决定注意力,这里的w还是一个标量,以上我们讨论的都是q,k,v都是标量的情况

总结pytorch封装的注意力 pytorch注意力机制_pytorch封装的注意力_22

pytorch封装的注意力 pytorch注意力机制_学习_23:注意力分数 pytorch封装的注意力 pytorch注意力机制_pytorch封装的注意力_24之后:注意力权重

pytorch封装的注意力 pytorch注意力机制_学习_25

拓展到高维

以上我们讨论的都是q,k,v都是标量的情况,现在拓展到高维

pytorch封装的注意力 pytorch注意力机制_卷积核_26

注意力:pytorch封装的注意力 pytorch注意力机制_学习_27

pytorch封装的注意力 pytorch注意力机制_卷积_28

现在问题在于如何计算pytorch封装的注意力 pytorch注意力机制_卷积_29,有两种方式

  • Additive Attention
  • 可学习参数:pytorch封装的注意力 pytorch注意力机制_卷积_30
    pytorch封装的注意力 pytorch注意力机制_卷积_31

最后计算出pytorch封装的注意力 pytorch注意力机制_学习_32是一个数,相当于把key和query合并起来放到一个隐藏层大小为h,输出为1的单隐藏层MLP中

适用于q,k,v大小不同的情况

  • Scaled Dot-Product Attention(transformer用的)
  • 如果query和key是同样的长度pytorch封装的注意力 pytorch注意力机制_卷积_33,那么可以pytorch封装的注意力 pytorch注意力机制_卷积核_34
  • 向量化版本:n个query,m个key-value
  • pytorch封装的注意力 pytorch注意力机制_卷积_35
  • 注意力分数:pytorch封装的注意力 pytorch注意力机制_学习_36
  • 注意力池化:pytorch封装的注意力 pytorch注意力机制_pytorch封装的注意力_37
    这时候你可能问Dot-Product Attention,没有可学习参数啊,在transformer里,Q,K,V是一个词向量通过三个矩阵pytorch封装的注意力 pytorch注意力机制_学习_38映射过来的