胶囊网络(CapsNet)是一个非常新颖的创新型深度学习网络。该技术于 2017 年 10 月底在 Sara Sabour、Nicholas Frost 和 Geoffrey Hinton 发表的一篇名为“Dynamic Routing Between Capsule”的开创性论文中被提出。Hinton 是深度学习的先驱之一,因此,整个深度学习社区很高兴看到 capsule 带来的进展。
事实上,令人印象深刻的是 CapsNet 已经在 MNIST 分类中击败了最好的 CNN!那么 CNN 有什么问题呢?在 CNN 中,每一层都以渐进级别的粒度识别图像。正如在多个方法中描述的那样,第一层很可能会识别直线或简单的曲线和边,而后面的层将开始识别更复杂的形状,如矩形和更复杂的形式,如人脸。
当前用于 CNN 的一个关键操作是池化。池化旨在建立位置不变性,并且通常在每个 CNN 层之后使用以使任何问题在计算上易于处理。但是,池化引入了一个重要的问题,因为它迫使我们失去所有的位置数据。这是很不利的。想象一张脸:包含两只眼睛、一张嘴和一个鼻子,而重要的是这些部位之间有空间关系(嘴巴在鼻子下方,而鼻子通常在眼睛的下面)。
的确如此,Hinton 说:卷积神经网络中使用的池化操作是一个很大的错误,即使它运行得很好,也将是一场数据灾难。
从技术上讲,需要的不是位置不变性,而是等值性。等值是表明想要了解图像中的旋转或比例变化的一个特定术语,希望相应地调整网络。这样,图像中不同分量的空间定位就不会丢失。
那么胶囊网络有什么创新点呢?据作者说,大脑有被称为 capsule 的模块,每个 capsule 专门处理特定类型的信息。capsule 对于理解位置的概念、尺寸的概念、定向的概念、变形的概念、纹理等尤其有效。除此之外,作者推断大脑具有特别有效的机制,能将每条信息动态传输到 capsule。这被认为最适合用来处理特定类型的信息。
所以,CNN 和 CapsNet 之间的主要区别在于,CNN 不断添加用于创建深层网络的图层,而 CapsNet 将神经层嵌入另一个。一个 capsule 是一组神经元,它在网络中引入更多的结构,它产生一个矢量来表示图像中存在的一个实体。特别是,Hinton 使用活动矢量的长度来表示实体存在的概率和表示实例化参数的取向。当多个预测一致时,更高级别的 capsule 变得活跃。对于每个可能的父代,capsule 产生额外的预测矢量。
现在又有了一个创新:使用 capsule 的动态路由,不再使用原始的池化思想。较低级别的 capsule 更倾向于将其输出发送到较高级别的 capsule,而活动矢量与来自较低级别 capsule 的预测具有较高的标量乘积。具有最大标量预测矢量积的父代增加了 capsule 键。所有其他父代减少了它们的 capsule 键。
换句话说,这个想法是如果一个更高层次的 capsule 与更低层次的 capsule 达成了协议,那么它会要求发送更多的这种类型的信息。如果没有达成协议,它会要求发送更少的这种类型的信息。这种使用协议方法的动态路由优于当前的机制,如最大池化。根据 Hinton 所述,路由最终是解析图像的一种方式。确实,最大池化只关注了最大值,而动态路由通过低层和高层之间的协议有选择性地传递信息。
第三个区别是引入了一个新的非线性激活函数。CapsNet 并没有像在 CNN 中一样为每个图层添加一个压缩函数,而是将一个压缩函数添加到一个嵌套的图层集合中。非线性激活函数如下所示,它被称为压缩函数:
其中,vj 是 capsule j 的矢量输出,sj 是它总的输入。
此外,Hinton 等人也表明:一种有差别训练的多层 capsule 系统在 MNIST 上实现了最新的性能,并且在识别高度重叠的数字方面比卷积网络好得多。文章“Dynamic Routing Between Capsules”展示了简单的 CapsNet 架构:
该架构非常浅显易懂,只有两个卷积层和一个全连接层。Conv1 有 256个9×9 卷积核,它的步长为 1,由 ReLU 激活。该层的作用是将像素强度转换为局部特征检测器的活动,然后将其作为 PrimaryCapsules 的输入。PrimaryCapsules 是一个 32 通道的卷积 capsule 层;每个主 capsule 包含 8 个卷积单元,带有一个 9×9 内核,步幅为 2。
总之,PrimaryCapsules 有 [32,6,6] capsule 输出(每个输出是一个 8D 矢量),[6,6] 网格中的每个 capsule 共享彼此的权重。最后一层(DigitCaps)在每个数字类中有一个 16D capsule,这些 capsule 中的每一个都接收来自下面所有其他 capsule 的输入。路由只产生在两个连续的 capsule 层(如 PrimaryCapsules 和 DigitCaps)之间。
CapsNet 与最先进的深度学习网络是不同的,它使用浅层网络,让 capsule 层嵌套在其他层中,而不需要增加更多的层和让网络深层次化。每个 capsule 被用于检测图像中的特定实体,一个动态的路由机制将检测到的实体发送给父层。对于 CNN 来说,要从不同角度识别一个物体,你必须从很多不同的方面来考虑成千上万的图像。Hinton 认为,这些层次中的冗余将会使 capsule 网络能够从多个角度和在不同情况下识别物体,相比 CNN,使用的数据更少。
检验一下 Tensorboard 所示的网络:
令人印象深刻的结果如下图所示:
3 个路由迭代的 CapsNet 的样本 MNIST 测试重构。(l,p,r)分别表示标签、预测和重构目标。最右边的两列表示一个失败案例的两个重构,它解释了模型是如何混淆在图像中的 5 和 3 的。其他的列都是由正确的分类获得的,它表明模型选取了细节而平滑了噪声。
这些图表取自公开发表的论文。CapsNet 在以前只能在深度网络中实现三层网络上的低测试误差(0.25%)。基线是具有 3 个卷积层的CNN具有256,256–128的通道。每个基线有 5×5 个内核,步幅为 1。最终的卷积层之后是两个大小为 328 和 192 的完全连接层。最后的全连接层连接到具有交叉熵损失的 10 类 softmax 层:
此表为 CapsNet 分类测试精度,MNIST 均值和标准差结果由 3 次试验获得。
看看差额损失、重构损失和总损失的减少情况:
看一下精确度的提高情况。经过 500 次迭代达到 92%,在 3500 次迭代中达到 98.46%: