1.简介
视觉系统通常在图片的所有区域使用同样的知识,卷积神经网络正是基于这样的事实。这种原理是通过绑定特征检测器的权值来实现的,在此基础上,在图片的一个位置学到的知识,亦可以在图像的其他地方使用。卷积胶囊(Convolutional capsule)通过加入“局部-整体”关系来扩展这种不同位置之间的知识共享,这种“局部-整体”关系用来描述一种相似的形状。视角(Viewpoint)变换通常与像素强度有复杂的关系,但是对于姿态矩阵(Pose matrix)这种表示物体与观察者之间的关系的矩阵来说,视角变换对应的是姿态矩阵上的简单的线性关系。设计胶囊的目标是利用这种潜在的线性关系,以便处理视角变换以及提升分割决策。
胶囊使用高维共因子滤波:相似的物体是通过寻找“投票”(vote)之间的一致性来完成,其中“投票”是针对其姿态矩阵的,同时,投票来自那些已经被检测的部分。一个投票是由自身的姿态矩阵乘以一个变换矩阵(Transformation matrix)得来,其中变换矩阵代表了“局部-整体”的视角不变性(Viewpoint invariant relaitionship)。变换矩阵是一个可学习的矩阵。当视角变化时,整体的姿态矩阵和局部的姿态矩阵将同步变化,所以同一物体的不同部分的投票将保持一致。
将部分映射到一个整体的方法之一是在看似无关的高维投票集合中寻找紧致簇,这是一种非平凡的过程,因为我们无法像低维变换空间中那样将空间网格化以便使用卷积操作,在高维的投票集合中,无法将空间网格化进行卷积。为了解决此问题,我们使用了一种快速的迭代过程——“一致路由”。一致路由根据各个部分对一个整体的投票之间的相似性来更新部分映射到整体的概率。这是一种有效的区分准则,该准则允许形状相似的知识驱动区分,而不仅仅是利用诸如相似性或者颜色、速率的相似性等低维特征。胶囊神经网络与标准的神经网络之间的一个重要的不同是胶囊神经网络的激活输出是基于多种姿态预测输入之间的比较,而标准的神经网络的一个激活输出是基于一个单一的输入向量与一个可学习的参数向量之间的比较。
2.胶囊如何工作
神经网络通常使用简单的非线性性,典型的一种非线性使用是在一个线性滤波器输出的标量上使用一个非线性函数。有时也会使用softmax非线性函数,这种函数可将向量的对分数转换为向量的概率。胶囊神经网络使用更为复杂的非线性过程,这种非线性过程可将一层中的激活概率以及该层中的姿态矩阵转换为下一层的激活概率以及姿态矩阵。
一个胶囊网络通常是由几层胶囊构成。记第层的胶囊集合为,每个胶囊都有一个4×4的姿态矩阵以及一个激活概率,它跟普通神经网络中的激活很像:都是基于当前输入且不会存储。在第层的第个胶囊与第层的第个胶囊之间是一个4*4的可训练的变换矩阵 ,且在训练过程中各个 分开学习,该参数也是在训练过程中唯一需要存储的可训练参数。胶囊 的姿态矩阵 通过变换矩阵 生成一个对胶囊 的姿态矩阵的投票 。非线性路由过程以 和 为输入,其中,计算出第L+1层所有胶囊的姿态矩阵和激活输出。
非线性路由过程是期望最大化算法(Expectation-Maximization,EM)的一个版本。该过程迭代的进行修正均值、方差以及L+1层胶囊的激活概率,以及 之间的胶囊的连接概率。 在附录1中,我们给出了一致路由的直觉介绍,并且详细介绍它如何与混合高斯模型联系到一起。
3. 使用EM算法的一致路由技术
假设我们已经确定好了某一层的所有胶囊的姿态矩阵以及激活概率,我们现在想确定高层胶囊中激活哪一个胶囊以及如何将低层的若干激活胶囊与高层的一个激活胶囊连接起来。每个高层胶囊对应一个高斯模型,每个低层激活胶囊的姿态矩阵(转换为向量)对应一个数据点(如果胶囊是部分激活,则对应部分数据点)。
根据最小描述长度原则,在决定是否激活一个高层胶囊之前,我们有个选择。选择0:如果我们不激活该胶囊,我们每个数据点承担一个固定的损失: ,该损失用于描述所有分配给高层胶囊的低层胶囊的姿态矩阵。这个损失是非确定先验均匀分布下数据点的概率密度函数的负对数。对于部分连接,我们只承担部分对应的损失。选择1:如果我们激活高层胶囊,则必须承担一个固定的损失 ,该损失用于编码高层胶囊的均值以及方差,此外,损失还用于编码高层胶囊处于激活状态的事实。处于激活态的胶囊还会承担额外的损失,用于描述低层均值与其预测值之间的差异,其中,高层胶囊的均值通过变换矩阵的逆矩阵生成预测值。计算描述数据点损失的一个更加简单的方法是在高斯分布下使用改数据点投票的负概率密度,该高斯分布由分配给他的高层胶囊拟合。这并不完全正确,原因见附录1,但是我们依然使用它因为计算量更少。选择0与选择1之间在损失上的区别在于在每次迭代求解高层胶囊的激活概率过程中,损失置于logistic函数中。附录1解释了为何使用logistic函数。
依据上述中选择1的有效近似,使用一个具有轴对称协方差矩阵的激活态胶囊描述一个数据点 的额外损失的方法是将描述投票 每个维度的代价(损失)的所有维度加起来,其结果是 ,其中 是向量化投票 的第 个分量的概率密度,其概率分布是第 个高斯模型,高斯模型的第 个分量的方差以及均值是 以及 。此外 是第 个胶囊的姿态矩阵的向量化版本。
将胶囊 的所有低层胶囊的第 维加起来,可以得到:
其中 是分配给胶囊 的数据量,是 的第 维。激活胶囊 将增加分配给胶囊 的低层胶囊的平均值的描述长度。增加幅度从 每个胶囊到 每个胶囊,加上所有维度的损失,我们定义胶囊的激活函数:
其中 对于所有的胶囊都一致,是逆温度系数。我们分开训练 和 ,并将 作为一个超参数处理。
为了计算出L+1层胶囊的姿态矩阵和激活值,在确定L层的姿态矩阵以及激活值后,我们执行3轮EM算法。这个在一个胶囊层上执行的非线性过程是一种使用EM算法的聚类搜索算法,因此我们称之为EM 路由。
4. 胶囊网络架构
模型的总体架构如图1所示。模型开始处有一个 5×5的卷积核,32个通道(A=32)、步长为2。随后有一个ReLU的非线性函数。其他的层都是从基础胶囊层(Primary Capsule layer)开始的胶囊层。(B=32)基础胶囊层(Primary Capsule layer)中的32个胶囊的每个胶囊都有一个4×4的姿态矩阵,该矩阵是一个从低层胶囊某个位置中心的ReLU函数到输出的线性变换。该线性变换是可训练的。低层ReLU函数的输出与权值进行点积运算后,再进行sigmoid函数运算,以此生成基础胶囊的激活输出。
基础胶囊层后面跟着两个卷积胶囊层(K=3),每个卷积胶囊层都有32个胶囊(C=D=32),其中卷积胶囊的步长(stride)分别是2和1。最后一层是胶囊层,该层每个胶囊都有一个类别输出。
当从最后一层卷积胶囊到最终的胶囊层连接时,我们不想丢弃卷积胶囊的任何关于位置的信息,考虑到这样一个事实:所有的同类型的胶囊从不同位置抽取相同的实体,为此,我们在同一个胶囊的不同位置共享一个变换矩阵,并且将每个胶囊的感受野中心坐标(行,列)加到其投票矩阵的右手一列。我们称此技术为“坐标添加”。这个过程有助于这种共享的变换生成一个坐标,而该坐标则是实体相对于胶囊感受野的精细的相对位置。
路由过程用于每个邻接的胶囊层。对于卷积胶囊层,每个L+1层的胶囊只对在其感受野之内的L层胶囊反馈信号。因此,每个L层的胶囊实体最多接受L+1层的 kernal_size×kernal_size个胶囊的反馈。在图像边缘的实体接受更少的反馈,而角落里的胶囊则只接受L+1层的一个胶囊的反馈信号。
4.1 Spread 损失
为了使模型对初始化以及超参数更加鲁棒,我们使用 “Spread损失”来最大化目标分类()的激活输出与其他分类的激活输出之间的间距。如果一个错误分类 的激活与 的间距比分类间距 (margin)更小,则添加一个与间距m的二次距离罚项:
通过以0.2的间距开始,在训练过程中线性增长到0.9,我们可以避免在早期训练中出现死亡胶囊(Dead Capsule)。Spread损失在m=1的时候与Hinge 损失等价。
Reference:
Appendix
1.最小描述长度原理(Minimum description length principle)
对于一组数据,如果要对其进行保存,为了节省空间,一般采用某种模型对数据进行编码压缩,然后在保存压缩后的数据。同样,为了以后能够正确恢复这些数据,还需要将用于编码压缩的模型也保存起来。因此,保存一组数据的总描述长度就是实例数据编码压缩后的长度加上模型的长度。而最小描述长度要做的事情就是,选择“恰当”的模型,使得数据总描述长度最小。
来源:知乎回答
2.EM 算法
网友评论