查看原文
其他

胶囊网络结构Capsule初探

2018-02-03 Peter 混沌巡洋舰

作为神经网络的大牛Geoffrey Hinton在17年十月提出了一种新的网络结构,他称之为Capsule,这个词的中文意思是胶囊。在本周,Capsule的代码在github上开源,瞬间成为爆款。 Capsule式的网络结构,和卷积神经网络一样,最初是用来处理视觉问题的,但是也可以应用到其他领域。这篇小文不涉及Capsule神经网络的数学细节,而是关注Capsule网络是如何克服CNN存在的问题的。阅读之前,对于卷积神经网络不熟悉的可以先看看你所不能不知道的CNN

谷歌公司的Geoffrey Hinton大神


用Hinton大神的话来说,计算机图形学做的是渲染,而计算视觉想做的就是渲染的逆过程。渲染是将三维的图像投影到二维,在数学上意味着给原图乘以一个固定的矩阵。而计算机视觉做的,则是Inverse Graphics,也就是从二维的图像推测出本身的三维结构。为了比较胶囊网络和CNN之间的区别,让我们先看看CNN想做什么,有什么不足。


1) CNN那里做的不够好

有一些事情,对小孩子来说很容易,但若是卷积神经网络,则很难,例如认清楚下面两章图上的猫是同一只。然而若是神经网络无法做到这一点,机器视觉的模型,不管处理怎样的任务,都注定会不够稳键(robust)。解决图像迁移后的一致识别,是Capsule神经网络出现的第一个目的。


不止是左右的平移,CNN对于旋转,加上边框也会难以觉察出其一致性,CNN会认为下图的三个R是两个不同的字母,而这是由网络结构所带来的,这也造成了CNN所需的训练集要很大,而数据增强技术虽然有用,但提升有限。



一张脸上不应该只是由两只眼睛一张嘴巴一对鼻子构成的,组成整体的部分之间的相互关系对于识别图形,也很重要。下面的这张图会被CNN看成是一张脸,这是因为CNN识别脸的时候,是识别脸的几个组成部分,下图中的确有两个眼睛,有鼻子,有嘴,虽然其位置不对,这对于CNN来说就够了,CNN是不会注意子结构之间关系的。




同样的道理,CNN的网络难以区分左图和右图,他们是由相同的形状(椭圆形)组成的,其信息都储存在子结构之间的关系中。卷积核之间的独立即使的训练简单,又丢失了全局的关联信息。

                    

人类在识别图像的时候,是遵照树形的方式,由上而下展开式的,而CNN则是通过一层层的过滤,将信息一步步由下而上的进行抽象。这是Hinton认为的人与CNN神经网络的最大区别。


总结下这一小节,卷积神经网络的问题是其神经员之间都是平等的,没有内部的组织结构,这导致无法保证在不同位置,不同角度下对同一个物品做出相同的识别,也无法提取不同卷积核得出的子结构之间的相互关系。CNN中采用的分块和共享权重,其目标都是希望能够使神经网络学到的特征提取之术能够在图形出现微小变化时能够应对,而不是针对图形的变化,对应神经网络进行相应的改变,而这正是capsule神经网络所要做的。


2)脆弱与反脆弱

用英文来说,为了提升模型的可扩展性,CNN追求的是Invariance,而胶囊网络追求的是Equivariance。熟悉塔勒布的童鞋会想起他的命运,脆弱的反义词不是稳健,而是反脆弱。这正是胶囊神经网络强大的地方,追求的是在不同视角下对同一个物品的相同感知(标签),而通过对各个视角下都有标记的数据死记硬背做到对相似物品图像的识别。


回到上文提到的字母R的例子,下图的两个字母左边的那个不是R,但人类大脑在做出这一判断的时候,不需要一个老师指出这一事实,人会在自己的大脑中对左边的图像进行翻转,使得半圆处于图形的上方,之后再识别出图形,如果能够让神经网络也能做类似的事,那就不需要太多的标注数据了。


正是由于胶囊网络可以对图形进行翻转,这使得其不需要那么多的标注数据,下图对比了CNN和胶囊神经网络在识别人脸上的区别。CNN中需要有一层去应对不同翻转角度的脸,而胶囊网络则可以用一个胶囊去完成这个任务


具体看看胶囊神经网络想做什么,假设我们训练一个识别数字2的网络,我们首先做的是在每一层训练一些胶囊(即一组相对独立的神经元),每一个胶囊只负责图形中的一个子结构,例如图中的三个胶囊,分别识别横线,竖线和锐角,每个胶囊给出图形中每个位置出现自己负责识别的特征的概率(intensity),之后再通过一个编码器,综合每一个胶囊给出的在各个位置的强度信息,最终得到经过重构后的图像。


例如我们关注的是识别数字7,那么下图中的第一行是传统的神经元,会给出对应图形是不是7的概率,但这个神经网络却无法识别第三行的数字。一个包含两个神经元的胶囊可以一个识别图形的翻转情况,一个识别具体的形状。不管图形是第二行那样竖直站立的,还是像第三行那样歪倒的,胶囊网络都可以正确的识别。


由于每个胶囊给出的是输出是一组向量,不是如同传统的人工神经元是一个单独的数值(权重),为了解决这组向量向那一个更高层的神经元传输的问题,就需要Dynamic Routing的机制,而这是胶囊神经网络的一大创新点,也是理解中的难点。Dynamic routing使得胶囊神经网络可以识别图形中的多个图形,这一点也是CNN所不能的。由于讲解Dynamic routing需要很多数学细节,这里就不再细说。可以理解成一种实时的投票,决定不同胶囊网络之间提取的特征哪一个更显著,更有益于上一层网络的重构。



3)冗余对抗复杂

下面的图展示了胶囊神经网络在MINST数据集下的表现,这里可以看出胶囊神经网络的另一个好处,即可解释性强,你可以看出每个胶囊想做什么。不过即使你知道了每个胶囊识别的是那些子结构,你也很难想象出是怎样通过这些结构的组合识别出数字的。我猜那是你理解的数字识别的规则,根本不需要这么多的子结构,但这只不过是你对当前情况的解释,真实的大脑,如同胶囊神经网络,所做的都是利用冗余来对抗复杂,让模型模仿人类大脑用冗余带动生产的能力, 来对抗复杂的问题。引申来说,说深度学习缺少解释性,部分的原因是我们对解释性的理解太浅了,人们天生不习惯复杂的解释,但要应对复杂,就必须有冗余。

此图来自Hinton关于Capsule的论文,图中的第一列是网络的输入数据,第二列是网络根据原图重构的图形,网络的目标是让这两幅图的差距尽可能小,第三列给出了这两幅图之间的差别,之后的列是网络中每一个胶囊所识别的子结构,可以看到,这些子结构之间很多是相似的,也就是网络有冗余。


冗余带来的好处,从下图可以看出,这里展示了如果对于每一个胶囊给出的intensity值加上或减去两个标准差后,网络重构出来的图像会是怎样,可以看出,图形基本还是能识别成原始的2的,这说明网络具有鲁棒性,不会像CNN一样,仅仅因为一两个像素点的改变,就将图形识别错误。

类似CNN的深层网络,胶囊网络也可以有层次结构,如下图所示,红色的是底层的胶囊结构,绿色的是高层的胶囊结构,绿色的胶囊无法知道图形中具体的形状是什么在哪里,这使得绿色的胶囊结构通过训练所学到的只是图形中子结构之间的相互关系,这就实现了CNN所不能的,也就是将图像在其头脑中进行翻转伸张平移等视角变换,但同时保持其特征的一致性。


下面展示了胶囊神经网络在3D图像中的表现,这里的目标是看看胶囊神经网络能否正确的的从下图中左边的一列,将图形做选择,得出右图的图形。我们看到,胶囊网络翻转生成的图像效果不错。这说明神经网络学到了每个图形中子结构之间应该怎样连接。而在第二幅图中,展示了说学到的连接也可以应用在没有出现在训练集的测试数据上,哪怕训练数据是汽车,测试数据是飞机,这展示了胶囊网络优良的可扩展性。


任何结构的神经网络需要提高其模型的可扩展性,都需要做正则化。CNN的标准做法是随机的扔掉一些神经元,即dropout,而胶囊神经网络则是通过重构的方式,在识别某一个图形的标签时,将网络中与这个图形无关的部分都关闭,而使剩下的网络试图尽可能准确的重构这个图形,从而提高模型的泛化能力,这里借鉴了自编码器的思路,结合胶囊网络子结构之间的独立性,这使得模型的泛化能力很强。而这也可以看成是通过冗余来应对复杂,明明识别6和9的网络可以很类似,但因为有了分工,弄混的概率也少了。


4)小结

胶囊网络可以算是一种革命性的网络架构,神经元的输出从一个标量变成了一组向量,这如同让网络流动起来了。每一个识别子结构的胶囊,使原始图形中隐藏的信息在bits数变小的情况下实现了高度的保真,而这个保真,又是从复杂结构里直接进化得到的。通过重构原图,模型做到了在视角变换后,通过网络结构的改变,给出相同的认知(重构),这使的胶囊网络具有了反脆弱的性质。另外需要指出的是,CNN和胶囊神经网络并不是互斥的,网络的底层也可以是卷积式的,毕竟胶囊网络善于的是在已抽象信息中用更少的比特做到高保真的重述。

这里给出了用来识别MInst数字集的CapsNet网络结构图,底层是卷积层,而用来最终做预测的也是熟悉的Sigmoid全连接层,改变是只是中间那些层,由卷积网络变成了胶囊网络。


更多阅读

白话迁移学习

对抗神经网络初探


参考资料

http://www.cs.toronto.edu/~fritz/absps/transauto6.pdf

http://cseweb.ucsd.edu/~gary/cs200/s12/Hinton.pdf

https://www.arxiv-vanity.com/papers/1712.03480/

https://jhui.github.io/2017/11/03/Dynamic-Routing-Between-Capsules/



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存