Dynamic Routing Between Capsules笔记

 *摘要

  胶囊是一组神经元,其激活向量表示特定类型实体(例如对象或对象部分)的实例化参数。我们使用激活向量的长度来表示实体存在的概率及其方向表示实例化参数。在一个水平上的激活胶囊通过转化矩阵对较高水平胶囊的实例化参数进行预测。 当多个预测一致时,更高级别的胶囊被激活。实验表明,对于一个识别训练,多层胶囊系统在MNIST上实现了最先进的性能,并且在识别高度重叠的数字方面比卷积网好得多。 为了实现这些结果,我们使用迭代逐个路由机制:较低级别的胶囊将其输出发送到活动向量具有大的标量积的更高级别的胶囊,其预测来自较低级别的胶囊。

理解:   胶囊本质——一组神经元       激活向量——不太理解【长度:实体存在的概率;方向:实例化参数】

           迭代路由机制——逐层传递

1.概述

  人类视觉通过使用仔细确定的固定点序列来忽略不相关的细节,以确保只有极小部分的光学阵列以最高分辨率进行处理。对于来自固定序列的场景知识和从单一固定中收集的到的理解了多少,自省(Introspection)是不太好的指导,但是在本篇论文里,我们将假设一个单一固定给我们的不仅仅是一个单一的确定的对象和其属性。我们假设我们的多层视觉系统在每个固定上创建了一个解析树结构,并且我们忽略了这些单一固定的解析树是如何在多个固定之间协调的问题。

   解析树通常通过动态分配内存来动态构建。然而,我们假设,对于单一的固定,解析树是从一个固定的多层神经网络中雕刻出来的,就像雕刻从岩石上雕刻出来的一样。每层将被分成许多小组神经元,称为“胶囊”(Hinton等人[2011]),并且解析树中的每个节点将对应于激活胶囊。使用迭代路由过程中,每个激活胶囊将在上面的图层中选择一个胶囊作为其树中的父节点。 对于视觉系统的高层次来说,这个迭代过程将解决将部分分配给整体的问题。

      理解:解析树 —— 从多层神经网络中抽取【每层网络被分成多组神经元,每个组称为胶囊】,解析树的一个节点就是一个胶囊,父节点就是该层胶囊在其上层中选择的某个胶囊。

    一个激活胶囊里的神经元的活动表示呈现在图像中的特定实体的各种属性。这些属性可以包括实例化参数的不同类型,如姿势(位置,大小,方向)、形变、速度、反射率、色调、纹理等等。一个非常特殊的属性是图像中实例化实体的存在。表示存在的一个明显的方法是用一个单独的逻辑单元,他的输出是实体存在的概率。在本文中,我们探讨一种用实例化参数向量的总长度去表示实体的存在,并强制使用向量的方向来表示实体的属性的有趣的迭代。我们通过应用一个非线性让向量的方向不变,但是大小改变,从而保证了一个胶囊向量输出的长度不能超过1。

      理解:激活向量——激活胶囊里的神经元活动,实例化参数向量,长度表示实体存在的概率(不超过1),方向表示实体的各属性        实体:例如某张图像中的树或者房子或者人等等      实例化参数:表示该实体(树)的属性,如高度,位置等

     事实上,一个胶囊体的输出是一个向量,这使得它可以用一个强大的动态路由机制来确保胶囊的输出发送到上一层的父节点。最初,输出被路由到所有可能的父节点,但是被耦合系数缩减为总数为1。对于每一个可能的父类,胶囊通过将其自身输出乘以一个权重矩阵来计算一个“预测向量”。如果这个预测向量与一个可能的父类输出的一个大的标量积,那么就有一个自上而下的反馈,增加该父类的耦合系数,并减少其他父节点的耦合系数。这增加了胶囊对于父节点的贡献,从而进一步增加了父节点输出和胶囊预测的标量积。这种类型的“路由协议”要比最大池化实现的最原始的路由方式更加有效,它允许一个层中的神经元忽略除了下面一层的局部池化中最活跃的特征检测器外的全部。我们证明了我们的动态路由机制是一个可以用于解释高度重叠的目标分割的有效方法。

理解:

         

    卷积神经网络(CNNs)使用变特征检测器学习到的变换副本。这使得它们能够将图像中的一个位置获取的好的权重值的知识变换到其他位置。这在图像解释中是非常有用的。尽管我们正在用向量-输出胶囊取代CNNs的标量-输出特征检测器,用路由协议取代最大池化,但是我们仍然希望在整个空间中复制知识。为了达到这个目标,我们让除了胶囊最后一层外的其它层做卷积。和CNNs一样,我们用更高层的胶囊覆盖图像的更大区域。然而,不同于最大池化,我们不会丢弃该区域内实体的精确的位置信息。对于低层胶囊,位置信息是通过“位置-编码(place-coded)”胶囊来激活。当我们提高到更高层,越来越多的位置信息是一个胶囊的输出向量实际值分量中的“速度-编码(rate-coded)”。从位置编码到速度编码的转变,再加上更高层的胶囊表示随着更高自由度的更加复杂的实体的事实,表明随着向更高层的提升,胶囊体的维数会增加。

2.如何计算胶囊的矢量输入和输出

   有很多种可能的方法来实现胶囊的一般概念,本文的目的不是探索这整个空间,而是简单地说明一个相当简单的实现是有效的,并且可以用动态路由来帮助。我们用一个胶囊的输出向量的长度表示胶囊所代表的实体在当前的输入中存在的概率。因此,我们使用一个非线性的“挤压(squashing)”函数来确保短向量压缩到接近于0的长度,且长向量被压缩到略低于1的长度,我们让它进行识别学习来好好的利用这个非线性。

                                                                              (1)

    其中,是胶囊j的向量输出,是其总输入。

  除了胶囊体的第一层外的其他层,一个胶囊的总输入是来自于低一层的胶囊所有“预测向量”的一个加权总和,且是通过用一个权重矩阵乘以一个低一层的胶囊的输出得到。

                                                 (2)

  其中 ,是由迭代动态路由过程决定的耦合系数。胶囊i和高一层的所有胶囊间的耦合系数总和为1,并且是由“路由softmax”决定,该“路由softmax”初始逻辑是对数先验概率(log prior probabilities),即胶囊i应该与胶囊j耦合

                                                                                        (3)

   同一时间的对数先验可以作为所有其他权重来进行有区别地学习。它们取决于两个胶囊的位置和类型,而不是取决于当前的输入图像。然后,初始耦合系数通过测量更高一层中每个胶囊j的当前输出和胶囊i的预测间的一致性(agreement)来重复细化(refined)。

     一致性仅仅是标量积。这种一致性被认为是一个对数似然比,并在对连接胶囊i和更高层胶囊的所有耦合系数计算新值之前,这种一致性被添加到初始逻辑
   在卷积胶囊层中,每个胶囊对高一层中的胶囊的每种类型输出一个向量的局部网格,并对于网格的每一部分和胶囊的每种类型使用不同的变换矩阵。

理解:胶囊j输出计算步骤: 为低一层的胶囊输出向量,对于l层的胶囊i和l+1层的胶囊j,初始逻辑赋值为0

                                           a. 计算耦合系数:利用初始逻辑计算得到

                                           b. 计算预测向量:从胶囊i到胶囊j的预测向量通过胶囊i的输出与权重矩阵相乘得到

                                           c. 计算总输入:将低一层的所有胶囊的预测向量加权求和,为权重系数

                                           d. 得到胶囊j的输出向量:利用公式(1)压缩

                                           e. 更新:将一致性标量积添加到初始逻辑中更新

                                        重复上述步骤r次,最终得到胶囊j输出

          第一步初始化为0后计算得到的胶囊j和上层所有胶囊i间的耦合系数都相等,也就是说初始化时假定了l层所有胶囊向量对于l+1层胶囊j的贡献相同,通过不断迭代更新,和高层胶囊j相似的低层胶囊权重越来越大,这个胶囊就只贡献于它认定的下一层某个胶囊j的了。

 3. 数字存在的边缘损失

      我们使用实例化向量的长度来表示一个胶囊的实体存在的可能性。当且仅当图像中有数字时,我们想要得到数字类k的顶层的胶囊来获取一个长的实例化向量。为了允许多个数字,我们对每个数字胶囊k使用一个单独的边缘损失

               (4)

     其中,对于一个类k的数字表示为。对于缺少数字的类别的损失的向下加权从缩减所有数字胶囊体的活动向量的长度停止了初始的学习。我们用。总的损失简单的认为是所有数字胶囊的损失的总和。

理解:不太懂3

4. Capsnet架构

   一个简单的CapsNet架构如图1所示。架构可以简单的表示为仅有两个卷积层和一个全连接层组成。Conv1有256个9×9个卷积核,步长为1和ReLU激活。该层将像素的强度/亮度(intensities)转换为之后会用于作为基本胶囊(primary capsules)输入的局部特征探测器的激活。

    基本胶囊是多维实体的最低层,并且来自于一个相反的图形视角,激活初始胶囊体对应于反向表现过程。这是一个非常不同的计算方式,不是胶囊被设计用来擅长做的事情,将实例化的部件组合在一起以形成熟悉的整体

    第二层(PrimaryCapsules)是一个卷积的胶囊层,卷积的8维胶囊的32个通道(即每个基本胶囊包含8卷积单元,用一个9×9的核和一个2的步长)。每个初始胶囊的输出看作是所有256×81 Conv1单元,这些单元可以容纳与胶囊的中心位置重叠的区域。总的PrimaryCapsules有[32×6×6]胶囊输出(每个输出都是8维向量),每个胶囊都在[6×6]的网格中互相共享权重。PrimaryCapsules作为卷积层用公式1表示,作为其的块非线性。最终层(DigitCaps)有每个数字类是一个16维,这些胶囊的每一个都是从低一层的所有胶囊中接收到输入。

     我们仅仅有两个连续的胶囊层之间的路由(即PrimaryCapsules和DigitCaps)。由于Conv1的输出是1维,在它的空间里没有任何方向可以达成一致。因此,用于Conv1和PrimaryCapsules之间。所有的路由模型()初始化为到0。因此,最初的一个胶囊输出()是发送到所有有相等的概率()父胶囊体()。我们是在TensorFlow(Abadiet al. [2016])进行实验,并且我们使用有着TensorFlow默认参数的Adam优化器(Kingmaand Ba [2014]),包括指数衰减的学习率,去最小化方程4中的边缘损失的总和。

      

    图1一个简单的三层CapsNet。这个模型给了深度卷积网络可比较的结果(如Changand Chen [2015]),DigitCaps层中的每个胶囊的激活向量的长度表示每个类的实例的呈现,并且是用于计算分类损失。是PrimaryCapsule中每个间的一个权重矩阵,且

理解:

         第一层:普通卷积层,输入:28*28*1 大小的图像,卷积核大小9 * 9,步长1 * 1,256个通道,无填充,使用ReLu激活函数,参数数目为【9 * 9 * 256 +256(权重+偏差)】,输出:20 * 20 * 256的特征图。

           第二层:PrimaryCaps,作为 Capsule 层的输入而构建相应的张量结构。输入:20 * 20 * 256的特征图,卷积核大小9 * 9,步长2 * 2,32个通道,无填充,激活函数是公式(1)的压缩函数,【9* 9 *256 *32+ 8* 32】,输出:6 * 6 * 32 * 8 的向量。可以理解为8个并行的卷积层。我们先考虑 32 个(32 channel)9×9 的卷积核在步幅为 2 的情况下做卷积,那么实际上得到的是传统的 6×6×32 的张量,即等价于 6×6×1×32。因为传统卷积操作每次计算的输出都是一个标量,而 PrimaryCaps 的输出需要是一个长度为 8 的向量,因此传统卷积下的三维输出张量 6×6×1×32 就需要变化为四维输出张量 6×6×8×32。如下所示,其实我们可以将第二个卷积层看作对维度为 20×20×256 的输入张量执行 8 次不同权重的 Conv2d 操作,每次 Conv2d 都执行带 32 个 9×9 卷积核、步幅为 2 的卷积操作。每次卷积操作都会产生一个 6×6×1×32 的张量,一共会产生 8 个类似的张量,那么将这 8 个张量(即 Capsule 输入向量的 8 个分量)在第三个维度上合并在一起就成了 6×6×8×32。从上可知 PrimaryCaps 就相当于一个深度为 32 的普通卷积层,只不过每一层由以前的标量值变成了长度为 8 的向量。

   根据Capsule 定义相当于一组常见的神经元,这些神经元封装在一起形成了新的单元。在本论文讨论的 CapsNet 架构中,我们将 8 个卷积单元封装在一起成为了一个新的 Caosule 单元。PrimaryCaps 层以向量的方式预备输入到下一层 Capsule 单元中。

  PrimaryCaps 每一个向量的分量层级是共享卷积权重的,即获取 6×6 张量的卷积核权重为相同的 9×9 个。这样该卷积层的参数数量为 9×9×256×8×32+8×32=5308672,其中第二部分 8×32 为偏置项参数数量。

                               

          第三层:DigitCaps层,输入:6 * 6 * 32向量Ui,维度为[8,1],输出:Vj,维度为[16,1],j在0-9之间,代表胶囊的编号。即第二层共输出 6×6×32=1152 个向量,每一个向量的维度为 8,即第 i 层共有 1152 个 Capsule 单元。而第三层 j 有 10 个标准的 Capsule 单元,每个 Capsule 的输出向量有 16 个元素。前一层的 Capsule 单元数是 1152 个,那么 w_ij 将有 1152×10 个,且每一个 w_ij 的维度为 8×16。当 u_i 与对应的 w_ij 相乘得到预测向量后,我们会有 1152×10 个耦合系数 c_ij,对应加权求和后会得到 10 个 16×1 的输入向量。将该输入向量输入到「squashing」非线性函数中求得最终的输出向量 v_j,其中 v_j 的长度就表示识别为个类别的概率。
 参数:DigitCaps 层与 PrimaryCaps 层之间的参数包含两类,即 W_ij 和 c_ij。所有 W_ij 的参数数量应该是 6×6×32×10×8×16=1474560,c_ij 的参数数量为 6×6×32×10×16=184320,,并且DigitCaps层中用路由法则更新参数。

 4.1 一种正则化方法——重构
    我们使用额外的重建损失来鼓励数字胶囊去编码输入数字的实例化参数。在训练过程中,我们将除了正确数字胶囊的激活向量外的所有激活向量都屏蔽掉。然后,我们用这个激活向量重建输入图像。数字胶囊的输出被送入一个由3个全连接层组成的解码器,模拟像素强度如图2所示。我们最小化逻辑单元和像素强度输出间的平方差异的总和。我们用0.0005缩小重建损失,以至于它在训练中不是边缘损失的主要部分。如图3所示,来自CapsNet的16维重建是稳定的,但是只保留了重要细节。
   图2.重建一个来自DigitCaps层表示的数字的解码结构。图像间的欧式距离和Sigmoid层的输出在训练中最小化。我们用正确的标签在训练中作为重建目标。

                               

理解在训练期间,除了特定的Capsule输出向量,将其它的输出向量置为0;然后经过三层FC + Sigmoid重构图片,重构部分可以帮助我们直观感受到当DigitCaps layer的输出向量某一维向量发生改变后重构图片发生的变化可以得出对应维度表示的特殊含义。

           

猜你喜欢

转载自blog.csdn.net/qq_37386541/article/details/80879719
今日推荐