神经网络的优化(5)----Dropout

一、Dropout怎么做                                                                                                                点击此处返回总目录

二、为什么Dropout有效

 

 

 

讲一下Dropout,我们先讲一下dropout是怎么做的,然后再讲为什么要这么做。

                          神经网络的优化(5)----Dropout_第1张图片

 

一、Dropout怎么做

Dropout是怎么做的呢?

在training的时候,每一次要update之前,我们都对某一个神经元(包括input的地方,input Layer的每一个element也算是一个神经元)做采样。这个采样决定,这个神经元要不要被丢掉。每个神经元有p%的概率被丢掉。

                     神经网络的优化(5)----Dropout_第2张图片

如果一个神经元被sample到被丢掉,跟它相连的weight也失去作用。所以做完这个sample之后,你的网络结构就变瘦了,变得比较细长。然后再train这个比较细长的网络。

                            神经网络的优化(5)----Dropout_第3张图片

要注意一下,这个sampling是在每一次update参数之前都要做一次。每一次update的时候,拿来training的网络结构都是不一样的。每一次都要重新做一次sampling。

当你在training的时候,使用dropout,你的performance是会变差的。本来不用dropout的时候,本来比如说可以把正确率做到100,但是加上dropout以后,因为你的神经元莫名其妙就是不见,所以在train的时候,performance是会变差的,比如本来是100,就只能做到98%了。

所以,当加入dropout以后,在training set上的结果会变差,但是dropout它真正要做的事情是,它就是要让你的testing set上的结果变好。如果今天遇到的问题是training set上做的不好,那越加dropout就会越差。

 

那在testing 的时候,怎么做呢?

要注意两件事。第一件事,testing的时候不做dropout。所有的神经元都要用。另外一个事情是,在testing的时候,假设你的dropout rate是p%,那在testing的时候所有weight,都要乘(1-p)%。也就是说,假如现在dropout rate是50%,那在training的时候learning出来的weight为1,在testing的时候要把这个weight设为0.5。这个步骤非常神妙。

 

                         神经网络的优化(5)----Dropout_第4张图片

 

二、dropout为什么有效

 

为什么dropout有用?直觉的想法是这样子。training的时候丢掉一些神经元,就好像练轻功的时候,在脚上绑一些重物。然后实际上战斗的时候呢,就把重物拿下来。这样就变得很厉害。

                                     神经网络的优化(5)----Dropout_第5张图片

另外一个直觉的理由是这样子。每一个神经元就是一个学生,在一个团队里面,总是会有人偷懒。如果你知道你的队友偷懒,你就得好好做。最后testing的时候,大家都好好做了。所以做的好了。

                                         神经网络的优化(5)----Dropout_第6张图片

另外一个直觉解释的是,为什么要乘以(1-p)%,为什么training 和test用的weight是不一样的呢?直觉的理由是这样,假设现在的dropout rate是50%,那在train的时候,总是会丢掉一般的神经元。所以learning好一组weight w1,w2,w3,w4的时候,在testing的时候,其实是没有dropout的,用同一组weight得到z'。z'和z的值其实是差两倍的。因为前面总有一半不在,而后面都在。这样training和test不match,performance反而会变差。所以怎么办,把所有weight都乘上0.5,这样z就等于z'。

                                  神经网络的优化(5)----Dropout_第7张图片

上面是比较直观上的解释。如果要更正式讲的话,其实dropout有很多理由,这个还是一个可以探讨的问题。可以在文献上找到很多种不同的观点来解释为什么dropout会work。我比较能接受的是,dropout是一种终极的ensemble(集成)的方法。

什么是ensemble的方法呢?ensemble的意思是说,我们有一个很大的training set,每次从training set里面呢,sample一部分的data出来。我们之前讲过,打靶有两种状况,一种是bias很大,一种是variance很大。如果有一个很复杂的model,他往往是bias很准,但是variance很大。但是如果,这个笨重的model有很多个,虽然variance很大,但是平均起来,就很准。所以,今天ensemble要做的事情,就是用这个特性。我们train很多个model,每个model的structure不一样。虽然每个model他们的variance很大,但是如果他们都是很复杂的model的话,平均起来,这个bias就很小。

                           神经网络的优化(5)----Dropout_第8张图片

 

所以,在testing的时候,你training了一把model。然后再testing的时候,丢了一笔data进来,它通过所有的model,得到一大堆的结果y1,y2,y3,y4...再把这些结果平均起来。当做最后的结果。如果你的model很复杂的话,这一招往往有用。像随机森林也是实现这个思想的方法。

                               神经网络的优化(5)----Dropout_第9张图片

好,那为什么说dropout是一个终极的方法呢?

我们知道我们在做dropout的时候,我们每次拿一个mini-batch出来,要update参数的时候,都会做一次sample。所以当你拿第一个mini-batch的时候,网络是一个样子。每次不同的mini-batch,网络都不一样。所以,在train的时候,假设有M个神经元,每个神经元可以drop或者不drop,所以共有2^M种可能的网络数。当做dropout的时候,等于在train这2^M个网络。每次都用一个minibatch的data去train一个网络。但因为update的次数是有限的,所以不太可能把所有的2^M的网络都train一遍。那每个网络都用一个batch来train,会不会觉得很不安,一个batch才100个data,怎么train 一整个network呢?没有关系,因为这所有的网络的参数是share的。也就是不同网络的同位置的参数是一样的。所以,虽然一个网络的参数只有一个batch来train,但是一个参数可能由好多个batch来train。

所以,当做dropout的时候,你就是train了一大把的网络。理论上,每一次update的时候,你都train了一个网络出来。

                    神经网络的优化(5)----Dropout_第10张图片

 

那testing的时候呢,按照ensemble的逻辑就是把一大把的网络统统都拿出来,然后把testing data丢进去,每个网络都吐一个结果,最后求平均,作为最终结果。但是实做上没有办法去做,因为这一把网络实在太多了。dropout最神奇的地方在于,它告诉你说,当你把一个完整的网络,不做dropout,但是把它的weight乘上(1-p)%,然后把testing data丢进去,得到的output y。神奇的是,average的结果跟y是差不多的。

                          神经网络的优化(5)----Dropout_第11张图片

 

你可能会说,何以见得呢?我没来举一个例子。

我们来train一个很简单的网络,它只有一个神经元。没有隐藏层。没有激活函数。

                                                               神经网络的优化(5)----Dropout_第12张图片

如果我们做dropout的时候,之会dropout隐藏层和输入层的神经元。所以,总共有4种结构:

                 神经网络的优化(5)----Dropout_第13张图片

把这四个网络的输入做平均为:(w1x1+w2x2)/2。

得到的结果就相当于,不dropout,每个w乘以1/2。

                                                               神经网络的优化(5)----Dropout_第14张图片

所以,想要说的是,在这个最简单的例子里面,不同的网络做集成这件事情跟不做dropout而每个weight乘以一个值这件事,其实是一样的。但是,你会说,这个简单的例子,有这样的结论是很直观的。但是假设激活函数是sigmoid函数,或者很多个layer,它还work么?结论就是这两个事不会一样。只有是linear 的网络,才一样。两者相等的前提是网络是linear的。所以,这就是dropout很神奇的地方,虽然不是一样的,但是结果还是work。根据这个结论,有人推出一个想法说,既然dropout在linear的网络上,dropout才会等于乘一个weight,那如果我的网络很接近linear的话,dropout的performance应该会比较好吧,比如用ReLU,比如maxout,他们相对于sigmoid是接近linear的。所以,dropout确实在用ReLU,用maxout的时候,performance是确实比较好的,如果你去看maxout的paper的话,它里面有point这一点。

 

 

 

 

 

 

 

你可能感兴趣的:(17,深度学习)