人工神经元不应当追求神经元活动中的视角不变性,(使用单一的标量输出来总结一个局部池中的重要特征的检测器的活动)。而应当使用局部的胶囊,这些胶囊对其输入执行一些相当复杂的内部计算。然后将这些计算的结果封装成一个包含信息丰富输出的小向量,每个胶囊学习辨识一个有限的观察条件和变形范围内隐式定义的视觉实体,并输出实体在有限范围内存在的概率及一组实例参数。实例参数可能包含相对这个视觉实体的隐式定义的典型版本的精确的位姿、照明条件和变形信息。当胶囊工作正常时,视觉实体存在的概率具有局部不变性—当实体在胶囊覆盖的有限范围内外观流形上移动时,概率不会改变。实例参数确实等变的,随着观察条件的变化,实体在外观流形上移动时,实例参数也会相应地变化,因为实例参数表示实体在外观流形上的内在坐标。
当我们通过计算机图形渲染来构建对象时,我们需要指定并提供一些几何信息,比如告诉计算机在何处绘制对象,该对象的比例,角度以及其他空间信息。对象通常是通过参数设置来呈现的,而这些信息全部表示出来,是屏幕上的一个对象。但是,如果我们只是通过观察照片中的物体来提取信息,这就是胶囊网络的核心思想—逆渲染。在胶囊网络中,恰恰相反,网络是要学习如何反向渲染图像——通过观察图像、然后尝试预测图像的实例参数。胶囊网络通过重视其检测到的对象**,然后将重视结果与训练数据中的标记示例进行比较来学习如何预测。通过反复学习,它将可以实现较为准确的实例参数预测**。
一个胶囊网络是由胶囊而不是由神经元构成的,一个胶囊就是将原有大家熟知的神经网络中的个体神经元替换成了一组神经元组成的向量,这些神经元被包括在了一起。组成了一个胶囊。(注意:原文表述的胶囊是一组神经元,也就是说胶囊指的是一整层)它们可以学习在一个图片的一定区域内检查一个特定对象,(比如:一个矩形)。它输出是一个向量(例如:一个8维向量)。每个向量的长度代表了物体是否存在估计概率。它的方向,(例如在8维空间里)记录了物体的姿态参数,(比如精确的位置、旋转等)。如果物体有稍微的变化(比如移动、旋转、尺寸变化等),胶囊也将会输出一个长度相同但是方向稍微变化的向量,因此胶囊是等变的。
长度:物体是否存在的估计概率。
长度:记录了物体的姿态参数。
要理解胶囊网络,我们首先需要抛开对CNN架构的固有印象,因为Geoffrey Hinton实际上认为在CNN中应用pooling是一个很大的错误,它工作很好的事实是一场灾难(来自演讲)。在最大池化过程中,很多重要的信息都损失了,因为只有最活跃的神经元会被选择传递到下一层。而这也是层之间有价值的空间信息丢失的原因。当我们看到下图时,这看起来并不是一张十分正确的人脸图,虽然图中包含了人脸的每个组成部分,人类可以很容易的分辨出这不是一张正确的人脸。但是CNNS却很难判断,这不是一张真实的人脸,因为它仅仅看图像的这些特征,而没有注意这些特征的姿态信息。(CNN仅仅看图像的特征)
CNN着力于检测图像像素中的重要特征,考虑简单的人脸检测任务,一张脸是由代表脸型的椭圆、两只眼睛、一个鼻子和一个嘴巴构成,而基于CNN的原理,只要存在这些对象就有强的刺激,因此这些对象的空间关系反而没有那么重要。
如下图,右图不是人脸但都具备了人脸需要的对象,所以CNN有很大可能通过具有的对象激活了是人脸的判断,从而使得结果判断出错。

如下图,重新审视CNN的工作方式,高层特征是低层特征组合的加权和,前一层的激活和下一层神经元权重相乘且相加,接着通过非线性激活函数进行激活。在这么一个架构中,高层特征和底层特征的位置关系变得模糊,(还是没有一些很好的利用)而CNN解决这个问题的方法是通过最大池化层,(最大池化层或多或少得会丢失位置信息)。

胶囊网络解决这个问题的方法是实现对空间信息进行编码的同时也计算物体的存在概率,这可以用向量表示,向量的模表示特征存在的概率,向量的方向表示特征的姿态信息。
Cauple的工作原理是归纳成一句话就是,所有胶囊检测中的特征的状态的重要信息,都将以向量的形式被胶囊封装。
简单来说,可以理解成:


(胶囊利用向量形式考虑到其空间状态)
注意:参数
w
1
w1
w1和
w
2
w2
w2是需要被学习出来的,而
c
1
c1
c1和
c
2
c2
c2不是被学习出来的,而是由dynamic动态决定的(c的和为1)。
在传统神经网络中,一个神经元一般会进行如下的标量操作:
胶囊可以理解为上述四个步骤的向量版,同时增加了对输入的仿射变换。
输入向量的矩阵乘法
胶囊接受的输入向量:编码了低层胶囊检测出的相应对象的概率。
向量的方向:编码了检测出对象的一些内部状态。
仿射变换

接着将这些向量乘以相应的权重矩阵W,W编码了底层特征(例如:眼睛、嘴巴和鼻子)和高层特征(例如:面部)之间的空间关系和其他重要关系。
动态路由
神经元的权重是通过反向传播学习的,而胶囊则使用动态路由,这一过程使用权重 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8cKdDbRx-1637908330661)(https://www.zhihu.com/equation?tex=c)] 决定了(经过本层的权重矩阵投影处理后的)来自下层的向量将会如何进入高一层的向量,需要注意的是这一过程并不加入bias。
动态路由的关键在于权重系数如何确定,对于max pooling而言,只有一个值能够进入本层,显然对应的就是一个独热向量,而在这里我们通过一种类似聚类的方式对向量进行赋权重,称为基于一致程度的路由,
求和向量到输出向量的非线性变换(Squash)
胶囊神经网络的非线性激活函数接受一个向量,然后在不改变方向的前提下,将其长度压缩至1以下。


李宏毅:动态路由由剔除离群点的意思,类似于RNN的循环神经网络,最后训练的时候依旧使用backprop反向传播。
动态路由算法流程:




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

可见,在投影后的每个空间中较为合群的(接近中心簇的)向量权重将会提高,而反之则降低。由此可以提取出所有向量的主要特征。


两者最大的不同在于,胶囊网络中的神经元是一个整体,包含了特征状态的各类重要信息 , 比如长度、角度、方向等,而传统的CNN 里每个神经元都是独立的个体,无法刻画位置角度等信息 。这也就是为什么CNN通过数据增广的形式(对于同一个物体 ,加入不同角度、不同位置的图片进行训练),能够大大提高模型最后的结果 。
当前,每种任务都需要一个不一样的CNN架构。比如分类里的ResNet,物体检测里的YOLO,实例分割里的Mask R-CNN等。恩,是的。我们已经见到了很多神奇的CNN,但是。
跟传统的CNN相比,当前的胶囊网络在实验效果手写数字识别上取得了更好的结果,但是训练过程却慢了很多,因为动态路由过程消耗资源,算法含有内部循环;
无论什么类型的对象,在给定位置永远只有一个胶囊,所以胶囊网络不可能检测出两个非常靠近的同一类型的对象,叫做拥挤现象;
虽然CapsNet在简单的数据集MNIST上表现出了很好的性能,但并未在较大的网络上表现较好,比如在更复杂的数据集如ImageNet、CIFAR-10上表现欠缺,这是因为在图像中发现的信息过多会使胶囊脱落;
总体来看,胶囊网络仍然处于研究和开发阶段,并且不够可靠,现在还没有很成熟的任务。
迭代的动态路由算法进行更新的。