论文解析:Matrix Capsule

1,586 阅读11分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

Matrix network

《MATRIX CAPSULES WITH EM ROUTING》

总体介绍

 matrix network是对前一篇capsule network的改进,改进的方向主要在聚类算法和实体特质表示两个方面,前者从没啥理论基础的动态路由算法变成了EM算法,后者由向量表示变成了矩阵表示。在理论上更加的清晰、更符合Hinton之前构想的对于CNN的改进。

模型介绍

 首先在原先的Capsule network中某个胶囊(实体)的属性只由一个一维向量,用向量的模值表示相应实体出现的概率,向量的相位表示实体的某些性质。而在改进的Capsule network中胶囊的属性则由4*4的姿势矩阵(pose matrix)MM和激活值(activition probablity)aa表示,前者用来表示实体的性质,后者用来表示实体存在的概率。(为什么要单独把激活概率抽出来,后续会介绍)。此处重点介绍一下使用EM进行的聚类算法,在前一版的Capsule network中,我们通过计算底层向量和顶层向量间的点积来衡量二者相似性,通过中间参数bijb_{ij}来给出底层向量和顶层向量间的耦合系数,没有直觉上的解释或者是理论支撑。而在EM算法中,则是通过概率和信息熵两方面给出了聚类算法的理论支持,如下:

实体描述

 首先对于某个实体,我们用pose matrix MM来表征它的性质,也需要将其进行一定的变换以成为更大实体的一部分(直觉上来说,就是将该实体进行相对于从属实体的线性变换),变换方式同样是乘以变换矩阵WW,得到的结果即为该实体对上层某个从属实体的认可矩阵(vote matrix)vv;

层间联系

 获得了底层实体对于顶层实体的认可矩阵后,我们下一步需要做的是通过这一联系来描述顶层实体的性质--pose matrix和它存在的可能性--activition probablity。在前一篇论文中,这一步是通过动态路由算法计算出底层实体和顶层实体的耦合度,再依次加权变换后的向量得到当前实体的表征向量。而在本文中,作者为这一底层到顶层的联系提供了一个概率层面的解释,我们假定底层存在M个caps,顶层存在着N个caps,则我们认为这M个底层实体是N混合高斯分布的采样值,而这N个混合高斯分布的采样的中心就是N个顶层实体的pose matrix,通过对单个高斯分布类存在的概率进行一定运算得到activition probablity。(实际上这就是一种聚类的算法,预先假定存在了N个高斯分布,通过EM算法迭代得到每个高斯分布的性质和存在的可能性,聚类越密集越可能存在)直观理解如下图: 在这里插入图片描述

除此之外我们做出一个更强的假设,每个高斯分布内部的变量都是独立的,协方差矩阵为对角阵.

EM路由概率部分推导:  1. 对于底层传入的某个输入xix_i,认为它服从N混合高斯分布: p(xi)=j=1Np(j)p(xij)=j=1NπjN(xi;uj,σj)p(x_i)=\sum^N_{j=1}p(j)p(x_i|j)=\sum^N_{j=1}\pi_jN(x_i;u_j,\sigma_j) 这里的p(j)为混合高斯分布中第jj个分布出现的概率,p(xij)p(x_i|j)为第jj个高斯分布的概率分布,为了与论文中的符号一致,现记pij=p(xij)p_{ij}=p(x_i|j)

 2. 我们已知输入xix_i,要判断顶层某个高斯分布(实体)存在的概率,可以计算后验概率p(jxi)p(j|x_i):

Rij=p(jxi)=p(xij)p(j)p(xi)=pijπjj=1NπjpijR_{ij}=p(j|x_i)=\frac{p(x_i|j)p(j)}{p(x_i)}=\frac{p_{ij}\pi_j}{\sum^N_{j=1}\pi_jp_{ij}}

 3. 又我们已知M个来自底层的输入,可以用蒙特卡洛法对顶层的每个高斯分布参数进行求取: 第jj个高斯分布的均值:

Mj=p(xjj)xidxi=p(xi)p(jxi)p(j)xidxi=E[p(jxi)p(j)xi]=1πjMi=1MRijxi\begin{aligned} M_j&=\int p(x_j|j)x_idx_i\\ &=\int p(x_i)\cdot \frac{p(j|x_i)}{p(j)x_idx_i}\\ &=E[\frac{p(j|x_i)}{p(j)}x_i]\\ &=\frac{1}{\pi_{j}M}\sum^M_{i=1}R_{ij}x_i \end{aligned}

又每个高斯分布存在的先验概率可以通过对变量积分得到:

πj=p(jxi)p(xi)dxi=1Mi=1MRij\pi_j=\int p(j|x_i)p(x_i)dx_i=\frac{1}{M}\sum^M_{i=1}R_{ij}

再记rij=RijiMRijr_{ij}=\frac{R_{ij}}{\sum^M_iR_{ij}},得到化简后的高斯分布均值:

Mj=i=1MrijxiM_j=\sum^M_{i=1}r_{ij}x_i

至此,高斯分布的求取已经初见端倪,我们来分析一下这些参数的意义,rijr_{ij}是假定所有xix_i都以RijR_{ij}的概率服从第jj个高斯分布下,某个输入xix_i相对于所有输入更可能服从于该高斯分布的程度,也就是该输入对这个高斯分布性质的贡献程度、权重。因此求得的高斯分布均值实际上也就是所有输入的加权平均。由此我们可以直觉上得到高斯分布协方差矩阵的表达式:

σj2=i=1Mrij(xiMj)2)\sigma_j^2=\sum^M_{i=1}r_{ij}(x_i-M_j)^2)

至此我们完成了EM算法所以依赖的公式,现整合如下:

{pij=N(xi;μj,σj2)Rij=pijπjj=1Nπjpij,rij=RijiMRijMj=i=1Mrijxiσj2=i=1Mrij(xiMj)2)πj=1Mi=1MRij\left\{ \begin{aligned} p_{ij}&=N(x_i;\mu_j,\sigma_j^2)\\ R_{ij}&=\frac{p_{ij}\pi_j}{\sum^N_{j=1}\pi_jp_{ij}},r_{ij}=\frac{R_{ij}}{\sum^M_iR_{ij}}\\ M_j&=\sum^M_{i=1}r_{ij}x_i\\ \sigma_j^2&=\sum^M_{i=1}r_{ij}(x_i-M_j)^2)\\ \pi_j&=\frac{1}{M}\sum^M_{i=1}R_{ij} \end{aligned} \right.

EM路由信息熵部分推导:  理论上来说,我们取均值MjM_j作为pose matrix即可,按照前一篇论文的思路,我们可以用矩阵的模值来表征实体出现概率,但在这种路由方式下是不可行的。因为这里的pose matrix是所有底层输入的加权平均值,而如果我们回顾前一篇论文的计算公式iciju^ji\sum_i c_{ij}\hat{u}_{j|i}l可以发现这里隐含了两个聚类目标:

  1. 底层实体越倾向于选择哪个顶层实体(cijc_{ij}越大),对应顶层实体模值越大,出现概率越大;
  2. 从属于某底层实体的底层实体模值越大(u^ji\hat{u}_{j|i}),该顶层实体模值越大,概率越大

 而MjM_j虽然会随着底层输入的模值增大而增大,但并没有体现出底层实体青睐于某个顶层实体的特征(cijc_{ij}体现第ii个底层实体对第jj个顶层实体的偏好,对jj累加为1,rijr_{ij}体现所有底层实体对第jj个顶层实体的偏好中第ii个的相对程度,对ii累加为1),因此pose matrix的模值不再能作为我们评估实体出现概率的标准,只能作为性质表征出现。为此,我们需要引入额外参数:activation probability。  这一参数是用于体现实体存在的可能性的,一个直观的匹配项就是高斯分布的概率πj\pi_j,但我们也没有采用这一思路,原因是:

  1. jπj=1\sum_j \pi_j=1,但我们希望Capsule net可以给出多个判定结果,而不是只输出一个类别。
  2. πj=1Mi=1MRij\pi_j=\frac{1}{M}\sum^M_{i=1}R_{ij},体现了所有底层实体对于某个顶层实体的偏好的均值,越受到底层实体青睐的顶层实体,该值越大,但这个值无法体现出底层实体模值的影响。因此作者引入了信息论中熵的概念来评价实体出现的可能性,如果一个实体出现的可能性越大,说明它的稳定性强而可能性少,激活值应该越大,用熵来表示如下:
Sj=p(xj)ln p(xj)dx=1p(j)p(jx)p(x)ln p(xj)dx=1p(j)E[p(jx)ln p(xj)]=i=1nrijln pij\begin{aligned} S_j&=-\int p(x|j)ln\ p(x|j)dx\\ &=-\frac{1}{p(j)}\int p(j|x)p(x)ln\ p(x|j)dx\\ &=-\frac{1}{p(j)}E[p(j|x)ln\ p(x|j)]\\ &=-\sum_{i=1}^nr_{ij}ln\ p_{ij} \end{aligned}

这里原论文的推导出了问题,对应的costjhcost_j^h表达式应该为: costjh=12+(ln2π2+lnσjh)irijcost_j^h=\frac{1}{2}+(\frac{ln2\pi}{2}+ln \sigma^h_j)\sum_i r_{ij} (此处的上标hh表示多维高斯分布中的某一维度,之前假设了各个变量独立,最后计算累计熵的时候对hh累加即可)
 除此之外,作者还用了类似于平均信息熵的概念,如果我们激活了某一个顶层实体,那么我们为了描述这一顶层实体分布的参数以及存在这一事实付出一定的码长代价,付出的熵增记作βa-\beta_a吗,如果我们不激活这一个顶层实体,那所有以RijR_{ij}概率从属于该顶层实体都将以均匀分布的形式存在,保持不变,描述每一个这样的底层实体付出的码长带来信息熵βu-\beta_u,因此如果激活这一实体带来的熵增少于不激活带来的熵增,我们就应该激活该实体,相应激活概率为:

aj=logistic(λ(βui=1rij(βa+costjh)))=logistic(λ(βaβui=1rijcostjh))\begin{aligned} a_j&=logistic(\lambda(-\beta_u \sum_{i=1}r_{ij}-(-\beta_a+cost^h_j)))\\ &=logistic(\lambda(\beta_a-\beta_u \sum_{i=1}r_{ij}-cost_j^h)) \end{aligned}

这里的βa,βu\beta_a,\beta_u为网络自行学习的参数,至于是每层都分配不同的βa,βu\beta_a,\beta_u还是共享,文章没有写明,倾向于是每层不同,λ\lambda为超参数。
 最后,作者为了显式的引入底层激活概率对底层的影响,人为的将其添加到了EM算法的依赖公式中,修改后的依赖公式如下:

{pij=N(Vij;μj,σj2)Rij=pijajj=1Najpij,rij=aiRijiMaiRijMj=i=1MrijVijσj2=i=1Mrij(xiMj)2)costj=(βu+h=1dln σjh)i=1aiRijaj=logistic(λ(βucostj))\left\{ \begin{aligned} p_{ij}&=N(V_{ij};\mu_j,\sigma_j^2)\\ R_{ij}&=\frac{p_{ij}a_j}{\sum^N_{j=1}a_jp_{ij}},r_{ij}=\frac{a_iR_{ij}}{\sum^M_ia_iR_{ij}}\\ M_j&=\sum^M_{i=1}r_{ij}V_{ij}\\ \sigma_j^2&=\sum^M_{i=1}r_{ij}(x_i-M_j)^2)\\ cost_j&=(\beta_u+\sum_{h=1}^dln\ \sigma_j^h)\sum_{i=1}a_iR_{ij}\\ a_j&=logistic(\lambda(\beta_u-cost_j)) \end{aligned} \right.

可以看出修改的点有以下几个:

  1. cost函数中去除了与网络训练无关的部分;
  2. 用表征实体激活概率的aja_j来代替分布存在的先验概率πj\pi_j
  3. RijR_{ij}描述了底层实体对第jj个顶层实体的偏好程度,在此基础上作者补充了aia_i来描述该底层实体存在的可能性

至此,本文最大的贡献描述完毕,对前一篇论文中模糊的层间路由算法进行了改进,补足了强有力的理论支撑。

模型架构

 模型的整体框图如下: 在这里插入图片描述

与前一篇的整体架构差不多,都由一个原始的CNN+中间Cap层+分类Cap层,不同点在于中间Cap层的数目变多并且增加了类似CNN中感受野(kernel)的概念,以下详细展开。

raw_map--->Reul Conv1:

 原始图片经过5F*1S*32C(32通道,步长为1的5*5卷积)经过Relu激活得到了ReLU Conv1。输入[32,32,1],输出[14,14,32];

Relu Conv1--->PrimaryCaps:

 从ReulConv1到PrimaryCaps的操作属于CNN和Cap之间的过渡层,既没有明显的卷积意义也没有路由操作。首先将ReluConv1的输出map进行32个1F*1S*16C的卷积从而得到[14,14,32,16]的输出,其含义是在空间层面(map)上划分出了14*14个子区域,每个子区域都由32个cap来表征,而每个Cap都需要用4*4=16的pose matrix来描述。而Cap除了pose matrix之外还有activation 参数等待初始化,同样是通过卷积来实现,ReluConv1的输出map进行32个1F*1S*1C的卷积从而得到[14,14,32,1]的输出。

 这里对应模型框图中参数计算法记作:32*32*(4*4+1),即对输入深度为A的map进行B个通道数为(4*4+1)的conv。输入[14,14,32],输出[14,14,32,17]。 PrimaryCaps--->ConvCaps

 这一步往后就是真正用到了路由算法的Cap层,同时还拥有了卷积感受野的概念。对于PrimaryCaps某个3*3的区域,将其内部所有Caps视为一组底层Caps,对应于CovCaps1中某个1*1区域内部的顶层Caps,即在3*3*32的底层Caps到1*1*32的顶层caps间进行路由,而路由算法中每个底层Cap和顶层Cap还需要通过4*4的权重矩阵来变换。

 对应模型框图中参数计算法记作:3*3*32*32*4*4,即对将输入深度为B的map在K*K范围内的所有Cap作为顶层和顶层某一位置的C个Cap进行路由,每个底层-顶层对之间的变换都需要4*4的权重矩阵。输入[14,14,32,17],输出[6,6,32,17]

 值得注意的是这里给出的参数量只是一个Conv-Cap的,每个Conv-cap的C个输出都是拥有着相同的感受野,输出时排列在通道维度上,如果不同空间维度的Caps不共享权重矩阵的话,那3*3的内核每次移动都需要新的权重矩阵。也就是总的参数量应该是相同大小的3*3卷积输出的size乘以每个Conv-cap的参数量。即:

((WF+2P)/S+1)KKBC44((W-F+2P)/S+1)*K*K*B*C*4*4

ConvCaps--->ConvCaps

 这一步和前一步基本一样,不同点在于Conv-Cap移动步长变为了1。输入[6,6,32,17],输出[4,4,32,17]

ConvCaps--->ClassCaps

 这一步和前一步同样差不多,不同点在于Conv-Cap的核尺寸变为了1*1,此外由于最终我们是汇总所有的信息进行分类,ClassCap层的每个输出的感受都是输入的所有Cap,为了体现出这一全局感受野的性质,同一输入map上的底层Cap共用权重矩阵,也就是Conv-Cap移动时不更新权重矩阵。而又为了不丢失位置信息,作者将底层cap的坐标化缩放到(0,1)区间内的点加在了pose matrix的前两维中。 总的参数量是:

11CE441*1*C*E*4*4

参考文献

三味Capsule:矩阵Capsule与EM路由

“Understanding Matrix capsules with EM Routing (Based on Hinton's Capsule Networks)”

[如何看待Capsule的第二篇论文Matrix Capsules with EM Routing?](www.zhihu.com/question/67…