深度学习(1)--小总结(验证训练、方差误差、L1L2正则化、dropout、提前停止、输入归一化、梯度爆炸和消失、梯度检验)

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

网易云课堂吴恩达深度学习微专业相关感受和总结。因为深度学习较机器学习更深一步,所以记录机器学习中没有学到或者温故知新的内容。

闲来复习,可以学到很多东西!


下一篇:深度学习(2)--小总结(指数加权平均值,偏差修正,momentum梯度下降,学习率衰减,batch归一化与BN层)https://blog.csdn.net/qq_36187544/article/details/91849279


目录

验证集与训练集

高方差与高偏差的判断

高方差和高偏差的解决

L1、L2正则化

dropout正则化

提前停止迭代

输入归一化

梯度爆炸和梯度消失

梯度检验


验证集与训练集

用交叉验证集验证哪个算法更加优秀,使用测试集测试准确率。
常用比例:当数据量较少,比如1万,可以6:2:2划分训练,验证,测试,或者7:3划分验证,测试。当数据量较大,比如百万级,可以仅取1万验证,1万测试,不用拘泥于比例而在于实际!
由于深度学习需要大量数据,所以有可能网络上抓取的数据也作为训练数据,但是注意,一定要分布相同。就是说,网上的数据也按比例划分到测试验证训练,本身的数据也同样按比例划分。
测试集是为了对算法做无偏估计,所以没有测试集也是ok的,但此时一般称验证集为测试集。 


高方差与高偏差的判断

(之前学习机器学习时只知道过拟合对应高方差等,不知道直接使用验证集损失和训练集损失就可以直接判断)

在最优误差(贝叶斯误差趋近于0的情况下,简言之就是人为误差接近于0):高方差对应过拟合,所以计算训练集与验证集的准确率就可以判断是否高方差,比如训练集准确率99%,验证集90%,就可以认为高方差了。高偏差对应欠拟合,训练集和验证集正确率都较低,比如训练85%,验证84%。
而当贝叶斯误差本身就较高的情况下,比如贝叶斯误差为15%(相当于某些情况人为判断都无法判断),训练85%,验证84%就是比较好的情况了。(理解:相当于人为也不能判断,那先验概率低,所以对误差更加容忍)

举例:手写数据集分类中,如果部分取样15%人为都无法区分,无法确定标签,那可以认为贝叶斯误差15%

高方差和高偏差的解决

对于高偏差问题:增大网络模型,更换网络结构,(通过一些方式减少特征数量)(如果采用某些正则化方式,减少λ,也类似等价于调整网络参数结构)
对于高方差问题:增大数据量,正则化防止过拟合(虽然对于偏差可能会略微增加,但是对于大网络可以忽略不计,所以可以换大网络再利用正则化实现无代价减小偏差方差),更换网络结构,(通过一些方式增加特征数量)(如果采用某些正则化方式,增大λ,也类似等价于调整网络参数结构)


L1、L2正则化

L1正则化会造成权重稀疏,L2正则化即二范数平方。所以常用L2正则化


dropout正则化

dropout正则化(随机失活正则化),让某些节点直接归0,简化节点,常用方法inverted dropout反向随机激活。dropout会压缩函数,因为任何一个节点都可能会被随机删除所以导致节点的权重将不会太大,防止过拟合。可以设置某些层dropout的比例,但一般来讲输入层和节点较少的层一般保留1.0(不做任何删除)。

下图左为正常DNN,右为dropout后


提前停止迭代

early stopping(提前停止迭代),在迭代过程中,训练集损失越来越小,验证集先减小后增大,找到临界点提前停止迭代,防止过拟合。但因此减少了迭代次数可能效果不如L2正则化好(使用L2会需要更多的超参数)

下图紫色线为验证集,蓝色线为训练集,可见,随着迭代次数增加,验证集损失先减小后增大,训练集损失一直减小,所以形成了过拟合,应当提前停止迭代


输入归一化

归一化输入:使收敛过程更加快速,相当于代价函数更加规整,下降更加快速。常用方法(x-μ)/σ。

图像处理中也有减均值归一化这样的步骤。


梯度爆炸和梯度消失

梯度爆炸和梯度消失:根本原因在于深层网络矩阵的连乘或者链式法则导致,若矩阵大于I,导致梯度爆炸,小于I,梯度消失。

如何解决?正则化,优化激活函数(如sigmod转reLU),对于RNN可以梯度截断。
权重矩阵随机初始化也可以解决梯度爆炸和梯度消失问题:采用np.sqrt(2/n)作为权重矩阵随机初始化的方差。写法形同W=np.random.rand(shape)*np.sqrt(2/n)


梯度检验

(写在最前头,这个梯度检验用于DEBUG寻找梯度下降什么地方出错,但主流框架如tensorflow都提供优化器自动进行梯度下降优化权重,所以都不需要梯度检验,如果写最底层可能需要梯度检验,学习下就行,有个印象、概念)

从数学上来说,双边导数精度比单边更高。利用双边导数进行梯度检验。

下图左为双边导数,误差为O(ε^2),右为单边导数,误差为O(ε)


在调试时可以使用梯度检验,不要再训练时使用。梯度建造时记得正则化,不要和dropout一起使用。

梯度检验大致过程如下,对于每一代某一个参数做双边导数,计算双边导数与梯度下降之间的二范数,判断误差大小,在10^(-7)内性状良好,大于10^(-3)考虑是否出错

展开阅读全文

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