时不我与

V1

2022/02/27阅读:38主题:橙心

2.2

日期: 2.2 - 2.4

论文链接 :A Stack of Feed-Forward Layers Does Surprisingly Well on ImageNet

一:Dropout的原理及bagging思想

1:Dropout原理

Dropout是深度学习中应对过拟合问题简单且有效的一种正则化方法。原理很简单:在训练阶段,在每一个Epoch中都以一定比例随机的丢弃网络中的一些神经元,如图一所示,使得每次训练的模型包含的神经元都不同。这种方式使得网络权重在更新过程中不依赖隐藏节点之间的固定关系(隐藏层节点的固定关系可能会影响参数更新过程),同时使得网络不会对某一个特定的神经元过分敏感,从而提高了网络的泛化能力。

图一:Dropout原理图

2:Dropout的Bagging思想

从《百面深度学习》这本书中的相关内容介绍领悟到,Dropout这种以一定比例随机丢弃神经元的方式是一种Bagging的思想:神经网络通过Dropout层以一定比例随即的丢弃神经元,使得每次训练的网络模型都不相同,多个Epoch下来相当于训练了多个模型,同时每一个模型都参与了对最终结果的投票,从而提高了模型的泛化能力。在此注意,Dropout与Bagging有一点不同是:Bagging的各个模型之间是相互独立的,而Dropout各个模型之间是共享权重的。

bagging是利用相同数据训练多个模型,然后将各个模型的结果投票或者加权取平均等。

二:Dropout使用要点

1:Dropout参数设置介绍

首先说一下Dropout的参数:官方文档中是这样介绍的:

p: probability of an element to be zeroed. Default: 0.5
inplace: If set to ``True``, will do this operation in-place. Default: ``False``

  • 第一个参数p代表Dropout率:即一个神经元被丢弃的概率,相反一个神经元被保留下来的概率即1-p;当p设置为1时,表示所有的神经元都被丢弃,输出全为0。
  • 第二个参数inplace,是布尔量,默认为'False',当inplace = True时,这个Dropout操作会作用在tensor自身上;当inplace = False时,tensor自身则不会改变。设置为True的好处是:上层网络传递下来的tensor直接进行修改,可以节省运算内存,不用多储存变量,所以显存不够的可以设置成'True'。

为了便于大家理解,请看下面代码:

import torch
import torch.nn as nn
d = nn.Dropout(p = 0.5, inplace = True)
input = torch.randn(4, 3)
d(input)
input

#input输出结果
tensor([[-0.0000,  0.0000,  0.0000],
        [ 0.0000, -0.1043,  1.8617],
        [-0.0000, -0.0000,  0.0000],
        [-0.0000, -0.0000, -0.4744]])


import torch
import torch.nn as nn
d = nn.Dropout(p = 0.5, inplace = False)
input = torch.randn(4, 3)
d(input)
input

#input输出结果
tensor([[ 1.1641,  1.6885, -0.5561],
        [ 0.4439, -0.3091, -0.7204],
        [-0.8396,  0.2921, -2.7595],
        [ 1.7675, -0.6382,  1.6372]])

2:Dropout层在训练和测试中的区别

在本文的第二段提到了,Dropout层利用了Bagging思想,在测试阶段,每一个模型都参与了测试结果的投票,这也就是测试阶段并没有设置Dropout率,而是将此功能关闭了,那么在网络中是如何实现的呢?

以pytorch框架为例说明,训练过程中,网络的模式会设置成train,即model.train(),在测试过程中网络的模式会设置成eval,即model.eval()。当设时成model.eval()时,表示这种模式关闭了Dropout功能,除此之外也改变了BatchNorm层。其中,测试时关闭Dropout功能我们上面解释了,对BatchNorm的改变是因为:BatchNorm训练时是将以minibatch的形式送入网络的,而测试是单个图片进行的,没有minibatch这个概念,所以测试过程中利用的是全部数据的统计结果,即均值和标准差,具体可参见。

3:Dropout层的复现问题

由于Dropout以一定比例随机丢弃神经元这种模式的存在,使得网络每次的训练结果都不同,那么结果即无法复现。解决办法:可以通过设置随机种子来保证网络每次丢弃固定的神经元,使结果得以复现。代码如下:

seed = 3
torch.manual_seed(seed)

分类:

后端

标签:

后端

作者介绍

时不我与
V1