介绍
英文题目:Dynamic Routing Between Capsules
中文题目:胶囊之间的动态路由
论文地址:https://papers.nips.cc/paper/2017/file/2cad8fa47bbef282badbb8de5374b894-Paper.pdf
领域:深度学习
发表时间:2017
作者:Sara Sabour,Nicholas Frosst,Geoffrey E. Hinton
出处:NIPS(机器学习和计算神经科学的国际会议)
被引量:3466
代码和数据:https://github.com/naturomics/CapsNet-Tensorflow
阅读时间:22-03-29
摘要
胶囊是一组神经元,其激活向量能表示特定类型的特征,比如一个对象或对象部分。文中用激活向量的长度表示存在的概率,用方向表示参数。一层激活胶囊通过变换矩阵为高层胶囊提供实例化参数。当多个低层胶囊预测一致时,高层胶囊被激活。实验部分使用MNIST数据集,证明在识别高度重叠的数字时,文中方法明显优于当时的卷积神经网络。
1. 介绍
人类视觉通过确定的视点序列来忽略不相关的细节,以确保只以最高分辨率处理光学阵列的一小部分。在本文中,假设多层视觉系统在每个注视上创建了一个解析树状结构(不是所有都往下传,选部分往下传)。
解析树是从固定的多层神经网络中雕刻出来的,就像雕塑是从岩石上雕刻的一样。每一层可以分解成多个神经元组称为胶囊,解析树的每个节点都与一个激活的胶囊有关,通过迭代路由选择(路由(routing):底层胶囊匹配高层胶囊,并将向量传递到高层胶囊的过程),每个激活的胶囊将选择其上层的一个胶囊作为其在树中的父节点,对于更高级的视频系统,迭代过程将解决将部件分配给整体的问题。
激活的胶囊可以表征实体的不同特性,比如位置,大小,方向,变形、速度、色调、纹理等。“是否存在”是一个特殊的特征,比较简单的方法是使用一个逻辑单元描述是否存在的概率。文中作者使用向量的模长来表征其是否存在,用向量的方向来描述其特征。使用非线性方法,保证方向不变,改变其大小的方式,将其限制在1以内。
胶囊的输出是向量,因此,可以使用动态路由来让胶囊的输出被发送到其上层与之匹配的父节点。将输出路由到可能父节点的概率之后归一化到1(softmax)。对于每个可能的父节点,胶囊使用它的输出和权重矩阵计算出"预测向量",当预测向量与其可能的父节点匹配度高时,就增加其耦合系数,减少其它可能父节点的耦合系数,从而进一步增加了对其父节点输出的贡献(具体算法见第二部分)。这种通过路由选择的方式明显优于原始的最大池化方法,它允许一层的神经元忽略其下层最活跃特征以外的其它特征。
卷积神经网络能够将在图像中一个位置获得的权重值转换到其他位置,这对图像解析非常有帮助。为了实现这一点,文中方法使除了最后一层胶囊之外的所有胶囊都是卷积的。与CNN一样,使更高级别的胶囊覆盖图像的更大区域。而与max-pooling不同的是,不丢弃有关实体在区域内的准确位置的信息。对于低层的胶囊,采用“place-coded",随着层次提升,更多的位置信息在胶囊的输出向量的实值分量中作为“rate-coding”。更高级别的胶囊代表着更复杂、更多自由度的实体,这表明胶囊的维度应该随着我们在层次结构中的上升而增加。
胶囊网络和传统神经网络相比的主要改进包括:将输出从标量变为向量,通过路由替代最大池化方法,对比如下:
2. 计算胶囊的输入输出
文中提出的胶囊实现方法利用动态路由,简单直接且效果好。
希望用胶囊输出向量的长度来表示实体出现的概率,因此,使用非线性的激活函数squashing(压榨),来保证输出模长在0到1之间。辨别任务可以很好地利用该方法。
式中的vj是胶囊的输出,sj是全部输入;式中左边是模长,右边是方向。
除第一层以外,sj是所有其上一层“预测向量”^uj|i的权重加和:
其中i指的是第l层中的胶囊,j指的是第l+1层中的胶囊。^uj|i通过l层胶囊输出ui和权重矩阵Wij计算到的;cij是耦合系数,它是在计算动态路由过程中迭代算出的。
耦合系数cij使用softmax计算得出,所有胶囊的cij加和为1。
bij是对数先验概率,它描述的是胶囊i与胶囊j的匹配关系;bij描述l层和l+1层之间胶囊i和j的相似度;b越高,c越高。
bij也可以和其它权重同时学习,它依赖于两个胶囊的位置和类型,而与当前输入图片无关。通过衡量当前每个胶囊输出的vj与胶囊i作出的预测^uj|i的一致性,迭代地计算耦合系数。
一致性通过计算点积得到,它被用于调整bij。两个向量点积用于描述它俩的一致性,向量越相似bij越大。
在卷积胶囊层中,每个胶囊层向上面层中的每一种胶囊层输出一个局部向量网格(涉及层中的多个点),该网格的每个成员以及每种胶囊层使用不同的变换矩阵。
路由函数计算方法如下:
函数的输入是u,输出是v。
输入参数包含l层的输出^uj|i,迭代次数r和层l;
b用于描述第l层(i)和第l+1层(j)中各个胶囊的关系,将其初值设成0;
进的r次迭代;
使用softmax把b转换成0-1之前的c;
然后利用c与l层的输出u计算出sj;
sj通过激活函数squash(相当于卷积网络中的池化和激活函数)计算出该l+1层的输出vj;
通过u与v的相似性迭代改进路由b;
最终返回输出vj。
由此可见,与卷积网络提最重要差异是:它不仅计算了向下一层传的具体内容,还通过路由计算了是不是要往下传(b和c),传给谁(哪个j)。
3. 边际损失
以数字识别MNIST为例,只需要识别数字0-9,可将其看成k=10的分类问题。
使用实例向量的模长来表征实体(数字)存在的概率。为了识别图中可能出现的多个数字,在顶层,使用Lk分别评价每个胶囊(k)的损失。
当图片中存在该数字时Tk=1,m+上边界设为0.9,m-下边界设为0.1,λ用于权衡两个边界的权重,它控制无法识别该数字时的损失,以免在开始学习时胶囊的模长变得太小。文是将λ设为0.5,损失函数是所有胶囊损失的加和。
4. 胶囊网络结构
图-1展示了一个简单的胶囊网络结构,由两个卷积层和一个全连接层组成。Conv1是卷积核9x9的卷积层。
MINIST图片大小为28x28,卷积核大小为9x9,步长为1,输出为20x20的卷积结果(28-9+1->20),通道数为256,它将像素转换成局部特征,作为胶囊的输入(左图)。
PrimaryCapsules(中图)是低层的多维实体,它根据图像反推出物体的信息(反向渲染)。它与普通卷积把所有输出拼接在一起的方法不同,这也是胶囊的特性。
第二层(PrimaryCapsules)是32通道的卷积胶囊层(每个PrimaryCapsule包含8个卷积单元,9x9的卷积核,步长为2),每个PrimaryCapsule的输入是上一层Conv1输出的256x81,所有PrimaryCapsules共有32×6×6输出((20-9+1)/2->6是卷积后的输出个数,32是通道数),注意此处输出的是向量(变标量输出为矢量输出是胶囊最重要的改进之一),每个输出是8D向量,6x6网格共享权重Wij。最后一层DigitCaps(右图)对于每个数字有16D的输出。将8D转成16D,使用权重Wij。
模型只在第二层和第三层进行路由,第一层输出1D,因此不需要定向。所有bij初值都为0,因此,开始时输出ui对v0-v9有相等的概率。
4.1 重建图片
如图-2所示,在第三层之后又加入了三个全连接层,用于重建与原始图片相同的图片,图片大小也为28x28=764。
使用重建后计算两图差异作为损失函数,尽量用第三层的输出还原图片。在训练过程中,我们屏蔽了除正确数字胶囊的活动向量之外的所有内容。将重建损失限制在0.0005,使它不会在训练时主导边际损失,这样做保证了模型的健壮性,并保留了图片的重要特征,重建结果如图-3所示:
5. 胶囊网络用于MNIST
数据集使用60K数据作为训练集,10K数据作为测试集。表-1展示了实验结果:
其中Baseline是三层卷积网络,参数35.4M,而CapsNet在不重建的情况下为8.2M和6.8M参数。
5.1 胶囊的各个维度代表什么
从图-4中可以看到,通过对输出的16个维度上扰动,展示了不同维度的捕捉的不同特征。
5.2 仿射变换的健壮性
实验表明,在不使用仿射变换数据训练的情况下,文中模型对加入仿射扰动的测试,准确率能达到79%,而传统模型只能达到66%。
6. MultiMNIST数据集
MultiMNIST是将MNIST数据叠加得到的数据集。训练数据大小为60M,测试数据为10M。
结果如图-5所示,重建的数字分别用红色和绿色显示,其中L(l1,l2)是图中的数字,R(r1,r2)是重建的数字。图中左半边是识别正确的,右半边的识别错误的。
7 代码示例
7.1 git上高星示例
https://github.com/laubonghaudoi/CapsNet_guide_PyTorch/blob/master/DigitCaps.py)
7.2 主要模块
- main.py 程序入口
- PrimaryCaps.py 第一层胶囊
- DigitCaps.py 第二层胶囊
- Decoder.py 胶囊后的决策层