李宏毅深度学习(2017)机器学习与数据挖掘机器学习

14.胶囊网络(Capsule Network)

2019-03-02  本文已影响0人  SpareNoEfforts

接下来,我们来讲一下胶囊网络(Capsule)。Capsule是Hilton的paper,他发表在NIPS2017。

Capsule的定义

Capsule是什么呢?Capsule是一个你可以想成他想要取代neuron,原来neuron是output一个值, 而Capsule是output一个vector,在其余的部分它的用法你就把它想成是一个一般的neuron。

所以如下图所示:有个Capsule,Capsule的output就是一个vector,这边的写成v,那Capsule的input是什么?Capsule的input就是其它的Capsule,我这边有一个黄色的Capsule,他会输出v^1,这边有一个绿色的Capsule它会输出v^2,这两个vector会当做蓝色的Capsule的input,蓝色Capsule的output也可以变成其他Capsule的input

Capsule的内部运算原理

1. 通过鸟嘴侦测引入Capsule原理

我们知道在一个network里面,每一个neuron的工作就是负责底dectect一个specific pattern

举例来说有一个neuron,假设你做影像辨识,有一个neuron的工作只是detect往左的鸟嘴,另外一个neuron的工作只是detect向右的鸟嘴;其实不太可能有一个neuron,它可以同时做两件事情,一个neuron它其实就是侦测一种鸟嘴而已,所以你很难说有一个neuron,它就是看说有向左边的鸟嘴,他被activate;向右边的鸟嘴,它也这被activate。


今天Capsule有不一样的地方Capsule是侦测某一个种类的pattern,它不是只侦测一个pattern,它是侦测某一个种类的pattern。 而output

今天的特别地方是这边 c^1c^2,他们不是通过backpropagation learn出来的。 c^1c^2叫做coupling coefficients,他们是在testing的时候在使用这个Capsule的时候动态去决定的。这个决定的process叫做dynamic routing

所以c^1c^2你可以想成就好像是pooling一样。Max pooling就是你有一组neuron,然后只选最大那个值出来,到底哪一个neuron的值会被选, 在training的时候我们不知道,在testing的时候才去dynamic决定的;它这个coupling coefficients跟max pooling是一样的,它也是online的时候决定的。max pooling你可以想成是要被max的那一个neuron,它的位置就是1,其它为的就是零。其实今天这个coupling coefficients,dynamic routing,你就想成是max pooling的一个进阶版,他不是1或者是0,这边可以是不一样的实数,但是我记得c^1c^2的和必须要是1,但它不一定要是1或0,他跟max pooling很像,他是在测试的时候动态决定的。

接下来讲c^1c^2又是怎么确定的?

我们先来看dynamic routing的演算法:一开始我们现在假设输入u^1,u^2,u^3,把u^1,u^2,u^3c^1,c^2,c^3weighted sum以后,我们得到ss再通过挤压就得到Capsule最后的output v

那么我们来看看c^1,c^2,c^3是怎么运作的,首先你要有一组参数bb的初始值都是0,而b_1^0,b_2^0,b_3^0就对应到c^1,c^2,c^3;假设今天就跑T个iteration,T是一个Hyper-parameter,你要事先定好的。

接下来我们把b_1^{r-1},b_2^{r-1},b_3^{r-1}softmax得到c_1^{r},c_2^{r},c_3^{r},所以我刚才讲说c^1,c^2,c^3的和必须是1。有了c_1^{r},c_2^{r},c_3^{r}以后你就可以做weighted sum,得到s^rs^r还不是最终的s,我们把得到的s^r做挤压得到a^r,这个a^r也不是最终的结果v,这是我们另外计算得到的s^ra^r;然后接下来我们用计算出来的a^r去update b的值,你就把a^r计算出来的结果去跟每一个u做内积,如果某个ua^r的内积结果特别大,即他们特别接近的话,对应到的input b的值就会增加。

如上图所示,我们举个例子:假设右下角红黄绿三个点是u^1,u^2,u^3,然后经过一番计算以后,你得到a^r是这边灰色的点,这个点跟红色的点、绿色的点比较像,红色点的跟绿色点它们的b就会上升,而他们的然后它的b上升,他们的c也就会跟着上升;然后接下来灰色的点就会往红色的点跟绿色的点更靠近。

所以今天dynamic routing这件事,他在决定这个c的时候有点像是排除离群点(outlier)的感觉,因为想想看,你把u^1,u^2,u^3weighted sum,然后再得到a;我们假设a就跟weighted sum的结果很像,如果今天有某一个人,比如说u^3跟其他人都很不像,今天算出来的a就会跟他很不像,他的weight就会比较小,再算出它的coupling coefficients c的时候,它算出来就有一点小。
总结一下就是:今天在input的这一组vector里面,如果有某些人跟其他人都比较不像,它的weight就会越来越小。

现在假设跑了T个iteration以后,我们就得到了T个iteration的c_1^T,c_2^T,c_3^T,这个就是我们最后要拿来计算svcoupling coefficients,或者是如果我们用图示来展开的话,看起来像是这个样子:

我们有v^1,v^2然后分别乘上W^1,W^2得到u^1,u^2,然后我们初始值b_1^0,b_2^0都是0
接下来根据b_1^0,b_2^0我们可以得到c_1^1,c_2^1,有了c_1^1,c_2^1以后,我们可以计算出一个s^1,然后得到a^1,根据a^1我们可以决定下一轮的c_1^2,c_2^2,怎么决定下一轮的c_1^2,c_2^2呢?你要透过这个式子:b_i^r=b_i^{r-1}+a^r .u^i,去计算a^1u^1u^2的相似的程度,如果a^1u^1比较像,之后c_1^1就会增加,如果a^1u^2比较像,之后c_2^1就会增加;看a^1跟谁像谁的weight就会增加,好,所以有了a^1以后你就会去update你的c_1^2,c_2^2;有了新的c_1^2,c_2^2以后,你就计算出新的s^2,然后你就得到a^2,根据a^2你就可以得到新的weightc_1^3,c_2^3……以此类推,就可以得到a^3,就是最终的输出v了。

而这整个process其实它就跟 rnn 是一样的。你outputc_1,c_2,会再下一个时间点被使用;这个在 rnn 里面就好像是hidden layer的memory里面的值一样,在前一个时间点的输出会在下一个时间点使用。

所以在training 的时候,实际上你train的时候你还是用backpropagation,很多农场文都说Hilton他要推翻backpropagation,其实我看也好像不是这样的,你刚刚看农场再下到吃手,其实也好像也不是这个样子,最后train的时候还是用backpropagation,怎么用呢?这个training就跟RNN很像,就是说这个dynamic routing你就可以想成是一个RNN,然后train下去就像train RNN一样,train下去你就得到那个结果。

实际上这个Capsule怎么train?

首先Capsule可以是convolution的。我们知道说在做卷积的时候,我们会有一堆filter,然后扫过那个图片,Capsule可以取代filter,filter就是input一幅图片的一小块区域得到output的value;那么Capsule就是input一幅图片的一小块区域得到一个vector,就这样的差别而已。Capsule最后的output长什么样子?
假设我们现在要做的是手写数字辨识,辨识一张image,原来如果是一般的neuron network,你 output就是十个neuron,每个neuron对应到一个可能的数字,如果是Capsule,你output 就是十个Capsule,每一个Capsule就对应到一个数字。
可是你说Capsule的输出是一个vector,我们怎么知道说在这个vector里面这个数字有没有出现呢?我们刚才讲过说vector的norm就代表了pattern出现的confidence。所以今天如果你要知道数字1有没有出现,你就把对照数字1的Capsule,取他的对应1的vector那个norm,那也就是得到了数字1的confidence。同理其他数字;
那么在training的时候,输入数字1你当然希望输出数字1的confidence越大越好,所以今天如果输入是数字1,你就希望说v^1的norm越大越好,你希望v^2的norm被压小,细节的式子我们就不列出来,精神就是这个样子的:

而在Hilton 的paper里面,它还加了一个reconstruction的network,是说他把Capsule的output吃进去,然后output reconstruct出原来的image。这个CapsNet的output他其实是一排vector,如果是手写数字辨识,它的output就是十个vector。那如上图绿色方框NN这个neuron network就把这十个vector的串接吃进去,然后希望可以做reconstruction。在实作上的时候,如果今天知道input的数字是1,那么就会把对应到1的Capsule的output乘1,其他数字统统都会乘0。如果今天对应的数字输入的数字是2,那就是就会把对应到2的Capsule的output乘1,其他数字统统都会乘0。得到neuron network,希望可以reconstruct回原来的输入。

实验结果

实验1

如下图所示,接下来我们先来看一下Capsule的实验结果,这个实验结果baseline应该是一个CNN的network,在MNIST上错误率其实很低,0.39%的错误率。接下来四行分别是Capsule的结果,routing 1次或者是routing 3次,没有reconstruction和有reconstruction,这边很明显的有reconstruction 的performance有比较好,至于routing 1次或者是routing 3次谁比较好就有点难说,在没有reconstruction的时候,然后routing 1次比较好,有reconstruction的时候,routing 3次比较好。
这边有另外一个实验是想要展示CapsNet它对抗noise的能力,他的robust的能力,所以今天这个实验把MNIST的CapsNet做一个affine transformation,但注意一下training没有affine transformation,所以training 跟testing是有点mismatch。 把testing故意作为一个affine以后,因为training 跟testing是mismatch的,所以当然理论上你的network performance是会变差,所以CapsNet的正确率掉到79%。但是traditional convolutional neuron networkmodel掉的更多,他是66%的正确率,这显示说CapsNet它比较Robust,你有做一下affine transformation, CapsNet的performance掉的量是比较少的。

实验2

我们刚才有说每一个Capsule的output vector v每一个dimension就代表了现在pattern的某种特征。怎么验证这一件事呢?
我刚不是说有一个会做reconstruction的network嘛,用它吃Capsule的output就可以变回image。好,我们就让他吃某一个Capsule的output,然后故意调整这个Capsule的output某一个dimension,就可以知道说这个Capsule的output的dimension,他代表了什么样的特征。举例来说在Hilton的paper的实验上看到说有某些dimension,他代表了笔画的粗细,有某些dimension代表了旋转等等,就每一个dimension都是代表了今天你要侦测的pattern的某一种特征。
如下图所示,为实验结果:

实验3

最后这个实验是想要显示Capsule的reconstruction的能力,这个实验是这样,他是把network train在MultiMNIST上面,也就network在train的时候她看到的image本来就是有重叠,我觉得这个实验其实如果有另外一个版本是:training的时候是没有重叠的一般数字,testing的时候有重叠还可以辨识出来,我就真的觉得我钦佩的五体投地,但这个不是这样,这个应该是training和testing都是有重叠的数字的。

好,今天是training和testing都有重叠的数字,比如说长得像这个样子:

那么machine需要做的工作是把这两个数字辨识出来。做法是:给machine看着这一张数字,不知道是哪两个数字的叠合,然后machine它辨识出来是7跟1的结合的可能性比较大。接下来再分别把7跟1丢到reconstruction里面,你就可以分别把7跟1 reconstruct回来,所以这边就显示一下reconstruct的结果,我们看第一排第一张图:看起来是4,其实是2跟7叠在一起,然后她被reconstruct以后,它就可以看出来说红色部分是2,绿色的部分是7。再看第一排第五张图,如果它辨识出来是5跟0,但是你要求他reconstruct 5和7,你把7的那个vector 即:对应到7的Capsule的output丢到reconstruct network里面叫他reconstruct,明明没有看到7,所以7的部分就会消失。好,这个是CapsNet的一些实验。好,为什么CapsNet会work呢?接下来,我们就来看看这个结构的特色。

3. CapsNet的特性

有两个特性,一个叫Invariance,一个叫Equivariance。
Invariance是什么意思?input一张image,得到这样的output;我input另外一张image,也得到这个output;他们都是1,虽然有点不一样,network学会无视这个差别得到一样的输出。如下图左边所示;
所谓的Equivariance意思是说我们并不是希望network input不一样的东西就输出一样东西,我们希望network输出完全地反映了现在看到的输入,比如说你输入这张1,得到结果是这样,你输另外一张1,其实这个1是左边这张1的翻转,那它的输出就是左边的vector的翻转。如下图右边所示;

那CNN的max pooling的机制,只能做到Invariance,不能够真的做到Equivariance。为什么?CNN就是一组neuron里面选最大的出来,现在input是3,-1,-3,1,max pooling选3,-3,-1,0,3,max pooling选3。 input不一样的东西,output一样的东西,它只做到Invariance;

但CapsNet可以做到Equivariance这件事情,怎么做到呢?现在input这个1出来,1进去,然后让Capsule的output要说看到1的confidence很高,input另外一张1,CapsNet要说我看到1的confidence也很高,今天它在对应到1的Capsule的output的vector v,他们的norm都要是大的;在输入这两张image的时候,但是他们在取norm之前的vector里面的值可以是不一样,而这个不一样可以反映的这两个1之间的差异。

所以如果要打个比方的话,你就可以想成说Invariance其实是说这个network很迟钝,他是个特别迟钝的人,人家赞美他或批评他对他来说是没差的,因为它看起来就是没差别。但是Capsule不一样,他知道差别,但是他选择不去理会,就是输入的差别在Capsule的output有被呈现,只是取norm的时候,最后没有用到差别。

至于Dynamic Routing,为什么会work呢?我直觉觉得Dynamic Routing非常像Attention-based model加multi-hop,我们之前已经讲过memory network嘛,我们说里面有attention的机制,然后有multi-hop的机制。
Dynamic Routing其实很像这个,你可以把input的u^1,u^2就想成是这边的document。然后这边的c^1,c^2你就想成是attention的weight,你先得到一组attention的weight,抽出一个vector,然后再回头再去做attention,再抽出一个vector再回头去做attention,跟memory network里面的attention加multi-hop的机制是一样,是非常类似的,至于他为什么会work,其实我没有很确定,我觉得这边其实需要一个实验,这个实验是什么?你敢不敢让那些c的值也跟着backpropagation一起被learn出来这样子,因为今天我们并没有验证说如果c的值用别的方法取得performance会不会比较好,如果今天c的值也跟着backpropagation一起被learn出来,但他的performance比capsule还要差的话,我就会觉得说Dynamic Routing提这件事情是真的有用。

这边就是一些reference给大家参考,


上一篇下一篇

猜你喜欢

热点阅读