卷积神经网络取得了很大的成功,也很受欢迎。但是,它也不是适合所有的任务,架构上的一些缺陷,导致它并不能很好的完成一些任务。
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却很难判断这不是一张真实的人脸,因为它仅仅看图像中的这些特征,而没有注意这些特征的姿态信息。
胶囊网络(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胶囊网络的架构
编码器
编码器用于获取图像输入,并学习如何将图像表示为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