『CapsNet』胶囊网络

一、卷积网络的不足之处

卷积神经网络虽然表现的很优异,但是针对于旋转或元素平移等变换后的图片,却无法做到准确提取特征。

比如,对下图中字母 R 进行旋转、加边框,CNN 会错误地认为下图的三个 R 是不同的字母。
在这里插入图片描述
如下图,有两张图片,它们都是由一个椭圆的轮廓、眼睛、鼻子和嘴巴组成。CNN 可以轻而易举地检测到两张图片上的这些特征,并且认为它检测到的是脸。但显然右边图片的眼睛和嘴巴位置改变了,但是 CNN 仍然识别为一张正常的人脸,它没有处理好子元素之间的位置关系。
在这里插入图片描述
这就引出了位姿的概念。位姿结合了对象之间的相对关系,在数值上表示为 4 维位姿矩阵。三维对象之间的关系可以用位姿表示,位姿的本质是对象的 平移旋转

相比 CNN,胶囊网络的另一大益处在于,它只需要学习一小部分数据,就能达到最先进的效果。从这个意义上说,胶囊理论实际上更接近人脑的行为。为了学会区分数字,人脑只需要几十条数据,最多几百条数据,而 CNN 则需要几万条数据才能取得很好的效果。

此外,CNN 输出单个标量表示结果,而胶囊可以输出向量作为结果。CNN 使用卷积层获取特征矩阵,为了在神经元的活动中实现视角不变性,通过最大池化方法来达成这一点。但是使用最大池化的致命缺点就是丢失了有价值的信息,也没有处理特征之间的相对空间关系。 但是在胶囊网络中,特征状态的重要信息将以向量的形式被胶囊封装。

二、Capsule 定义

Capsule 是一个拥有多个神经元的载体,每个 Capsule 识别一个有限的观察条件和变形范围内的视觉实体,并输出一组的实例化参数和其显著性程度值(即该实体存在的概率),该参数包含实体的精确的位置,颜色信息,以及形状的信息。其中视觉实体存在的显著性程度具有局部不变形(对实体种类的识别概率不会改变),而实例化参数具有等变性(实例化参数也会相应地变化)。

三、胶囊的工作原理

在这里插入图片描述
在这里插入图片描述
CNN: 人造神经元可以用如下3个步骤来表示:

step 1: 输入标量的标量加权: w i x i + b w_{i}x_{i}+b wixi+b
step 2: 加权输入标量之和: a j a_{j} aj = ∑ i w i x i + b \sum_{i}w_{i}x_{i}+b iwixi+b
step 3: 标量到标量的非线性变换: h j h_{j} hj = f   ( a j ) f\ (a_{j}) f (aj)

CapsNet: 胶囊具有上面 3 个步骤的向量版,并新增了输入的仿射变换这一步骤:

step 1: 输入向量的矩阵乘法
step 2: 输入向量的标量加权
step 3: 加权输入向量之和
step 4: 向量到向量的非线性变换

激活函数:

在这里插入图片描述

3.1 输入向量的矩阵乘法

胶囊接收的输入向量(上图中的 U 1 U_1 U1 U 2 U_2 U2 U 3 U_3 U3)来自下层的 3 个胶囊。这些向量的长度分别编码下层胶囊检测出的相应特征的概率。

3.2 输入向量的标量加权

在这里插入图片描述

  • 如上图所示,左右两个方形区域分别是两个高层胶囊 J 和 K,方形区域内的点是低层胶囊输入的分布。一个低层胶囊通过调整权重 C 来“决定”将它的输出发送给哪个高层胶囊。调整方式是胶囊在发送输出前,先将输出乘以这个权重,然后发送给与结果更匹配的高层胶囊。
  • 低层胶囊通过加权把向量输入高层胶囊,同时高层胶囊接收到来自低层胶囊的向量。所有输入以红点和蓝点表示。这些点聚集的地方,意味着低层胶囊的预测互相接近。

关于权重注意事项:

  1. 权重均为非负标量。
  2. 对每个低层胶囊 i 而言,所有权重的总和等于 1(经过 softmax 函数加权)。
  3. 对每个低层胶囊 i 而言,权重的数量等于高层胶囊的数量。
  4. 这些权重的数值由迭代动态路由算法确定。

对于每个低层胶囊 i i i 而言,其权重定义了传给每个高层胶囊 j j j 的输出的概率分布。

3. 加权输入向量之和

这一步表示输入的组合,和通常的人工神经网络类似,只是它是向量的和而不是标量的和。

4. 向量到向量的非线性变换

CapsNet 的另一大创新是新颖的非线性激活函数,这个函数接受一个向量,然后在不改变方向的前提下,压缩它的长度到 1 以下。

三、囊间动态路由

低层胶囊将其输出发送给对此表示“同意”的高层胶囊。这是动态路由算法的精髓。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 伪代码的第一行指明了算法的输入:低层输入向量经过矩阵乘法得到的 û,以及路由迭代次数 r。最后一行指明了算法的输出,高层胶囊的向量 V j V_{j} Vj
  • 第 2 行的 b i j b_{ij} bij 是一个临时变量,存放了低层向量对高层胶囊的权重,它的值会在迭代过程中逐个更新,当开始一轮迭代时,它的值经过 softma x转换成 c i j c_{ij} cij。在囊间动态路由算法开始时, b i j b_{ij} bij 的值被初始化为零(但是经过 softmax 后会转换成非零且各个权重相等的 c i j c_{ij} cij)。
  • 第 3 行表明第 4-7 行的步骤会被重复 r 次(路由迭代次数)。
  • 第 4 行计算低层胶囊向量的对应所有高层胶囊的权重。 b i b_{i} bi 的值经过 softmax 后会转换成非零权重 c i c_i ci 且其元素总和等于1。如果是第一次迭代,所有系数 c i j c_{ij} cij 的值会相等。例如,如果我们有 8 个低层胶囊和 10 个高层胶囊,那么所有 c i j c_{ij} cij 的权重都将等于0.1。这样初始化使不确定性达到最大值:低层胶囊不知道它们的输出最适合哪个高层胶囊。当然,随着这一进程的重复,这些均匀分布将发生改变。
  • 第 5 行,那里将涉及高层胶囊。这一步计算经前一步确定的路由系数加权后的输入向量的总和,得到输出向量 s j s_j sj
  • 第 7 行进行更新权重,这是路由算法的精髓所在。我们将每个高层胶囊的向量 v j v_j vj 与低层原来的输入向量 û 逐元素相乘求和获得内积(也叫点积,点积检测胶囊的输入和输出之间的相似性(下图为示意图)),再用点积结果更新原来的权重 b i b_i bi。这就达到了低层胶囊将其输出发送给具有类似输出的高层胶囊的效果,刻画了向量之间的相似性。这一步骤之后,算法跳转到第 3 步重新开始这一流程,并重复 r 次。

四、损失函数

  • 将一个 10 维 one-hot 编码向量作为标签,该向量由 9 个零和 1 个一(正确标签)组成。在损失函数公式中,与正确的标签对应的输出胶囊,系数 T c T_c Tc 为 1。

在这里插入图片描述

  • 如果正确标签是 9,这意味着第 9 个胶囊输出的损失函数的 T c T_c Tc 为 1,其余 9 个为 0。当 T c T_c Tc 为 1 时,公式中损失函数的右项系数为零,也就是说正确输出项损失函数的值只包含了左项计算;相应的左系数为 0,则右项系数为 1,错误输出项损失函数的值只包含了右项计算。

五、编码器

在这里插入图片描述

  1. 输入图片 28x28 首先经过 1x256x9x9的 卷积层获得 256 个 20x20 的特征图;
  2. 用 8 组 256x32x9x9(stride=2) 的卷积获得 8 组 32x6x6 的特征图;
  3. 将获取的特征图向量化输入 10 个胶囊,这 10 个胶囊输出向量的长度就是各个类别的概率。

特征图转换成向量实际的过程,是将每组二维矩阵展开成一维矩阵(当然有多个二维矩阵则展开后前后拼接);之后再将所有组的一维矩阵在新的维度拼接形成向量(下图为示意图)。根据下面这个思路把 8 次卷积缩小到了一次卷积,本质上脱离循环只用 split 和 concat 方法直接向量化,加快了训练效率。

在这里插入图片描述

六、解码器

在这里插入图片描述

解码器从正确的胶囊中接受一个 16 维向量,输入经过三个全连接层得到 784 个像素输出,学习重建一张 28×28 像素的图像,损失函数为重建图像与输入图像之间的欧氏距离。

猜你喜欢

转载自blog.csdn.net/libo1004/article/details/111033576