1.使用的原由:
大规模的神经网络有两个缺点:
- 费时
- 容易过拟合
2.Dropout的正式介绍
- Dropout是减少过拟合并提高模型泛化能力的一个大杀器。
- 一般只有训练时才使用 Dropout,在验证或测试时不需要使用 Dropout
- 对于神经网络单元,按照一定的概率将其暂时从网络中丢弃.(随机丢弃神经元)
- Dropout一般用在全连接神经网络映射层之后,如代码的nn.Linear(20, 30)之后
每次做完dropout,相当于从原始的网络中找到一个更瘦
的网络,如下图所示:
在训练CNN网络的时候,常常会使用dropout来使得模型具有更好的泛化性,并防止过拟合。而dropout的实质则是以一定概率使得输入网络的数据某些维度上变为0,这样可以使得模型训练更加有效。但是我们需要注意dropout层在训练和测试的时候,模型架构是不同的。为什么会产生这种差别呢?
训练和测试的不同:
- 训练层面
标准的网络连接 和 增加了dropout层的网络结构如下图:
此处的 是服从参数为p的伯努利分布的随机数(0或者1),用一句话来说就是y这个向量的每一个维度都会以概率p变为0。
对应的公式变化如下如下:
- 没有dropout的神经网络
-
有dropout的神经网络
-
测试层面
问题来了,在训练的时候我们是有dropout层的,那我们测试的时候还需要么?答案是不需要dropout层了,而是直接把y输入进网络。这时候问题又来了,如果直接把y输入进网络,在训练的时候y由于经历了dropout层,意味着y的数据分布的期望应该是会乘以p的(举个例子如果y的每一个维度都是1,那么经过dropout层之后,有些维度变成了0,那此时真正进入网络的数值分布其期望应该是p),而测试时没有经过drop