初读Geoffrey Hinton颠覆之作《Dynamic Routing Between Capsules》

最近在搜资料时忽然看到一条消息,Hinton老爷子在NIPS 2017大会上放了大招,宣布要革CNN和反向传播的命。武林盟主在武林大会上要推翻自己之前的武学门派,另起炉灶,如此精彩的大戏怎能不吃瓜围观,于是一边努力完成导师的任务,一边找了点时间学习老爷子的论文。

论文比较精简,言简意赅,干货满满。可能是因为第一篇相关的完善论文,并没有过多复杂的数学细节,还是比较容易读懂,下面开始展开自己对这篇论文的一些粗略的见解,有理解不当之处,欢迎批评指正。

另,本文部分思路来自SIY.Z老师的解析,深入浅出,写得非常好:https://zhuanlan.zhihu.com/p/29435406

一、”What is wrong with CNN ? “

早在2011年,老爷子就提出了Capsule的结构[1],同时一起进入人们视线的还有卷积神经网络(Convolutional Neural Network,CNN),后来由于CNN在计算机视觉方面功能太过亮眼,capsule的提出一直蒙在尘埃之中,无人问津。

但是没有关系,大神之所以是大神,除了金字塔尖的技术能力,更重要的是,他有掌控全局的观念和对未来的直觉,当几乎所有人都沉浸在CNN的狂热中,发了一篇又一篇的paper时,老爷子依然坚持在capsule的进一步构建与完善中(当然他已经不需要发paper完成指标了——来自苦哈哈研究生的吐槽)。

直到2017年,在 NIPS 2017,他终于放出了这篇备受关注的论文,向世人展示他又一次的创举。

1、CNN的不合理之处

  • Pooling
  • Back-propagation
  • 低等级识别
  • 样本数量过大

    1) Pooling

    CNN在做pooling操作的主要目的是降低特征维度,既减少计算量又可以防止过拟合。
    下面借用SIY.Z老师的图说明Pooling和Dynamic Routing的区别,出处:https://zhuanlan.zhihu.com/p/29435406

    这里写图片描述

    在这里我们可以直观的看到,Pooling是对一定区域内的特征取平均,然后映射到下一层对应的神经元上,在两个layer之间的对应关系是固定的,直白的。

    但老爷子认为,两个layer之间的对应关系,不应该是如此死板的映射规则,同时Pooling过程中不可避免地损失了一些重要的精细特征,这样的话对最终的分类结果一定会产生消极的影响。于是老爷子设想,能不能让相邻两个网络之间采用动态路由协议,自己选择特征映射的对象。

    举个栗子,较低级别的low-level layer中有大量的capsule,其中一个capsule i 可以映射到较高级别layer中的任意一个capsule j,在训练的过程中使用Dynamic routing不断迭代,最终可以确定capsule i 映射到哪一个capsule j 最多(在下文中表现为耦合系数c)。

    2)Back-propagation

    反向传播是Hinton老爷子当初为了解决网络优化而提出的训练方法,在近几年的神经网络中搭配简单的随机梯度下降(stochastic gradient descent,SGD)取得了极其优秀的结果。

    然而老爷子对BP的质疑越来越深,首先在生物的神经系统,从来没有发现过能够完成反向传播功能的神经结构,也就是说,反向传播的诞生,完全是人类为解决神经网络学习问题创造出来的方法,目前没有生物学方面的支持。当然对于神经网络是否要完全仿生这个问题,目前还无法下定论,人类大脑作为人类已知的最高智能,通过模仿人脑系统来构建神经网络,自然是一个值得发展的设想。而且,老爷子对于capsule的设想正是来源于神经解剖学中发现的mini-column,朝仿生方面考虑下一代神经网络的结构,也就可以理解了。

    这里写图片描述

    这里写图片描述
    (引用自[2],论文地址:https://academic.oup.com/brain/article-lookup/doi/10.1093/brain/awf110

    3)低等级识别

    这里写图片描述
    (引用自Geoffrey Hinton的 Does the Brain do Inverse Graphics? 讲座中采用的PPT)

    让我们来看上面的图片,首先CNN能够识别出上述两个图片中的”R”,然而人脑的识别方法是将左边的R旋转后判断出左边的字母为“R”,而CNN是由于在做样本transform的时候,对正常的“R”做旋转镜像并作为样本进行训练,也就是说,CNN是直接学习了左边那个“R”才完成的识别,它并没有对左边做旋转后判断,甚至,它都不知道左右两个是相同的字母。这就引出了下一个问题——大量样本。

    4)样本数量过大

    CNN之所以需要大数量级的样本,原因有上面的一部分。在现实世界中可能出现成百上千中同质情况的变体,例如上面的R,光是旋转、翻转、平移就可以产生大量的表现,卷积解决了平移的问题,但为了CNN能够识别其他情况下的图像,在输入样本时往往需要百万数量级的图像才能训练出较为精准的效果。这在数据爆炸的今天并不是难事,问题是,神经网络是否真的需要如此多的样本,Andrew Ng说过,你在教一个小孩认苹果,是不会拿几百万张图片给他看的,Robert D.Hof 也写到

No human child needs to see 50,000 labeled images to recognize a kitty

我们是否可以思考,也许存在这样一种网络,不需要大量样本训练,就可以提取出物体的相关特征,实现物体的准确识别。不过这里插一点自己的见解,生物在识别物体时不只是依靠眼球接受到的视觉信息,同时还有听觉、触觉的信息,甚至还有外界输入的属性特征,比如说一个栩栩如生的青蛙外形的水杯,但从视觉上看,是不可能判断为水杯的,如果这时候有人告诉你,它的功能属性是可以喝水,那么你会立刻判断为水杯而不是根据外形判断为青蛙,因为可以喝水这个功能属性极其重要,权重比其他属性都要高,几乎可以判断出来物体的语义。随机森林之类的决策过程能够通过这些非视觉属性来准确给物体下定义,但是在计算机视觉这一块,由于非视觉属性是获取不到的,或许需要大量样本作为补偿才能获得更精准的判断效果。

2、CNN的合理之处

首先CNN工作得非常出色,在GPU高速发展的今天,计算速度不断提高,加上可以布置分布式系统进行计算,CNN原有的计算量过大的问题得到很好的解决。另一个是反向传播就是有用,加上momentum之后可以避免落入局部最小点从而发现真正的鞍点。

CNN发展到今天,正是由于它优秀的性能和令人满意的效果,至少目前来看它是作用得最好的图像处理网络,不过Hinton老爷子在新论文里也放了大招,显示了在MNIST上训练的结果,下面我们就来品一品这篇论文到底说了什么,展示了什么,启发了什么。

二、Dynamic Routing Between Capsules

以下引用文字和图片均来自[3]

1、什么是Capsule

A capsule is a group of neurons whose activity vector represents the instantiation parameters of a specific type of entity such as an object or object part.

capsule是一组神经元,capsule生成的激活向量代表了一类特性实体的实例参数,这类实体可以是一个物体,也可以是物体的某个部分。

论文中把capsule生成的激活向量的长度(模)作为这个实体是否在image中出现的概率,帮助做出最后的prediction,一个活跃的capsule通过转换矩阵(Wij)对高层次的capsule的做出实例化参数的预测。

To achieve these results we use an iterative routing-by-agreement mechanism: A lower-level capsule prefers to send its output to higher level capsules whose activity vectors have a big scalar product with the prediction coming from the lower-level capsule.

在摘要中,Hinton表示CapsNet在MNIST上取得了比CNN优秀的结果,对于高度重叠的图像也能够很好的识别。在训练过程中,论文采用了路由协议机制——lower-level的capsule倾向于向与低级别capsule预测具有更大点积的高级别capsule传输output。

这段话究竟是什么意思呢,我们下面一一解答。

P.S. capsule就是胶囊的意思。

2、CapsNet之原理

人通过辨认物体其实是通过一系列注视点(fixation point)来获取物体的特征,下图是人类在看到人脸时的眼动轨迹,其中Fixation就是眼动轨迹中的点(注意图中有一些较明显的黑点)。从图中我们可以直观地看出,人类在识别人脸时,并不是将图像的所有信息输入大脑,而是提取其中的特征点。眼球会对图像中的注视点(fixation)用中央凹(fovea)进行visual gaze,然后眼动(saccades),在注视点之间进行扫描,提取特征信息,对于重要的特征部分,比如图片中的眼睛,还会进行微眼动(microsaccades)进行更加精细的特征提取,最终获得所需的信息。

这里写图片描述
(图片引用自Fixation-Wikipedia:https://en.wikipedia.org/wiki/Fixation_(visual)

Hinton的论文认为注视点能够给予我们充分的信息,并采用一个multi-layer visual system对每一个注视点(fixation)建立一棵分析树(parse tree)。

分析树的建立是大多数通过动态内存分配动态建立的,但在本文中,分析树通过一个多层神经系统来构建。系统中的每一层被分割为小的capsule,也就是说,网络层次为 Net –> Layer –> capsule –> neuron。而分析树中的每一个节点,就是一个active capsule。

通过迭代路由处理(iterative routing process),低层次的active capsule会自动选择高层次的capsule作为自己在分析树中的父节点。

一个active capsule里面的每个神经元代表了图像中某个实体表现出来的某一个属性,这些属性可以是姿势,是形变,是速率,是反射率,是色相,或者纹理等,其中有一个非常特别的属性是物体是否在image中存在的概率,它是神经网络做prediction的基础,在这里用了capsule输出向量的模来表示。同时用orientation of the vector来表示实体的属性。

3、CapsNet之动态路由的过程

Initially, the output is routed to all possible parents but is scaled down by coupling coefficients that sum to 1. For each possible parent, the capsule computes a “prediction vector” by multiplying its own output by a weight matrix. If this prediction vector has a large scalar product with the output of a possible parent, there is top-down feedback which has the effect of increasing the coupling coefficient for that parent and decreasing it for other parents. This increases the contribution that the capsule makes to that parent thus further increasing the scalar product of the capsule’s prediction with the parent’s output.

首先,Dynamic routing初始化时,capsule会路由(route)到所有可能的父capsule,并对每个父capsule有相同的耦合系数。详细点说,就是假设一个capsule i,它的所有可能的父节点就是更高那一层layer的所有capsule,假设有n个,那么对每个capsule的耦合系数就是1/n,注意capsule i 所有的耦合系数的和为一。

然后,capsule i 对每一个可能的父节点,计算出prediction vector并作为父节点的输入,如果这个prediction vector和某一个父节点的output vector的內积(就是把两个向量相乘)很大,那么会通过一个自顶向下的反馈增大这个父节点的耦合系数,同时减小其他父节点的耦合系数,达到动态选择的结果。

论文中还提到动态路由机制可以解决“explaining away”(名词解释见:http://blog.sina.com.cn/s/blog_719a21b70102woto.html),可以帮助分辨重叠的图像,有兴趣的朋友可以看看相关博文。

总的来说,CapsNet把CNN的标量输出变为向量输出,用路由选择代替Max Pooling,从而避免了在pooling过程中精细特征的丢失。

4、CapsNet之capsule输入输出的计算

由于我们需要将capsule的output vector的长度作为,这个capsule代表的实体是否存在于输入的image中的概率,我们用了一个“squashing”函数把output vector进行压缩,应用这个函数之后,向量长度越短结果越接近于零,长度越长结果越接近于一。

这里写图片描述
其中v(j)是capsule j 的输出向量,s(j)是所有输入capsule j的input的总和

除了第一层capsule,其他层的capsule的输入s(j)通过下列公式计算,u(i)代表比capsule j 低一层的所有capsule的输出向量,u(i | j)代表低一层的所有capsule对于capsule j 的预测向量,计算公式如右,W(i j)代表低一层的某个capsule i 的输出向量u(i)与高一层的capsule j 的输出向量u(j)。

c(i j)就是capsule i和capsule j之间的耦合系数啦,也就是动态路由机制要重点处理的系数。

这里写图片描述

c(i j)可以干什么呢,就是用来表示低层次capsule i 对高层的capsule j 的preference的啦。还记得我们在“什么是Capsule”中提到“lower-level的capsule倾向于向与低级别capsule预测具有更大点积的高级别capsule传输output”,这个倾向如何理解呢,就是耦合系数高,倾向大,耦合系数低,倾向小。假设capsule i 对capsule j 的c(i j)为1,由于capsule i 的所有耦合系数和为1,那么对其他capsule的耦合系数就是0了,这样一乘,capsule i 就把所有output都传入到capsule j 了,厉不厉害。

而且比起max pooling,dynamic routing可以路由到任意的capsule,大大提高了系统的灵活性,而且还不会丢失精细特征,这也是Hinton推崇CapsNet的重要原因之一。

那么c(i j)是怎么来的呢,对于相邻两层的capsule之间,例如低层的capsule i 和高层的capsule j 之间先设定一个基底b(i j),然后对b做softmax,在动态路由的过程中,实际变化也是这个b(i j),进而修改耦合系数c。

这里写图片描述

5、CapsNet之动态路由算法详解

这里写图片描述

讲完了相关公式,我们来看一看具体的算法流程:

  1. 首先初始化两个layer之间的Capsule的基底b(i j) = 0,这样算出来每个c(i j)都是1/n,是相等的
  2. 进行r次迭代(r应该是自己设定的迭代次数)
  3. 开始计算layer(l)中每个capsule(i)的耦合系数c
  4. 计算layer(l+1)中每个capsule(j)的输入
  5. 用 squash函数通过输入计算capsule(j)的输出
  6. 修改b(i j)
  7. 进行下一次迭代

    这里有几个注意点:

    首先,u(j|i)是作为给定的参数,而u(j|i)是权重矩阵W和u相乘,说明权重矩阵是不会变化的。

    其次,注意图中画红线的部分,这个部分称为agreement,是对b(ij)进行修改所用。还记得我们上面讲到的“lower-level的capsule倾向于向与低级别capsule预测具有更大点积的高级别capsule传输output”,为什么具有更大点积的capsule具有更高的preference呢,这里的agreement就是那个点积,如果agreement越大,那么b(i j)就越大,c(i j)相应越大,preference就更高。

    至于其中的c(i)如何保持和为1,文中没有给出相关证明,希望将来有人能够补充,拓宽知识点。
    这里写图片描述

6、CapsNet之网络架构

一开始Hinton的初步设想是这样的,图中黄色框代表一个capsule,最后综合capsule的输出信息得到最终的output。

这里写图片描述

在本论文中,Hinton对CapsNet做了进一步完善,下面是最为简单的CapsNet示例:

这里写图片描述

从左侧输入一张图片,用9*9的卷积核进行特征提取,因此紧接输入的那一层其实是一个卷积层。

卷积层提取特征后作为输入送入PrimaryCaps,PrimaryCaps是一个卷积 capsule层,里面有32个通道,也就是一层里面有32*6*6个capsule(每个通道有6*6个capsule),其中每个通道中每个capsule输出一个8维向量,一个通道的输出向量就是6*6*8。

PrimaryCaps和DigitCaps之间还有一个权重矩阵W(i j),代表capsule i 和capsule j 的输出向量(8维和16维)之间的权重。同一个通道里的capsule采用相同的权重。

接着PrimaryCaps的是一个DigitCaps,这个可以看做是一个预测层,共有10个capsule,每个capsule对应0~9共10个数字,然后每个capsule的输出是一个16维的向量。

下面的图是将DigitCaps的输出做mask,分离出每个capsule的输出,然后送进全连接层进行分类,最终得出判断结果。

这里写图片描述

好了,今天的感想就写到这里,后面对于MNIST的训练还没细看,看完之后再来博客做后续连载,先做任务去,我们下期见~

彩蛋:
Andrew Ng对话Geoffrey Hinton:https://www.youtube.com/watch?v=-eyhCTvrEtE
Geoffrey Hinton讲述CNN不合理之处:https://www.youtube.com/watch?v=Mqt8fs6ZbHk

无法打开的,请移步bilibili搜索。

Reference

[1] Hinton, G. E., Krizhevsky, A., & Wang, S. D. (2011, June). Transforming auto-encoders. In International Conference on Artificial Neural Networks (pp. 44-51). Springer Berlin Heidelberg.

[2] Daniel P. Buxhoeveden, Manuel F. Casanova; The minicolumn hypothesis in neuroscience, Brain, Volume 125, Issue 5, 1 May 2002, Pages 935–951, https://doi.org/10.1093/brain/awf110

[3] Sabour, Sara; Frosst, Nicholas; E Hinton, Geoffrey.(2017). Dynamic Routing Between Capsules. arXiv eprint arXiv:1710.09829.

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页