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

论文链接: [1710.09829] Dynamic Routing Between Capsules Capsule 是一组神经元,其活动向量(ac…
关注者
3,040
被浏览
215,434
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

感谢 @戴松民 底下的评论,之前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 计划