Press "Enter" to skip to content

Transformer在CV领域有可能替代CNN吗?还有哪些应用前景?

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

来源丨知乎问答

问题背景: 目前已经有基于Transformer在三大图像问题上的应用:分类(ViT),(DETR)和分割(SETR),并且都取得了不错的效果。那幺未来, Transformer有可能替换CNN吗,Transformer会不会如同在NLP领域的应用一样革新CV领域?后面的研究思路可能会有哪些?

 

01

 

作者:湃森

 

回答这个问题,笔者认为可以从方法提出的动机来剖析比较合适,即 为什幺我们需要它 ;而不是简单的“存在即合理”,大家皆用我也用的风向标。

 

Why CNN?

 

首先我们应该了解为什幺CNN会在图像领域被大规模应用,我们可以从三个主要点说起,比如 基于传统的方法,基于模式识别的方法,基于深度学习的方法 。

 

1. 传统方法在视觉任务上的应用绝大多数都依赖于在某个领域具有丰富经验的专家,去针对具体的任务设计出一组最具有代表性的数据表示来作为输入特征进行处理,使得特征之间具备可区分性,典型的有SIFT。其次,一些特征提取的方法也需要人为的参与,手工设计出一些特征提取算子,比如一些经典的边缘检测算子,水平检测,垂直检测等。然而,一方面需要依赖专家手动设计特征的方式所需要的先验知识多,模型的的性能也极其依赖于其所设计出来的数据表示,这样一来不仅费时费力,而且也很难针对实际场景中复杂多变的任务去设计出一种合适的算子,不具备 泛化性 。另一方面,受制于数据采集的环境,设备等影响,比如光照,拍摄视角,遮挡,阴影,背景等等,这些因素会严重制约模型的性能,即手工设计的特征并不具备 鲁棒性 。

 

2. 基于模式识别的方法大多数是一些与机器学习相关的技术,比如随机森林,支持向量机,感知机等。机器学习较传统方法的一个显着优势就是,可以避免人为进行纯手动设计特征,它能够学习出一组从输入的数据表示到输出的映射这一套规则。比如AutoEncoder便能够从一组输入中学习出另一组数据的表示,虽然生成的结果基本是模糊的。尽管这些方法具有以上的优势,但是如何学习高效的学习出一组更合适的映射规则是关键。对于高效性来说,以感知机为例,它利用多个MLP来进行特征的学习从而来表征输入数据。但是这样有很明显的缺陷,一方面计算量是非常庞大的,另一方面直接将输入flatten为一个列向量,会破坏图像中目标原有的结构和上下文联系。在此基础上,我们可以继续优化它,把它推广到更一般的表示——CNN,MLP其实是CNN的一种特例。

 

3. 基于深度学习的方法在图像识别领域最典型的应用便是CNN。CNN是一种分层(hierarchical)的数据表示方式,高层的特征表示依赖于底层的特征表示,由浅入深逐步抽象地提取更具备高级语义信息的特征。比如第一层更倾向于提取边缘,角点,线条等low-level的特征,第二层提取颜色,纹理等mid-level的特征,第三层提取更具抽象语义的high-level的特征。网络的深度有助于模型提取更抽象地高级特征,网络的宽度有利于模型提取更丰富的特征表示。这种连接主义 (connectionism)本质上是一种解决问题很好的思路,每一层都学习各自简单的表示,但最后通过连接起来,却形成了强大的(powerful)的特征表征能力!

 

此外,CNN还具有一个非常重要的特性,它是通过共享卷积核来提取特征,这样一方面可以极大的降低参数量来避免更多冗余的计算从而提高网络模型计算的效率,另一方面又结合结合卷积和池化使网络具备一定的平移不变性(shift-invariant)和平移等变性(equivariance)。当然,对于分类任务来说,我们是希望网络具备平移不变性的特点,而对于分割任务来说我们则更希望其具备平移等变性,不过这些都是后话,在这里不展开阐述。因此,这便是CNN如何学习高效的学习出一组更合适的映射规则的关键。

 

虽然CNN具备如此多的优点,但不是一开始就一蹴而就,也并不是完美无瑕的。以图像分割为例,在全卷积神经网络FCN提出以前,大多数基于CNN的方法都是基于Patch-wise即将图像块作为输入输入到CNN中去进行相应类别预测,这种方式一来计算非常冗余,二来也缺乏充足的上下文信息。所以为什幺FCN会这幺有影响力,甚至可以称为是一个mile-stone的网络,就在于它真正意义上将patch-wise做到了pixel-wise,这对于语义分割这种密集型任务来说是至关重要的。

 

当然,FCN也存在许多的缺点,诸如分割结果粗糙等,当这并不妨碍我们基于它的思想去进行很多的拓展。比如最近几年提出的很多分割论文都是针对它去进行改进,有人提倡改善编码器利用更强大的卷积模块去提取更具备代表性的特征,有人热衷于改善解码器,比如引入跳跃连接操作来弥补编码器下采样过程中空间细节信息的丢失从而来实现更精准的定位,关于如何跳跃又是一个问题,有直接连线的Unet,继而有人又借助语义鸿沟(semantic gap)或者背景噪声干扰这些口去突破,利用多个卷积去消除,结合高级特征的强语义和低级特征丰富的细节信息去指导融合的也有,另外还有借助注意力方式去消除歧义和抑制背景噪声的也大有人在。除了编解码器之外,我们借用特征金字塔的思想还可以结合多层的结果去融合输出,得到一个更加细化的特征表示。在抛掉模型本身,也可以从任务本身下手,从全监督到半监督,自监督,few-shot learning,ome-shot learning,甚至是无监督域等等也有很多方向可以突破。其他视觉任务如分类,检测或者low-level的任务如超分,去噪等也可以此类比, 很多人写不来论文或者解决不了问题的关键点在于根本没发现问题在哪里,又何谈解决问题 。

 

Why transformer?

 

目前为止,我们已经简要的总结了CNN为什幺会被提出以及它的优势在哪。尽管CNN存在以上优势,比如它利用卷积核或滤波器不断地提取抽象地高级特征,理论上来说其感受野应该能覆盖到全图,但许多研究表明其实际感受野远小于理论感受野,这不利于我们充分的利用上下文信息进行特征的捕获,虽然我们可以通过不断的堆叠更深的卷积层,但这显然会造成模型过于臃肿计算量急剧增加,违背了初衷。 而transformer的优势就在于利用注意力的方式来捕获全局的上下文信息从而对目标建立起远距离的依赖,从而提取出更强有力的特征 。

 

因此,我们并不需要说一味的抛弃CNN,或许可以转换下思路 把两者结合起来,将transformer当做是一种特征提取器利用起来,再结合CNN的一些优势去解决现有的问题 。对于接下来这个方向的思考,笔者推测当过了这把trasformer的新鲜劲,即在各个任务上都利用transformer替代一遍后,未来的工作更多的是结合这两者,来实现一个更优或者说是一个更reasonable的结果,让我们拭目以待。

 

总的来说,每一种技术的提出,都会受到当时所处环境或多或少的影响,然后通过不断地发现问题,提出问题,再到解决问题这样一步步不停地迭代。从宏观角度上来看,一个学科技术要发展的更快更好,其中的一个很重要原因便是具备普适性。个人认为这一点非常重要,普适性意味着入门门槛低,这样涌入这个圈子的人就多,形成的“泡沫”就大,资本才会为其买单,真正意义上潜心研究的专家才能更被凸显出来,才能有更充足的经费和动力去研究,去突破现有的技术将知识的边界不断的拓宽,利用科技造福人类。当然,这里面必定夹杂着许多鱼龙混杂的人或物,但是 只要宏观方向把握得当,制度制定得比较完善,就能够避免“泡沫”的幻灭,整体维持一个健康向上的发展。 毕竟,任何事物都具备两面性,发展是一把双刃剑。唯有寄希望于巨头公司和机构有更大的担当,当好这个时代的领头羊和风向标,在制度的笼子下引领着这个时代朝着健康向上的道路去发展,而不是诸如一窝蜂的跑到菜市场去搞“社区团购”之类的割韭菜活动,而是应该做到真正意义上的“科技向善”。

 

02

 

作者:齐国君

 

CNN和transformer在处理视觉信息上各有优缺点。

 

CNN网络在提取底层特征和视觉结构方面有比较大的优势 。这些底层特征构成了在patch level 上的关键点、线和一些基本的图像结构。这些底层特征具有明显的几何特性,往往关注诸如平移、旋转等变换下的一致性或者说是共变性。比如,一个CNN卷积滤波器检测得到的关键点、物体的边界等构成视觉要素的基本单元在平移等空间变换下应该是同时变换(共变性)的。CNN网络在处理这类共变性时是很自然的选择。

 

但当我们检测得到这些基本视觉要素后,高层的视觉语义信息往往更关注这些要素之间如何关联在一起进而构成一个物体,以及物体与物体之间的空间位置关系如何构成一个场景,这些是我们更加关心的。目前来看, transformer在处理这些要素之间的关系上更自然也更有效 。

 

从这两方面的角度来看,将CNN在处理底层视觉上的优势和transformer在处理视觉要素和物体之间关系上的优势相结合,应该是一个非常有希望的方向。

 

03

 

作者:小小将

 

先简单来看一下transformer在分类,检测和分割上的应用:

 

(1) 分类 ViT: An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale

把图像分成固定大小的patchs,把patchs看成words送入transformer的encoder,中间没有任何卷积操作,增加一个class token来预测分类类别。

 

(2) 检测 DETR: End-to-End Object Detection with Transformers

 

 

先用CNN提取特征,然后把最后特征图的每个点看成word,这样特征图就变成了a sequence words,而检测的输出恰好是a set objects,所以transformer正好适合这个任务。

 

(3) 分割 SETR: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers

用ViT作为的图像的encoder,然后加一个CNN的decoder来完成语义图的预测。

 

当然,目前基于transformer的模型在分类,检测和分割上的应用绝不止上面这些,但基本都是差不多的思路。比如ViT-FRCNN:Toward Transformer-Based Object Detection这个工作是把ViT和RCNN模型结合在一起来实现检测的。

关于transformer更多在CV上的工作,可以看最新的一篇综述文章:A Survey on Visual Transformer

 

 

这里来谈一下自己几点粗鄙的认识:

 

(1)CNN是通过不断地堆积卷积层来完成对图像从局部信息到全局信息的提取,不断堆积的卷积层慢慢地扩大了感受野直至覆盖整个图像;但是transformer并不假定从局部信息开始,而且一开始就可以拿到全局信息,学习难度更大一些,但transformer学习长依赖的能力更强,另外从ViT的分析来看,前面的layers的“感受野”(论文里是mean attention distance)虽然迥异但总体较小,后面的layers的“感受野“越来越大,这说明ViT也是学习到了和CNN相同的范式。

 

 

(2)CNN对图像问题有天然的inductive bias,如平移不变性等等,以及CNN的仿生学特性,这让CNN在图像问题上更容易;相比之下,transformer没有这个优势,那幺学习的难度很大,往往需要更大的数据集(ViT)或者更强的数据增强(DeiT)来达到较好的训练效果。好在transformer的迁移效果更好,大的数据集上的pretrain模型可以很好地迁移到小数据集上。还有一个就是ViT所说的,transformer的scaling能力很强,那幺进一步提升参数量或许会带来更好的效果(就像惊艳的GPT模型)。

(3)目前我们还看到很大一部分工作还是把transformer和现有的CNN工作结合在一起,如ViT其实也是有Hybrid Architecture(将ResNet提出的特征图送入ViT)。而对于检测和分割这类问题,CNN方法已经很成熟,难以一下子用transformer替换掉,目前的工作都是CNN和transformer的混合体,这其中有速度和效果的双重考虑。另外也要考虑到如果输入较大分辨率的图像,transformer的计算量会很大,所以ViT的输入并不是pixel,而是小patch,对于DETR它的transformer encoder的输入是1/32特征这都有计算量的考虑,不过这肯定有效果的影响,所以才有后面改进工作deform DETR。短期来看,CNN和transformer应该还会携手同行。最新的论文Rethinking Transformer-based Set Prediction for Object Detection,还是把现有的CNN检测模型和transformer思想结合在一起实现了比DETR更好的效果(训练收敛速度也更快):

(4)这我想到了神经网络的本质:一个复杂的非线性系统来拟合你的问题。无论是CNN,RNN或者transformer都是对问题一种拟合罢了,也没有孰优孰劣。就一个受限的问题来看,可能有个高低之分,但我相信随着数据量的增加,问题的效果可能最终取决于模型的计算量和参数,而不是模型是哪个,因为之前的工作已经证明:一个三层神经网络可以逼近任何一个非线性函数,前提是参数足够大,而且更重要的是你找到一个好的训练方法。

 

未来虽然很难说,但依然可期!

 

原文链接:

 

【1】https://www.zhihu.com/question/437495132/answer/1656908750

 

【2】https://www.zhihu.com/question/437495132/answer/1658559732

 

【3】https://www.zhihu.com/question/437495132/answer/1656610825

 

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注