本篇blog主要是源于对hinton的 Dynamic Routing Between Capsules 进行理解,转载请注明出处
- 容器(capsule):表示的是一些神经元的集合,这些神经元都是某一类别实体的激活的向量。
- 向量的长度:表示实体存在概率
- 向量的方向:表示的是所代表向量的实例化参数
每一层的每一组激活容器通过变换矩阵(transformation matrics)会对当前的输入做一个预测,然后得到更高级别的容器(capsule),当多个预测值一致时,会激活更高级别的capsule
- 迭代路由协议机制(routing-by-agreement mechanism):较低级别的capsule更倾向于将输出传递给更高级别的capsule,由于多个低级别的capsule预测一致,更高级别的capsule将会得到激活,因此,会使得更高级别的capsule的活动向量得到更大的标量积(big scalar product)
1. 简介
对于一张图片,人类视觉通过关注于几个固定的序列来忽略掉图片中的一些不怎么重要的细节部分,只处理所关注到的一些微小的部分来获取较高的结果(识别准确率),这种内省(本能)的机制能够正确地指导我们从一张图的几处关键点去理解整张图片。但是,在Google研究院Hinton等提出的capsule模型中,他们假设相对于单个确定的目标及其属性,图像中单个的固定点能给予我们更多的信息,他们假设多层视觉系统(mutil-layer visual system)将在每一个关注点(fixation)建立一棵解析树,同时将忽略掉单个的解析树与多个目标关注点(multiple fixations)之间的协调问题。
- 解析树:神经网络是由解析树组成。每一层的神经元将会被划分为多个小的神经元组,每一组称为capsule,解析树的每一个节点将对应于一个激活的容器(active capsule)。利用迭代路由策略,每一个激活的容器(active capsule)将会在上面的神经元层中选择一个capsule来作为其解析树中的父节点
在图像中,在一个激活的capsule中的多个激活的神经元中,代表了某个特定实体的某些属性,这些属性包含了该实例参数的多个类别如姿势(如:大小、位置、方向等)、变换、速度、反射率、色调以及文本等信息。在此,利用一个分离的逻辑单元(separate logistics unit),其输出表示的是一个实体存在的概率。利用向量的长度表示实体存在的概率,向量的方向则表示实例化参数(instantiation parameter),为了保证概率不超过1,通过一个非线性变换,使其向量方向不变,对其长度进行一定程度的缩放
一个capsule的输出是一个向量,能够利用动态路由协议机制确保capsule的输出能够传入到上一层网络的最合适的父节点;直观地,下一层的capsule输出被传入到上一层中所有的capsules,通过缩放机制,将其相关系数进行耦合,使其该层所有的输出之和为1,。对于每一个可能的父节点,capsule会通过自身的输乘以一个权重矩阵来计算一个"预测的向量"(prediction vector),如果该预测向量与可能是父节点的输出预测向量之间存在着一个较大的标量积,则会通过自顶而下的反馈机制来增加该可能的父节点的耦合系数,从而降低其它的“非父节点”的耦合系数;这样做的好处是:增加了当前capsule对其父节点的“贡献”,也提高了当前capsule的预测向量与父节点的输出向量之间的标量积,这种路由协议(rooting-by-agreement)比原始的路由(路径,如:max-pooling)效果高效的多,max-pooling机制只是激活每一个map中的一个神经元,其余的神经元进行抑制。
卷积神经网络(CNN)能够利用特征检测器(filter)的转换副本,然后将其进行特征迁移,从图像中的一个位置转移到另外一个位置。尽管他们利用向量输出容器(vector-output capsules)来代替CNN中的标量输出特征检测器(scalar-output feature detectors),与此同时,利用路由选择协议机制(routing-by-agreement)来代替传统CNN中的max-pooling机制。同时,仍然希望利用空间所学的知识(如CNN在图像中所提取到的局部的特征),对网络中的每一层(除了最后一层的输出层)的capsules进行卷积操作。与CNN相比,利用更高层次的capsules能够覆盖到图像中更加全面的区域信息特征,但是不同于max-pooling,他们没有丢弃掉该区域中实体的精确的位置信息(precise position)。对于低层次的capsules,位置信息是由激活的capsule进行“位置编码”(place-coded),随着层次的上升,越来越多的位置信息由capsule中输出向量的实值部分(real-valued component)进行“速率编码”(rate-coded),这种由“位置编码”转变为“速率编码”与高层次的capsule表示更为复杂的实体以及更高维度的特征。
2. capsule输入输出
在当前输入的输入单元中,capsule所代表实体的向量长度表示的是该实体所出现的概率大小,由于表示的是一个概率值,因此利用一个非线性“挤压”函数来保证将短的向量“压缩”成长度接近0、将长的向量“压缩”成长度接近1的值,在此,利用非线性函数为:
v j ⃗ = ∥ s ⃗ j ∥ 2 1 + ∥ s ⃗ j ∥ 2 ⋅ s ⃗ j ∥ s ⃗ j ∥ \vec{v_j} = \frac{\|\vec{s}_{j}\|^2}{1+\|\vec{s}_j{}\|^2}\cdot\frac{\vec{s}_{j}}{\|\vec{s}_{j}\|} vj=1+∥sj∥2∥sj∥2⋅∥sj∥sj
其中, v j ⃗ \vec{v_j} vj 表示的是 capsule j 的输出, s j ⃗ \vec{s_j} sj 则表示的是 capsule j 所有的输入
-
对于除了第一层的所有的 capsules, capsule j 的输入 s j ⃗ \vec{s_j} sj 表示的是“预测向量” u ^ j ∣ i \hat{u}_{j\mid i} u^j∣i 的带权和(weighted sum), u ^ j ∣ i \hat{u}_{j \mid i} u^j∣i 表示的是上一层中 capsule i 的输出 u i ⃗ \vec{u_i} ui 与两个相邻层之间的连接矩阵的内积亦即: s j ⃗ = ∑ i c i j ⋅ u ^ j ∣ i \vec{s_j} = \sum_{i}{c}_{ij}\cdot \hat{u}_{j \mid i} sj=∑icij⋅u^j∣i, u ^ j ∣ i = W i j ⋅ u ⃗ i \hat{u}_{j\mid i} = W_{ij}\cdot \vec{u}_i u^j∣i=Wij⋅ui;其中, c i j {c}_{ij} cij 表示的是耦合系数(coupling coefficients), 其通过迭代动态路由协议来确定。
-
capsule i 与上一层中所有的capsules之间的耦合系数之和进行归一化(sum to 1),通过一个“软路由”(routing softmaxs),其初始化的logits值b_ij表示的是capsule i 与capsule j 的对数先验概率值的对数先验函数(log prior probabilities),其定义如下:
c i j = e i j b ∑ k e i k b {c}_{ij} = \frac{e^{b}_{ij}}{\sum_{k}e^{b}_{ik}} cij=∑keikbeijb
这种先验对数(log prior)能够和其它的权重同时确定。其依赖于两个capsule的位置信息以及类别信息,而与当前输入的图片没有关系;初始化的耦合系数通过计算上一层的 capsule j 的输出 v ⃗ j \vec{v}_{j} vj 和本层 capsule i 所预测的向量 u ^ j ∣ i \hat{u}_{j \mid i} u^j∣i 的一致性(agreement),利用动态路由协议算法进行且待更新。这种一致性(greement)简单地定义为: a i j = v ⃗ j ⋅ u ^ j ∣ i a_{ij} = \vec{v}_j\cdot \hat{u}_{j \mid i} aij=vj⋅u^j∣i,该一致性可被认为是对数似然估计,并将其加上初始化的 logit,$ {b}_{ij} $ 在计算所有的耦合系数之前,已经将 capsule i 链接到更高级别的capsule中了。
-
在卷积capsule层,capsule中的每一个单元都是一个卷积单元,因此,每个capsule将输出一组向量,而不仅仅只是一个向量(不同于传统的CNN之处)
3. 数字的边际损失函数(margin loss for digit existence)
- 利用向量的长度来表示capsule 实体存在的概率,因此,对于数字类别k,希望高层次的capsule 能够有一个较长的输出向量,对于每个digit capsule k:
L c = T c m a x ( 0 , m + − ∣ ∣ v ⃗ c ∣ ∣ ) 2 + λ ( 1 − T c ) m a x ( 0 , ∣ ∣ v ⃗ c ∣ ∣ − m − ) 2 L_c = T_cmax(0, m^+ - ||\vec{v}_c||)^2 + \lambda(1 - T_c) max(0, ||\vec{v}_c|| - m^-)^2 Lc=Tcmax(0,m+−∣∣vc∣∣)2+λ(1−Tc)max(0,∣∣vc∣∣−m−)2
其中, T c = 1 T_c = 1 Tc=1 当且仅当 digit 的类别 c 存在并且 m + = 0.9 , m − = 0.1 m^+ = 0.9, m^- = 0.1 m+=0.9,m−=0.1, λ \lambda λ 表示的是已存在类别的权重衰减系数
4. capsule网络结构
- 简易的网络结构如上所示:其结构是一个紧含两层卷积层和一个全连接层的浅层网络,第一个卷积层采用256个9*9的卷积核,其步长为1,并采用 ReLU 作为激活函数;这一层将像素强度(pixel intensities)转化为局部特征,并将其作为输入到primary capsules
- 第二层(primary capsules)是一个32个通道(channels)的卷积层,每个卷积值都是 8D 的 capsules (不同于传统CNN的卷积后都是1D),每一个 primary capsule 均包含有8个卷积单元,每个卷积单元都使用的是9*9的卷积核,且步长(stride)为2。
编码阶段: 首先是将28 * 28 像素的图片通过一个 9 * 9 kernel size的卷积核,其channel为256, stride 为1,通过传统的CNN进行卷积,得到(28 - 9 + 1) = 20, 通过一层卷积后得到256 个 20 * 20 size 的 feature map, 第二层(primary capsules)采用同样 size 的 kernel, stride为2, ( 20 − 9 + 1 ) 2 = 6 \frac {(20 - 9 + 1)}{2} = 6 2(20−9+1)=6, 其输出为一个 8D 的 vector, 32 个 6 * 6 * 8 的feature map, 在第三层(digitCaps), 其权重 W ⃗ i j \vec{W}_{ij} Wij 为8 * 16 size的矩阵, 利用公式: u ^ j ∣ i = W i j ⋅ u ⃗ i \hat{u}_{j\mid i} = W_{ij} \cdot \vec{u}_i u^j∣i=Wij⋅ui, 其中, W i j W_{ij} Wij 的 size 为:1152 * 10 个, 且每个均为 8 * 16 维的向; u ⃗ i \vec{u}_i ui 表示的是一个 8D 向量,亦即: u ⃗ i = [ 8 , 1 ] \vec{u}_i = [8, 1] ui=[8,1],由上述公式: u ⃗ i \vec{u}_i ui 与 W i j W_{ij} Wij 相乘后,其得到的预测向量维度为:[8, 16].T * [8, 1] = [16, 1],然后通过 [32 * 6 * 6, 10] 个耦合系数 c i j c_{ij} cij,由公式: s j ⃗ = ∑ i c i j ⋅ u ⃗ j ∣ i \vec{s_j} = \sum_{i}{c}_{ij} \cdot \vec{u}_{j \mid i} sj=∑icij⋅uj∣i 可得其输入 s ⃗ j \vec{s}_j sj;最后通过一个 squashing 函数, 得到输出 v ⃗ j \vec{v}_j vj
各层参数分析:
- 第一层卷积层:原始图像输入size为:28 * 28,采用256个channels,9 * 9的kernel size,stride = 1,padding = 0;利用Relu作为激活函数,其输出的张量size为:256 * 20 * 20。该层参数个数为:9 * 9 * 1 *256 + 256, 其中"+ 256"表示的是bais 。 注:此处每个神经单元为标量
- 第二个卷积层(primary capsule):第二层的输入为:256 * 20 * 20,通过32个channels,kernel size为9 * 9,stride = 2,则输出为32 * 8 * 6 * 6,亦即:32个map, 每个map都包含有6 * 6个capsule单元, 每个capsule单元都是一个8D向量。亦即:其primary capsule层的输出为:6 * 6 * 32个8D的向量,该层的参数个数为:9 * 9 * 256 * 8 * 32 + 8 * 32, 其中,“8 * 32”表示的是bias ,不同的map代表的是不同的类型,同一个map中的capsule则表示的是不同的位置。
- 第三层digitcaps对第二层的输出使用routing进行更新,第三层的输入是32 * 6 * 6 * 8 = 1152 * 8的size,即:1152个capsule;第三层的神经元capsules为10个(分为十个类别),每个capsule都表示的是16D的向量;该层参数为:1152 * 10 * 8 * 16 + 10 * 16 (其中,“+ 10 * 16”表示的是bias)
5. 重构
- 解码阶段:将DigitCaps层重构出来。文章使用重构损失对图像进行编码,利用预测出的capsules,来对图像进行重构与表示。
TODO
Hinton另外一篇paper:transforming auto-encoders
一篇匿名paper:matrix capsules neural networks
Mason McGill、Pietro Perona的一篇paper:Deciding How to Decide: Dynamic Routing in Artificial Neural Networks
参考文献
Hinton:Dynamic Routing Between Capsule
机器之心:http://mp.weixin.qq.com/s/2GVsVPtYRNkOcelCKXjaVQ
https://hackernoon.com/what-is-a-capsnet-or-capsule-network-2bfbe48769cc?gi=e953068428e6
http://bigthink.com/robby-berman/buh-bye-traditional-neural-networks-hello-capsules