droupout和BN层的区别
相关链接https://blog.csdn.net/yunlong_g/article/details/107402085
首先两者都是为了防止网络过拟合而进行的手段。
不同点:
1.droupout是在全连接层,随机的是一些全连接层的神经元暂时性的失活。属于一种集成学习的方法防止过拟合,在训练集中使用特征融合的思想。按照比例完成分类,或者其他任务。并不能解决梯度消失,或爆炸问题
2.BN在卷积层之后,激活函数之前,起到一个将卷积结果归一化的作用。可以有效结果梯度消失,或爆炸问题
Dropout
Dropout在训练模型中是如何实现的呢?Dropout的做法是在训练过程中按一定比例(比例参数可设置)随机忽略或屏蔽一些神经元。这些神经元被随机“抛弃”,也就是说它们在正向传播过程中对于下游神经元的贡献效果暂时消失了,反向传播时该神经元也不会有任何权重的更新。所以,通过传播过程,dropout将产生和L2范数相同的收缩权重的效果。
随着神经网络模型的不断学习,神经元的权值会与整个网络的上下文相匹配。神经元的权重针对某些特征进行调优,会产生一些特殊化。周围的神经元则会依赖于这种特殊化,如果过于特殊化,模型会因为对训练数据过拟合而变得脆弱不堪。神经元在训练过程中的这种依赖于上下文的现象被称为复杂的协同适应(complex co-adaptations)。
加入了Dropout以后,输入的特征都是有可能会被随机清除的,所以该神经元不会再特别依赖于任何一个输入特征,也就是说不会给任何一个输入设置太大的权重。网络模型对神经元特定的权重不那么敏感。这反过来又提升了模型的泛化能力,不容易对训练数据过拟合。
为什么dropout可以防止过拟合
在某种程度上,dropout相当于模型融合。dropout工作中,每次随机丢弃一部分神经元,每次丢弃都是随机的,不一样,相当于每次形成的网络结构都不一样,更新的参数都不一样,最后的预测结果类似于多个网络模型的集成的结果;
dropout随机丢弃一部分神经元,减少了网络结构中的需要更新的参数,有利于减少过拟合;
dropout随机丢弃一部分神经元,相当于这部分神经元对应的特征直接舍弃了,可以理解成从所有特征中挑选了一部分特征进行训练,每次选的特征集还不一样,这就是类似于RF中的列采样了,增强了模型的泛化能力,减少过拟合;
批量正则化BN
我们知道数据归一化,这个一般是针对输入数据而言。但在实际训练过程中,经常出现隐含层因数据分布不均,导致梯度消失或不起作用的情况。如采用sigmoid函数或tanh函数为激活函数时,如果数据分布在两侧,这些激活函数的导数就接近于0,这样一来,BP算法得到的梯度也就消失了。如何解决这个问题?
Sergey Ioffe和Christian Szegedy两位学者提出了批标准化(Batch Normalization)方法。Batch Normalization不仅可以有效解决梯度消失问题,而且还可以让调试超参数更加简单,在提高训练模型效率的同时,还可让神经网络模型更加“健壮”。
为什么BN可以缓解过拟合
原论文中的解释是这么的:
When training with Batch Normalization, a training example is seen in conjunction with other examples in the mini-batch, and the training network no longer producing deterministic values for a given training example. In our experiments, we found this effect to be advantageous to the generalization of the network. 大概意思是:在训练中,BN的使用使得一个mini-batch中的所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果。这句话什么意思呢?意思就是同样一个样本的输出不再仅仅取决于样本本身,也取决于跟这个样本属于同一个mini-batch的其它样本。同一个样本跟不同的样本组成一个mini-batch,它们的输出是不同的(仅限于训练阶段,在inference阶段是没有这种情况的)。我把这个理解成一种数据增强:同样一个样本在超平面上被拉扯,每次拉扯的方向的大小均有不同。不同于数据增强的是,这种拉扯是贯穿数据流过神经网络的整个过程的,意味着神经网络每一层的输入都被数据增强处理了。
BN操作是对每一个隐藏层的激活输出做标准化,即BN层位于隐藏层之后。对于Mini-Batch SGD来说,一次训练包含了m个样本,具体的BN变换就是执行以下公式的过程。
使用
一旦网络训练结束,就没有了batch这个概念了,测试阶段的时候我们一般只输入一个样本来看一下预测结果。因此测试样本前向传导的时候,上面式子里的均值和标准差从哪里来?其实网络一旦训练完毕,参数都是固定的,这个时候即便是训练数据进来一个batch,BN层计算的均值和标准差都是基本不变的(网络趋于稳定),我们可以采用这些数值作为测试样本所需要的均值和标准差,于是最后测试阶段的均值和标准差为:
上面简单理解就是:对于均值来说直接计算所有batch u值的平均值;然后对于标准偏差采用每个batch σB的无偏估计。最后测试阶段,BN的使用公式就是
BN可以用于一个神经网络的任何一个神经元上,文献中主要是把BN变换放在激活函数层的前面,所以前向传导的计算公式应该是:z=g(BN(Wu+b)),因为偏置参数经过BN层其实是不起作用的,因为也会被均值归一化(平移),所以这个参数就可以不要了,可以写成:z=g(BN(Wu))
何时使用BN呢?一般在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时,可以尝试用BN来解决。另外,在一般情况下,也可以加入BN来加快训练速度,提高模型精度,还可以大大提高训练模型的效率。BN具体功能有:
(1)可以选择比较大的初始学习率,让训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然,这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性。
(2)不用再去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性。
(3)再也不需要使用局部响应归一化层。
(4)可以把训练数据彻底打乱。
梯度消失于爆炸
梯度消失
产生原因:
??许多激活函数将输出值挤压在很小的区间内,在激活函数两端较大范围的定义域内梯度为0,导致权重更新的缓慢训练难度增加,造成学习停止。前面层上的梯度是来自后面的层上项的乘积,当层数过多时,随着乘积的累积,将越来越小。
?
解决办法:
1.更改激活函数:Relu、leakyReLu、Elu等激活函数缓解梯度消失
2.减少网络层数
3.使用BN层:BN 通过对每一层的输出规范为均值和方差一致的方法,将输出从饱和区拉倒了非饱和区?
4.残差机制 短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。所以残差学习会更容易。
梯度爆炸
1.梯度剪切防止爆炸,设定阈值,大于阈值剪切;正则化限制梯度爆炸
2.更改激活函数