dropout,batch norm的使用顺序,训练和测试时的差异

2022-09-23 14:47:49

  最近开通了一个公众号,里面会分享一些机器学习,深度学习,推荐系统的学习笔记和相关知识,同时也会分享一些面经,感兴趣的小伙伴可以关注一下,十分感谢,比心


batch norm和dropout都可以起到正则化的作用,防止过拟合。

dropout:

dropout通俗理解就是,在神经网络训练的时候,有时因为神经元过多,模型参数过多等原因而导致过拟合,dropout以概率p让一部分神经元失活,从而达到降低过拟合的效果。如下图所示,使用dropout后,一部分神经元不参与训练。

  •  在前向传播时,假设有这一层n个神经元,则我们可以假设每个神经元的概率都是0~1(可以通过python得到随机的值),然后小于p的就失活,即不参与训练。
  • 在反向传播时,也只对参与训练的神经元进行参数更新。
  • 每次训练的时候,又是n个神经元,重新进行dropout

dropout可以缓解过拟合的原因:

1.类似bagging,采用dropout,使得每次训练的时候一部分神经元失活,从而导致dropout后的模型都是不一样的,因为失活的神经元不一样。这就相当于有多个网络进行训练得到最终结果,有点ensemble的感觉。

2.因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。

BN的知识后续补充

BN和Dropout训练和测试时的差异

对于BN,在训练时,是对每一批的训练数据进行归一化,也即用每一批数据的均值和方差。

而在测试时,比如进行一个样本的预测,就并没有batch的概念,因此,这个时候用的均值和方差是全量训练数据的均值和方差,这个可以通过移动平均法求得。

对于BN,当一个模型训练完成之后,它的所有参数都确定了,包括均值和方差,gamma和bata。

BN训练时为什么不用全量训练集的均值和方差呢?

因为用全量训练集的均值和方差容易过拟合,对于BN,其实就是对每一批数据进行归一化到一个相同的分布,而每一批数据的均值和方差会有一定的差别,而不是用固定的值,这个差别实际上能够增加模型的鲁棒性,也会在一定程度上减少过拟合。

也正是因此,BN一般要求将训练集完全打乱,并用一个较大的batch值,否则,一个batch的数据无法较好得代表训练集的分布,会影响模型训练的效果。


Dropout是在训练过程中以一定的概率的使神经元失活,即输出为0,以提高模型的泛化能力,减少过拟合。

Dropout 在训练时采用,是为了减少神经元对部分上层神经元的依赖,类似将多个不同网络结构的模型集成起来,减少过拟合的风险。

而在测试时,应该用整个训练好的模型,因此不需要dropout。

Dropout 如何平衡训练和测试时的差异呢?

Dropout ,在训练时以一定的概率使神经元失活,实际上就是让对应神经元的输出为0

假设失活概率为 p ,就是这一层中的每个神经元都有p的概率失活,如下图的三层网络结构中,如果失活概率为0.5,则平均每一次训练有3个神经元失活,所以输出层每个神经元只有3个输入,而实际测试时是不会有dropout的,输出层每个神经元都有6个输入,这样在训练和测试时,输出层每个神经元的输入和的期望会有量级上的差异。

因此在训练时还要对第二层的输出数据除以(1-p)之后再传给输出层神经元,作为神经元失活的补偿,以使得在训练时和测试时每一层输入有大致相同的期望。

不同层的顺序关系:

conv+pooling+bn+relu,可以使relu保留较好的非线性性

linear+dropout


  • 作者:夏未眠秋风起
  • 原文链接:https://blog.csdn.net/naocanmani/article/details/105652235
    更新时间:2022-09-23 14:47:49