Drop详细原理参考
训练模型时用了dropout,模型训练好后在测试集上做预测,需要开dropout吗?
训练的时候dropout的作用就是通过引入噪声,防止模型过拟合。所以其实测试的时候是不能关闭dropout的(关闭的话训练的模型和测试的模型就不同了)。不关闭dropout,我们得到的就是一个随机的网络,给定x,得到的预测值y是服从一定的分布的。不关闭dropout的情况下,单次预测就是从这个分布中采样一次。多次采样就可以得到y的均值,也就是最终的预测值。但是多次采样会带来较大的计算开销。这时我们假设(这个假设在大多数情况下时成立的,但也有不成立的情况),平均参数(关闭dropout)得到的模型的预测值近似等于上面说的多次采样的平均值。所以这个时候就有了训练开dropout,预测时关闭的做法。
(作者:欧阳疯
链接:https://www.zhihu.com/question/286256061/answer/783458538)
drop起作用的原理
(1)减少神经元之间复杂的共适应关系:
因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高
(2)取平均:
Dropout得益于p,当p=0.5时,就可以有2^n个不同的网络,dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均,在每次迭代后,参数值随机更新,最终使得所有参数更鲁棒,即对各种情况都适应,更具体的就是选出了最佳的网络参数(防止过拟合)
为什么经过dropout需要进行rescale
Drop代码讲解
def dropout(x, level, noise_shape=None, seed=None):
"""Sets entries in `x` to zero at random,
while scaling the entire tensor.
# Arguments
x: tensor
level: fraction of the entries in the tensor
that will be set to 0.
noise_shape: shape for randomly generated keep/drop flags,
must be broadcastable to the shape of `x`
seed: random seed to ensure determinism.
"""
if level < 0. or level >= 1:
raise ValueError('Dropout level must be in interval [0, 1[.')
if seed is None:
seed = np.random.randint(1, 10e6)
if isinstance(noise_shape, list):
noise_shape = tuple(noise_shape)
rng = RandomStreams(seed=seed)
retain_prob = 1. - level
if noise_shape is None:
random_tensor = rng.binomial(x.shape, p=retain_prob, dtype=x.dtype)
else:
random_tensor = rng.binomial(noise_shape, p=retain_prob, dtype=x.dtype)
random_tensor = T.patternbroadcast(random_tensor,
[dim == 1 for dim in noise_shape])
x *= random_tensor % random_tensor 一个以0,1组成的向量,用来屏蔽一部分的输入X
x /= retain_prob %除以保留的概率
return x
(1)为什么要除以保留的概率?
对于一个神经元,如果它在训练的时候以概率p丢弃,那么它输出的期望为px+(1-p)0=px;而测试的时候不丢弃,那么测试的时候期望就为x。
为了维持训练和测试的时候输出的期望保持一致,在代码上有两种做法,一种是在训练的时候对输出除以1-p(保留的概率),另外一种则是在预测的时候对输出乘以p
网友评论