深度学习:正则化

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pipisorry/article/details/75307522

http://blog.csdn.net/pipisorry/article/details/75307522

机器学习模型过拟合可采用的方法参考[Machine Learning - X. Advice for Applying Machine Learning机器学习算法的诊断和改进]

为了防止过拟合,提高模型泛化能力,减少测试误差,深度学习模型(如神经网络)一般采用正则化策略。采用的方法有范数惩罚(如l2正则)、数据集增强、提前终止、参数绑定和共享、ensembling models集成、dropout、对抗训练等等。

L1和L2范数正则化

方法参考[最优化方法:L1和L2正则化regularization ]

深度学习模型中L1和L2正则化需要注意的一点是:

在神经网络中我们通 常只对每一层仿射变换的权重做惩罚而不对偏置做正则惩罚。精确拟合偏置所需的 数据通常比拟合权重少得多。每个权重会指定两个变量如何相互作用。我们需要在 各种条件下观察这两个变量才能良好地拟合权重。而每个偏置仅控制一个单变量。 这意味着,我们不对其进行正则化也不会导致太大的方差。另外, 正则化偏置参数 可能会导致明显的欠拟合。因此,我们使用向量 w 表示所有应受范数惩罚影响的权 重,而向量 θ 表示所有参数 (包括 w 和无需正则化的参数)。

有时希望对网络的每一层使用单独的惩罚,并分配不同的α系数。

 

 

Dropout正则化

        训练神经网络模型时,如果训练样本较少,为了防止模型过拟合,Dropout可以作为一种trikc供选择。Dropout是hintion最近2年提出的,源于其文章Improving neural networks by preventing co-adaptation of feature detectors.中文大意为:通过阻止特征检测器的共同作用来提高神经网络的性能。

        dropout 是指在深度学习网络的训练过程中,按照一定的概率将一部分神经网络单元暂时从网络中丢弃,相当于从原始的网络中找到一个更瘦的网络。或者说,Dropout是指在模型训练时随机让网络某些隐含层节点的权重不工作,不工作的那些节点可以暂时认为不是网络结构的一部分,但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了。

        按照hinton的文章,他使用Dropout时训练阶段和测试阶段做了如下操作:

在样本的训练阶段,在没有采用pre-training的网络时(Dropout当然可以结合pre-training一起使用),hintion并不是像通常那样对权值采用L2范数惩罚,而是对每个隐含节点的权值L2范数设置一个上限bound,当训练过程中如果该节点不满足bound约束,则用该bound值对权值进行一个规范化操作(即同时除以该L2范数值),说是这样可以让权值更新初始的时候有个大的学习率供衰减,并且可以搜索更多的权值空间。

在模型的测试阶段,使用”mean network(均值网络)”来得到隐含层的输出,其实就是在网络前向传播到输出层前时隐含层节点的输出值都要减半(如果dropout的比例为50%)。

关于Dropout,文章中没有给出任何数学解释,Hintion的直观解释和理由如下:

  1. Hinton认为过拟合,可以通过阻止某些特征的协同作用来缓解。在每次训练的时候,每个神经元有百分之50的几率被移除,这样可以让一个神经元的出现不应该依赖于另外一个神经元。由于每次用输入网络的样本进行权值更新时,隐含节点都是以一定概率随机出现,因此不能保证每2个隐含节点每次都同时出现,这样权值的更新不再依赖于有固定关系隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况。

  2. 可以将dropout看作是模型平均的一种。对于每次输入到网络中的样本(可能是一个样本,也可能是一个batch的样本),其对应的网络结构都是不同的,但所有的这些不同的网络结构又同时share隐含节点的权值。这样不同的样本就对应不同的模型,和bagging,boosting理论有点像,但又不完全相同。所谓的dropout我们可以这么理解,n个网络,它们权值共享,并且具有相同的网络层数(这样可以大大减小计算量)。我们每次dropout后,网络模型都可以看成是整个网络的子网络。

  3. native bayes是dropout的一个特例。Native bayes有个错误的前提,即假设各个特征之间相互独立,这样在训练样本比较少的情况下,单独对每个特征进行学习,测试时将所有的特征都相乘,且在实际应用时效果还不错。而Droput每次不是训练一个特征,而是一部分隐含层特征。

  4. 还有一个比较有意思的解释是,Dropout类似于性别在生物进化中的角色,物种为了使适应不断变化的环境,性别的出现有效的阻止了过拟合,即避免环境改变时物种可能面临的灭亡。

(需要注意的是如果采用dropout,训练时间大大延长,但是对测试阶段没影响)。

[Deep learning:四十一(Dropout简单理解)]

RNN中的Dropout

[Dropout在RNN中的应用综述]

Drop的变体

SpatialDropout2D:与 Dropout 相同,但它会丢弃整个 2D 的特征图而不是丢弃单个元素。如果特征图中相邻的像素是强相关的(通常是靠前的卷积层中的情况),那么常规的 dropout 将无法使激活正则化,且导致有效的学习速率降低。在这种情况下,SpatialDropout2D 将有助于提高特征图之间的独立性,应该使用它来代替 dropout。

算法实现

以前我们网络的计算公式是:

采用dropout后计算公式就变成了:

上面公式中Bernoulli函数,是为了以概率p,随机生成一个0、1的向量。

经过上面屏蔽掉某些神经元,使其激活值为0以后,我们还需要对向量x1……x1000进行rescale,也就是乘以1/(1-p)。

如果你在训练的时候,经过置0后,没有对x1……x1000进行rescale,那么你在测试的时候,就需要对权重进行rescale:

 

    #dropout函数的实现测试
    def dropout(x, level):  
        if level < 0. or level >= 1:    #level是概率值
            raise Exception('Dropout level must be in interval [0, 1[.')  
        retain_prob = 1. - level  
        #我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样。硬币 正面的概率为p,n表示每个神经元试验的次数。#因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。  
        sample=np.random.binomial(n=1,p=retain_prob,size=x.shape)    #即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了  
        print sample  
        x *=sample    #0、1与x相乘,我们就可以屏蔽某些神经元,让它们的值变为0  
        x /= retain_prob  
      
        return x  
    x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)  
    dropout(x,0.4)</span>  

函数中,x是本层网络的激活值。Level就是dropout就是每个神经元要被丢弃的概率。

tf中实现

hidden3 = tf.nn.relu(tf.matmul(hidden2, weights) + biases)
hidden3 = tf.nn.dropout(hidden3, keep_prob)只需要在神经网络的隐层中加入dropout代码行就行。

[GDLnotes/src/neural/nn_overfit.py ]

为什么经过dropout需要进行rescale?

有的人解释有点像归一化一样,就是保证网络的每一层在训练阶段和测试阶段数据分布相同。我查找了很多文献,都没找到比较合理的解释,除了在文献《Regularization of Neural Networks using DropConnect》稍微解释了一下,其它好像都没看到相关的理论解释。

我们前面说过,其实Dropout是类似于平均网络模型。我们可以这么理解,我们在训练阶段训练了1000个网络,每个网络生成的概率为Pi,然后我们在测试阶段的时候,我们肯定要把这1000个网络的输出结果都计算一遍,然后用这1000个输出,乘以各自网络的概率Pi,求得的期望值就是我们最后的平均结果。我们假设,网络模型的输出如下:

M是Dropout中所有的mask集合。所以当我们在测试阶段的时候,我们就是对M中所有的元素网络,最后所得到的输出,做一个期望:

P(M)表示网络各个子网络出现的概率。因为dropout过程中,所有的子网络出现的概率都是相同的。

[深度学习(二十二)Dropout浅层理解与实现 ]

from: http://blog.csdn.net/pipisorry/article/details/75307522

ref: [理解dropout ]???

《Improving neural networks by preventing co-adaptation of feature detectors》

《Improving Neural Networks with Dropout》

《Dropout: A Simple Way to Prevent Neural Networks from Overtting》

 

展开阅读全文

没有更多推荐了,返回首页