编者按:深度学习开创者之一、反向传播等神经网络经典算法的发明人Geoffrey Hinton思考了胶囊网络数十年之久,然而直到上一个月才发表论文正式提出胶囊网络。主要原因就是一直没找到训练胶囊网络的合适算法。深度学习开发者,Medium知名博主Max Pechyonkin刚发表了胶囊网络入门系列的第三篇,简明扼要地介绍了Hinton新提出的囊间动态路由算法。

介绍

本文是胶囊网络(CapsNet)系列的第三篇。胶囊网络是一种基于胶囊的新型神经网络。我已经讨论过它背后的直觉,以及胶囊是什么和胶囊如何工作。在本文中,我将讨论创新的囊间动态路由算法,胶囊网络是用这个算法训练的。

                                                         Hinton等人早期报告中描述胶囊和囊间路由的示意图

第二篇提到,低层胶囊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次后,我们计算出了所有高层胶囊的输出,并确立路由权重。之后正向传导就可以推进到更高层的网络。

点积运算接收两个向量,并输出一个标量。对于给定长度但方向不同的两个向量而言,点积有几种情况:a最大正值; b 正值;c 零;d 负值;e 绝对值最大的负值

权重更新的直观例子

上图中,两个高层胶囊的输出用紫色向量v1和v2表示。橙色向量表示接收自某个低层胶囊的输入,其他黑色向量表示接收自其他低层胶囊的输入。

我们看到,左边的紫色输出v1和橙色输入û1|1指向相反的方向。换句话说,它们并不相似。这意味着它们的点积将是一个负数,并减少路由系数c11。右边的紫色输出v2和橙色输入û2|1指向相同的方向。它们是相似的。因此,路由系数c12会增加。在所有高层胶囊及其所有输入上重复应用该过程,得到一个路由系数的集合,达成了来自低层胶囊的输出与高层胶囊的输出的最佳匹配。

进行多少次路由迭代?

论文在MNIST和CIFAR上检验了一定范围内的数值,得到了两个结论:

  1. 更多的迭代往往会导致过拟合
  2. 实践中建议使用3次迭代

结语

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

在下一篇文章中,我将带你领略CapsNet的架构,将迄今为止我们所掌握的谜题线索集中起来。

CapsNet入门系列之三:囊间动态路由算法相关推荐

  1. 3. oracle学习入门系列之三Unix、Linux历史及基础

    oracle学习入门系列之三Unix.Linux历史及基础 终于翻过了前面两篇,喝杯咖啡提下神,咱们继续前行.这次我们要进行操作系统方面知识了,考虑到当前时间上操作系统的多样性.变化性等,蛤蟆斟酌再三 ...

  2. 【论文导读】浅谈胶囊网络与动态路由算法

    前言 "Dynamic Routing Between Capsules"是由Hinton等联合发表在NIPS会议上.提出了一个新的神经网络---胶囊网络与囊间的动态路由算法. 上 ...

  3. 【计算机网络】网络层 : 路由算法 ( 路由算法分类 | 静态路由算法 | 动态路由算法 | 全局性动态路由算法 | 分散性动态路由算法 | 分层次路由选择协议 )

    文章目录 一.路由算法 二.路由算法 分类 三.静态路由算法 四.动态路由算法 五.动态路由算法 分类 六.分层次的路由选择协议 一.路由算法 路由算法 : 选择数传输的 "最佳路由&quo ...

  4. 网络协议梳理(三)(网关和路由器、动态路由算法、Bellman-Ford算法、Dijkstra算法、动态路由协议、TCP和UDP)

    MAC 头和 IP 头的细节 在任何一台机器上,当要访问另一个IP地址的时候,都会使用CIDR和子网掩码去判断目标IP地址和当前机器的IP地址是否属于同一网段. 如果是同一网段--如果ARP缓存中存有 ...

  5. Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上

    这个系列的前两篇文章,我们已经把我们的应用成功地在Docker里通过nginx运行了起来,并且用dockerfile里制作好了一个镜像. Docker入门系列之一:在一个Docker容器里运行指定的w ...

  6. RHEL6入门系列之三十,服务管理

    服务是在系统后台运行,并等待用户或其它软件调用的一类特殊程序.由于Linux主要是用作服务器操作系统,因而当学习完入门课程之后,接下来就要学习对各种常用服务的配置与管理,如实现Web服务器的httpd ...

  7. RHEL6入门系列之三,GNU计划与Linux发行版

    1.GNU计划 在上篇博文中谈到Kernel是Linux系统的心脏,但Kernel只能实现系统最基本的功能,作为一个操作系统,仅仅只有内核是远远不够的,我们的重点是要使用在Kernel之上运行的Web ...

  8. 简单易懂的讲解深度学习(入门系列之三)

    在之前系列中已大致了解了机器学习的形式化定义和神经网络的概念,在本小节中,将相对深入地探讨一下神经网络中的神经元模型以及深度学习常常用到的激活函数及卷积函数. 3.1  M-P神经元模型是什么? 在前 ...

  9. [unreal4入门系列之三] 初探UE4安装文件目录结构

    UE4文件夹里面包含了许多有用的资源,我们首先去了解这些文件结构,以便日后需要用到的时候随时地查找我们所需要的东西. 打开UE4所安装的目录,你会看到我们下载好的4.10版本的文件夹. 1) Dire ...

最新文章

  1. R语言使用tidyquant包的tq_transmute函数计算持有某只股票的天、月、周收益率、ggplot2使用条形图(bar plot)可视化股票年收益率数据使用不同的色彩表征正收益率和负收益率
  2. [网络安全自学篇] 六十五.Vulnhub靶机渗透之环境搭建及JIS-CTF入门和蚁剑提权示例(一)
  3. SpringBoot 配置环境属性
  4. ABAP git客户端的简单介绍
  5. Java-使用反射获取类型信息
  6. linux as4,as4是linux系统吗?
  7. pytorch3d在linux下安装
  8. 学python要什么基础-学Python首先要学什么?
  9. MFC模拟360悬浮窗加速球窗口
  10. 简单实现根据excel表生成sql 建表语句
  11. 欧姆龙 Omorm FINS通讯实例C#
  12. 小学计算机课后作业,“互联网+”背景下小学信息技术课后作业设计研究
  13. Cloudflare发布全球最快的DNS
  14. 视频教程-HoloLens与ARcore第三视角开发-其他
  15. matlab怎么求三次微分,Matlab – 求解三阶微分方程
  16. 这些潮汕美食你真的不来尝一尝?
  17. Batch Norm
  18. 汽车零部件ELV测试标准
  19. 文献阅读——How to give an Academic Talk
  20. 源码中的modCount是什么?有什么作用

热门文章

  1. 烧心吃什么马上能缓解11 oracle,烧心喝什么马上能缓解
  2. UE4 碰撞(Collsion)
  3. 分区表修改和分区挂载流
  4. Activiti获取历史任务信息
  5. 电子招投标系统简介 招投标系统源码 java招投标系统开发类型 招投标系统功能设计
  6. C++内存管理——空间申请、释放的新玩法
  7. Golang学习(二十九)序列化和反序列化
  8. EXCEPTIONS——异常处理总结
  9. Kibana: 如何在 Kibana 中生成 Scripted fields
  10. JAVA线程池 之 Executors (二) 原理分析