dropout有很多种方式。该文章主要总结倒置丢弃法
一、dropout概述
dropout是指:将hidden layer中的某些隐藏单元以一定的概率进行丢弃。
被丢弃的神经元,在反向传播时,与这些神经元相关的权重梯度均为0。由于在训练中隐藏层神经元的丢弃是随机的,即 h 1 , . . . , h 5 h_1 ,...,h_5 h1,...,h5 都有可能被清零。这样输出层的计算都⽆法过度依赖 h 1 , . . . , h 5 h_1 ,...,h_5 h1,...,h5中的任⼀个,从而在训练模型时起到正则化的作⽤,并可以⽤来应对过拟合。在测试模型时,我们为了拿到更加确定性的结果,⼀般不使⽤丢弃法。
具体做法:
设丢弃概率为
p
p
p,那么有
p
p
p的概率
h
i
h_i
hi会被清0,有
1
−
p
1-p
1−p的概率
h
2
h_2
h2会除以
1
−
p
1-p
1−p做拉伸。丢弃概率是dropout的超参数。使用dropout时,计算新的隐藏单元
h
i
′
h'_i
hi′
h
i
′
=
ξ
i
1
−
p
h
i
h'_i=\frac {\xi_i}{1-p}h_i
hi′=1−pξihi
其中随机变量 ξ i \xi_i ξi为0和1的概率分别为 p p p和 1 − p 1-p 1−p
二、实现dropout函数
import d2lzh as d2l
from mxnet import autograd, gluon, init, nd
from mxnet.gluon import data as gdata, loss as gloss, nn
def dropout(X, drop_prob):
assert 0 <= drop_prob <= 1
keep_prob = 1 - drop_prob
# 这种情况下把全部元素都丢弃
if keep_prob == 0:
return X.zeros_like()
mask = nd.random.uniform(0, 1, X.shape) < keep_prob
return mask * X / keep_prob
- 其中
nd.random.uniform(0, 1, X.shape)
函数的作用是:生成和 X X X形状一样的数据结构,其中的元素均在 [ 0 , 1 ] [0, 1] [0,1]之间 mask
的形状和X
一样,其中的每个元素实际上表示了每个元素被保留的概率。如果比给定的keep_prob
还小,说明小概率事件发生了,就保留下来- 在
python
中,形状相同 X 、 Y X、Y X、Y矩阵相乘,所得结果矩阵的形状也为 X . s h a p e X.shape X.shape,而其中每个元素= X i ∗ Y i X_i*Y_i Xi∗Yi
在使用mxnet框架时,可以通过在nn.Sequential()
生成的容器中addnn.Dropout(prob)
来实现,其中prob
表示丢弃的概率,是超参数。如下: