如何理解和使用胶囊网络

技术分享

作者:Aryan Misra

编辑:萝卜兔

卷积神经网络取得了很大的成功,也很受欢迎。但是,它也不是适合所有的任务,架构上的一些缺陷,导致它并不能很好的完成一些任务。

CNNs提取图像中的特征并通过特征学习识别物体。网络底层学习一般性特征,比如轮廓,随着层数的加深,提取的特征更加复杂,比如像眼睛、鼻子或者整张脸。然后,网络用它学习到的所有特征作出最后的预测。这里存在一个缺陷,在CNN中没有可用的空间信息,而用于连接的池化层,效率实际上也非常低。

Reddit上有Geoffrey Hitton关于pooling的看法。

在CNN中应用pooling是一个很大的错误,它工作得很好的事实是一场灾难。

最大池化

在最大池化过程中,很多重要的信息都损失了,因为只有最活跃的神经元会被选择传递到下一层,而这也是层之间有价值的空间信息丢失的原因。为了解决这个问题,Hinton提出使用一个叫做“routing-by-agreement”的过程。这意味着,较为底层的特征(手、眼睛、嘴巴等)将只被传送到与之匹配的高层。如果,底层特征包含的是类似于眼睛或者嘴巴的特征,它将传递到“面部”的高层,如果底层特征包含的是类似手指、手掌等特征,它将传递到“手”的高层。

这个完整的解决方案将空间信息编码为特征,同时使用动态路由(dynamic routing)。这由Geoffrey Hinton在NIPS2017提出,称为胶囊网络(Capsule Networks)。

胶囊

当我们通过计算机图形渲染来构建对象时,我们需要指定并提供一些几何信息,比如告诉计算机在何处绘制对象,该对象的比例,角度以及其他空间信息。而这些信息全部表示出来,是屏幕上的一个对象。但是,如果我们只是通过观察照片中的物体来提取信息呢?这就是胶囊网络(Capsule Network)的核心思想——逆渲染(inverse rendering)。

让我们一起来理解Capsules以及它是怎么解决提供空间信息的问题的。

当看到CNN是背后的逻辑时,我们开始注意到它的架构缺陷。看下图:

这看起来并不是一张十分正确的人脸图,虽然图中包含了人脸的每一个组成部分。人类可以很容易分辨出这不是一张正确的人脸,但是CNNs却很难判断这不是一张真实的人脸,因为它仅仅看图像中的这些特征,而没有注意这些特征的姿态信息。

CNN如何分类这张图像

胶囊网络(capsule networks)解决这个问题的方法是,实现对空间信息进行编码同时也计算物体的存在概率。这可以用向量来表示,向量的模表示特征存在的概率,向量的方向表示特征的姿态信息。

Capsule 的工作原理归纳成一句话就是,所有胶囊检测中的特征的状态的重要信息,都将以向量的形式被胶囊封装。

这里可以参照论文中关于胶囊网络的定义,论文地址:https://arxiv.org/pdf/1710.09829.pdf

在计算机图形应用程序中,比如设计或者渲染,对象通常是通过参数设置来呈现的。而在胶囊网络中,恰恰相反,网络是要学习如何反向渲染图像——通过观察图像,然后尝试预测图像的实例参数。

胶囊网络通过重现它检测到的对象,然后将重现结果与训练数据中的标记示例进行比较来学习如何预测。通过反复的学习,它将可以实现较为准确的实例参数预测。

论文Dynamic Routing Between Capsules中建议使用两个损失函数。主要是为了实现capsules之间的等效性。这意味着,在图像中移动特征会改变Capsule向量,但是不影响特征存在的概率。底层Capsules提取特征之后,就传递到匹配的更高层的Capsules。

胶囊网络分类人脸

如上图所示,所有特征的姿态参数用来决定最后结果。

胶囊内的操作

在传统神经网络里,一个神经元一般会进行如下的标量操作:

输入标量的标量加权;

对加权后的标量求和;

对和进行非线性变换生成新标量。

而在胶囊网络里面,这些操作有有一些的改变:

1、输入向量与权重矩阵的矩阵乘法。这编码了图像中低级特征和高级特征之间非常重要的空间关系。

2、加权输入向量。这些权重决定当前胶囊将其输出发送到哪个更高级的胶囊。这是通过动态路由(dynamic routing)的过程完成的。

3、对加权后的向量求和。 (这一点没什么差别)

4、非线性化使用squash函数。该函数将向量进行压缩使得它的最大长度为1,最小长度为0,同时保持其方向不变。

胶囊之间的动态路由

在路由(routing)过程中,下层胶囊将输入向量传送到上层胶囊。对于可以路由到的每个更高层的胶囊,下层胶囊通过将自己的输出乘上权重矩阵来计算预测向量。如果预测向量与上层胶囊的输出具有较大的标量积,则存在自顶向下的反馈,具有增加上层胶囊耦合系数,减小其他胶囊耦合系数的效果。

MNIST胶囊网络的架构

CapNet 架构

编码器

编码器用于获取图像输入,并学习如何将图像表示为16维向量,包含渲染图像所需要的所有信息。

1、Conv Layer——提取用于后续胶囊分析的特征。论文中包含大小为9*9*1的256个卷积核。

2、PrimaryCaps——这是下级胶囊层,包含32个不同的胶囊,每个胶囊将第8个9*9*256的卷积核用于之前卷积层的输出,并输出4D向量。

3、DigitCaps——上级胶囊层,使用动态路由的主要胶囊层,该层输出16D向量,包含重建对象所需要的实例化参数。

解码器

解码器架构

解码器从DigitCaps获取16D向量,并学习如何解码图像的实例参数。解码器与Euclidean distance损失函数一起使用,确定重建特征与实际特征的相似度。解码器是一个非常简单的前馈网络。

为什么要使用胶囊网络

虽然,CapsNet在简单的数据集MNIST上表现出了很好的性能,但是在更复杂的数据集如ImageNet、CIFAR-10上,却没有这种表现。这是因为在图像中发现的信息过多会使胶囊脱落。

胶囊网络仍然处于研究和开发阶段,并且不够可靠,现在还没有很成熟的任务。但是,这个概念是合理的,这个领域将会取得更多的进展,使胶囊网络标准化,以更好的完成任务。

https://towardsdatascience.com/capsule-networks-the-new-deep-learning-network-bd917e6818e8

>

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190118A05HS700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券