DL Net | Capsual Net 算法学习笔记


会议: NIPS 2017

标题:《 Dynamic Routing Between Capsules》

论文链接:https://arxiv.org/abs/1710.09829

代码链接:https://github.com/naturomics/CapsNet-Tensorflow

论文摘要:

capsule是一组神经元,其活动向量表示特定类型实体(例如对象或对象部分)的实例化参数。我们使用活动向量的长度来表示实体存在的概率及其表示实例化参数的方向。活动capsule在一个层面上通过变换矩阵对更高层capsule的实例化参数进行预测。当多个预测相符时,较高层的capsule就开始活动。本文显示,经过区别训练的多层capsule系统在MNIST上实现了最先进的性能,在识别高度重叠的数字时,效果明显好于卷积神经网络。为了达到这样的结果,我们用了一个迭代的路由协议机制:一个低层的capsule希望将其输出发送到一个活动向量具有大标量积、预测来自低层capsule的高层capsule。

CNN

CNN是如何工作的呢?CNN的主要部分是卷积层,用于检测图像像素中的重要特征。较深的层(更接近输入的层)将学习检测诸如边缘和颜色渐变之类的简单特征,而较高的层则将简单特征组合成复杂一些的特征。最后,网络顶部的致密层组合高层特征并输出分类预测。

需要重点理解的是,高层特征将低层特征组合为加权和,前一层的激活与下一层神经元的权重相乘并相加,接着传递到非线性激活函数。在这一配置中,组成高层特征的低层特征之间并不存在位姿(平移和旋转)关系。CNN解决这个问题的方法是使用最大池化或后续卷积层来减少通过网络的数据的空间大小,从而增加了上层网络神经元的“视野”,因此它们得以检测输入图像较大区域的高阶特征。卷积网络表现惊人,甚至在众多领域产生了超越人类的效果,其支柱正是最大池化。

当然,你可以不使用最大池化,基于传统的CNN取得不错的结果,然而这仍旧没有解决一个关键问题:卷积神经网络的内部数据表示没有考虑简单和复杂对象之间的重要空间层级。上文提到的例子,图片中存在两只眼睛、一张嘴和一个鼻子,仅仅这些并不意味着图片中存在一张脸,我们还需要知道这些对象彼此之间的朝向关系。

胶囊网络

Hinton主张,为了正确地分类和辨识对象,保留对象部件间的分层位姿关系很重要。这是让你理解胶囊理论为何如此重要的关键直觉。它结合了对象之间的相对关系,在数值上表示为4维位姿矩阵。

当数据的内部表示内建这些关系时,模型非常容易理解它看到的是以前见过的东西,只不过是另一个视角而已。考虑下面的图片。你可以轻易辨识出这是自由女神像,尽管所有的图像显示的角度都不一样。这是因为你脑中的自由女神像的内部表示并不依赖视角。你大概从没有见过和这些一模一样的图片,但你仍然能立刻知道这是自由女神像。

在这里插入图片描述
对CNN而言,这个任务非常难,因为它没有内建对三维空间的理解。而对于CapsNet而言,这个任务要容易得多,因为它显式地建模了这些关系。相比之前最先进的方法,使用CapsNet的论文能够将错误率降低45%(由约20%降低到约12%),这是一个巨大的提升。

胶囊方法的另一大益处在于,相比CNN需要的数据,它只需要学习一小部分数据,就能达到最先进的效果(Hinton在他关于CNN错误的著名演说中提到了这一点)。 从这个意义上说,胶囊理论实际上更接近人脑的行为。为了学会区分数字,人脑只需要几十个例子,最多几百个例子。而CNN则需要几万个例子才能取得很好的效果。这看起来像是在暴力破解,显然要比我们的大脑低级。

和其他模型相比,胶囊网络在辨识上一列和下一列的图片属于同一类、仅仅视角不同方面,表现要好很多.

胶囊引入了一个用于深度学习的新构件,以更好地建模神经网络中内部知识表示的分层关系。胶囊背后的直觉非常简单优雅。

尽管如此,挑战依旧存在。胶囊网络的当前实现比其他现代深度学习模型慢很多。时间会告诉我们,是否能够快速高效地训练胶囊网络。此外,我们需要看看胶囊网络在更困难的数据集上和不同领域是否仍然表现良好。

无论如何,胶囊网络是一个非常有趣的模型,而且它现在就能工作。假以时日,它肯定会进一步发展,同时有助于深度学习应用领域的进一步扩展。

在这里插入图片描述

胶囊如何工作

人工神经网络不应当追求“神经元”活动中的视角不变性(使用单一的标量输出来总结一个局部池中的重复特征检测器的活动),而应当使用局部的“胶囊”,这些胶囊对其输入执行一些相当复杂的内部计算,然后将这些计算的结果封装成一个包含信息丰富的输出的小向量。每个胶囊学习辨识一个有限的观察条件和变形范围内隐式定义的视觉实体,并输出实体在有限范围内存在的概率及一组“实例参数”,实例参数可能包括相对这个视觉实体的隐式定义的典型版本的精确的位姿、照明条件和变形信息。当胶囊工作正常时,视觉实体存在的概率具有局部不变性——当实体在胶囊覆盖的有限范围内的外观流形上移动时,概率不会改变。实例参数却是“等变的”——随着观察条件的变化,实体在外观流形上移动时,实例参数也会相应地变化,因为实例参数表示实体在外观流形上的内在坐标。

因为最大池丢失了有价值的信息,也没有编码特征之间的相对空间关系。我们应该转而使用胶囊,因为,所有胶囊检测中的特征的状态的重要信息,都将以向量的形式(神经元输出的则是标量)被胶囊封装。

即所有胶囊检测中的特征的状态的重要信息,都将以向量的形式被胶囊封装。

胶囊将特征检测的概率作为其输出向量的长度进行编码。检测出的特征的状态被编码为该向量指向的方向(“实例参数”)。所以,当检测出的特征在图像中移动或其状态不知怎的发生变化时,概率仍然保持不变(向量长度没有改变),但它的方向改变了。

想象一个胶囊,它检测图像中的面部,并输出长度为0.99的三维向量。接着我们开始在图像上移动面部。向量将在空间上旋转,表示检测出的面部的状态改变了,但其长度将保持固定,因为胶囊仍然确信它检测出了面部。这就是Hinton所说的活动等变性:神经活动将随着物体在图像中的“外观流形上的移动”而改变。与此同时,检测概率保持恒定,这才是我们应该追求的那种不变性,而不是CNN提供的基于最大池化的不变性。

另一方面,胶囊具有上面3个步骤的向量版,并新增了输入的仿射变换这一步骤:

  1. 输入向量的矩阵乘法
  2. 输入向量的标量加权
  3. 加权输入向量之和
  4. 向量到向量的非线性变换

在这里插入图片描述
公式右边的蓝色矩形缩放输入向量至单位长度,左边的红色矩形进行一些额外的缩放。记住,输出向量的长度代表胶囊检测的给定特征的概率。

在这里插入图片描述
低层胶囊i需要决定如何将其输出向量发送给高层胶囊j。低层胶囊改变标量权重cij,输出向量乘以该权重后,发送给高层胶囊,作为高层胶囊的输入。通过这一方式,低层胶囊做出决策。就符号表示而言,cij表示与低层胶囊i的输出向量相乘,乘积传递到高层胶囊j作为输入的权重。关于权重cij,我们需要知道:
1. 权重均为非负标量。
2. 对每个低层胶囊i而言,所有权重cij的总和等于1。
3. 对每个低层胶囊i而言,权重的数量等于高层胶囊的数量。
4. 这些权重的数值由迭代动态路由算法确定。

胶囊经训练后检测出特征,该特征的存在概率用胶囊输出向量的长度来表示。特征的参数状态则用输出向量的方向表示。所以,从某种意义上说,对于每个低层胶囊i而言,其权重cij定义了传给每个高层胶囊j的输出的概率分布。

结论:胶囊的设计基于人造神经元的设计,但将其扩展到了向量形式,使其具有更强大的表示能力。它还引入了矩阵权重来编码不同层的特征之间的重要层次关系。 结果成功地实现了设计者的目标:随着输入变化的神经元活动等变性和特征检测概率的不变性。

囊间动态路由算法

低层胶囊将其输出发送给对此表示“同意”的高层胶囊。这是动态路由算法的精髓。

胶囊网络是用囊间动态路由算法训练的,它允许胶囊之间相互通信,并创建类似计算机图形中场景图的表示。

在这里插入图片描述

算法描述如下图所示:
在这里插入图片描述
让我们先来看第一行和最后一行,也就是说,这个算法的输入和输出分别是什么。第一行指明了算法的输入:低层l中的所有胶囊及其输出û,以及路由迭代计数r。最后一行指明了算法的输出,一个高层胶囊vj。本质上,这段算法告诉我们如何计算网络的前向传导。

第2行的bij是一个临时变量,它的值会在迭代过程中更新,当整个算法运行完毕后,它的值将被保存到cij。在训练开始时,bij的值被初始化为零。

第3行表明第4-7行的步骤会被重复r次(路由迭代次数)。

第4行计算向量ci的值,也就是低层胶囊i的所有权重。这一计算将应用到所有低层胶囊上。

为什么要用softmax呢?Softmax将确保所有权重cij均为非负数,且其总和等于一。本质上,softmax强制实施了我在上文描述的系数cij的概率性质。

由于所有bij的值初始化为零(第2行),第一次迭代后,所有系数cij的值会相等。例如,如果我们有3个低层胶囊和2个高层胶囊,那么所有cij将等于0.5。算法初始化时期,所有cij均相等,这意味着不确定性达到最大值:低层胶囊不知道它们的输出最适合哪个高层胶囊。当然,随着这一进程的重复,这些均匀分布将发生改变。

计算了所有低层胶囊的所有的权重cij之后,我们来看第5行,那里将涉及高层胶囊。这一步我们将计算经前一步确定的路由系数cij加权后的输入向量的线性组合。从直觉上说,这意味着缩小输入向量并将它们相加,得到输出向量sj。这一步骤将应用到所有高层胶囊上。

接着,在第6行中,来自前一步的向量将穿过squash非线性函数,这确保了向量的方向被保留下来,而长度被限制在1以下。该步骤生成传给所有高层胶囊的输出向量vj。

总结一下到目前为止算法做了什么:步骤4-6是在计算高层胶囊的输出。第7行更新了权重,也是路由算法的本质所在。在这一步中,我们查看了每个高层胶囊j,然后检查每个输入并根据公式更新相应的权重bij。公式表明,胶囊j的当前输出和从低层胶囊i处接收的输入的点积,加上旧权重,等于新权重。点积检测胶囊的输入和输出之间的相似性。另外,如前文所述,低层胶囊将其输出发送给具有类似输出的高层胶囊。点积刻画了这一相似性。这一步骤之后,算法跳转到第3步重新开始这一流程,并重复r次。

重复r次后,我们计算出了所有高层胶囊的输出,并确立路由权重。之后正向传导就可以推进到更高层的网络。

进行多少次路由迭代?论文在MNIST和CIFAR上检验了一定范围内的数值,得到了两个结论:
1. 更多的迭代往往会导致过拟合
2. 实践中建议使用3次迭代

动态路由算法用于训练CapsNet。最关键的想法是,通过胶囊的输入和输出的点积测量输入和输出的相似性,然后相应地更新路由系数。实践中的最佳做法是使用3次迭代。

Reference:

https://zhuanlan.zhihu.com/p/31262148
https://zhuanlan.zhihu.com/p/31327410
https://zhuanlan.zhihu.com/p/31669793
https://blog.csdn.net/u010976347/article/details/80795451

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值