如何看待Hinton的论文《Dynamic Routing Between Capsules》?

论文链接:[1710.09829] Dynamic Routing Between Capsules Capsule 是一组神经元,其活动向量(activity vector)表示特定实体类型的实例化参数,如对象或对象部分。我们使用活动向量的长度表征实体存在的概率,向量方向表示实例化参数。同一水平的活跃 capsule 通过变换矩阵对更高级别的 capsule 的实例化参数进行预测。当多个预测一致时,更高级别的 capsule 变得活跃。我们展示了判别式训练的多层 capsule 系统在 MNIST 数据…
关注者
2,802
被浏览
103,079

25 个回答

2017.11.17更新:

在雷锋网AI研习社的邀请下,2017.11.17做了一场该论文的在线技术分享,ppt和视频已放出(百度网盘 pan.baidu.com/s/1pLp8fd,密码: ahjs,如果失效,请到我的github readme看看新的链接,那里更新比较及时,有空我再传到优酷等平台),需要的小伙伴可以去下载。注:该ppt和视频仅作为学术交流使用,不得用于商业用途,若使用到ppt中原创的图表,请声明来源。


先安利我的githubgithub.com/naturomics,已经使用Tensorflow复现了该论文的核心算法,目前test accuracy达到99.57(论文:99.75),我这个repo也已经收获1.3k+的star,谢谢各位的关注。


正文:

这里我将从以下几个方面作答:

  1. 解释论文:通过对比传统神经网络来理清什么是capsule及capsNet模型结构的细节
  2. 评论及其他



首先,一张图告诉你capsule是啥玩意,这个图就可以把论文Sec 2的大部分内容囊括进来:

图中右边是传统神经元的模型,它接受来自上一层多个神经元的输出 x_i (标量值)作为输入,对其进行加权、求和,然后进行sigmoid、ReLU等非线性操作,最后输出一个标量值;左边就是capsule论文Sec 2的几个公式,做一个对比,我们可以发现,capsule的输入是一个向量u_i,输出v_j也是一个向量,中间的公式Eq.1和Eq.2 就是从u_i到v_j的计算过程,这个过程可以一一地跟传统的神经元计算过程对应起来,u_i到u_hat(Eq.2)是一个仿射变换,这是传统神经元所没有的操作,然后u_hat到s_j是在c_ij的加权下然后对 i 维度进行求和的操作,这个可以看作向量版的加权求和过程,再接着就是s_j到v_j,Eq. 1这个squashing函数已经在楼上有同学进行分析,我不再赘述,我们需要知道的是,这个函数是非线性的,而且输出的v_j保持了s_j的维度,所以可以看作是向量版激活函数。

到了这里,我们可以看到,capsule就是一个向量版的神经元,所以可以叫它张量神经元,而不是所谓的“胶囊”(前一版写的是矢量神经元,最近跟小伙伴们反复讨论了capsule名字翻译的问题,网上现在都翻译为“胶囊”,我表示不忍直视,学术名词应该要具有直观的意义,能让大部分人在已有的知识体系下快速认识一个新名词所具有的特征,能够轻易辨别跟已有概念的区别以及共通点,另外,名字的变化也能够充分体现我们对事物认知的变化,就以这里我对capsule的翻译来说,我也经历了从矢量神经元到张量神经元的变化,这是因为我也慢慢意识到,既然神经元的输入输出可以从标量扩展到向量,那么向量也可以进一步扩展到张量这个概念,所以,我认为取名张量神经元更合适。当然,至于神经元的输出是否需要扩展到三维、四维的张量,这也是个值得研究的问题)


接着,就是CapsNet模型的结构。

这个model不算最后的reconstruction部分的话,总共就三层。

其中第一层不值得多说,就是一个常规的conv layer,得到一个20x20x256的输出。按照原文的意思,这层的主要作用就是先在图像pixel上做一次局部特征检测,然后才送给capsule。至于为何不从第一层就开始使用capsule提取特征?当然,MNIST是灰度图,每个pixel是一个标量,每个pixel看作低层capsule的输出u_i的话,就不符合capsule输入输出都是vector的要求(不考虑标量是长度为1的vector这个情况,那将退化成现在的CNN模式),但如果把这点作为第一层使用常规conv层的理由,我认为并不充分,我们完全可以使用3 channel的图像数据集来做experiment,达到capsule输入为vector的要求。既然这样,那又是为什么这么设计这层呢,是capsule不具备常规的convolution局部特征检测的能力还是别的原因呢?这是我的一个小疑问,读了原文后我并未从中得到相关的解答,有待进一步实验解决这个疑问。


而第二层(PrimaryCaps)才是真正开始使用capsule的层,但这层跟它的低一层,也就是上面说的conv layer之间,却并未使用routing算法。按照我的理解,这层才是真正为了做routing而准备的。我们先来看下,如果在第一层的输出上做常规的32 channel, 9x9 kernel size和strides 2的CNN,结果是怎么样的呢?事实上我们将得到一个6x6x32的输出,或者说是6x6x1x32的输出(这个1不是随便加的,下面有作用),如图(1):

图 (1)

将这个图与原文的Figure 2对比可以看出,原本convolution每次的计算输出是一个scalar value,现在到了PrimaryCaps这里成了一个长度为8的vector,也就是从6x6x1x32到了6x6x8x32(这里1就起作用了,从1到8的转变,也就是从标量向矢量的变化)。这是怎么做到的呢?按照我的理解,其实可以看作第二层在第一层的输出上用8个不同的conv2d层做了共8次32 channel, 9x9 kernel size和strides 2的卷积(每个conv2d分别一次),如下图(2)所示,每次都得到一个6x6x1x32的输出,共8个,再把这些输出在6x6x1x32的第三个纬度上concatenate, 就得到了第二层最终的输出:6x6x8x32大小的高维矩阵,也就对应上了论文里的Figure 2。

图 (2)

这么理解下来,我们可以发现,primaryCaps层就是多个常规卷积层的叠堆,换句话,就是把8个conv2d封装在一起,然后形成一种新的neural unit,hinton称之为capsule,在这层这种neural unit可以输出8x1的vector,接着第三层我们就能看到输出的是16x1的vector。就说明了这种neural unit的输出可以根据需要设计verctor的输出维度。


——这里我要提一下,有位同学提出,这里的输出[6, 6] grid相互之间是共享权重的,然后又提到6x6x32=1152,这好像没有共享权重啊,我想这位同学是误读了,请大家要仔细阅读,这里在解释的是conv1 和 primaryCaps层之间的变化,按照我上面这个思路,6x6 grid之间是权重共享的,提到1152是在后面primaryCaps和digitCaps层之间的计算了。请大家注意辨别。


此外,第二层的卷积操作除了可以看作是多个常规的卷积叠堆后的效果外,还有一点是跟传统的卷积过程是不一样的,那就是对每个长度为8的vector做了文中的Eq. 1的向量单位化和缩放操作(存疑的地方:capsule内部每次的卷积只做加权求和,但不做非线性的activation非线性转换,还是加权求和后也做ReLU这类non-linearity activation呢,读了多次论文似乎没提到),公式如下,其他楼层有这个公式的解读:

Eq. 1

到了这里,第二层的计算也就完了。第三层(DigitCaps)在第二层的输出之上就开始使用了 routing 算法。这一层依然可以跟传统的网络做比较,可以看作一个全连接层,这在原文里也有提到:

文中第4节的第一段第二行就说了,这个Net就是两个卷积层加第三层的fully connected layer,说明Hinton大大也是认为这个就相当于capsule版的全连接层。怎么理解呢?上图:

图 (3)

请你先把第二层的6x6x8x32输出看作上图左边的样子,也就是每个长度为8x1的vector就是一个点,一个向量点!这里说的一个点在文中就是指u_i。而第三层的输出也可以看作是由10个神经元输出的10个点,每个点同样是向量点,其中向量的维度为16x1,在文中就是指v_j。所以第二层向第三层共输入32x6x6=1152个点,即 i 取值为0到32x6x6=1152, 而 j 取值为从0到10, 其中第三层的每个神经元代表一类数字(0-9)出现的可能性。那么就好理解了,传统的一个神经元就是对输出做加权求和然后非线性激活,现在就不是这样了,而是每个神经元(capsule)内部使用routing算法。至于这个routing算法起到了什么作用呢?结合他人的观点后,我认为这个routing确实有几分类似于 attention的机制,但它跟attention的差别就是,routing是低层neural unit选择高层neural unit,而attention是高层的选择低层的。


评论及其他:

  1. 有同学评论说u_i能不能表示一维的向量,这是绝对可以的,不仅u_i可以是一维的,v_j也可以是一维,如果这样做,那么论文里的第二层就退化为现在的卷积层,第三层就变为一个全连接层,但是神经元内部不再是常规的加权求和然后active了,而是新版的加权求和并active,Hinton称之为routing。懒癌发作,更多讨论请直接看评论里我的回复,了解更具体的看法。
  2. 读完这个文章后,我们可以发现其实只有第二层和第三层之间做了routing,而且是 fully connect的,那么我们是否还可以用capsule来做自带routing过程的capsule版卷积层呢?只是做这种卷积层的必要性值得探讨,因为routing已经具备了一定的层与层之间的选择性连接的功能,而卷积是先验性地设计结构,做到人为地选择层与层之间的部分连接。到了这里,让我想起了今年初那篇Deformable Convolutional Network的贡献,还没读过的同学可以了解下。
  3. 宣传了那么久的capsule概念,到底能不能革现在的CNN的命呢?我的态度,那还是让时间说话吧。但是这个工作我还是很认可的,因为我认为它的贡献至少有一下两点:(a)把传统的单个神经元从scalar in scalar out的模式扩展到了verctor in vector out(甚至还可以 matrix in matrix out啊[笑]),这是个拓展性的工作,即使曾经有人有过vector in vector out这样的想法,但是我没见过有实现的(知道哪有的话请告知);(b) 就是routing 这样不需要BP算法来更新参数的,routing里面只有b_ij参数——虽然整个capsule内部还是多多少少使用了BP,但我们还是期待Hinton能做到更少使用BP吧
  4. 但是,我们真的必须要丢弃BP吗?我认为这不是必须的,你要看Hinton为啥认为BP不好。据我的了解(没有做很多官方数据考据,请注意),Hinton的其中一个观点,就是认为现在的model参数更新都是由最后的loss fun通过BP来决定,这个太不合理了,loss fun设计得不好,整个model就废了,“一人独大”的感觉。在我了解到Hinton的capsule理念之后,我受到了一定的启发,就是每个neural unit的参数更新不仅应该受到global的loss fun影响,还应该受到这个capsule的周边capsule影响,就是一个model结构局部影响,根据这个思路,我产生了一个我认为值得去尝试的新算法,待我日后实验,欢迎跟进。


注:

  1. github上一个叫Siraj的略有名气的同学copy了我的工作却没有“明显”地声明来源(readme最后加了一行并不显眼的说明),导致最近经常有同学问我是不是Siraj,我不是。我不知道是应该感谢他为我打广告,还是要谴责他,不过我已选择了相应的开源协议,他的行为也还在协议之内,所以谴责之词也无从说起,在此还是非常感谢曾经想为我打抱不平的小伙伴们。
  2. 非常欢迎大家通过PR或Issue帮助改善代码、丰富功能,我将继续做一些拓展性的实验,进一步研究capsule的效果。

感谢 @戴松民 底下的评论,之前routing的图画反了。

最近一次修改 10-31 下午。基本更新完。

Capsule 是 Hinton 近几年在采访中频繁提到的概念,在之前我写过一个详尽的概述:浅析 Hinton 最近提出的 Capsule 计划,由于 Capsule 的基础概念相关的知识非常多,这里全部列出来恐怕不合适,如果想详细了解 Capsule的理念,我建议先参考这个概述。论文中很多抽象的论述都和Hinton之前的这些想法密切相关。


理念归理念,论文归论文,应用归应用。对于这篇公开的论文,我认为我们应该关注这些地方:

  1. 这篇论文的定位是什么?

    答:

    我想论文中说的非常清楚:The aim of this paper is not to explore this whole space but to simply show that one fairly straightforward implementation works well and that dynamic routing helps.

    也就是这篇论文仅仅是为了实现一个简陋的,能用的基于capsule的模型,原则上无论结果多么差都可以接受。而结果还是基本令人满意的,并且动态路由算法似乎能提升算法性能。作者并没有精心设计高效可扩展的算法,而是仅仅展示 capsule 是能用的。

    Hinton 提Capsule已经提了相当一段时间了,但是基本没有具体的算法和模型实现。一个还称得上实现的是2011年的论文[1],但是显然那个实现和Hinton的想法相差很远。

    所以,这次paper是Hinton他们的初步实现,改进空间很大,没有必要大规模炒作(这样被误导看了论文反而觉得印象很差)。很多Hinton在演讲中提到的成果(包括few-shot learning等等)论文里面还没有看到,也就意味着Hinton可能还有一些更加成熟的关于capsule的论文没有发表。

  2. 就理念而言,这篇论文践行了Hinton的哪些理念,而哪些论文还没有达到?而践行这些理念使用哪些具体的数学方法?

    答:这篇论文基本践行了Hinton对的Capsule的观念,但是某些地方没有体现:

    (1)coincidence filtering(参考[2])。这是 Hinton 理念上的“routing”方案,看上去非常robust,但是实施需要EM算法和 Gaussian Mixture,相对比较复杂。而这次论文中我们可以看到它直接用非常简单粗暴的dynamic routing来实现了(并且引入新的超参数),这有点偏离原来的思想。

    (2)place-coding & rate-coding (参考[2])。这需要多层 capsule才能体现,论文中的模型实在太浅了完全不能体现。

  3. 就论文而言,论文有什么亮点,有什么突破?将来有什么展望?

    答:亮点和突破在于更好的robust,以及对重叠图像/多物体识别的先天优势。这个正文会细说。

  4. 就应用而言,这篇论文中的Capsules是否有传统的深度学习不可替代的价值?又有什么应用场景?

    答:对不起,目前看来还不明显。不过这也不是论文的目标。


用一组 Capsules 替代网络的一层

Capsule 关键的一点是在于用复杂的 Capsule 替代现在神经网络中简单的 layer。

其重要理由之一是现在 layer 中的 neuron 太过简单,本身很难表征概念;而Capsule使用向量作为输入输出,而向量就可以作为良好的表征(比如word2vec中的向量就可以良好表征词汇),可以加各种特技,(具体原因,包括生理学,心理学上的原因参见[2])。

与一般的向量表征不同,Capsule 的输出向量表征了两个部分:

  1. 其长度表征了某个实例(物体,视觉概念或者它们的一部分)出现的概率
  2. 其方向(长度无关部分)表征了物体的某些图形属性(位置,颜色,方向,形状等等)

用 Capsules 代替 layer 存在几个问题:

(1) 如何实现激活函数?layer 使用了非线性函数来处理标量,而Capsule处理的是向量,那么又该用什么“激活函数”呢?

答案是一个被称为 “squashing” 的非线性函数,(s为输入,v为输出,j为capsule的序号)
\mathbf{v}_j={\|\mathbf{s}_j\|^2\over 1+\|\mathbf{s}_j\|^2} {\mathbf{s}_j \over \|\mathbf{s}_j\|}

\mathbf{v}_j={\|\mathbf{s}_j\|^2\over 1+\|\mathbf{s}_j\|^2} {\hat{\mathbf{s}_j}} ,其中 \hat{\mathbf{s}_j } 是单位化向量,也就是缩放向量的长度为 {\|\mathbf{s}_j\|^2\over 1+\|\mathbf{s}_j\|^2}

它画出来如下:

长度缩放函数

这个函数的特点是:

  1. 值域在[0,1]之间,所以输出向量的长度可以表征某种概率。
  2. 函数单调增,所以“鼓励”原来较长的向量,而“压缩”原来较小的向量。

也就是 Capsule 的“激活函数” 实际上是对向量长度的一种压缩和重新分布。

(2) 如何处理输入?layer 使用了矩阵,本质上是上层输出的线性组合。那么对于 Capsule 又应该怎么做呢?

Capsule 处理输入分为两个阶段:线性组合和routing。

线性组合一定程度上是借用layer中的线性组合的概念,用在Capsule中的好处和作用来自于图形学对Hinton的启示(参见[2])。

不过这个线性组合不是针对 layer(也就是只有一个matrix),而是针对 capsules (一堆matrices),亦即:

\hat{\mathbf{u}}_{j|i}=\mathbf{W}_{ij}\mathbf{u}_i (其中u是下层的向量,由前层的标号为i的capsule产生,带帽子的u是处理后的结果,送给后层的标号为j的capsule)。

这等于,原来NN中的“边权”(常量)变成了矩阵。

线性组合部分示意图

关于 routing 部分,其实是给 \mathbf{\hat{u}}_{i|j} 加权求和,权重是 \mathbf{c}_{ij}

routing 和 线性组合相结合

\mathbf{c}_{ij} \mathbf{b}_{ij} softmax 的结果,从而使得 \mathbf{c}_{ij} 分布归一化;并且由于softmax会使分布“尖锐化”,从而只有少数 \mathbf{c}_{ij} 有较大的取值,这样就起到了routing的作用(只有少数 \mathbf{\hat{u}}_{i|j} 的权重较大,就好像底层的某个capsule的输出只贡献给上面的某个capsule)。

Routing 的更新:Updating by agreement

按照 Hinton 在很多视频中的理念,“找到最好的(处理)路径等价于(正确)处理了图像”。这也是 Capsule 框架中引入 Routing 的原因之一。

而找到“最好路径”的方法之一就是找到最符合输出的输入向量。符合度通过输出向量和输入向量(线性变换后的向量)的内积所表征,这个符合度直接被加入到 \mathbf{b}_{ij} 中。

更新算法示意图
更新算法

这个更新算法很容易收敛。论文中认为3次足矣。routing 和其他算法一样也有过拟合的问题,虽然增加routing的迭代次数可以提高准确率,但是会增加泛化误差,所以不宜过多迭代。

网络结构:CapsNet

网络结构在论文中称为CapsNet

首先,来一个标准的CNN+ReLU。强迫症患者可能感到不是很舒服:为什么不全部使用Capsule,而是要来个CNN呢?

第一层,标准的卷积

原因其实很简单,Capsule 的向量是用来表征某个物体的“实例”,并且按照假设,越高级的capsule能够表征更高级的实例。如果不通过CNN抽取特征,那么Capsule就直接得到图片的内容,这并不是很理想的低级特征。而浅层的CNN却擅长抽取低级特征,于是用CNN是在情理之中的。

这里注意到CNN的感知野很大(9*9,现在一般3*3),这是因为CNN层数很少的情况下,感知野越大,底层的capsules能够感知到的内容也越多。

但是,一层 CNN 的能力不足以抽取到合适的特征,于是这篇论文又加了一个 CNN层(一共32个CNN,文中称为32个channels,每个CNN有8个filters),这个 CNN 的输出构成了第一层 Capsules 的向量。

由于 CNN 共享权值的特点,这一层每个 CNN 输出的feature map中的36个capsules 是共享权值的(通过CNN)。显然所有的Capsules都共享权值是有问题的,这也是为什么这层搞32个CNN的道理:不同的 CNN 输出的Capsules间是独立的。

第二层,通过卷积生成初级Capsules

为了加深理解,我们可以对比一下CNN的输出和这层输出的Capsules的区别:

CNN的输出,和论文中这层Capsules的输出的比较

我们可以看到它们的相似点在于,每个”平面“内,变量都是共享权值的;而在不同”平面“内,变量是独立的。而不同点在于,在”平面“内CNN的单位是标量,而Capsules是一个capsule表征的向量。

这一层的Capsules在论文中被称为 PrimaryCapsules ,这让我联想到 primary visual cortex(初级视皮层),因为如果说第一层卷积相当于视网膜,第二层卷积相当于初级视皮层,那么 PrimaryCapsules 的向量就是初级视皮层的表征。

第三层,也是输出层,就是一组10个标准的 Capsules,每个 capsule 代表一个数字。每个capsules 输出向量的元素个数为16。这组 Capsules 被称为 DigitCaps (取名逼死强迫症)。

从 PrimaryCapsules 到 DigitCaps 使用了上文所述的 dynamic routing。这也是唯一使用dynamic routing 的地方。

从 PrimaryCapsules 到 DigitCaps

按照假定,某个 capsule 输出向量的(范数)长度表示某个 capsule 表征的内容出现的概率,所以做分类的时候取输出向量的 L2 范数即可。

这里注意到,最后 capsules 输出的概率向量不是归一的,也就是 capsules 天然有同时识别多个物体的能力。

分类任务:最后取 DigitCaps 向量的 L2 范数

优化

由于 capsules 允许多个分类同时存在,所以不能直接用传统的交叉熵损失,一种替代方案是 SVM 中常用的 margin loss:

L_c = T_c\max(0, m^+− \|v_c\|)^2 + \lambda(1 − T_c)\max(0, \|v_c\| − m^−)^2

其中 c 是分类, T_c 是分类的指示函数(分类c存在为1,否则为0), m^+ 为上margin,惩罚假阴性(没有预测到存在的分类的情况); m^- 为下margin,惩罚假阳性(预测到不存在的分类的情况)。 \lambda 是比例系数,调整两者比重。

总的 loss 是各个 L_c 之和。

至于优化算法,论文没有明说,其实不难猜到就是标准的反向传播(否则怎么搞CNN),估计作者觉得没有必要写了。论文在很多细节上让人很难受,比 AlphaGo Zero的文笔差多了(人家把讲过N次的MCTS还是换个说法耐心地讲解了一遍)。

重构与表示

Hinton 一直坚持的一个理念是,一个好的robust的模型,一定能够有重构的能力(”让模型说话“)。这点是有道理的,因为如果能够重构,我们至少知道模型有了一个好的表示,并且从重构结果中我们可以看出模型存在的问题。

之前我们说过,capsule 的一个重要假设是每个 capsule 的向量可以表征一个实例。怎么来检验这个假设呢?一个方法就是重构。

重构的时候,我们单独取出需要重构的向量,扔到后面的网络中重构。当然后面的重构网络需要训练。

重构模型

但是有读者可能会有疑问:如何证明重构的好是因为Capsules输出了良好的表示,而不是因为后面的网络拟合的结果?我们知道哪怕前面的输入是随机的,由于神经网络强大的拟合能力,后面的网络也能拟合出重构结果。

一个证据是人为扰动 capsule 的输出向量。我们可以看到,如果逐渐改变向量的一些分量,表示也很有规律地改变,这是随机的输入难以做到的。

通过扰动 capsule 的向量,产生不同效应的重构结果

另外,他们没有拿capsule 的输出向量做个 t-SNE,这点很可惜。。。如果这样我们就能看到 capsule 的输出向量是如何把 MNIST 嵌入到空间中去的。

重构与无监督学习

论文中发现如果把重构误差计入,可以显著地提高准确率:

有重构介入时,准确率有显著提升

(其实很搞笑的是,这种提升远远大于对dynamic routing的调整)

需要注意到,重构是无监督的方式,不需要标签。如果重构能够大幅提升分类效果,那么就暗示了可以通过重构做无监督学习(重构也可能是人做无监督学习的途径之一)。这部分Hinton提了很多,应该已经做出来了,不过看样子不在这篇论文当中。

重构与可解释性

之前我在[2]中简单提及过,做capsule的动机之一还在于可解释性。我们需要看到NN为什么正确,为什么错误。

这篇论文通过重构或多或少这一点,还是很有意思的。

比如下图左侧,都是分类正确的重构,可以看到重构除了还原本身外,还起到了去噪的效果。

右侧模型误把”5“识别成了”3“,通过重构,模型”告诉“我们,这是因为它认为正常的”5“的头是往右边伸出的,而给它的”5“是一个下面有缺口的”3“。

对正确和错误的分类进行重构

在识别重叠数字的时候,它显示了更强的重构能力,并且拒绝重构不存在的对象(右侧*号)

识别重叠数字,以及重构结果

为什么选择 MNIST 而不是 ImageNet

我知道,大家都会吐槽为什么还要用 MNIST 这种用烂的数据集。

首先是,ImageNet 很难做重叠图像的实验(现实图片重叠的情况下本来就很难辨认,即使实现了也很难可视化),这点手写数字几乎是最理想的方案。

第二点是,在此实验的配置下,做 ImageNet 是自杀行为。因为 Capsules 假设是每个 Capsule 能够代表一个实例,本论文实现的动态路由方案比较naive,根本不能满足这么多的 Capsule 数量,何必做不符合自己假设的实验呢?其实文章作者知道这点,还是强行试了试 cifar10,果然效果不好(和最初应用到cifar10的CNN效果差不多)。

另外一个关键的数据集: smallNORB

Capsule 非常重要的卖点是符合图形学的某些现象(参见[2]), 在 smallNORB 上达到 state-of-the-art 是非常重要的支持。

smallNORB 数据集

smallNORB 和 MNIST 一样,构成非常简单,所以目前的 CapsNet 架构可以训练。但是 smallNORB 非常重要的一点是,它是3D的,并且明显由各个组件构成的,这点对于 Capsules 是非常有利的(如果 Capsules 假设正确)。

我相信以后关于 Capsules 的论文中 smallNORB 可能还会出现多次。

全场最差:动态路由

个人认为动态路由是论文中做的最不好的地方,做的太简单了,如果用论文中的动态路由方案,我想是无法做到训练 ImageNet 的。

按照 Capsules 的假设,在当前方案下,训练 ImageNet,估计至少要用长度100的向量来表征一个物体吧(可能还是不够)。假设我们卷积层保持 256 * 256 的长宽,256个独立的 Capsules 分组,那么一层就有 16777216 个 Capsules,我们不管其他的,就看最后输出1000个分类,需要1000个Capsules(假设向量长度还是100个元素),那么参数占用内存(设类型为float32)就是 16777216 * 1000 * (100*100*4)= 671088640000000 = 671.08864 TB(不计路由等部分)。实际训练中内存还会数倍于这个数字,至少要翻一倍,到1.7 PB左右。如果你要单独用GPU放下这一层,就需要 80000 张 Titan X Pascal,更别提整个网络的参数量。如此多的参数显然是因为全连接的动态路由造成的。

相信路由方案一定是将来改进的重点。

[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] 浅析 Hinton 最近提出的 Capsule 计划