CapsNet模型:Dynamic Routing Between Capsules

1.CNN模型的缺陷

  • CNN主要用于捕捉图形的局部特征,但是在探索这些特征之间的关系似乎不是特别好(比如相对位置关系、相对大小关系,特征的方向等等关系)
  • 如下面两幅图,由于局部特征相同,所以CNN可能将它们都识别成一张人脸:
    CapsNet模型:Dynamic Routing Between Capsules_第1张图片
  • 一个简单的CNN模型可以正确地提取鼻子,眼睛和嘴巴的特征,但是并不能提取出特征之间的相对关系:
    CapsNet模型:Dynamic Routing Between Capsules_第2张图片
  • CapsNet模型就是为解决CNN这个缺陷而产生的。

2.Capsules网络的概念

  • 在一般的神经网络中,一层一般由若干神经元组成,每个神经元对应一个常数(或者叫常数的输出和输出)。下图为一个全连接神经网络:

    CapsNet模型:Dynamic Routing Between Capsules_第3张图片
    每层的小⚪对应一个神经元,神经元的输入输出都是一个常量

  • 一般神经网络中每层(layer)的神经元(neuron)太过简单很难表征一些概念;为了能表示一些复杂的概念,将一组神经元封装起来形成Capsule(胶囊),每个Capsule对应一个向量而不是标量,而向量就可以作为良好的表征(比如word2vec中的向量就可以良好表征词汇)。Capsule的输入和输出就不再是标量而是向量。

  • Capsule 的输出向量表征了两个部分:

    • 其长度表征了某个实例或实例的一部分出现的概率
    • 其方向表征了实体的某些图形属性(位置,颜色,方向,形状等等)
  • 将上面全连接网络的每个神经元⚪换成Capsule⬜:

    CapsNet模型:Dynamic Routing Between Capsules_第4张图片
    其中⬜表示Capsule,中间的红色⚪表示Capsule包含的神经元

  • 激活函数

    • 首先需要考虑一下什么样的激活函数可以用于向量的激活,论文中使用了下面激活函数: v j = ∣ s j ∣ 2 1 + ∣ s j ∣ 2 s j ∣ s j ∣ v_j=\frac{|s_j |^2}{1+|s_j |^2 }\frac{s_j}{|s_j |} vj=1+sj2sj2sjsj
    • 该激活函数称为squashing,是一个非线性激活函数;其中 s j s_j sj是当前Capsule的输入, v j v_j vj是当前Capsule的输出。
    • 上面公式可以拆成两个部分:后半部分是一个单位向量 s ^ j = s j ∣ s j ∣ \hat{s}_j=\frac{s_j}{|s_j |} s^j=sjsj,前半部分是模长放缩因子 ∣ s j ∣ 2 1 + ∣ s j ∣ 2 \frac{|s_j |^2}{1+|s_j |^2 } 1+sj2sj2;放缩因子的函数图形如下:
      CapsNet模型:Dynamic Routing Between Capsules_第5张图片
      横坐标为 ∣ s j ∣ |s_j | sj,要放缩因子函数有如下特点:
      • 值域在[0,1]之间,所以输出向量的长度可以表征某种概率。
      • 函数单调增,这样原本比较短的向量压缩接近0,原本较长的向量压缩接近1
  • 相邻两层的连接方式: 现在要考虑相邻两层是如何连接,很明显应该分为两个阶段:

    • 维度变换:级将低一层的Capsule向量维度变换为当前层的Capsule向量维度。
      • 变换公式如下: u ^ j ∣ i = W i j u i \hat{u}_{j|i}=W_{ij} u_i u^ji=Wijui其中 u i u_i ui是低一层的第i个Capsule的输出向量, u ^ j ∣ i \hat{u}_{j|i} u^ji u i u_i ui维度变换后的结果(也被称为预测向量),并且将送给当前层的标号为j的capsule, W i j W_{ij} Wij是对应的变换矩阵
      • 过程图:
        CapsNet模型:Dynamic Routing Between Capsules_第6张图片
    • 线性组合:将下面一层维度变换后得到的向量 u ^ j ∣ i \hat{u}_{j|i} u^ji进行线性组合得到当前层第j个Capsule的输入向量 s j s_j sj
      • 组合公式: s j = ∑ i c i j u ^ j ∣ i s_j=∑_ic_{ij} \hat{u}_{j|i} sj=iciju^ji c i j c_{ij} cij称为耦合系数(coupling coefficients),并且 c i j c_{ij} cij b i j b_{ij} bijsoftmax的结果,从而使得 c i j c_ij cij分布归一化,即: c i j = e x p ⁡ ( b i j ) ∑ k e x p ⁡ ( b i k ) c_{ij}=\frac{exp⁡(b_{ij})}{∑_kexp⁡(b_{ik})} cij=kexp(bik)exp(bij) ∑ k c i k = 1 ∑_kc_{ik} =1 kcik=1
      • 可以看出这个归一化是以低一层的第i个capsule为中心,而不是以当前层的第j个capsule为中心。由此可以看出这个路由选择是底层向高层的一个选择,并且由于softmax会使分布“尖锐化”,即只有少数 c i j c_ij cij有较大的取值,这样就使得低层第i个capsule的输出最终经过路由选择进入某个(或某几个)高层的capsule中。
      • 动态路由迭代获获得 c i j c_{ij} cij的过程:
        CapsNet模型:Dynamic Routing Between Capsules_第7张图片
      • b i j b_{ij} bij刚开始初始化为0,这样得到的 c i j c_{ij} cij是相等的即刚开始下层capsule的输出均得的进入上层的每个capsule中。
      • 论文中跟新 b i j b_{ij} bij的公式为: b i j ← b i j + u ^ j ∣ i v j b_{ij}←b_{ij}+\hat{u}_{j|i} v_j bijbij+u^jivj其中 u ^ j ∣ i v j \hat{u}_{j|i} v_j u^jivj用来表示底层第i个capsule与上层第j个capsule的一致性。经过这样的迭代一致性越强的capsule对的耦合系数 c i j c_{ij} cij会被进一步扩大。
      • 这个更新算法很容易收敛。论文中认为3次足矣。routing 和其他算法一样也有过拟合的问题,虽然增加routing的迭代次数可以提高准确率,但是会增加泛化误差,所以不宜过多迭代
    • 整个过程图:
      CapsNet模型:Dynamic Routing Between Capsules_第8张图片

3.CapsNet模型结构

  • CapsNe模型结构图

    CapsNet模型:Dynamic Routing Between Capsules_第9张图片

  • 整体框架:

    • CNN层
    • primarycapsules 层
    • DigitCaps层
  • CNN层: 该层是一般CNN结构

    • 输入:28×28×1的MNIST数字图像
    • 输出:20×20×256的张量
    • 卷积核:256个步长为1的9×9×1卷积核
    • 激活函数:Relu
    • 说明:首先使用CNN进行初级特征的提取,这里注意到所使用的CNN视野比较大(9×9),这是因为CNN层数很少的情况下,感知野越大,底层的capsules能够感知到的内容也越多
  • primarycapsules 层:

    • 纯属个人理解:这一层可以理解为Capsules级的CNN;先将几个(论文中是8个)过滤器封装成一个Capsules过滤器;这样的Capsules过滤器在输入矩阵(20×20×256的张量)上滑动时每次都会产生一个长度为8的向量而不是一个标量。
    • Capsules过滤器:
      • 输入:上一层CNN层的输出:20×20×256的张量
      • Capsules过滤器组成:8个9×9×256的过滤器封装而成
      • 步长:2
      • 输出:6×6×8的张量,也可理解为6×6的Capsules矩阵,每个Capsules维度为8.
    • Primary capsules 层一共用了32个Capsules过滤器来进行Capsules级的CNN操作,所以该层最终的输出张量维度为:32×6×6×8,一共1152个Capsules
  • DigitCaps层:

    • 这一层用的就是上一节(Capsules网络的概念)的方法:
    • 输入:1152个Capsules,每个Capsules维度为8
    • 输出:10个Capsules,每个维度为16,并且每个Capsules对应一个数字,由于每个Capsules的模长代表其所对应实例出现的概率,所以这10个Capsules的模长分别表示了(0-9)数字出现(预测)的概率
    • 过程图:
      CapsNet模型:Dynamic Routing Between Capsules_第10张图片
    • 注意到:这里只保证了最后输出的每个Capsules的模长在区间[0,1]内,并没有在10 Capsules进行归一化,所以天然有同时识别多个物体的能力。
  • 损失函数:

    • 由于capsules允许多个分类同时存在,所以不能直接用传统的交叉熵损失,一种替代方案是 SVM 中常用的margin loss(合页损失): 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_c max⁡(0,m^+-|v_c |)^2+λ(1-T_c ) max⁡(0,|v_c |-m^- )^2 Lc=Tcmax(0,m+vc)2+λ(1Tc)max(0,vcm)2
    • 其中 c c c是分类, L c L_c Lc是类别 c c c的对应的损失, T c T_c Tc是分类的指示函数(分类 c c c存在为1,否则为0), m + m^+ m+为上界,惩罚假阴性(没有预测到存在的分类的情况); m − m^- m为下界,惩罚假阳性(预测到不存在的分类的情况)。 λ λ λ是比例系数,调整两者比重;总的 L 1 L_1 L1是各个类别损失 L c L_c Lc之和: L 1 = ∑ c = 1 10 L c L_1=∑_{c=1}^{10}L_c L1=c=110Lc

2.重构与表示

  • capsule的一个重要假设是每个 capsule的向量可以表征一个实例。怎么来检验这个假设呢?一个方法就是重构。
  • 重构的时候,我们单独取出需要重构的capsule向量,扔到后面的网络中重构,然后重构该capsule向量所对应的图形。当然后面的重构网络需要训练。
  • 重构网络:由三个全连接神经网络构成
    • 输入:维度为16的capsule向量
    • 输出:28×28×1图形拉直后维度为784的向量
    • 模型图:
      CapsNet模型:Dynamic Routing Between Capsules_第11张图片
  • 如何证明重构的好是因为Capsules输出了良好的表示,而不是因为后面的网络拟合的结果:一个证据是人为扰动 capsule 的输出向量。我们可以看到,如果逐渐改变向量的一些分量,表示也很有规律地改变。
  • 在训练期间,先将图片输入到CapsNet架构中得到DigitCaps层输出,然后得到对应的合页损失 L 1 L_1 L1(margin loss),然后将该图片标签对应的Capsules输入到重构网络中,在重构网络的最后一层获得重构损失 L 2 L_2 L2(reconstruction loss),这个损失函数通过计算 FC Sigmoid 层的输出像素点与原始图像像素点间的欧几里德距离而得到。最后将两个损失函数合并为最终的损失函数: L o s s = L 1 + μ L 2 Loss=L_1+μL_2 Loss=L1+μL2论文还按 0.0005 的比例缩小重构损失(即取 μ μ μ=0.0005),以使它不会主导训练过程中的 Margin loss。

参考链接

  • https://blog.csdn.net/uwr44uouqcnsuqb60zk2/article/details/78463687
  • https://www.zhihu.com/question/67287444/answer/251241736
  • https://arxiv.org/abs/1710.09829

你可能感兴趣的:(NLP)