Dropout在做什么
Train时Dropout在做什么?
当dropout(p)时,意味着每个neuron, 有p%的可能性被去除;(这里需要注意的是,不是去除p%的neuron)
我们可以看到的是,每一次进行dropout的时候,网络的结构都会发生改变,会变成一个比之前thin的网络结构。
所以,总结一下:dropout在训练的时候步骤如下:
- 每次前向传播时, 去除一些neuron;
- 网络的结构发生了改变;
- 使用新的网络结构进行训练;
- 对于每一个min-batch, 每次都会修改网络的结构;
Test时Dropout在做什么
在进行test的时候,我们是不进行dropout,同时要修改之前的系数,我们看一下具体的步骤。
- 不进行dropout(即每个节点都不会被去掉)
- 同时, 若train时dropout§, 则在test时候, 所有系数需要乘(1-p%);
- 例如, dropout(0.9), 则最后所有系数需要乘(1-0.9);
下面我们来解释一下为什么最后所有系数要乘(1-p%),他的最终的目标是为了保持不进行dropout时候网络输出的值与进行dropout时,网络输出值的期望相同。我们看下面一个具体的例子:
上图中,我们的Dropout(0.5)。则每个点有50%的可能性被去掉。
原始的结构如蓝框所示,则dropout后会有四种不同的可能性,分别如图左边的四个小结构所示,其中每个结构的可能性都是1/4。
我们对上面可能的四个结构的输出求期望,得到1/2×w1×x1+1/2×w2×x2,相当于在原始的网络的系数上都乘了(1-0.5)。这也就是为什么在最后进行test的时候,所有的系数都需要乘上(1-p)了。
对于线性结构来说,我们都是可以这么进行计算的,即dropout和最后系数乘(1-p)是等价的。这样大概解释了一下为什么最后系数要乘(1-p).
Dropout的具体实现
在pytorch中,dropout在train和test的时候不会改变系数,他会直接在训练的时候,将dropout层的输出的值,除(1-p),这样就不需要改变系数了。在test的时候只需要不进行dropout即可。
下面是一个简答的测试结果的图片:
我们看到,在dropout(0.9),且在train模式下,输出的值会直接乘10,相当于除(1-0.9)。在test的时候,就会直接关闭dropout。
在pytorch中,我们可以通过如下的方式控制model是train还是test模式:
model.train() # Set model to training mode
model.eval() # Set model to evaluate mode