深度学习的实用技巧——L2正则化、Dropout正则化、梯度检验

1.深度学习应用是一个高度迭代的过程

想要找到一个称心的神经网络结构,是一个循环往复的过程:

idea——>code——>experiment——>idea……

超级参数的选择也是神经网络工程师关注的重要问题:

#layers   ?

#hidden units  ?

learning rates  ?

activation functions   ?

因此,创建高质量的训练数据集、验证集和测试集是十分重要的事情。有助于提高循环效率。

2.训练集/验证集/测试集

在布置机器学习任务中,通常将数据分为训练集(train)、验证集(dev)和测试集(test)。

训练集用来run优化算法来拟合数据

验证集用来比较哪个模型或者算法效果更好

测试集用来评估模型效果。

当数据集规模较小时,适用传统的7/3或者6/2/2划分;当数据规模达百万级以上,一般是98/1/1的划分比例。

一个经验的法则:确保dev和test数据集来自相同的分布,而训练集则不要求与dev和test数据集来源相同。

没有测试集也不要紧,有dev数据集就行了。

3.偏差和方差(Bias/Variance)

欠拟合意味着高偏差,过拟合意味着高方差。

假设人眼识别误差Optimal error约等于0%(最优误差也被称为贝叶斯误差)

Training set error:1%

Dev set error:11%  这意味着过度拟合了训练集,但是验证集上的表现不够好,这是high variance。

Training set error:15%

Dev set error:16%  这意味着欠拟合训练集,验证集上表现比训练集略差,这是合理的,所以是high bias。

Training set error:15%

Dev set error:30%  high variance & high bias 

Training set error:0.5%

Dev set error:1% low variance & low bias(优质分类器 )

以上是在训练集和验证集来自相同来源的假设下的。如果没有这一假设,分析偏差和方差将会复杂。

分析完模型的偏差和方差之后,根据情况选择不同的路径,如下图所示:


解决高偏差:更大的网络结构,训练更长

解决高方差:准备更多的数据,正则化

4.正则化(Regularition)

逻辑回归中的正则化,L1正则化和L2正则化,不同的是L1正则化得到的权重w是稀疏的。如下图:


神经网络中的正则化是矩阵L2正则化(正则项是权重矩阵各元素的平方之和):


L2正则化又被称为“权重衰减”weight decay,因为是在原有的权重上乘以一个小于1 的系数。

正是因为权重衰减导致w矩阵中很多项约等于0,致使深层神经网络中很多节点的影响变小了,相当于简化了网络结构,这就是为什么正则化可以减少过拟合(缓解高方差)的原因。

还有一个直观的解释:通过正则化设置lambda,使得w减小,导致z也很靠近0,处在激活函数的线性范围(非饱和)内,每一层都约为线性,这样这个神经网络的线性成分大大增加,减少了过拟合。如图:


5.Dropout正则化

Dropout(随机失活)正则化的原理是:设置消除神经网络中节点的概率来精简网络结构。

实施Dropout:反向随机失活(Inverted Dropout),其流程如下:


如果keep-prob=1,那么就相当于没有实施Dropout。

在测试阶段不要使用Dropout!因为我们不希望预测结果是随机的。

为什么Dropout正则化有效?它不依赖输入的其中任意特征,这样spread out weights,以至于shrink weight。

对于不同的层,w的权重矩阵大小不一样,可以设置不同的keep-prob。

缺点:丧失了通过判断J的是否单调递减的测试方法,因为J的定义是变化的。

一般只有在防止过拟合的时候,我们才想到使用dropout正则化。

6.其他的正则化方法

——数据扩增(Data Augmentation)

——提早停止(Early stopping)


随着训练的过程,权重w很小的初始化值逐渐增大。

提早停止的缺点:不能独立处理bias和variance的问题

L2正则化的缺点:要尝试很多lambda的值

7.归一化输入(加快训练速度)

需要两个步骤:1,对每个特征零均值化 2,对每个特征归一化方差

注意:训练集和测试集要使用相同的均值和方差去归一化。

为什么要这样做?原本狭长的优化函数,要找到最小值,需要设置较小的学习率,并且进行多次迭代;而归一化以后变的更加圆,便于更加直接找到最小值,减少迭代次数。如图:


如果特征输入的范围大致在相同范围,则归一化操作就不需要了。

8.梯度消失和梯度下降(阻碍训练速度)

深度神经网络出现梯度消失和梯度下降的直观解释:(以激活函数为例,实际上每一层的导数或者梯度也是同样的现象,这会大大加重训练难度。因为梯度过大或者过小都不好,尤其是过小,梯度下降步长过小,将耗费很长时间去学习)


9.权重初始化

通过设置权重初始值,部分缓解梯度消失和梯度下降的想象。一般有Xavier Initialization等,就是设置权重w的方差为1/n

具体的编码范例如下所示:


猜你喜欢

转载自blog.csdn.net/sinat_28520127/article/details/81052625