胶囊间的动态路由

1. Capsule介绍

Sabour, Sara, Nicholas Frosst, and Geoffrey E. Hinton. “Dynamic routing between capsules.” Advances in neural information processing systems. 2017.

Capsule特色是“vector in vector out”,取代了以往的“scaler in scaler out”,也就是神经元的输入输出都变成了向量,从而算是对神经网络理论的一次革命。

然而在目前的深度学习中,从来不缺乏“vector in vector out”的案例,因此显然这不能算是Capsule的革命。比如在NLP中,一个词向量序列的输入模型,这个词向量序列再经过RNN/CNN/Attention的编码,输出一个新序列,不也是“vector in vector out”吗?

Capsule的革命在于:它提出了一种新的“vector in vector out”的传递方案,并且这种方案在很大程度上是可解释的。

深度学习(神经网络)为什么有效:神经网络通过层层叠加完成了对输入的层层抽象,这个过程某种程度上模拟了人的层次分类做法,从而完成对最终目标的输出,并且具有比较好的泛化能力。的确,神经网络应该是这样做的,然而它并不能告诉我们它确确实实是这样做的,这就是神经网络的难解释性,也就是很多人会将深度学习视为黑箱的原因之一。

下面介绍Capsule是怎么突破这一点的。

2. CapsNet模型

CapsNet: 两个卷积层(Conv 1, PrimaryCaps),一个全连接层(DigitCaps)

在这里插入图片描述

2.1 Conv1层

常规的卷积层, 起像素级局部特征检测作用

在这里插入图片描述
s h a p e : [ N o n e , 28 , 28 , 1 ] → [ N o n e , 20 , 20 , 256 ] shape: [None,28,28,1] \rightarrow [None,20,20,256] shape:[None,28,28,1][None,20,20,256]

2.2 PrimaryCaps层

生成最低级卷积8D胶囊层(无路由)

胶囊:其实,只要把一个向量当作一个整体来看,它就是一个“胶囊”。可以这样理解:神经元就是标量,胶囊就是向量。Hinton的理解是:每一个胶囊表示一个属性,而胶囊的向量则表示这个属性的“标架”。也就是说,我们以前只是用一个标量表示有没有这个特征(比如有没有羽毛),现在我们用一个向量来表示,不仅仅表示有没有,还表示“有什么样的”(比如有什么颜色、什么纹理的羽毛),如果这样理解,就是说在对单个特征的表达上更丰富了。

简单的讲,PrimaryCaps层要输出一些8D的向量,每个向量代表一些比较低级的特征,向量的各个位置的值代表该特征的属性

PrimaryCaps层: 计算过程具有多种理解方式,其中之一为,8个并行的常规卷积层的叠堆

PrimaryCaps层的第一种理解方式

8个并行的常规卷积层:
在这里插入图片描述
卷积操作2参数:
在这里插入图片描述
对Conv1层的输出进行8次卷积操作2所示的卷积操作:
在这里插入图片描述

然后对8个并行常规卷积层叠堆(对每个卷积层的各个通道在第四个维度上进行合并):

8个[6,6,1,32]卷积层合并示意图如下:
在这里插入图片描述
得到叠堆后的结果:[None,6,6,8,32]
然后展开为[None,6x6x32,8,1]=[None,1152,8,1],这样我们就得到了1152个初始胶囊,每个胶囊是一个纬度为[8,1]的向量,并代表某一特征

PrimaryCaps层的第二种理解方式

  • 32个通道之间的卷积核是独立的(9x9大小)
  • 8个并行卷积层之间的参数也是独立的

R i g h t a r r o w Rightarrow Rightarrow 即共有8x32个大小为9x9的相互独立的卷积核,可看作8x32个通道的常规卷积和
则可以用下面的操作得到和第一种理解方式相同的结果
在这里插入图片描述
输出: [ N o n e , 6 , 6 , 32 ∗ 8 ] → r e s h a p e [ N o n e , 1152 , 8 , 1 ] ) [None,6,6,32*8] \overset{reshape}{\rightarrow} [None,1152,8,1]) [None,6,6,328]reshape[None,1152,8,1])

注意:虽然计算方式上与常规卷积层无差异,但意义上却已经大不相同!将达到8x1capsule的特征封装的效果

PrimaryCaps输出输出1152个8D的胶囊后,使用了一个Squash函数做非线性变换,那么,为什么要设计这个函数呢?这个函数的原理是啥

2.3 Squash函数

为什么要设计squash函数:

因为论文希望Capsule能有一个性质:胶囊的模长能够代表这个特征的概率,即特征的“显著程度”, 模长越大,这个特征越显著,而我们又希望有一个有界的指标来对这个“显著程度”进行衡量,所以就只能对这个模长进行压缩了

squash函数的原理:

s q u a s h ( x ) = ∣ ∣ x ∣ ∣ 2 1 + ∣ ∣ x ∣ ∣ 2 x ∣ ∣ x ∣ ∣ squash(x) = \frac{||x||^2}{1+||x||^2} \frac{x}{||x||} squash(x)=1+x2x2xx

  • x ∣ ∣ x ∣ ∣ \frac{x}{||x||} xx: 将x的模长变为1
  • ∣ ∣ x ∣ ∣ 2 1 + ∣ ∣ x ∣ ∣ 2 \frac{||x||^2}{1+||x||^2} 1+x2x2: 起缩放x的模长的作用,x模长越大, ∣ ∣ x ∣ ∣ 2 1 + ∣ ∣ x ∣ ∣ 2 \frac{||x||^2}{1+||x||^2} 1+x2x2越趋近于1,||x||=0时, ∣ ∣ x ∣ ∣ 2 1 + ∣ ∣ x ∣ ∣ 2 = 0 \frac{||x||^2}{1+||x||^2}=0 1+x2x2=0

y = s q u a s h ( x ) y=squash(x) y=squash(x)的效果为:x的模长越大,y的模长越趋近于1

PrimaryCaps输出的1152个8D的胶囊经过squash函数后非线性变换后,都具有了胶囊的模长能够代表这个特征的概率的特性,这些新的胶囊接着作为DigitCaps层的输入。

2.4 DigitCaps层

由于该层解释起来比较复杂,所以先从简单例子开始,慢慢推出该层的流程及原理。

capsule示意

capsule示意图:

在这里插入图片描述
如上图所示,底层的胶囊和高层的胶囊构成一些连接关系那么,这些胶囊要怎么运算,才能体现出“层层抽象”、“层层分类”的特性呢?让我们先看其中一部分连接:

在这里插入图片描述
u,v都是胶囊,图上只展示了 u 1 u_1 u1的连接。这也就是说,目前已经有了 u 1 u_1 u1这个特征(假设是羽毛),那么我想知道它属于上层特征 v 1 , v 2 , v 3 , v 4 v_1,v_2 ,v_3,v_4 v1,v2,v3,v4(假设分别代表了鸡、鸭、鱼、狗)中的哪一个。分类问题我们显然已经是很熟悉了,不就是内积后softmax吗?于是单靠 u 1 u_1 u1这个特征,我们推导出它是属于鸡、鸭、鱼、狗的概率分别是:

( p 1 ∣ 1 , p 2 ∣ 1 , p 3 ∣ 1 , p 4 ∣ 1 ) = 1 Z 1 ( e < u 1 , v 1 > , e < u 1 , v 2 > , e < u 1 , v 3 > , e < u 1 , v 4 > ) (p_{1|1},p_{2|1},p_{3|1},p_{4|1})=\frac{1}{Z_1} (e^{<u_1,v_1>},e^{<u_1,v_2>},e^{<u_1,v_3>},e^{<u_1,v_4>}) (p11,p21,p31,p41)=Z1

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值