接下来,我们来讲一下胶囊网络(Capsule)。Capsule是Hilton的paper,他发表在NIPS2017。
Capsule的定义
Capsule是什么呢?Capsule是一个你可以想成他想要取代neuron,原来neuron是output一个值, 而Capsule是output一个vector,在其余的部分它的用法你就把它想成是一个一般的neuron。
所以如下图所示:有个Capsule,Capsule的output就是一个,这边的写成,那Capsule的input是什么?Capsule的input就是其它的Capsule,我这边有一个黄色的Capsule,他会输出,这边有一个绿色的Capsule它会输出,这两个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的
今天的特别地方是这边 和,他们不是通过backpropagation learn出来的。 和叫做coupling coefficients,他们是在testing的时候在使用这个Capsule的时候动态去决定的。这个决定的process叫做dynamic routing。
所以和你可以想成就好像是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,这边可以是不一样的实数,但是我记得,的和必须要是1,但它不一定要是1或0,他跟max pooling很像,他是在测试的时候动态决定的。
接下来讲,又是怎么确定的?
我们先来看dynamic routing的演算法:一开始我们现在假设输入,把用做weighted sum以后,我们得到,再通过挤压就得到Capsule最后的 。
那么我们来看看是怎么运作的,首先你要有一组参数,的初始值都是,而就对应到;假设今天就跑个iteration,是一个Hyper-parameter,你要事先定好的。
接下来我们把做softmax得到,所以我刚才讲说的和必须是。有了以后你就可以做weighted sum,得到,还不是最终的,我们把得到的做挤压得到,这个也不是最终的结果,这是我们另外计算得到的和;然后接下来我们用计算出来的去update 的值,你就把计算出来的结果去跟每一个做内积,如果某个和的内积结果特别大,即他们特别接近的话,对应到的input 的值就会增加。
如上图所示,我们举个例子:假设右下角红黄绿三个点是,然后经过一番计算以后,你得到是这边灰色的点,这个点跟红色的点、绿色的点比较像,红色点的跟绿色点它们的就会上升,而他们的然后它的上升,他们的也就会跟着上升;然后接下来灰色的点就会往红色的点跟绿色的点更靠近。
所以今天dynamic routing这件事,他在决定这个的时候有点像是排除离群点(outlier)的感觉,因为想想看,你把作weighted sum,然后再得到;我们假设就跟weighted sum的结果很像,如果今天有某一个人,比如说跟其他人都很不像,今天算出来的就会跟他很不像,他的weight就会比较小,再算出它的coupling coefficients 的时候,它算出来就有一点小。
总结一下就是:今天在input的这一组vector里面,如果有某些人跟其他人都比较不像,它的weight就会越来越小。
现在假设跑了个iteration以后,我们就得到了个iteration的,这个就是我们最后要拿来计算跟的coupling coefficients,或者是如果我们用图示来展开的话,看起来像是这个样子:
我们有然后分别乘上得到,然后我们初始值都是。
接下来根据我们可以得到,有了以后,我们可以计算出一个,然后得到,根据我们可以决定下一轮的,怎么决定下一轮的呢?你要透过这个式子:,去计算跟和的相似的程度,如果跟比较像,之后就会增加,如果跟比较像,之后就会增加;看跟谁像谁的weight就会增加,好,所以有了以后你就会去update你的;有了新的以后,你就计算出新的,然后你就得到,根据你就可以得到新的weight: ……以此类推,就可以得到,就是最终的输出了。
而这整个process其实它就跟 rnn 是一样的。你output的,会再下一个时间点被使用;这个在 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一幅图片的一小块区域得到一个,就这样的差别而已。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的时候,输入数字你当然希望输出数字的confidence越大越好,所以今天如果输入是数字,你就希望说的norm越大越好,你希望的norm被压小,细节的式子我们就不列出来,精神就是这个样子的:
而在Hilton 的paper里面,它还加了一个reconstruction的network,是说他把Capsule的output吃进去,然后output reconstruct出原来的image。这个CapsNet的output他其实是一排vector,如果是手写数字辨识,它的output就是十个vector。那如上图绿色方框NN这个neuron network就把这十个vector的串接吃进去,然后希望可以做reconstruction。在实作上的时候,如果今天知道input的数字是,那么就会把对应到的Capsule的output乘,其他数字统统都会乘。如果今天对应的数字输入的数字是,那就是就会把对应到的Capsule的output乘,其他数字统统都会乘。得到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 的每一个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是,max pooling选,max pooling选3。 input不一样的东西,output一样的东西,它只做到Invariance;
但CapsNet可以做到Equivariance这件事情,怎么做到呢?现在input这个出来,进去,然后让Capsule的output要说看到的confidence很高,input另外一张,CapsNet要说我看到的confidence也很高,今天它在对应到的Capsule的output的 ,他们的norm都要是大的;在输入这两张image的时候,但是他们在取norm之前的vector里面的值可以是不一样,而这个不一样可以反映的这两个之间的差异。
所以如果要打个比方的话,你就可以想成说Invariance其实是说这个network很迟钝,他是个特别迟钝的人,人家赞美他或批评他对他来说是没差的,因为它看起来就是没差别。但是Capsule不一样,他知道差别,但是他选择不去理会,就是输入的差别在Capsule的output有被呈现,只是取norm的时候,最后没有用到差别。
至于Dynamic Routing,为什么会work呢?我直觉觉得Dynamic Routing非常像Attention-based model加multi-hop,我们之前已经讲过memory network嘛,我们说里面有attention的机制,然后有multi-hop的机制。
Dynamic Routing其实很像这个,你可以把input的就想成是这边的document。然后这边的你就想成是attention的weight,你先得到一组attention的weight,抽出一个vector,然后再回头再去做attention,再抽出一个vector再回头去做attention,跟memory network里面的attention加multi-hop的机制是一样,是非常类似的,至于他为什么会work,其实我没有很确定,我觉得这边其实需要一个实验,这个实验是什么?你敢不敢让那些的值也跟着backpropagation一起被learn出来这样子,因为今天我们并没有验证说如果的值用别的方法取得performance会不会比较好,如果今天的值也跟着backpropagation一起被learn出来,但他的performance比capsule还要差的话,我就会觉得说Dynamic Routing提这件事情是真的有用。
这边就是一些reference给大家参考,
网友评论