训练、验证和测试数据集(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),如下图:

GitHub:https://github.com/fengbingchun/NN_Test

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

  1. 吴恩达老师深度学习视频课笔记:逻辑回归公式推导及C++实现

    逻辑回归(Logistic Regression)是一个二分分类算法.逻辑回归的目标是最小化其预测与训练数据之间的误差.为了训练逻辑回归模型中的参数w和b,需要定义一个成本函数(cost functi ...

  2. 吴恩达老师深度学习视频课笔记:总结

    吴恩达老师深度学习视频课网址为:https://mooc.study.163.com/smartSpec/detail/1001319001.htm/?utm_source=weibo.com& ...

  3. Emojify - v2 吴恩达老师深度学习第五课第二周编程作业2

    吴恩达老师深度学习第五课第二周编程作业2,包含答案! Emojify! Welcome to the second assignment of Week 2. You are going to use ...

  4. Operations on word vectors-v2 吴恩达老师深度学习课程第五课第二周编程作业1

    吴恩达老师深度学习课程第五课(RNN)第二周编程作业1, 包含答案 Operations on word vectors Welcome to your first assignment of thi ...

  5. 吴恩达老师深度学习,结课了

    在2018的最后一天终于学习完了吴恩达老师深度学习课程,2018年真的收获多多,认真学完这个课程就是之一. 对于零基础,想学习深度学习的伙伴,吴恩达老师的网易深度学习微专业适合你,推荐指数4.8. 个 ...

  6. 吴恩达老师的机器学习和深度学习课程笔记打印版

    注意:下载笔记.视频.代码:请点击"阅读原文" 我和同学将吴恩达老师机器学习和深度学习课程笔记做成了打印版,放在github上,下载后可以打印. 公布了深度学习笔记的word和ma ...

  7. 吴恩达老师DeepLearning系列课程最详细学习笔记之4—为什么深度学习会兴起?

    教程是本人学习吴恩达老师DeepLearing系列课程中整理的最为详细的学习笔记.学习视频主要来自B站[双语字幕]吴恩达深度学习deeplearning.ai_哔哩哔哩_bilibili?,以及Dee ...

  8. 有人把吴恩达老师的机器学习和深度学习做成了中文版

    近年来 AI 越来越火,吴恩达是被公认的人工智能(AI)和机器学习领域国际最权威的学者,他一直致力于普及.宣传.推广 AI 教育,包括最前沿.最火爆的 AI 基础课程.深度学习课程等等.惠及全球超过 ...

  9. 论文整理集合 -- 吴恩达老师深度学习课程

    吴恩达老师深度学习课程中所提到的论文整理集合!这些论文是深度学习的基本知识,阅读这些论文将更深入理解深度学习. 这些论文基本都可以免费下载到,如果无法免费下载,请留言!可以到coursera中看该视频 ...

  10. 深入理解吴恩达老师深度学习课程(01神经网络和深度学习 第二周)

    深入理解吴恩达深度学习(01神经网络和深度学习 第二周) 1引言 2.1 二分类(Binary Classification) 2.1.1 符号定义(视频给出的) 2.2 逻辑回归(Logistic ...

最新文章

  1. layui 常用的css,使用layui xtree插件最基础样式
  2. 美团把AI搞出一股烟火气
  3. oracle中怎样查询用户权限
  4. 你根本想象不到,学霸到底经历过什么
  5. 【Clickhouse】Connection is currently waiting for an insert operation, check your previous InsertState
  6. Linux时间操作(time、gettimeofday)
  7. 华三F100 系列防火墙 - 浮动路由联动NQA 实现双线路自动切换
  8. MD通过vscode生成PDF(带目录标签)
  9. 用户注册时图片验证码和短信验证码的逻辑
  10. 微信小程序自动回复用户消息
  11. python数字的表示
  12. Melancholy 题解
  13. 7-15 地下迷宫探索
  14. 亚马逊多账号怎么管理|亚马逊账号关联
  15. C++编程规范 头文件格式 和 函数注释格式
  16. jellyfin自定义css主题
  17. 【软考高级:信息系统项目管理师】【信息项目十大管理】第八天:项目人力资源管理
  18. Groups CodeForces - 1598B
  19. LVDS、FPD-Link/GMSL、MIPI的区别
  20. window安装weblogic教程

热门文章

  1. Python报错:NameError: name ‘wraps‘ is not defined
  2. 0.基于C++的图像处理算法实现、INTEL CPU上SSE加速、ARM CPU上NEON加速
  3. OpenCV Mat数据类型及位数总结
  4. 鲲鹏服务器拦截系统调用,鲲鹏服务器unicfg工具适配OpenEuler 20.03问题
  5. python列出文件夹所有文件_python-列出所有目录及子目录文件
  6. 新建eclipse的java项目报错处理
  7. Blender数字雕刻终极指南学习教程
  8. ab测试nginx Nginx性能优化
  9. hashlib模式和hmac模式
  10. ThinkPHP5.0中Redis的使用和封装(原创)