概述
Dynamic Routing Between Capsules
- CNN 的局限性
- 人类视觉识别
- CapsNets 到底是什么?
- 路由协议(Routing by agreement)
- CapsNet背后的数学
- 动态路由算法
- 路由算法优势
- 优点和缺点
- 参考链接
Capsule是一组 vector in vector out的神经元,每一个胶囊代表某一特定实体,如对象或对象部分.其向量模长代表实体存在概率,向量参数代表实体实例化参数.低级别Capsule向量通过变化矩阵实现对高级别Capsule实体参数进行预测.当多个预测一致时,该高级别Capsule会更加活跃,借由动态路由算法加强预测.
本文综合多篇中文和外文博客(原文链接均在参考链接中给出),结合自己理解转述而来,original paper by Hinton,原载于 https://tw19941212.github.io/
CNN 的局限性
- 需要大量训练数据(测试时只能识别已经训练的特征).Capsule能使用更少数据实现更好泛化
- 不能处理复杂场景(如特征重叠),而Capsule能很好处理复杂场景(crowded scenes,如数字重叠),因为Capsule能很好实现特征分配(通过动态路由)
- Pooling层丢失大量信息,降低了空间分辨率(spatial resolution),所以输出对输入的微小变化不敏感,这在需要细节信息的任务(语义分割)上是糟糕的.当然通过构建复杂CNN网络能恢复信息损失.而Capsule能精确捕捉细节信息(pose information,如角度,厚度,大小,位置等)而不是丢失后再恢复信息.因此微小输入变化导致输出变化,这被称为等效性(equivariance).因此Capsule能在不同的视觉任务使用相同且简单的结构.
- CNN需要额外的组件来自动识别不同物体属于哪个对象(如这个胳膊属于这只羊),而Capsule提供了对象的层次结构.
- CNN忽略结构信息,仅仅考虑’有没有’,而没有考虑feature map的结构关系,包含位置,角度等.
人类视觉识别
任何物体都是由多个更小的实体组成.例如,树由树干,树冠和树根组成.这些部分形成层次结构.树冠还包括树枝和树叶.
当我们看物体时,我们的眼睛就会形成一些固定点(fixation points),这些固定点的相对位置和性质有助于我们的大脑识别这个物体.因此,我们的大脑不必处理每个细节.只要看到一些树叶和树枝,我们的大脑就会认出树冠.并且树冠在树干上.结合这种层次信息,我们的大脑知道有一棵树.从现在开始,我们将对象的各个部分称为实体.(the parts of the objects as entities)
CapsNets 到底是什么?
简短的说,CapsNet由capsule(胶囊)而非神经元组成.胶囊是一小组神经元,其学习检测图像的给定区域内的特定对象(如矩形),并且输出向量(如8维向量).其长度表示对象存在的概率,其方向编码对象的姿势参数(如位置,旋转等).如果稍微改变输入对象(如移位,旋转,调整大小等),胶囊将输出相同长度的矢量,但方向略微不同.因此.胶囊具有等效性.
与常规神经网络相似,CapsNet也有多个层.最下层的胶囊称为主胶囊(primary capsules),它们中的每一个都接收图像的一小部分作为输入(receptive field),并且它试图检测特定图案的存在和姿势.更高层的胶囊(routing capsules)可以检测更大和更复杂的物体(如船只).
使用常规卷积层即可实现主要胶囊层.例如,论文中,使用两个卷积层,输出256个包含标量的6x6特征映射.重塑此输出以获得包含8维向量的32个6x6特征映射.最后,使用新颖的squash函数来确保这些向量的长度在0和1之间(表示概率).这给出了主胶囊的输出.
下一层中的胶囊也会尝试检测物体及其姿势,但工作方式却截然不同,使用称为路由协议的算法.
路由协议(Routing by agreement)
假设只有两个主要胶囊:一个矩形胶囊和一个三角形胶囊,并假设它们都检测实体.注意到矩形和三角形在船的姿势上是一致的,而他们对房子的姿势非常不同意.因此,矩形和三角形很可能是同一艘船的一部分.(值得注意的是实体的形状及整体/部分之间的关系是在训练中学习的)
由于现在确信矩形和三角形是船的一部分,因此将矩形和三角形胶囊的输出更多地发送到船舱中是有意义的,而对于房屋舱更少:这样,船舱将接收更有用的输入信号,房屋胶囊将收到更少的噪音.即在达成一致时增加路由权重,并在出现不一致时减少路由权重.
路由协议算法涉及一致性检测+路由更新的几次迭代(注意,这发生在每次预测中,而不仅仅是训练时,不仅仅是一次).这在拥挤的场景中尤其有用.在混淆场景中很可能会收敛到一个更好的解释:底部的船,顶部的房子.模糊性被’解释了’:下方的矩形最好用船的存在来解释,这也解释了下三角形,一旦解释了这两个部分,其余部分很容易被解释为房屋.
CapsNet背后的数学
假设层
l
l
l和
l
+
1
l+1
l+1分别具有
m
m
m和
n
n
n个胶囊.我们的任务是在给定层
l
l
l的激活向量下计算层
l
+
1
l+1
l+1处胶囊的激活向量.设
u
u
u表示第
l
l
l层胶囊的激活向量.我们必须计算
v
v
v,胶囊在
l
+
1
l+1
l+1层的激活向量。
对于层
l
+
1
l+1
l+1处的胶囊
j
j
j:
- 我们首先通过层 l l l处的胶囊计算预测向量.胶囊 i i i( l l l层)对胶囊 j j j( l + 1 l+1 l+1层)的预测向量由下式给出
u ^ _ j ∣ i = W _ i j u i boldsymbol{hat{textbf{u}}}_{j|i} = boldsymbol{textbf{W}}_{ij}boldsymbol{textbf{u}}_{i} u^_j∣i=W_ijui
W
i
j
W_ {ij}
Wij是权重矩阵
2. 计算胶囊
j
j
j的输出矢量.胶囊
j
j
j输出向量是胶囊层
l
l
lcapsules胶囊给出的所有预测向量的加权和
s j = ∑ i = 1 m c i j u ^ j ∣ i s_j = sum_{i=1}^{m}{c_{ij}boldsymbol{hat{textbf{u}}}_{j|i}} sj=i=1∑mciju^j∣i
标量
c
i
j
c_ {ij}
cij称为胶囊
i
i
i(
l
l
l层)对胶囊
j
j
j(
l
+
1
l+1
l+1层)之间的耦合系数.系数由迭代动态路由算法确定
3. 在输出向量上应用squashing函数来获得激活向量
动态路由算法
层
l
+
1
l+1
l+1的激活向量将反馈信号发送到层
l
l
l处的胶囊.如果胶囊
j
j
j(
l
+
1
l+1
l+1层)的激活向量与胶囊
i
i
i(
l
l
l层)的预测矢量一致,则它们的点积应该比较大.因此,预测向量的’权重’在
j
j
j的输出向量中增加.换句话说,那些贡献越大的预测向量在输出向量(激活向量)中具有更多的权重.循环持续4-5轮.(这像一种聚类算法,可以参考链接4)
低级别胶囊对高级别胶囊的的预测权重总和应该为1
c
i
j
=
exp
(
b
i
j
)
∑
k
exp
(
b
i
k
)
c_{ij} = frac{exp(b_{ij})}{sum_{k}{exp(b_{ik})}}
cij=∑kexp(bik)exp(bij)
显然
∑
k
c
i
k
=
1
sum_{k}{c_{ik}} = 1
k∑cik=1
logit
b
i
j
b_{ij}
bij表示胶囊
i
i
i(
l
l
l层)和胶囊
j
j
j(
l
+
1
l+1
l+1层)是否具有强耦合.换句话说,它是由胶囊
i
i
i解释胶囊
j
j
j的存在性大小的量度.所有
b
i
j
b_{ij}
bij初始化应该是相等的.
Routing algorithm:
Given: 预测向量 u ^ _ j ∣ i boldsymbol{hat{textbf{u}}}_{j|i} u^_j∣i, 迭代次数 r r r
对胶囊 i i i(层 l l l)和胶囊 j j j(层 l + 1 l+1 l+1): b i j = 0 b_{ij} = 0 bij=0
for r r r iterations do:
对所有胶囊 i i i(层 l l l): c _ i = s o f t m a x ( b i ) c_{i }= softmax(b_i) c_i=softmax(bi) (对高级别胶囊预测权重总和为1)
对所有胶囊 j j j(层 l + 1 l+1 l+1): s _ j = ∑ _ i = 1 m c _ i j u ^ _ j ∣ i s_{j} = sum_{i=1}^{m}{c_{ij}boldsymbol{hat{textbf{u}}}_{j|i}} s_j=∑_i=1mc_iju^_j∣i (输出向量是预测向量的加权和)
对所有胶囊 j j j(层 l + 1 l+1 l+1): v _ j = squash ( s _ j ) textbf{v}_{j} = textbf{squash}(textbf{s}_{j}) v_j=squash(s_j) (应用激活函数)
对所有胶囊 i i i(层 l l l)和胶囊 j j j(层 l + 1 l+1 l+1): b i j = b i j + u ^ _ j ∣ i ⋅ v j b_{ij}=b_{ij}+boldsymbol{hat{textbf{u}}}_{j|i} cdot textbf{v}_{j} bij=bij+u^_j∣i⋅vj
返回 v j textbf{v}_j vj
循环中的最后一行非常重要.这是路由发生的地方.如果乘积 u ^ _ j ∣ i ⋅ v _ j boldsymbol{hat{textbf{u}}}_{j|i} cdot textbf{v}_{j} u^_j∣i⋅v_j很大,它将增加 b _ i j b_{ij} b_ij,这将增加相应的耦合系数 c _ i j c_{ij} c_ij,这反过来将使乘积 u ^ _ j ∣ i ⋅ v j boldsymbol{hat{textbf{u}}}_{j|i} cdot textbf{v}_{j} u^_j∣i⋅vj更大.(在链接4里面博主有自己的想法)
路由算法优势
在CNN中,存在池化层.通常使用MaxPool,这是一种非常原始的路由机制.局部池化中最活跃的特征(比如4x4网格)被路由到更高层,而更高级别的检测器在路由中没有发言权.将其与CapsNet中引入的协议路由机制进行比较,只有那些与高级探测器一致的功能才会被路由.这是CapsNet优于CNN的优势.它具有卓越的动态路由机制(动态,因为要路由的信息是实时确定的).
优点和缺点
Prons:
- 更少训练数据
- 等效性保留了输入对象的位置信息
- 动态路由算法对重叠对象(特征)很有用
- 自动计算了输入物体的层次结构
- 激活向量可解释性更强
Cons:
- 训练慢(因为动态路由的内循环)
- 没有在大数据集(如ImageNet)上测试
- 在复杂数据集CIFAR10上效果不好
- 不能区分彼此靠近的俩个相同类型的相同物体(Problem of crowding)
参考链接
- Introducing capsule networks
- Beginner’s Guide to Capsule Networks
- Understanding Capsule Network Architecture
- 揭开迷雾,来一顿美味的Capsule盛宴
- Understanding Hinton’s Capsule Networks. Part I: Intuition.
- GitHub:awesome-capsule-networks
- 一个注释非常详细的tensorflow源码
- CSDN:Dynamic Routing Between Capsules(NIPS2017)
最后
以上就是含蓄流沙为你收集整理的Dynamic Routing Between Capsules的全部内容,希望文章能够帮你解决Dynamic Routing Between Capsules所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复