Geoffrey Hinton《Dynamic Routing Between Capsules》阅读笔记

论文地址:https://arxiv.org/pdf/1710.09829v1.pdf

参考文章:

http://blog.csdn.net/uwr44uouqcnsuqb60zk2/article/details/78463687

(知乎)https://zhihu.com/question/67287444/answer/251460831

http://blog.csdn.net/zchang81/article/details/78382472


1 Capsule和Traditional Neuron的对比

首先,一张图展示Capsule和Traditional Neuron的异同:

Geoffrey Hinton《Dynamic Routing Between Capsules》阅读笔记_第1张图片

图中右边是传统神经元的模型,它接受来自上一层多个神经元的输出 x_i (标量值)作为输入,对其进行加权、求和,然后进行sigmoid、ReLU等非线性操作,最后输出一个标量值;左边就是capsule论文Sec 2的几个公式,做一个对比,我们可以发现,capsule的输入是一个向量u_i,输出v_j也是一个向量,中间的公式Eq.1和Eq.2 就是从u_i到v_j的计算过程,这个过程可以一一地跟传统的神经元计算过程对应起来,u_i到u_hat(Eq.2)是一个仿射变换,这是传统神经元所没有的操作,然后u_hat到s_j是在c_ij的加权下然后对 i 维度进行求和的操作,这个可以看作向量版的加权求和过程,再接着就是s_j到v_j,Eq. 1这个squashing函数是非线性的,而且输出的v_j保持了s_j的维度,所以可以看作是向量版激活函数。

2 Capsule模型结构
Geoffrey Hinton《Dynamic Routing Between Capsules》阅读笔记_第2张图片
如上图所示,整个层级间的传播与分配可以分为两个部分,第一部分是上图 u_i 与 u_j|i hat 间的线性组合,第二部分是 u_j|i hat 与 s_j 之间的 Routing 过程。该图展示了Capsule的层级结构与动态Routing的过程。最下面的层级u_i共有两个Capsule单元,该层级传递到下一层级 v_j 共有四个 Capsule。u_1 和 u_2 是一个向量,即含有一组神经元的 Capsule 单元,它们分别与不同的权重 W_ij(同样是向量)相乘得出 u_j|i hat。例如 u_1 与 W_12 相乘得出预测向量 u_2|1 hat。随后该预测向量和对应的「耦合系数」c_ij 相乘并传入特定的后一层 Capsule 单元。不同 Capsule 单元的输入 s_j 是所有可能传入该单元的加权和,即所有可能传入的预测向量与耦合系数的乘积和。随后我们就得到了不同的输入向量 s_j,将该输入向量投入到「squashing」非线性函数就能得出后一层 Capsule 单元的输出向量 v_j。然后我们可以利用该输出向量 v_j 和对应预测向量 u_j|i hat 的乘积更新耦合系数 c_ij,这样的迭代更新不需要应用反向传播。

3 Dynamic Routing算法
因为按照 Hinton 的思想,找到最好的处理路径就等价于正确处理了图像,所以在 Capsule 中加入 Routing 机制可以找到一组系数 c_ij,它们能令预测向量 u_j|i hat 最符合输出向量 v_j,即最符合输出的输入向量,这样我们就找到了最好的路径。
按照原论文所述,c_ij 为耦合系数(coupling coefficients),该系数由动态 Routing 过程迭代地更新与确定。Capsule i 和后一层级所有 Capsule 间的耦合系数和为 1,即图四 c_11+c_12+c_13+c_14=1。此外,该耦合系数由「routing softmax」决定,且 softmax 函数中的 logits b_ij 初始化为 0,耦合系数 c_ij 的 softmax 计算方式为:

b_ij 依赖于两个 Capsule 的位置与类型,但不依赖于当前的输入图像。我们可以通过测量后面层级中每一个 Capsule j 的当前输出 v_j 和 前面层级 Capsule i 的预测向量间的一致性,然后借助该测量的一致性迭代地更新耦合系数。本论文简单地通过内积度量这种一致性,即,这一部分也就涉及到使用 Routing 更新耦合系数。
Routing 过程就是上图 4右边表述的更新过程,我们会计算 v_j 与 u_j|i hat 的乘积并将它与原来的 b_ij 相加而更新 b_ij,然后利用 softmax(b_ij) 更新 c_ij 而进一步修正了后一层的 Capsule 输入 s_j。当输出新的 v_j 后又可以迭代地更新 c_ij,这样我们不需要反向传播而直接通过计算输入与输出的一致性更新参数。
对于所有在 l 层的 Capsule i 和在 l+1 层的 Capsule j,先初始化 b_ij 等于零。然后迭代 r 次,每次先根据 b_i 计算 c_i,然后在利用 c_ij 与 u_j|i hat 计算 s_j 与 v_j。利用计算出来的 v_j 更新 b_ij 以进入下一个迭代循环更新 c_ij。该 Routing 算法十分容易收敛,基本上通过 3 次迭代就能有不错的效果。 

4 Capsule工作原理解读
Geoffrey Hinton《Dynamic Routing Between Capsules》阅读笔记_第3张图片
深度学习其实就是一系列的张量变换。通过一系列张量变换,从图像、视频、音频、文字等等原始数据中,筛选出特征数据,以便完成识别、分解、翻译等等任务。
论文使用了两层卷积神经网络,对原始黑白照片,也就是 28 * 28 * 8 的原始张量,用两层卷积,完成一系列张量变换,转变成新的张量 ( x_{attr, lon, lat, channel} ) ,attr  = 0 ... 7, lon = 0 ... 5, lat = 0 ... 5, channel = 0 ... 31。
这个新张量中的 ( x_{attr} ) 是初级 capsule,表达原始图像中值得注意的特征。其中 attr 代表初级 capsule 的属性,维度为 8。
新张量中的 ( x_{lon, lat} )  表示 capsule ( x_{attr} ) 在原始图像中的方位。经过张量变换后,28 * 28 的原始图像,被缩略为 6 * 6 个方位。( x_{channel} ) 是频道,类似于多机位拍摄同一个场景,全面表达 capsule 在原始图像中的视觉特点,总共有 32 个频道。
在新张量中,总共有 lon * lat * channel = 6 * 6 * 32 = 1152 个初级 capsule ( x_{attr} ) 。换句话说,经过一系列张量变换,从原始图像中,筛选出了 1152 个值得注意的图像特征,而每个特征是一个8维的向量。
高级 capsule 是前文说的十个手写体数字的 16 维属性向量,即 ( x_{attr, class} ), attr = 0 ... 15, class = 0 ... 9。
想识别原始图像中,是否包含手写体数字 3,也就是 class = 2,只需要把 1152 个初级 capsules,逐一与高级 capsule 向量 x_{*, 2}  做比对。
如何做比对呢?先做一次线性变换(仿射变换),把 8 维的初级 capsule,变换成 16 维的初级 capsule。然后计算 16 维的初级 capsule 与 16 维的高级 capsule 之间的余弦距离,也就是两个向量之间的点乘。
从每个高级 capsule 出发,在低级 capsules 中寻找它存在的证据,这个过程,就是 Dynamic Routing。
如果某一个高级 capsule 中每一个属性,都能在 1152 个初级 capsules 中,找到 “对应的” 一个或多个 capsules,那么就证实了高级 capsule 中的这个属性,确实在图像中存在。
如果某一个高级 capsule 中的全部 16 个属性,都能在 1152 个初级 capsules 中,找到存在的证据,那么就认定这个高级 capsule 在原始图像中存在。
如果有多个高级 capsules,都能在 1152 个初级 capsules 中,找到各自存在的证据,那么就认定在原始图像中存在多个高级 capsules,这也解释了Capsule对于识别重合的数字有较好效果的原因。


4 总结和展望

在过去30年的时间里,在语音识别方面最先进的方法一直使用具有高斯混合的隐马尔可夫模型作为输出分布。这种模型容易在小型计算机上学习,但它们有一个致命的缺陷:与使用分布式表示的循环神经网络相比,它们所使用的one-of-n表示策略是指数级低效率的。为了将隐马尔可夫可以记住的有关它所产生的字符串的信息量加倍,我们需要平方隐藏节点的数量;但对于循环(神经)网络,我们只需要将隐藏的神经元数量加倍即可。

当下,CNN网络在目标识别领域具有举足轻重的地位,所以探索算法中是否存在可能被替换的指数级低效率操作是有意义的。其中一个可能被替代的点就是卷积网络在泛化到新的图像视角(如仿射变换)下时具有难度。CNN应对图像平移的能力是内在的,但是对于放射变换中其它维度(放射变换包括平移、旋转、放大、缩小等维度)的变换,我们可以通过增加特征检测器(及卷积核个数)或者增加标注数据量的方式来解决这个问题,但这些方法都是指数级低效率的操作。Capsule通过将像素强度转换成已识别片段的实例化参数矢量,然后将转换矩阵应用于已识别片段以预测较大片段的实例化参数的方法避免了这些指数级的低效率操作。而学习编码部分和整体之间内在空间关系的变换矩阵构成了算法能自动推广到新视角的视角不变性知识。

Capsule做了非常强的代表性假设:在图像中的每个位置,最多只有一个Capsule代表的实体类型实例。这种由被称为“Crowding”的感知现象激发的假设消除了绑定问题,并允许Capsule使用分布式表示来编码该类型实体在给定位置的实例化参数。这种分布式表示比通过激活高维网格上的点来编码实例化参数指数地更高效,且该方法具有正确的分布式表示,然后Capsule就可以充分利用空间关系可以通过矩阵乘法来进行建模的事实来使算法对图像的仿射变换具有不变性。

Capsule使用随视点变化而变化的神经活动,而不是试图消除神经活动中的视点变化。这使得他们比等标准化方法更具有优势:它们可以同时处理不同对象或对象不同部分的多个不同仿射变换。

此外,Capsule在解决计算机视觉领域另一个困难问题——分割上表现良好,这是因为如我们在本文中所展示的那样,实例化参数的向量允许他们使用路由协议。Capsule的研究现状就类比于本世纪初递归神经网络在语音识别领域的应用研究阶段。目前已经有一些基本的实验表现表明这是一种更好的方法,但是在它能够超越目前已有高度发展的技术之前,还需要更多细微的洞察。

事实上,简单的Capsule系统在分割重叠数字方面已经取得了无可比拟的性能,这也是Capsule一个值得探索的方向的初期指引。

你可能感兴趣的:(深度学习)