Dynamic Routing Between Capsules 笔记
胶囊神经网络,capsule network,capsnet
参考资料
1.论文:Sabour S, Frosst N, Hinton G E. Dynamic routing between capsules[J]. Advances in neural information processing systems, 2017, 30.
2.讲解视频:Capsule Networks (CapsNets) – Tutorial: https://www.youtube.com/watch?v=pPN8d0E3900
该视频的b站转载: https://www.bilibili.com/video/BV1RW411W7rv
Hinton亲自称赞该视频: “This is an amazingly good video. I wish I could explain capsules that well.”
3.pytorch代码: https://github.com/adambielski/CapsNet-pytorch
文章目录
简介
胶囊:描述(探测)某一特征的一组神经元。向量长度代表某特征出现的概率,向量方向体现了实例化参数。
胶囊的路由(routing)机制
设
u
i
u_i
ui是前胶囊的输出,我们首先通过乘一个参数得到“预测向量”(prediction vectors)
u
^
j
∣
i
\hat u_{j|i}
u^j∣i ,即
u
^
j
∣
i
=
W
i
j
u
i
\hat u_{j|i}=W_{ij}u_i
u^j∣i=Wijui
这一步如果将胶囊看作神经元,类似神经网络的全连接层,不同的是,下一步我们不只是将所有的
u
^
j
∣
i
\hat u_{j|i}
u^j∣i 简单相加,而是继续给它增加一个权重
c
i
j
c_{ij}
cij ,使系统学习到低层胶囊对高层胶囊影响的大小。
需要注意,这里如果 u i u_i ui 是标量,那么这两个参数可以简化为一个参数。而这里 u i u_i ui 是矢量,我们可以理解为 W i j W_{ij} Wij 调整了胶囊内部的权重, c i j c_{ij} cij 调节了胶囊间的权重。
现在只剩下一个问题待解决,那就是我们如何求权重 c i j c_{ij} cij ?答案也是这篇文章的精髓,路由机制:
路由机制的大概想法就是,增加最“像”输出的那个预测向量的权重,某种意义上是一种“注意”,达到了类似池化的效果,但是也并没有损失过多信息。
margin loss
目的:当某一特征(在这篇文章中使digit)出现,则输出向量的模长 ∣ ∣ v k ∣ ∣ ||v_k|| ∣∣vk∣∣尽量长(靠近1)
CapsNet网络结构
整体
- 卷积层
- primarycaps
- digitcaps
卷积层
普通二维卷积
primarycaps
二维卷积+重排+squash
digitcaps
作为primarycaps中胶囊的高层胶囊,使用前面介绍的传输机制搭建网络。
capsnets的正则方法
方法: 重建
目的: 鼓励digitcaps编码原始图像(类似自编码器的bottleneck层)
tricks:新增三个全连接层来解码,使用SE作为重构误差,并赋予重构误差一个较小的权重(相对于margin loss)
胶囊神经网络的优势
5.2: 对经过仿射变换的图像很稳定
6:分割高度重叠的digits效果很好