Dynamic Routing Between Capsules论文阅读

发布于 2021-01-15  2911 次阅读


前言

刚考完试,虽然没出分数但是自己觉得应该都比较满意,回沈阳也是经历了2077般跳票,今天是在家的第一天,回归状态比较难, 但是也算是吃透了Capsules的第一篇论文,不禁感叹数学真的很重要

何为Capsule

Capsule一般译为胶囊,但是根据论文本意它其实更多是张量,所以我称其为张量神经网络

Capsule提出了一种新的“vector in vector out”的传递方案,并且这种方案在很大程度上是可解释的

在CNN的架构中每次的输入$X_i$都会被解释为属性的有或无,而Capsule则是指对属性用向量表示,使网络对单个特征的表达上更丰富

在论文中,Geoffrey Hinton 介绍 Capsule 为:「Capsule 是一组神经元,其输入输出向量表示特定实体类型的实例化参数(即特定物体、概念实体等出现的概率与某些属性)。我们使用输入输出向量的长度表征实体存在的概率,向量的方向表示实例化参数(即实体的某些图形属性)。同一层级的 capsule 通过变换矩阵对更高级别的 capsule 的实例化参数进行预测。当多个预测一致时(本论文使用动态路由使预测一致),更高级别的 capsule 将变得活跃。

Capsule架构

上图展示了Capsule整体结构:Capsule层级结构动态 Routing 的过程

Capsule的运行流程大致如下:

  • $u_1$和$u_2$是一个向量,即含有一组神经元的 Capsule 单元,它们分别与不同的权重 $W_{ij}$(同样是向量,更准确来说是矩阵)相乘得出$u ^ j ∣ i$
  • 预测向量和对应的「耦合系数」$c_{ij}$ 相乘并传入特定的后一层 Capsule 单元得到$s_{ij}$。不同 Capsule 单元的输入$s_{ij}$是所有可能传入该单元的加权和,即所有可能传入的预测向量与耦合系数的乘积和
  • 将向量$s_{ij}$投入到「squashing」非线性函数就能得出后一层 Capsule 单元的输出向量$v_{ij}$
  • 利用该输出向量$v_{ij}$和对应预测向量$u ^ j ∣ i$的乘积更新耦合系数$c_{ij}$,这样的迭代更新不需要应用反向传播。

Dynamic Routing 算法

论文中给出的算法如下

一些小细节问题

1.耦合系数

$c_{ij}$系数由动态 Routing 过程迭代地更新与确定。Capsule i 和后一层级所有 Capsule j间的耦合系数和为 1。此外,该耦合系数由「routing softmax」决定,计算方法如下
$$
c_{ij}=\frac{exp(b_{ij})}{\sum_kexp{(b_{ik})}}
$$
我们可以通过测量后面层级中每一个 Capsule j 的当前输出$v_j$前面层级 Capsule i 的预测向量间的一致性,然后借助该测量的一致性迭代地更新耦合系数。本论文简单地通过内积度量这种一致性,即:
$$
a_{ij}=v_j⋅\hat{u}_{j|i}
$$
然后用$a_{ij}$来间接更新$c_{ij}$

这里可以$v_j$实际上就是各个$\hat{u}_{j|i}$的某个聚类中心,这里的$a_{ij}$可以看做是和聚类中心的距离,从而返过来更新$c_{ij}$

2.$b_{ij}$权值更新

$$
b_{ij} \leftarrow b_{ij} + a_{ij}
$$

点积运算接收两个向量,并输出一个标量。对于给定长度但方向不同的的两个向量而言,点积有下列几种情况:正值、零、负值。故当$v_j与\hat{u}_{j|i}$的相乘结果为正时,代表两个向量指向的方向相似,b更新结果变大,那么耦合系数就高,说明该$v_j与\hat{u}_{j|i}$分匹配。相反,若是$v_j与\hat{u}_{j|i}$相乘结果为负,b更新结果变小,那么$v_j与\hat{u}_{j|i}$耦合系数就小,说明不匹配

3.squashing线性激活函数

$$
squash(\boldsymbol{x})=\frac{\Vert\boldsymbol{x}\Vert^2}{1+\Vert\boldsymbol{x}\Vert^2}\frac{\boldsymbol{x}}{\Vert\boldsymbol{x}\Vert}
$$

该非线性函数可以看作是对向量长度的一种压缩和重分配,因此也可以看作是一种输入向量后「激活」输出向量的方式

总结

感觉Capsule跟Transformer的self-attention有点类似之处,我准备这段时间拜读一下这俩个领域的文章,今天算是入门了