"); //-->
来源:深度学习爱好者
CNN是不是一种局部self-attention?
cnn可不是一种局部的attention,那么我们来辨析一下cnn和attention都在做什么。
1:cnn可以理解为权值共享的局部有序的fc层,所以cnn有两个和fc层根本区别的特征,权值共享和局部连接。也就是在保证不丢失一些根本feature的情况下大大减少了参数量。
2:attention的步骤是通过Q和K点乘得到attention maritx并表示二者的相似性,即Q和K相似性越大的部分点乘越大,之后scale并softmax之后得到attention score,之后乘以V,得到attention之后的结果。
attention的本质是求Q和K的相似性,强调Q中和K相似的部分而已。
其本质区别还可以理解为cnn是提取特征,attention是强调特征即可,二者可不相似。那要是这么说所有model都是围绕feature做一些东西,那就说这些都是一样的话显然不合理。
更新,因为对CNN有了新的理解,所以对之前的答案进行更新,但是我前面之前的回答就不会在删了,后续有什么关于这方面进一步的补充和说明会再加进来,欢迎大家收藏。
关于RNN和self-attention的区别,可以看我的这篇回答,希望对你有所帮助。
https://zhuanlan.zhihu.com/p/360374591
首先,说结论,CNN可以看作简化版的Self-attention,又或者说Self-attention是CNN的泛化。
之前我们对CNN和self-attention作比较,其实下意识的想的是CNN用于图像处理,将self-attention用于NLP,所以会产生这两种方法怎么会有关联的错觉,那么下面都将从图像处理方面来讨论CNN和self-attention的区别和联系,更好的来对比CNN和self-attention。self-attention用于图像处理的流程:
首先,如果用self-attention对图像进行处理,对于每一个pixel(像素值)产生Query,其他的pixel产生Key,Query*Key,然后softmax(正如评论中说的,其实不一定非要softmax,也可以采用Relu等激活函数),最后乘以对应的Value并求和作为每一个pixel经过softmax的输出值。这里大家会发现对图像做self-attention的时候每一个pixel考虑了整张图片所有的pixel,要考虑整张图像中所有的信息。
那么,如果我们用CNN对图像进行处理,我们会选取不同的卷积核,用卷积核对图像进行处理,每一个pixel(像素值)其实只需要考虑这个卷积核中其他的pixel就可以了,只需要考虑这个receptive field就可以了,而不需要考虑整张图像中的所有信息。
进而,我们可以得到一个一般性的结论,CNN可以看作一种简化版的self-attention,即CNN只需要考虑卷积核(receptive field)中的信息即可,但是对于self-attention需要考虑全局的信息。
反过来,我们可以同样理解为,self-attention是复杂化的CNN,CNN需要划定receptive field,只考虑Receptive field里面的资讯,而Receptive field的范围和大小是需要自己设定的大小。而对Self-Attention而言,用attention找到相关的pixel,就好像Receptive是自动学出来的,即以这个pixel为中心,其他哪些pixel是需要我这个pixel考虑的,是与我这个pixel相关的。
简单一句话,CNN每一个pixel只学卷积核中的信息,Self-Attention每一个pixel学整张图像中的信息。(这里只考虑一层卷积,如果多层卷积的话,CNN其实达到了和self-attention类似的效果)
那么,知道self-attention和CNN联系,我们可以得到什么结论呢?
我们知道了CNN就是Self-Attention的特例,或者说Self-Attention就是CNN的泛化,非常的flexible的CNN,对Self-Attention做某些限制, Self-Attention和CNN是一样的。(论文:https://arxiv.org/abs/1911.03584 中得到的结论)
对于self-attenion来说,这是一种非常flexible的model,所以需要更多的数据进行训练,如果数据不够,就可能over-fitting,但对于CNN来说因为限制比较多,在training data不多的时候可以train出一个比较好的Model。
如图所示,在training data比较小的时候,CNN比较好,在training data比较大的时候,self-attention的效果会更好一些。即Self-Attention的弹性比较大,所以需要比较多的training data,在训练资料比较小的时候就容易over-fitting,CNN的弹性比较小,在training data比较小的时候,训练结果比较好,在training data比较多的时候,CNN就没有办法从更大量的训练资料中得到好处了。
作者:匿名用户
https://www.zhihu.com/question/448924025/answer/1784363556
有相似性,但是也有差异。CNN可以认为是在每个位置与固定的静态的模板做内积,是局部的投影,而attention是在不同位置之间计算内积,某种意义上可以看作一个distance metric,其中的加权矩阵其实是定义了一种distance metric。从更普遍一点的意义上,CNN是更加local的,self-attention更多强调relation. 说CNN是一种特殊的退化的attention也许更合适一点。
作者:林建华
https://www.zhihu.com/question/448924025/answer/1793085963
我认为CNN的卷积层和self-attention不是一回事情。self-attention的K和Q都由数据产生, 所以是反应数据内部的关系。
CNN卷积层可以看成由参数组成的K和不同数据产生的Q, 反应的是数据和参数的关系。
也就是说self-attention通过参数构建了不同的空间, 使得数据在不同空间中呈现不同的自相关性质。
而CNN卷积通过参数, 构建了某些固定的特征, 通过统计数据在这些特征上的表现来进行后面的处理。
作者:阿良
https://www.zhihu.com/question/448924025/answer/1786277036
cnn的核心在于使用局部特征获取全局特征。可以说每次将注意力放在局部的卷积核。最后通过局部卷积核特征形成整体的特征表示。
自注意力机制是重点还有个自己的自,自己和自己进行计算,它的好处在于通过自注意力机制能够对每个词能够融入全局的信息,目的是借助全局信息帮助局部特征更好表示。
所以cnn是局部到整体,自注意力机制是整体辅助局部。如果硬要将cnn与注意力扯上关系,我个人理解可以看成是局部注意力(注意没有自字)
作者:aluea
https://www.zhihu.com/question/448924025/answer/179309914
调转一下顺序,self-attention是一种强归纳偏置的CNN。
这不难理解,我们来看一下self-attention具体做了什么。
假设,对于一层self-attention,存在a、b、c、d四种侯选特征可同时输入,而仅有ac、bd两种combine的嵌入表示对下游任务有贡献。那么self-attention就会注意这两种combine而遮掩其他特征;比如,[a,b,c]->[a',0,c']。Ps. a'表示a的输出表征。
对于一层CNN,就比较直白,有一说一,[a,b,c]->[a',b',c']。那么CNN可不可以完成像self-attention的功能,完全可以,再加一层CNN弄两个过滤器一个滤ac;一个滤bd就完事了。
当然我CNN完全可以不这么干,也能拟合分布;而self-attention必须这么干,所以这是一种更强的归纳偏置。
关于归纳偏置的重要性,这里就不赘述了。
作者:mof.ii
https://www.zhihu.com/question/448924025/answer/1797006034
CNN不是一种局部的self-attention,但是把局部self-attention实现成一个层,做全self-attention网络的方法是可以实现的,参考Google Brain在NeurIPS19的Stand-Alone Self-Attention in Vision Models。
文章第二节详细比较了卷积层和Self-Attention层的计算方式,值得一看。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。