背景
传统的卷积神经网络因为全连接层会丢失位置空间信息,而池化层又会损失掉一部分信息,所以Hinton提出了胶囊网络,这里我介绍的这篇是以向量为输入输出,后面Hinton还写了一篇文章《matrix capsules with em routing》是以矩阵作为胶囊网络的输入。
胶囊网络介绍
胶囊网络不再以卷积神经网络中特征图的形式,而是以向量作为输入和输出,向量的长度表示某种目标特征,方向代表目标的存在。整个模型分为encoder和decoder部分。
Encoder
Encoder部分示例图如下:
以mnist为例:
输入28*28*1图像,经过第一个卷积层,卷积层为256个9*9,输出20*20*26;
第二层为PrimaryCaps层,32个胶囊组成,每个胶囊含有步长为2的9*9*256的卷积核,输入为20*20*256的张量,输出为6*6*256,这时候reshape成6*6*8*32的张量,然后利用sqush将张量的大小压缩到[0,1],为什么压缩到0-1在后面的公式部分有讲解;
第三层为DigitCaps,为10个数字胶囊,每个数字胶囊的激活向量模长说明每个类的实例是否存在,并且用来计算分类损失,上一层的胶囊层和DigitCaps层可以认为是全连接。这里用到的为margin loss,允许多个类存在,如果第k个类存在,Tk=1,否则为0,相应的计算出loss值。
整个模型中的特色就在于胶囊网络那一块,在胶囊网络部分需要迭代多次,整个过程可以看作是仿射变换、标量加权求和、非线性激活函数的过程,对于来自浅层的胶囊的输入张量u,主要的过程如下图所示:
模型中的一个很重要的思想是动态路由算法,动态路由算法负责更新耦合系数c,主要过程如下:
在动态路由过程中,刚开始将b全部设置为0,对于每次迭代,首先将b做softmax激活,得到耦合系数c,其中的softmax激活是自定义的一种激活,公式如下:
这时候,胶囊i到i 1层的胶囊耦合系数都是相同的。然后将这个耦合系数和接收到的所有输入u加权求和得到s,但是这时候利用squash函数将整个计算完的向量长度缩减到0-1,
当s特别小的时候,v会趋近于0,当s特别大的时候,v会趋近于1,这样相当于进行了非线性变换得到v,利用v值通过b uv的方式进行更新b值,迭代r次就可以返回胶囊的输出v。
Decoder
Decoder部分中,主要是3个全连接层,用来重构图像,最后的输出为28*28大小。
实验结果及优缺点
在mnist数据集上实现了最好的结果,但是在cifar-10上发现效果没有达到top的结果。
后面Hinton针对mnist数据集,做了重叠的实验,发现胶囊网络对重叠拥挤的场景有较好的识别和解释,同时胶囊网络需要的数据量少,相对于传统卷积神经网络胶囊网络在较少的数据量上也可以实现非常高的正确率,能够解释物体的不同角度,但胶囊网络的计算量太大,没有进行权值共享,或dropout等操作,训练时间太长,主要的优化方法针对两部分,第一是胶囊网络的结构改进,如何更加精准的输出到下一个网络,或者改进胶囊的数量或者模型的结构,第二种方法是改进动态路由的算法,如何减少计算量同时又达到更好的效果。