Dynamic Routing Between Capsules(NIPS2017)

Dynamic Routing Between Capsules这篇文章已被NIPS 2017接收。2017年10月28日被提交到了预印版论文平台上。

摘要:Capsule 是一组神经元,其活动向量(activity vector)表示特定实体类型的实例化参数,如对象或对象部分。我们使用活动向量的长度表征实体存在的概率,向量方向表示实例化参数。同一水平的活跃 capsule 通过变换矩阵对更高级别的 capsule 的实例化参数进行预测。当多个预测一致时,更高级别的 capsule 变得活跃。我们展示了判别式训练的多层 capsule 系统在 MNIST 数据集上达到了顶尖的性能,并且在识别高度重叠数字任务中比传统卷积网络的性能优越很多。为了达到这些结果,我们使用迭代的路由协议机制(routing-by-agreement mechanism):较低级别的 capsule 偏向于将输出发送至高级别的 capsule,有了来自低级别 capsule 的预测,高级别 capsule 的活动向量具备较大的标量积。

参考资料:

[1] Sabour S, Frosst N, Hinton G E. Dynamic Routing Between Capsules[J]. 2017.

[2] 知乎话题:https://www.zhihu.com/question/67287444/answer/254512736

[3] 机器之心:https://mp.weixin.qq.com/s/WspmbqlwdxKXH1cgbkuGwQ

[4] 代码实现:https://github.com/naturomics/CapsNet-Tensorflow

1、用一组 Capsules替代神经网络的一层

现在 layer 中的 neuron 太过简单,本身很难表征概念;而Capsule使用向量作为输入输出,而向量就可以作为良好的表征(比如word2vec中的向量就可以良好表征词汇),与一般的向量表征不同,Capsule 的输出向量表征了两个部分:其长度表征了某个实例(物体,视觉概念或者它们的一部分)出现的概率,其方向表征了物体的某些图形属性(位置,颜色,方向,形状等等)。下图(来源[4])展示了capsule与传统神经元之间的区别:

2、动态路由算法(Routing by agreement)

一组 Capsules层可以表示为(来源[3]):

输入输出向量的长度表示了某个实体出现的概率,所以它的值必须在 0 到 1 之间。为了实现这种压缩,并完成 Capsule 层级的激活功能,Hinton 等人使用了一个被称为squashing的非线性函数。该非线性函数将向量的长度缩放到在0和1之间,方向保持不变。以下是该非线性函数的表达式:

Capsule 处理输入分为两个阶段:仿射变换和routing。仿射变换一定程度上是借用神经网络中的线性组合的概念,不过这个仿射变换不是针对一个神经元(也就是只有一个matrix),而是针对capsules (多个matrices),亦即:(其中ui是下层的输入向量,由前层的标号为i的capsule产生,u^j|i是仿射变换后的结果,送给后层的标号为j的capsule)。

其中cij为耦合系数(coupling coefficients),该系数由迭代的动态路由选择过程确定。Capsule i的耦合系数和上面层级所有的 Capsule 耦合系数和为 1,并且由routingsoftmax决定,该 softmax 函数中的bij初始为 Capsule i 应该和 Capsule j 耦合的对数先验概率:

对数先验(log priors)可以同时和其它权重有区别地进行学习。它们依赖于两个 Capsule 的位置与类型,但不依赖于当前的输入图像。初始化耦合系数可以通过测量前面层级中每一个 Capsule j 的当前输入vj和 Capsule i 的预测间一致性(agreement),然后借助该测量的一致性迭代地精炼更新耦合系数。这个一致性(agreement)可以简单地设置为标量乘积。

算法如下:

3、CapsNet架构

这是一个简单的用于手写体数字识别的 CapsNet 架构。该架构只有两个卷积层和一个全连接层。Conv1有256个9×9卷积核,步幅为1,带有ReLU激活。该层将像素强度(pixel intensity)转换成局部特征检测器的活动,然后作为输入传送至主 capsule 中。

第一层的卷积层是最低级别的多维实体,从逆向图(inversegraphics)的角度来看,激活该层对应的是逆转渲染过程(rendering process)。这和将多个实例化部分拼合起来组成一个整体有所不同。

第二个层(Primary Capsules)是一个卷积 capsule 层,具有 32 个通道的8D capsule(即每个卷积层包括 8 个卷积单元,每个卷积单元有一个9×9核,步幅为2)。每个主 capsule 输出接收到所有 256×8×1 Conv1 单元的输出,它们的感受野与 capsule 的中心位置重叠。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、损失函数

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 的比例缩小重构损失,以使它不会主导训练过程中的边际损失。

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。所以,如果其中一个没有任何其它的支持线索,模型不会将一个像素分配给两个数字。

目前被复现的代码版本:

-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

Dynamic Routing Between Capsules学习资料总结相关推荐

  1. 初读Geoffrey Hinton颠覆之作《Dynamic Routing Between Capsules》

    最近在搜资料时忽然看到一条消息,Hinton老爷子在NIPS 2017大会上放了大招,宣布要革CNN和反向传播的命.武林盟主在武林大会上要推翻自己之前的武学门派,另起炉灶,如此精彩的大戏怎能不吃瓜围观 ...

  2. capsule系列之Dynamic Routing Between Capsules

    文章目录 1.背景 2.什么是capsule 3.capsule原理和结构 3.1.capsule结构 3.2.Dynamic Routing 算法 3.3.小部件 3.3.1.为耦合系数(coupl ...

  3. 【Hinton大神新作】Dynamic Routing Between Capsules阅读笔记

    Dynamic Routing Between Capsules 卷积 信号处理之卷积,信号的叠加与分解 http://blog.csdn.net/lz0499/article/details/701 ...

  4. 论文阅读2 Dynamic Routing Between Capsules

    论文阅读<2> Dynamic Routing Between Capsules Abstract 1 Introduction 2 How the vector inputs and o ...

  5. Capsule:Dynamic Routing Between Capsules

    Capsule介绍 Hinton在<Dynamic Routing Between Capsules>中提出了capsule,以神经元向量代替了从前的单个神经元节点,以dynamic ro ...

  6. linux运维零基础学习资料:Linux网络管理技术

    全套学习资料移步至公众号[学神来啦]更多学习资料添加扣扣资源群:661308959 本节所讲内容:   18.1  OSI七层模型和TCP/IP四层模型   18.2  linux网络相关的调试命令 ...

  7. 最全深度强化学习资料

    转载 J.Q.Wang2011 -----深度强化学习系列: 最全深度强化学习资料 下面附上原地址 https://blog.csdn.net/gsww404/article/details/1030 ...

  8. ASP.NET MVC学习资料 新增几个开源项目

    ASP.NET MVC学习资料 新增几个开源项目 ASP.NET MVC MSDN API:  System.Web.Mvc Namespace (暂无中文版):  http://msdn.micro ...

  9. (汇总篇)语义SLAM相关开源方案| 全球优秀作者与实验室 | SLAM学习资料整理

    目录 1 开源方案 1.1 Geometric SLAM (26项) 1. PTAM 2. S-PTAM(双目 PTAM) 3. MonoSLAM 4. ORB-SLAM2 5. DSO 6. LDS ...

最新文章

  1. 《OpenCV3编程入门》学习笔记3 HighGUI图形用户界面初步
  2. Python通过urllib访问网页
  3. C++线程同步之事件(生产者与消费者问题)
  4. 字符串池化,减少了三分之一的内存占用
  5. 笔记 英语二 考研先导课 0126
  6. 树莓派(raspberry pi)系统开发
  7. 转自:拜小白教你OpenCV3.2.0+VS2017开发环境配置
  8. 我眼中的解决方案架构师
  9. android文献翻译,Android外文文献翻译
  10. 解决vscode的报错:Java 11 or more recent is required to run the Java extension
  11. 马科维兹+matlab,“马科维茨”投资组合模型实践——第三章 投资组合优化:最小方差与最大夏普比率...
  12. 公主与骑士-ZZUOJ
  13. Web mfw Writeup
  14. OpenRisc-50-or1200的freeze模块分析
  15. dw1000精度调节记录1
  16. 苹果授权登录Sign In With Apple亲测通过版[100%成功]
  17. 第九周-求一元二次函数的根
  18. MQTT协议详解 三、MQTT控制包(CONNECT)
  19. sqlserver2005和mysql_myecplise+mysql(或SQLserver2005)配置
  20. CCNA第三天(交换机)

热门文章

  1. python 实现tif图片转jpg图片 windows下
  2. 软测5班Http协议与Fiddler抓包(2019-10-24)
  3. 网络斗地主游戏的完整设计与实现(二)系统的核心技术路线
  4. CC2530 CC2592 PA 功率最大
  5. verilog_边学边练习(2)二选一_四选一(组合逻辑电路)
  6. 面试题5:从尾到头打印单链表(链表--剑指offer)
  7. INTEST/EXTEST SCAN 的学习
  8. 成功实施商业智能的4个关键
  9. uc浏览器下方控制栏的调整方法
  10. 看完就能掌握的PHP核心技术 - ​​​​​​​​面向对象