论文杂记 | ||
---|---|---|
上一篇 | 主目录 | 下一篇 |
文章目录
【前言】
参考文章
Dynamic Routing Between Capsules中文译文
Dynamic Routing Between Capsules学习资料总结
原论文下载地址
本文仅供个人参考学习,不用于任何商业用途,如有侵权请联系作者删除。shaneholmes@qq.com
1 传统神经网络的缺陷
CNN的问题:
- 组件的朝向和空间上的相对关系对它来说不重要,它只在乎有没有特征。
- 池化层:从网络设计上来说,池化层不仅减少了参数,还可以避免过拟合。但是,它的确抛弃了一些信息,比如位置信息。
2 胶囊Capsule简介
- 胶囊是一组神经元,其激活向量表示特定类型实体(比如目标或目标部分)的实例化参数。我们用激活向量的长度来表示实体存在的概率,而其方向表示实例化参数,也就是说,激活向量的长度表征了某个实例(物体,视觉概念或者它们的一部分)出现的概率,其方向表征了物体的某些图形属性(位置,颜色,方向,形状等等)。同一层的活性胶囊,通过变换矩阵,对更高层的胶囊的实例化参数进行预测。当多个预测相一致时,较高层的胶囊被激活。低层胶囊倾向于将其输出发送到更高层胶囊,更高层胶囊(激活向量具有大的标量积)的预测来自低层胶囊。
- 激活胶囊内的神经元活动表示图像中存在的特定实体的各种属性。这些属性可以包括许多不同类型的实例化参数,如姿势(位置,大小,方向)、形变、速度、反射率、色调、纹理等等。一个非常特殊的属性是图像中实例化实体的存在,表示实体存在的一个显而易见的方法是用一个独立的逻辑单元,其输出是实体存在的概率。在本文中,用实例化参数向量的总长度来表示实体的存在,并强制向量的方向来表示实体的属性。我们通过应用非线性使向量的方向不变但是规模缩小,从而保证了胶囊向量的输出长度不超过1。
- 胶囊的输出是向量的事实使得它可以使用一个强大的动态路由机制以确保胶囊的输出发送至上层合适的父节点。最初,输出被发送到所有可能的父节点,但是被耦合系数缩减总数为1。对于每个可能的父类,胶囊通过将对自身输出乘以一个权重矩阵来计算“预测向量”。如果这个预测向量是一个可能父类输出的一个很大的标量积,那么就有一个自上而下的反馈,增加该父类的耦合系数,并减少其他父节点的耦合系数.这增加了胶囊对于该父节点的贡献,从而进一步增加了使用父节点输出的胶囊预测的标量积。这种类型的“路由协议”要比最大池化(max-pooling)实现的最原始的路由方式更加有效,它允许一层中的神经元忽略除过下面一层的局部池化中最活跃的特征检测器之外所有的。动态路由机制是一个可用于解释高度重叠的目标分割的有效方法。
- 卷积神经网络(CNNs)使用学习特征检测器的变换副本。这使得它们能够将图像中的某个位置获取的良好权重值知识变换到其他位置。这已被证实在图像解释中是非常有帮助的。尽管我们正在用向量-输出胶囊取代CNNs的标量-输出特征检测器,以及用路由协议取代最大池化,但是我们仍然希望在整个空间中复制学到的知识。为了实现该目标,我们让除了胶囊最后一层外的其它层做卷积。与CNNs一样,我们使用更高层的胶囊覆盖图像的更大区域。然而,不同于最大池化,我们不会丢弃远离该区域内实体的精确位置信息。对于低层胶囊,位置信息是激活胶囊的“位置-编码”。随着层次结构的升级,有越来越多的位置信息成为胶囊输出向量实际值分量中的“速度-编码”。从位置-编码到速度-编码的转变,再加上更高层的胶囊代表具有更多自由度更复杂的实体的事实,表明随着层次的提升,胶囊的维度应该会增加。
3 capsule与传统神经元之间的区别
4 CapsNet是如何工作的
4.1 CapsNet架构
该架构只有两个卷积层和一个全连接层。
- 首先第一层对这张图片28X28做了常规的卷积操作,即用256个9X9的卷积核进行步幅为1的卷积,得到ReLU Conv1。Conv1是20X20的图,有256个通道,并且带有ReLU激活。该层将像素强度(pixel intensity)转换成局部特征检测器的活动,然后作为输入传送至主 capsule 中。
- 第二个层(Primary Capsules)是一个卷积 capsule 层,具有 32 个通道的8D capsule(即每个卷积层包括 8 个卷积单元),通过对Conv1用9X9的卷积核进行卷积,步长是2((20-9)/2+1=6),得到6X6X256的PrimaryCaps,对PrimaryCaps的256个通道每8个为一份,为8D,共有32份。PrimaryCapsules 一共有 [32, 6, 6] capsule 输出(每个输出都是一个 8D 向量),[6, 6] 网格中的每个 capsule 彼此共享权重。
- 最后的层(DigitCaps)是全连接层,每个数字类别都有一个16D capsule,每个 capsule 接收来自上面一层所有capsule的输入。
路由选择算法只在两个连续的 capsule 层之间执行(如 PrimaryCapsules 和 DigitCaps)。Conv1 的输出是 1D 的,无法对其空间进行定位。因此 Conv1 和 PrimaryCapsules 之间无法进行路由选择。所有路由选择bij都要被初始化为0。因此最初 capsule 输出ui以同样的概率cij被发送至下一层capsules。
4.2 动态路由算法
路由选择算法只在两个连续的 capsule 层之间执行(如 PrimaryCapsules 和 DigitCaps)。Conv1 的输出是 1D 的,无法对其空间进行定位。因此 Conv1 和 PrimaryCapsules 之间无法进行路由选择。所有路由选择bij都要被初始化为0。因此最初 capsule 输出ui以同样的概率cij被发送至下一层capsules。
前面我们的b初始化为0,得到的耦合系数C趋于一般化,并不能表现出前一层的胶囊和后一层胶囊的之间的关系。故我们需要更新b,通过b的更新来更新C,b更新公式就是:
动态路由过程如下:
(此过程T=2,一般迭代三次比较好)
1.由v1和W1得到u1,即u1=W1v1,u2同理
2.初始化b11,b21=0
3.使用softmax函数求c11,c21,即c11,c12=softmax(b11,b21)
4.使用s使用激活函数Squashing,s=c11u1+c21u2,a1=squashing(s),a1是一个向量
5.更新b1,b2.b12:=b11+a1•u1,b22:=b21+a1•u2.
6.c12,c22=softmax(b12,b22)
7.a2=squashing(c12u1+c22u2)
8. v=a2,||v||的值就是概率
(注:v,u,w,s,a是vector,b,c是标量)
路由视频讲解过程:BliBli
- 点积运算
点积运算接收两个向量,并输出一个标量
b:=b+u•v
对于给定长度但方向不同的的两个向量而言,点积有下列几种情况:正值、零、负值。故当u和v的相乘结果为正时,代表两个向量指向的方向相似,b更新结果变大,那么耦合系数c就高(c=softmax(b)),说明该u和v十分匹配。相反,若是u和v相乘结果为负,b更新结果变小,那么耦合系数就小,说明不匹配
4.3 激活函数
我们用胶囊的输出向量的长度表示胶囊所代表的实体在当前的输入中存在的概率。因此,我们使用一个非线性的“挤压(squashing)”函数以确保短向量被压缩至接近0,长向量被压缩至略低于1。我们让其进行判别性学习以充分利用该非线性。
squashing函数:
- 【注】左半部分是非线性挤压,值的大小表示概率;右半部分代表单位向量,指明方向(这也正是capsule特别之处)
4.4 损失函数
DigitCaps 层输出向量的长度即某个类别的概率,耦合系数cij是通过一致性 Routing 进行更新的,他并不需要根据损失函数更新,但整个网络其它的卷积参数和 Capsule 内的Wij都需要根据损失函数进行更新。一般我们就可以对损失函数直接使用标准的反向传播更新这些参数,而在原论文中,作者采用了 SVM 中常用的 Marginloss,该损失函数的表达式为:
其中 c 是分类类别,Tc为分类的指示函数(c存在为 1,c不存在为 0),m+为上边界,m-为下边界。此外,Vc的模即向量的 L2 距离。
因为实例化向量的长度来表示 Capsule 要表征的实体是否存在,所以当且仅当图片里出现属于类别 k 的手写数字时,希望类别 k 的最顶层 Capsule 的输出向量长度很大。为了允许一张图里有多个数字,对每一个表征数字c的 Capsule分别给出单独的Margin loss:Lc,总的Margin Loss为所有类别Lc求和。
此外,文章还使用额外的 重构损失(reconstruction loss) 来促进数字 capsule 对输入数字的实例化参数进行编码。
在训练期间,蒙住所有向量,除了正确的数字 capsule 的活动向量外,其他向量置为0。然后,使用该活动向量来重构数字,capsule的输出被馈送至包含 3个全连接层的解码器,按0.0005 的比例缩小重构损失,以使它不会主导训练过程中的边际损失。这一过程的损失函数通过计算FC Sigmoid层的输出像素点与原始图像像素点的欧氏距离而构建。
5 实验结果
进行3次路由迭代的CapsNet在 MNIST 数据集上的测试重构样例。(l, p, r) 分别代表标签、预测和重构目标。最右两列是两个失败的重构样例,它展示了模型如何混淆该图像中的5和3。其他列来自正确的分类,展示了模型如何识别细节,同时使噪声变得平滑。
CapsNet分类测试准确度与Routing算法以及重构误差之间的关系。其中 MNIST 均值和标准差都是根据三个试验计算而出。
维度扰动(dimension perturbation)。每一行展示当 DigitCaps 表征的 16 个维度之一在区间 [−0.25, 0.25] 中以0.05 的间隔(interval)进行变化并重构,,发现capsule 中的一个维度(所有 16 个维度中)几乎总是可以表征数字的宽度。而多个维度可以表征全局变化的组合,还有其它一些维度可以表征数字的局部变化。
在MultiMNIST测试数据上使用了3个Routing迭代。两个重构数字以绿色和红色重叠位于图下方。图上方展示了输入图像。L:(l1,l2) 表示图中输入的两个数字的标签,R:(r1, r2) 表示重构的两个数字。最右两列展示了两个错误重构的例子,分别从标签和预测(以P标记)重构。在(2,8)的例子中,模型混淆了8和7,在(4,9)的例子中,模型混淆了 9 和 0。其它列都给出了正确的分类结果,表明模型能考虑所有的像素并决定每个像素如何分配给两个数字,即使是在相当困难的情景下(第1—4 列)。注意数据集生成的时候,像素的值都简化为 1。带*号的两列展示了既不是从标签也不是从预测重构的数字的结果。这些结果表明模型不止是为图像中的所有(包括未出现的)数字寻找最佳拟合。因此,在(5,0)的例子中,它无法重构出一个7,因为它知道5和0拟合得最好,并且模型已经考虑了所有的像素。同样,在(8,1)的例子中,数字8中的环并不会使模型指向0,因为它已经考虑了8。所以,如果其中一个没有任何其它的支持线索,模型不会将一个像素分配给两个数字。
6 复现代码
目前被复现的代码版本:
-
TensorFlow:
https://github.com/naturomics/CapsNet-Tensorflow.git
https://github.com/InnerPeace-Wu/CapsNet-tensorflow
https://github.com/chrislybaer/capsules-tensorflow -
PyTorch:
https://github.com/timomernick/pytorch-capsule
https://github.com/gram-ai/capsule-networks
https://github.com/nishnik/CapsNet-PyTorch.git
https://github.com/leftthomas/CapsNet -
MXNet
https://github.com/AaronLeong/CapsNet_Mxnet -
Chainer:
https://github.com/soskek/dynamic_routing_between_capsules -
Matlab:
https://github.com/yechengxi/LightCapsNet