感谢 @戴松民 底下的评论,之前routing的图画反了。
最近一次修改 10-31 下午。基本更新完。
Capsule 是 Hinton 近几年在采访中频繁提到的概念,在之前我写过一个详尽的概述:浅析 Hinton 最近提出的 Capsule 计划,由于 Capsule 的基础概念相关的知识非常多,这里全部列出来恐怕不合适,如果想详细了解 Capsule的理念,我建议先参考这个概述。论文中很多抽象的论述都和Hinton之前的这些想法密切相关。
理念归理念,论文归论文,应用归应用。对于这篇公开的论文,我认为我们应该关注这些地方:
Capsule 关键的一点是在于用复杂的 Capsule 替代现在神经网络中简单的 layer。
其重要理由之一是现在 layer 中的 neuron 太过简单,本身很难表征概念;而Capsule使用向量作为输入输出,而向量就可以作为良好的表征(比如word2vec中的向量就可以良好表征词汇),可以加各种特技,(具体原因,包括生理学,心理学上的原因参见[2])。
与一般的向量表征不同,Capsule 的输出向量表征了两个部分:
用 Capsules 代替 layer 存在几个问题:
(1) 如何实现激活函数?layer 使用了非线性函数来处理标量,而Capsule处理的是向量,那么又该用什么“激活函数”呢?
答案是一个被称为 “squashing” 的非线性函数,(s为输入,v为输出,j为capsule的序号)
即
,其中 是单位化向量,也就是缩放向量的长度为
它画出来如下:
这个函数的特点是:
也就是 Capsule 的“激活函数” 实际上是对向量长度的一种压缩和重新分布。
(2) 如何处理输入?layer 使用了矩阵,本质上是上层输出的线性组合。那么对于 Capsule 又应该怎么做呢?
Capsule 处理输入分为两个阶段:线性组合和routing。
线性组合一定程度上是借用layer中的线性组合的概念,用在Capsule中的好处和作用来自于图形学对Hinton的启示(参见[2])。
不过这个线性组合不是针对 layer(也就是只有一个matrix),而是针对 capsules (一堆matrices),亦即:
(其中u是下层的向量,由前层的标号为i的capsule产生,带帽子的u是处理后的结果,送给后层的标号为j的capsule)。
这等于,原来NN中的“边权”(常量)变成了矩阵。
关于 routing 部分,其实是给 加权求和,权重是 。
而 是 softmax 的结果,从而使得 分布归一化;并且由于softmax会使分布“尖锐化”,从而只有少数 有较大的取值,这样就起到了routing的作用(只有少数 的权重较大,就好像底层的某个capsule的输出只贡献给上面的某个capsule)。
按照 Hinton 在很多视频中的理念,“找到最好的(处理)路径等价于(正确)处理了图像”。这也是 Capsule 框架中引入 Routing 的原因之一。
而找到“最好路径”的方法之一就是找到最符合输出的输入向量。符合度通过输出向量和输入向量(线性变换后的向量)的内积所表征,这个符合度直接被加入到 中。
这个更新算法很容易收敛。论文中认为3次足矣。routing 和其他算法一样也有过拟合的问题,虽然增加routing的迭代次数可以提高准确率,但是会增加泛化误差,所以不宜过多迭代。
网络结构在论文中称为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间是独立的。
为了加深理解,我们可以对比一下CNN的输出和这层输出的Capsules的区别:
我们可以看到它们的相似点在于,每个”平面“内,变量都是共享权值的;而在不同”平面“内,变量是独立的。而不同点在于,在”平面“内CNN的单位是标量,而Capsules是一个capsule表征的向量。
这一层的Capsules在论文中被称为 PrimaryCapsules ,这让我联想到 primary visual cortex(初级视皮层),因为如果说第一层卷积相当于视网膜,第二层卷积相当于初级视皮层,那么 PrimaryCapsules 的向量就是初级视皮层的表征。
第三层,也是输出层,就是一组10个标准的 Capsules,每个 capsule 代表一个数字。每个capsules 输出向量的元素个数为16。这组 Capsules 被称为 DigitCaps (取名逼死强迫症)。
从 PrimaryCapsules 到 DigitCaps 使用了上文所述的 dynamic routing。这也是唯一使用dynamic routing 的地方。
按照假定,某个 capsule 输出向量的(范数)长度表示某个 capsule 表征的内容出现的概率,所以做分类的时候取输出向量的 L2 范数即可。
这里注意到,最后 capsules 输出的概率向量不是归一的,也就是 capsules 天然有同时识别多个物体的能力。
由于 capsules 允许多个分类同时存在,所以不能直接用传统的交叉熵损失,一种替代方案是 SVM 中常用的 margin loss:
其中 是分类, 是分类的指示函数(分类c存在为1,否则为0), 为上margin,惩罚假阴性(没有预测到存在的分类的情况); 为下margin,惩罚假阳性(预测到不存在的分类的情况)。 是比例系数,调整两者比重。
总的 loss 是各个 之和。
至于优化算法,论文没有明说,其实不难猜到就是标准的反向传播(否则怎么搞CNN),估计作者觉得没有必要写了。论文在很多细节上让人很难受,比 AlphaGo Zero的文笔差多了(人家把讲过N次的MCTS还是换个说法耐心地讲解了一遍)。
Hinton 一直坚持的一个理念是,一个好的robust的模型,一定能够有重构的能力(”让模型说话“)。这点是有道理的,因为如果能够重构,我们至少知道模型有了一个好的表示,并且从重构结果中我们可以看出模型存在的问题。
之前我们说过,capsule 的一个重要假设是每个 capsule 的向量可以表征一个实例。怎么来检验这个假设呢?一个方法就是重构。
重构的时候,我们单独取出需要重构的向量,扔到后面的网络中重构。当然后面的重构网络需要训练。
但是有读者可能会有疑问:如何证明重构的好是因为Capsules输出了良好的表示,而不是因为后面的网络拟合的结果?我们知道哪怕前面的输入是随机的,由于神经网络强大的拟合能力,后面的网络也能拟合出重构结果。
一个证据是人为扰动 capsule 的输出向量。我们可以看到,如果逐渐改变向量的一些分量,表示也很有规律地改变,这是随机的输入难以做到的。
另外,他们没有拿capsule 的输出向量做个 t-SNE,这点很可惜。。。如果这样我们就能看到 capsule 的输出向量是如何把 MNIST 嵌入到空间中去的。
论文中发现如果把重构误差计入,可以显著地提高准确率:
(其实很搞笑的是,这种提升远远大于对dynamic routing的调整)
需要注意到,重构是无监督的方式,不需要标签。如果重构能够大幅提升分类效果,那么就暗示了可以通过重构做无监督学习(重构也可能是人做无监督学习的途径之一)。这部分Hinton提了很多,应该已经做出来了,不过看样子不在这篇论文当中。
之前我在[2]中简单提及过,做capsule的动机之一还在于可解释性。我们需要看到NN为什么正确,为什么错误。
这篇论文通过重构或多或少这一点,还是很有意思的。
比如下图左侧,都是分类正确的重构,可以看到重构除了还原本身外,还起到了去噪的效果。
右侧模型误把”5“识别成了”3“,通过重构,模型”告诉“我们,这是因为它认为正常的”5“的头是往右边伸出的,而给它的”5“是一个下面有缺口的”3“。
在识别重叠数字的时候,它显示了更强的重构能力,并且拒绝重构不存在的对象(右侧*号)
我知道,大家都会吐槽为什么还要用 MNIST 这种用烂的数据集。
首先是,ImageNet 很难做重叠图像的实验(现实图片重叠的情况下本来就很难辨认,即使实现了也很难可视化),这点手写数字几乎是最理想的方案。
第二点是,在此实验的配置下,做 ImageNet 是自杀行为。因为 Capsules 假设是每个 Capsule 能够代表一个实例,本论文实现的动态路由方案比较naive,根本不能满足这么多的 Capsule 数量,何必做不符合自己假设的实验呢?其实文章作者知道这点,还是强行试了试 cifar10,果然效果不好(和最初应用到cifar10的CNN效果差不多)。
Capsule 非常重要的卖点是符合图形学的某些现象(参见[2]), 在 smallNORB 上达到 state-of-the-art 是非常重要的支持。
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.
有些回答真是看不过去,抛去所有的光环来看待,这也是一篇非常优秀的具有启发性的论文,所以很快有了更好的路由实现(i.e. MATRIX CAPSULES WITH EM ROUTING)。论文展示了不用 Spatial transformer networks就可以获得更好的适应仿射变换的能力,展示了在高度重叠下对于图像的分割能力。论文的实现看似很简陋,没有在大的数据集上进行验证,但是已经给出了一个值得探索的方向了。
----------------------------------------------------------------------
话说回来,有人关注这篇论文么。。。我觉得效果逆天了。。。
A generative vision model that trains with high data efficiency and breaks text-based CAPTCHAs