Machine Learning & Recommendation & NLP & DLmachine learning深度学习·神经网络·计算机视觉

CapsulesNet一些个人理解

2018-02-10  本文已影响376人  GeEKOh

概要

去年年底,Geoffrey E. Hinton开源了一个新的图像识别模型CapsulesNet,中文翻译过来呢就是胶囊网络。虽然刚刚开源没多久,但是fork和star就已经爆炸了。的确,新东西就是有新东西的亮点。算法部分呢,我就简单说一下,重在理解。

CapsNet的流程,我从原论文上直接截下来,放在这:


向量加权和
激活函数squashing

从图中可以看出来,v 就是一个胶囊最后的输出。那么不仅有个疑问,最后一步的共识路由去哪了?怎么只有2步。回看第一个公式,里面的参数c,也就是权值系数是什么?


权值系数c
很直白,c就是一个softmax后的数组,这一步竟是什么意思呢?现在有必要来说一下CapsNet的设计思路了。
假设:

那么我们现在思考一下,中间层的胶囊要把激活值输出给下一层的胶囊,也就是要输出给“脸”和“不是脸”这两个胶囊,那么理所当然的,希望检测“鼻子”,"眼睛"这一类的胶囊,能和检测“脸”的胶囊关系更大,而与“不是脸”的关系更小。那么就像我们站在一个路口,我们选择任意一条路的概率和就是1 ,中间层胶囊也是如此,但是胶囊更倾向于选择和自己最接近也是最相似的输出胶囊或者说和他们自身关系最大的胶囊。(那么“鼻子”就应该选择“脸”,“耳环”就应该选择“不是脸”)回到公式中,softmax后的 c 就是当前胶囊选择下一层胶囊的概率分布其和为1。

Dynamic Routing

那么如何确定 c 呢,这里就是用了这个叫做“dynamic routing”的方法。这个方法蛮多的介绍,主要的意思呢就是通过几次迭代,根据高级胶囊的输出逐步调整低级胶囊输出给高级胶囊的分布,最后会达到一种理想的分布。


dynamic routing process

这里有一个注意的地方就是,我们看到参数 c 在不断的更新,但是是由dynamic routing 来调整的,并不是通过backward调整的。换句话说,在backward运算中并不会计算 c 的误差(不更新 c 值),c 的更新和确定是在forward运算中的。
激活函数squashing不难看出是做了一个方向上不变,长度上进行收缩的操作。

Loss Function

loss function

在来看看损失函数,使用的方式和svm的损失函数比较类似(最大化正负样本到超平面的距离)。这里给定了2个锚点m+=0.9和m-=0.1,损失最终希望正例样本预测在0.9,超过就没必要继续提高了(max(0,m-y)),负例在0.1,低于0.1就没必要继续下降了,于是取了max(0,y-m)。然后 λ 是为了减小那些图片中没有出现过的数字类别的损失,防止一开始损失过大,导致全部的输出值都在收缩。(毕竟图片中不存在的数字更多,小的损失x多的数量=大的损失)。损失函数就谈这么多。

Caps Net 和 Neural Net 对比

现在总结一下,Capsnet和普通的神经网络的区别,借用了naturomics(github传送)的图片

对比

Capsnet Architecture

接下来看看如何将一个typically CNN改造成一个Capsnet。 Capsnet Arch

说了这么多,不禁有个疑惑,胶囊究竟学习到了什么东西?

胶囊究竟学习到了什么东西?

众所周知,大名鼎鼎的cnn确实学习到了东西,图像的一些底层特征,比如 边、角、点这种零碎的图像组成部分——或者可以说一些模式。
但是有个弊端就是,cnn会把一条昏暗的横线和一条明亮的横线认为是2个特征,而实际上可能只是由于光线等因素导致的同一事物的2个样子。
于是胶囊的作用就体现出来了,我们之前在 Capsnet Architecture 这一块里面说了,胶囊是由8个卷积结构封装在一起形成的。一个最直观的理解就是,它将一个事物的8种不同形态封装在一起。这8个形态的激活值合在一起作为输出。举个例子:一个负责检测横线的胶囊,将一条明亮的线,一条昏暗的线,一条粗一点的线,一条细一点的线的检测结果封装在一起。那么但凡有一个激活值很高,那么整体的模长就会很长,那么这个胶囊就处于激活态~证明检测到了一条横线。于是胶囊就学习到不同状态下的物品其实是同一个。对应到从decode网络中发现的结果,最后DigitCaps层中16维的胶囊,正代表着不同状态下的同一个数字。比如有一个维度是检测数字粗细的,那么微调这个维度的激活值,那么还原回去就对应着数字的粗细的改变,如下图

微调控制粗细的维度的激活值
说白了,原来的神经元存储着一种状态下一个特征的active,而现在胶囊存储着多种状态下一个特征的active。

Dynamic Routing是干嘛的?

我们发现,在与普通的neural network做对照的时候,缺少了maxpooling这一步,但是却多了 routing这一个过程,为什么?
因为routing在这里代替了maxpooling,他们都是一种对有用信息的提取方式

Coding的一些细节

最后

以上仅是个人对胶囊网络的一种理解,不喜勿喷。毕竟新东西刚出,有问题和细节希望一同探讨。
参考如下:

全部原创,转载请注明出处,谢谢~

上一篇下一篇

猜你喜欢

热点阅读