深度学习笔记:正则化 1

来源:互联网 发布:facebook免费翻墙软件 编辑:程序博客网 时间:2024/06/16 22:29

1、训练集/验证集/测试集

训练集:用于训练模型。

验证集(简单交叉验证集 cross validation set/development set/dev set):用于评估多种算法模型的性能,尽可能优化算法

测试集(test set):评估模型准确率

验证集和测试集和可以合在一起,当我们不做无偏差估计的时候。

2、偏差、方差

偏差(bias):训练集准确率。模型在训练集表现越好,预测准确率越高,则偏差越低。换句话说,偏差大就是拟合度不够。

方差(variance):验证集准确率。模型在测试集表现越好,则方差越低。可能是拟合度不够,也可能过拟合,把训练集中的特征过度提取,降低了泛化能力。

3、机器学习基础方法

减小偏差的方法:1、更大规模的网络。2、更长训练时间/轮数(不一定有用)

减少方差的方法:1、更多的数据。2、正则化以减少过拟合。

找到一个合适的网络结构(正则化良好的大网络)可能对减小这两个东西同时有帮助。

可以用训练验证集来检测偏差、方差。

4、L2正则化

在损失函数L后面减去一个正则化项,L2正则化项是指权值向量w中各个元素的平方和然后再求平方根。由于有正则化项,所以反向传播一层一层求梯度的过程中,每层的参数都会乘以一个(1 - lambda/m)的小于1 的系数,造成权重衰减。正则化参数lambda设置的越大,w权重矩阵中的值

机器学习中正则化L2和L1的直观理解:http://blog.csdn.net/jinping_shi/article/details/52433975

L2正则化是如何影响权重矩阵w在更新使让w中的数更接近0:http://blog.csdn.net/u012162613/article/details/44261657

5、dropout正则化(随机失活)

设置一个参数keep-prob=一个概率,表示在这一层要把多少比例的神经元设为失活。keep-prob用来乘以本层的输出a,这样就让一部分神经元的输出失效。

每一次迭代(训练出一个模型),失活的神经元是不同的

6、直观理解dropout

随机失活就是在层之间添加一个BOOL类型的矩阵,随机选择矩阵中的0,1,用矩阵乘以该层的输出a,随机去掉本层一些节点。这些矩阵在每一轮训练中随机生成,所以每一轮训练相当于对一个不同结构的网络进行训练。

一般我们在一些参数较多(容易发生过拟合)的层上应用dropout,对于不会过拟合的层,keep-prob可以设为1。计算机视觉领域通常用dropout来正则化。

为什么它有助于防止过拟合?http://blog.csdn.net/stdcoutzyx/article/details/49022443和http://blog.csdn.net/u012162613/article/details/44261657

7、其他正则化方法

可以用微修改原图片的方式增加训练集的数据量,也可以用早停的方式,在训练集偏差仍减小,但测试集方差将增大时停止训练。

8、正则化输入(normalizing inputs)

第一步:均值化0。第二步:归一化样本中的每一个参数,比如输入训练集X有x1、x1两个参数,共有m个样本,即有m个x1、x2,我们要让m个x1和x2的方差相同(同分布)。作用是可以加速训练,因为进行对损失函数的优化过程中(梯度下降),即找损失函数的最/极值得过程中,同分布可以让梯度下降更快到达最/极小值,这样我们就可以用更大的步长,从而加快训练。

用这种方法,也要对测试集进行归一化输入。

9、梯度消失和梯度爆炸

指梯度特别小或者特别大的情况,会导致迭代训练过慢或者不稳定

10、神经网络的权重初始化

为解决梯度消失、梯度爆炸的问题,应该妥善随机初始化权重w[l]。在Relu激活函数中,我们通常会用w[l]=np.random.rand(shape) * np.sqrt(2/n[l-1]),一种高斯分布的随机初始化。np.sqrt(2/n[l-1])是初始化权重过程中可以调节的超参数,它一般不是首要调节的超参数。

11、梯度的数值逼近(双边梯度检测)

讲述的是一种进行梯度检测的方法,使用的是双边检测来检测某个点x的导数近似值(f'(a) = ( f(a+v) - f(a-v) ) / 2v , 其中,v是一个非常小的数),而不是单边,这样的导数近似值更准确,因为更加接近微积分的定义。

12、梯度检测

梯度检测可以检查反向传播的实现过程中的BUG。这样,由双边梯度检验算出某点梯度的近似值,与真实值比较,(比较过程设计矩阵的范数等计算,不过有些类似于矩阵各个位置之差相加后再开平方这种),如果比较地差值小,比如小于 10^-7 这种,可以认为反向传播的实现是正确的,如果比较大,比如 10^-3,应继续debug

总结:

13、实现梯度检测


* 正则化是为了防止过拟合,减小模型的方差,提高泛化能力。

* 正则化输入是为了让训练正常进行,不会发生过慢等情况。

* 梯度检测是为了确保模型中反向传播算法的正确实施