吴恩达老师深度学习视频课笔记:深度学习的实用层面

        训练、验证和测试数据集(training、development and test sets):训练神经网络时,我们需要作出很多决策,如神经网络分多少层(layers)、每层含有多少个隐藏层单元(hidden units)、学习率(learning rates)、各层采用哪些激活函数(activation functions)等。开始一个新应用时,我们不可能从一开始就准确预测出这些信息和其它的超参数。实际上,应用型机器学习是一个高度迭代的过程。通常在项目启动时,我们会先有一个初步想法,比如构建一个含有特定层数(certain number of layers)、特定隐藏层单元数量、特定数据集的神经网络。然后编码并尝试运行这些代码。通过运行和实验,你得到该神经网络结果,告知你设置这些配置信息后的运行结果是怎样的。然后基于输出结果,重新完善你的想法、改变策略,或者为了找到更好的神经网络不断迭代更新自己的方案。

        我们通常会把数据集分为三部分:一部分作为训练集(training set);一部分作为交叉验证集(hold-out cross validation set),有时也称为验证集(development set);一部分作为测试集(test set)。首先,对训练集执行训练算法,然后通过验证集选择最好的模型,最后在测试集上对选择的最终模型进行评估。为了无偏评估(unbiased estimate)算法的状态,在机器学习发展的小数据量时代,常见的做法是将数据集七三分,即70%作为训练集,30%作为测试集;如果有验证集,则60%作为训练集,20%作为验证集,20%作为测试集。如果数据集仅有100、1000或10000,按上述比例划分是非常合理的。但是在大数据时代,数据量可能是百万级别,或更大,那么验证集和测试集占数据总量的比例会趋向于变得更小。验证集的目的就是验证不同的算法,校验哪种算法更有效,因此验证集要足够大才能评估。通过验证集可以选择几种较好的算法,最后通过测试集选择最终的算法。测试集的主要目的是评估算法的效果。在训练模型时,要保证验证集和测试集的数据来自同一分布。有时没有测试集也是可以的,因为测试集的主要目的是对所选定的神经网络做出无偏评估(unbiased estimate)。如果不需要无偏评估也可以不设置测试集。在机器学习中,如果只有一个训练集和一个验证集而没有测试集,在这种情况下,人们经常将训练集称为训练集,而把验证集称为测试集。

        偏差(bias)/方差(variance)高偏差我们称为欠拟合(underfitting),高方差称为过拟合(overfitting)。理解偏差和方差的两个关键是训练集误差(train set error)和验证集误差(development set error)。


        通过查看训练集误差和验证集误差,我们便可以判断出现有算法是否具有高方差,高偏差,如下图。假设:(1)、训练集误差为1%,验证集误差为11%,此种情况属于高方差;(2)、训练集误差为15%,验证集误差为16%,此种情况属于高偏差;(3)、训练集误差为15%,验证集误差为30%,此种情况属于高偏差、高方差;(4)、训练集误差为0.5%,验证集误差为1%,此种情况正常,属于低偏差、低方差。注:以上假设的前提是:基于最优误差(optimal error)或贝叶斯误差(Bayes error)接近0%,即人眼辨别的错误率接近0%,且训练集和验证集数据来自相同分布。


        当我们训练神经网络的时用到的基本方法(basic recipe)是判断算法偏差或方差是否偏高。初始模型训练完成后,我们首先要判断算法的偏差高不高,如果偏差过高,甚至无法拟合数据集,就需要试图选择(pick)一个新网络,比如含有更多隐藏层或者隐藏单元的网络,或者花费更多的时间来训练网络,或者尝试更先进(more advanced)的优化算法或者尝试其它不同的神经网络架构(neural network architectures)。一般采用更大规模的网络会有所帮助。反复尝试,直到拟合数据为止。一旦偏差降低到可接受的数值,然后检查方差是否正常。如果方差高,最好的解决办法是采用更多的数据。如果无法获得更多数据,我们也可以尝试通过正则化(regularization)来减少过拟合。有时为了能够找到更合适的神经网络架构,我们不得不反复尝试,直到找到一个低偏差和低方差的架构。

        有两点需要注意:第一:高偏差和高方差是两种不同的情况,通常会用训练集、验证集来诊断算法是否存在偏差或方差问题;要清楚存在问题的是偏差还是方差,还是两者都有问题。第二:只要持续训练一个更大的网络,准备更多的数据,就可以减少偏差或方差,而不影响另一方,也不用太过于关注如何平衡偏差和方差。

        正则化(regularization):解决高方差(过度拟合)一般有两种方法,一个是正则化,一个是准备更多数据。正则化是一种非常实用的减少方差的方法

        L1范数正则化、L2范数正则化。λ是正则化参数,通常用验证集来配置这个参数。L2范数正则化也被称为权重衰减(weight decay)。在神经网络中,L2范数一般被称为弗罗贝尼乌斯范数(frobenius norm),如下图。


        为了调试梯度下降,务必使用带有正则化的J函数(成本函数),它可以保证在所有调幅范围内单调递减。

        Dropout正则化:直观上,dropout可以随机删除(knocking out)网络中的神经单元,好像每次迭代之后,神经网络都会变得比之前更小。dropout可以采用inverted dropout方法,其有一个参数为keep_prob,如果你担心某些层比其它层更容易发生过拟合,可以把某些层的keep_prob值设置的比其它层更低。也可以有些层应用dropout,而有些层不使用dropout。应用dropout,只含有一个超参即keep_prob。dropout的一大缺点就是成本函数J不再被明确定义,因为每次迭代都会随机移除一些节点。

        其它几种减少神经网络过拟合的方法:(1)、训练数据扩增(dataaugmentation):水平翻转原有图像、随意裁剪原有图像、旋转并随机缩放原有图像等增加额外假(fake)训练数据,这样可以不用增加额外的花费,代价几乎为0。(2)、early stopping:提早停止训练神经网络,因为验证集误差通常会先呈下降趋势,然后在某个节点处开始上升,在此节点处停止训练神经网络。

        加速训练的方法:归一化输入(normalize your inputs)。归一化输入需要两个步骤:第一:零均值化(subtract out or to zero out the mean);第二:归一化方差(normalizethe variances);如下图。


        需要用同样的方法调整测试集,我们希望不论是在训练数据还是在测试数据都是通过相同的μ和σ2,其中μ和σ2是由训练集数据计算得来的。归一化输入的原因:应用梯度下降法,使学习算法运行的更快,可以更快地找到最小值,更容易优化,如下图。如果输入特征处于不同范围内,可能有些特征值从0到1,有些从1到1000,那么归一化特征值就非常重要。如果特征值处于相似范围内,那么归一化就不是很重要了。


        梯度消失与梯度爆炸(vanishing/exploding gradients):当你训练深度网络时,导数或坡度(slope)有时会变得非常大或非常小,这加大了训练的难度,明智地选择随机初始化权重可以避免这个问题,即设置的权重矩阵,既不会增长过快,也不会太快下降到0。

        梯度的数值逼近(numerical approximation of gradients):在实施back propagation时,有一个测试叫梯度校验(gradient checking),它的作用是确保back propagation正确实施,可以使用双边误差(two sided difference),如下图:


        GitHubhttps://github.com/fengbingchun/NN_Test  

猜你喜欢

转载自blog.csdn.net/fengbingchun/article/details/79773525