dropout理解(二)

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

猜你喜欢

转载自blog.csdn.net/vincent_duan/article/details/119951471
今日推荐