Py学习  »  机器学习算法

【深度学习】CNN是不是一种局部self-attention?

小白学视觉 • 1 年前 • 111 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

CNN是不是一种局部self-attention?

作者:吼吼
https://www.zhihu.com/question/448924025/answer/1791134786
(本回答参考:李宏毅2021机器学习课程)
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层的计算方式,值得一看。

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇




下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/150447
 
111 次点击