Dropout
Dropout
How to train?
在train的时候,每一次update参数之前,对network里面的每个neural(包括input),做sampling(抽样)。 每个neural会有p%会被丢掉,跟着的weight也会被丢掉。
你在training 时,performance会变的有一点差(某些neural不见了),加上dropout,你会看到在testing set会变得有点差,但是dropout真正做的事就是让你testing 越做越好
在testing上注意两件事情:
- 第一件事情就是在testing上不做dropout。
- 在dropout的时候,假设dropout rate在training是p%,all weights都要乘以(1-p%)
假设training时dropout rate是p%,在testing rate时weights都要乘以(1-p)%。(假定dropout rate是50%,在training的时候计算出来的weights等于1,那么testing时的rate设为0.5
为什么Dropout会有用
为什么在训练的时候要dropout,但是测试的时候不dropout。
training的时候会丢掉一些neural,就好像使在练习轻功一样在脚上绑上一些重物,然后实际上战斗的时候把重物拿下来就是testing时(没有进行dropout),那时候你就会变得很强
另外一个很直觉的理由是:在一个团队里面,总是会有人摆烂(摆烂,指事情已经无法向好的方向发展,于是就干脆不再采取措施加以控制而是任由其往坏的方向继续发展下去),这是会dropout的。
假设你觉得你的队友会摆烂,所以这个时候你就想要好好做,你想要去carry他。但实际上在testing的时候,大家都是有在好好做,没有需要被carry,因为每个人做的很努力,所以结果会更好。
testing时为什么要乘以(1-p)%
还有一个要解释的是:在做dropout任务时候要乘以(1-p)%,为什么和training时使用的training不相同呢?很直觉的理由是这样的:
假设dropout rate是50 percent,那在training的时候总是会丢掉一般的neural。假设在training时learning好一组weight(
上述的描述是很直觉的解释
其实dropout还是有很多的理由,这个问题还是可以探讨的问题,你可以在文献上找到很多不同的观点来解释dropout。我觉得我比较能接受的是:dropout是一个终极的ensemble方法
ensemble的意思是:我们有一个很大的training set,每次从training set里面只sample一部分的data。我们之前在讲bias和variance时,打靶有两种状况:一种是bias很大,所以你打准了;一种是variance很大,所以你打准了。如果今天有一个很复杂的model,往往是bias准,但variance很大。若很复杂的model有很多,虽然variance很大,但最后平均下来结果就很准。所以ensemble做的事情就是利用这个特性。
我们可以training很多的model(将原来的training data可以sample很多的set,每个model的structures不一样)。虽然每个model可能variance很大,但是如果它们都是很复杂的model时,平均起来时bias就很小。
在training时train了很多的model,在testing时输入data x进去通过所有的model(
如果model很复杂时,这一招是往往有用的
为什么说dropout是终极的ensemble方法
为什么说dropout是终极的ensemble方法?在进行dropout时,每次sample一个minibatch update参数时,都会进行dropout。
第一个、第二个、第三个、第四个minibatch如图所示,所以在进行dropout时,是一个终极ensemble的方式。假设有M个neurons,每个neuron可以dropout或者不dropout,所以可能neurons的数目为
每次只用one mini-batch去train一个neuron,总共有
每个neuron都用one mini-batch来train,每个neuron用一个batch来train可能会让人觉得很不安(一个batch只有100笔data,怎么可能train整个neuron呢)。这是没有关系的,因为这些不同neuron的参数是共享的。
在testing的时候,按照ensemble方法,把之前的network拿出来,然后把train data丢到network里面去,每一个network都会给你一个结果,这些结果的平均值就是最终的结果。但是实际上没有办法这样做,因为network太多了。所以dropout最神奇的是:当你把一个完整的network不进行dropout,但是将它的weights乘以(1-p)percent,然后将train data输入,得到的output y。神奇的是:之前做average的结果跟output y是approximated
你可能想说何以见得?接下来我们将来举一个示例:若我们train一个很简单的network(只有一个neuron并且不考虑bis),这个network的activation是linear的。
这个neuron的输入是
如果我们现在将这两个weights都乘以
只有是linear network,ensemble才会等于weights multiply一个值。