深度学习总结(十)——dropout

深度学习总结(十)——dropout_第1张图片


1. Inverted dropout

大家都知道dropout是一个概率值,它表示的是a[l] (第l层的输入)中的元素以多大的概率置零。这里我们用它的对偶变量keep-prob代替dropout,它表示的是以多大的概率保留元素。可见dropout+keep-prob=1。

现在我们以一个三层的神经网络为例,讨论keep-drop在神经网络中是如何发生作用的。

import numpy as np

keep_prod = 0.8
a3 = np.random.rand(3,4)
print("a3-before",a3)
d3 = np.random.rand(a3.shape[0],a3.shape[1])"d3",d3)
a3=np.multiply(a3,d3)
print("a3-after",a3)

上述代码显示的是第三层中keep-drop的运行过程,a[3]为第3层的输出结果,d[3]为keep-drop的index数组,它与a[3]同样大小,元素非0即1。两者对应位置相乘,a[3]中d[3]的1对应的位置,元素值保留,否则置为零。这就是keep-prod的过程,输出如下所示:

a3-before 
[[ 0.6016695   0.733025    0.38694513  0.17916196]
 [ 0.39412193  0.22803599  0.16931667  0.30190426]
 [ 0.8822327   0.64064634  0.40085393  0.72317028]]
d3 
[[False  True  True False]
 [ True False  True  True]
 [ True  True  True  True]]
a3-after 
[[ 0.          0.733025    0.38694513  0.        ]
 [ 0.39412193  0.          0.16931667  0.30190426]
 [ 0.8822327   0.64064634  0.40085393  0.72317028]]

然后通过 z[4]=w[4]a[3]+b[4] 获得该层的输出。通过keep-drop后,我们发现a[3]中的元素以20%(假设keep-prod=0.8)的概率置零,这就使得a[3]的期望约变为原来的0.8倍。那么就意味着z[4]的期望也将变为原来的0.8倍。而在测试时,我们是不使用keep-drop的(会使得测试结果变得随机),这就造成了训练和测试时输入输出的期望不一致,会影响模型的泛化能力。为此,我们添加以下操作:

a3/=keep_prob

来保证训练和测试时输入输出的期望一致,这个过程我们称之为inverted dropout。这也是目前最主要的dropout实现方式。

2. dropout的一些使用说明

一般一次训练迭代中,隐含层的参数为0的点应该是一样的。不同的迭代中才会不一样。因为同一次迭代中,不同训练样本的梯度不一样,最好不要两个变量一起变。

Dropout会产生收缩权重平方范数的效果,即压缩权重。并完成一些预防过拟合的外层正则化。Dropout被正式作为一种正则化的替代形式,L2对不同权重的衰减是不同的,它取决于倍增的激活函数的大小。Dropout的功能类似于L2正则化,与L2正则化不同的是,被应用的方式不同dropout也会有所不同,甚至更适用于不同的输入范围。

不同层的keep-prob可以不一样,参数多的层,keep-prob可以设置小一些,少的可以设置大一些,或者为1。

如果你觉得某一层比其它层更容易过拟合,你可以把该层的keep-drop设得比其它层低一些,但是你需要使用交叉验证来搜索更多的超参数。你也可以有的层用dropout,有的不用,这样在应用dropout的层只含有一个超级参数。

Dropout主要用在计算机视觉领域,因为数据量不够,容易过拟合,需要dropout。

Dropout的一大缺点就是成本函数J不再被明确定义。因为每次迭代的过程中,都会随机移除一些点,你很难检查梯度下降的性能。

你可能感兴趣的:(深度学习)