这门课是讲一些分析机器学习问题的方法,如何更快速高效的优化机器学习系统,以及NG自己的工程经验和教训。

1. 正交化(Othogonalization)

  设计机器学习系统时需要面对一个问题是:可以尝试和改变的东西太多太多了。牛逼的机器学习专家很清楚自己要调什么以达到什么目的,这个调参和效果一一对应的关系就是所谓的正交化,调整一个参数的时候,只调整一个对应的性质。或者说各种性质互相正交,互不影响。

  机器学习的一般性步骤:

    1)在训练集上表现足够好,如果不够好的话,则尝试更大的神经网络、用更好的优化算法比如Adam等。

    2)在验证集上表现足够好,如果不够好的话,则尝试正则化、增大训练集等。

    3)在测试集上表现足够好,如果不够好的话,则尝试更大的验证集等。

    4)在实际中表现足够好,如果不好好的话,则尝试改变验证集、改变cost function等。

  NG说他不会用提前停止(early stopping)的方法。因为它同时影响了1)和2)。

2. 评价机器学习系统好坏的指标

  NG建议用机器学习解决实际问题的时候,设置一个单一的实数来评价机器学习系统的好坏,这会加快调参,因为它可以很快的告诉我们系统变好还是变坏。

  常用的评估机器学习系统的指标是Precision(查准率)和Recall(查全率)。比如在训练集一大堆图片中识别猫,Precision是给一张图片系统判定是不是猫的正确率,而Recall是机器学习系统把训练集中所有猫认出来的百分比。在实际使用中,这两个指标往往需要做权衡,一个变好,往往另一个变坏,所以NG不推荐使用这种指标。我们需要一个单一的实数来告诉我们系统时好还是坏,很直接简单,不需要权衡。一种常用的选择是F1 Score = 2/(1/P+1/R),可以看成是Precision(P)和Recall(R)的平均值,数学定义是Harmonic mean。

  所以我们实际评估系统好坏的时候,可以选一个验证集,外加一个单一实数指标,来快速判断哪个系统更好。这可以加速改进机器学习算法的迭代过程。

  单一实数指标的选择要跟据实际情况来,如果几个指标物理意义相似,比如一个算法在世界不同地区的表现,则可以简单的取平均值。如果几个指标有不同的物理意义,比如accuracy和running time,则我们往往会选择一个指标作为优化指标,即希望它越小越好(或者越大越好),而其他指标作为满足指标,即只需要达到一个阈值就可以了,比如running time要小于100ms,不在乎它是70ms还是90ms。

3. 如何设置验证集(课程里也叫开发集development set)/测试集

  验证集和测试集要尽量同分布。可以把 数据随机洗牌,然后分配验证集和测试集。

  传统的机器学习算法习惯于按70%/30%的比例分配训练集/测试集,或者60%/20%/20%分配训练集/验证集/测试集。这种分法对于小样本(几百、几千、上万)的情况是很合理的。但对于现代的大样本(上百万)应用,98%/1%/1%的分法更合理,因为一百万的1%也有1万,这对于验证集和测试集足够了。样本越多,测试集/训练集的比例越小。

  测试集的目的是评估系统的整体性能,所以它的大小要足够大到可以提供高置信度的评估结果。一般来说1万或者10万的样本就可以了,这个数目远远小于训练集的需求。在有的应用,甚至我们不需要对系统性能有置信度很高的评估,那么可以不设立测试集,只需要训练集和验证集(有的教程会把样本分为训练集和测试集,这里的测试集就是NG说的验证集),但NG还是非常建议设立测试集来评估系统性能。

  当测试集上的结果和实际运行不符合的时候,这说明要么样本集没有反应实际分布,要么评估指标不对。评估指标要能正确的反应实际使用中的优劣。

  要有正交化的思维,第一步定义好评估指标,这是设立目标;第二步再考虑在这个指标下如何训练出更好的系统。这是两个完全独立的问题。不要把事情混为一谈,要一步一步做。

  即使无法定义出一个很完美的评估指标和验证集,也要快速设立一个,然后加速团队对系统的迭代速度,发现选的不好,有更好的想法,则可以再更改。但千万不要在还没有把评估指标和验证集想清楚的情况下就胡乱的跑算法,那很浪费时间。

4. 为什么把人的性能(performance)作为深度学习算法的benchmark

  两个原因:1)深度学习算法的性能已经可以和人一较高下;2)算法在达到人类性能之前,进步非常迅速,达到人类性能之后,进展会缓慢下来。

  为什么算法到达人类性能后进展会变缓慢呢?两个原因:1)人类的性能已经很接近理论极限(Bayes optimal error,这是理论极限,实际永远不可能达到),进步空间有限;2)只要算法的性能低于人类性能,那么总有一些工具可以提高性能,而一旦超过人类性能,这些工具就都不太好用了。这些工具包括:获得更多人标记的数据、人工分析误差来源(可以通过思考“为什么人就可以做对”获得灵感)、更好的分析偏差/方差。理解人类为什么可以在 特定任务上表现的很好,这对于改进算法很有利。

  我们会关注三个误差,a)Human-level error,近似Bayes optimal error;b)Training error,算法在训练集上的表现;c)Dev error,算法在验证集上的表现。a和c之间的差距是可避免偏差(avoidable bias),b和c之间的差距是方差。人类误差的作用就是帮助我们判断是聚焦于改善偏差,还是改善方差。

  由于我们是用人类误差近似贝叶斯误差,所以这里说的人类误差是人类能达到的最好水平,比如普通人和专家,那我们要以专家的表现为准。当然,如果算法的实际使用场景只要求达到普通人的水平,那也可以以普通人的误差为准。

  目前的算法对于结构化数据、非自然感知任务、有大量数据的问题的表现要优于人类。

5. 总结

  监督学习的两个步骤:1)算法对训练集拟合的足够好,或者说可以做到很小的可避免偏差;2)训练集上的表现可以泛化到验证集/测试集上,或者说方差很小。对于第一个步骤,改善的工具有:用更大的网络(增加层数、隐藏单元数)、训练更久、用更好的优化算法(Momentum、RMSprop、Adam)、尝试新的网络架构(RNN、CNN)、更好的超参数、尝试新的激活函数。对于第二个步骤,改善的工具有:正则化(L2、dropout、data augmentation)、更多的训练数据、尝试新的网络架构、更好的超参数。

  

deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I 听课笔记的更多相关文章

  1. deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II 听课笔记

    1. 误差分析(Error analysis) 误差分析的目的是找到不同误差源的比重,从而指引我们接下来往哪个方向努力改进.NG建议手工统计随机100个错误的误差源,比如对于猫分类器,错误的照片可能是 ...

  2. deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I

    这门课是讲一些分析机器学习问题的方法,如何更快速高效的优化机器学习系统,以及NG自己的工程经验和教训. 1. 正交化(Othogonalization) 设计机器学习系统时需要面对一个问题是:可以尝试 ...

  3. deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II

    1. 误差分析(Error analysis) 误差分析的目的是找到不同误差源的比重,从而指引我们接下来往哪个方向努力改进.NG建议手工统计随机100个错误的误差源,比如对于猫分类器,错误的照片可能是 ...

  4. deeplearning.ai 神经网络和深度学习 week3 浅层神经网络 听课笔记

    1. 第i层网络 Z[i] = W[i]A[i-1] + B[i],A[i] = f[i](Z[i]). 其中, W[i]形状是n[i]*n[i-1],n[i]是第i层神经元的数量: A[i-1]是第 ...

  5. deeplearning.ai 神经网络和深度学习 week1 深度学习概论 听课笔记

    1. 预测房价.广告点击率:典型的神经网络,standard NN. 图像:卷积神经网络,CNN. 一维序列数据,如音频,翻译:循环神经网络,RNN. 无人驾驶,涉及到图像.雷达等更多的数据类型:混合 ...

  6. 使用 TensorFlow 构建机器学习项目中文版·翻译完成

    原文:Building Machine Learning Projects with TensorFlow 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原 ...

  7. 使用Google Cloud Platform构建机器学习项目-宠物识别

    宠物识别我们使用到了tensorflow object-detection API  (https://github.com/tensorflow/models/tree/master/researc ...

  8. deeplearning.ai课程学习(1)

    本系列主要是我对吴恩达的deeplearning.ai课程的理解和记录,完整的课程笔记已经有很多了,因此只记录我认为重要的东西和自己的一些理解. 第一门课 神经网络和深度学习(Neural Netwo ...

  9. DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)

    一.进行误差分析 很多时候我们发现训练出来的模型有误差后,就会一股脑的想着法子去减少误差.想法固然好,但是有点headlong~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...

随机推荐

  1. Pycharm配置(三)

    1.准备工作 (1)Python版本为2.7或者更高版本 (2)已经创建了一个Python工程并且添加了内容,具体参考: Getting Started tutorial2.第一步——运行代码 打开之 ...

  2. magento获取商品的图片

    获取商品的图片主要从catalog_product_entity_media_gallery 表中 该表中各列的属性代表 value_id:记录 ID,可以留空让数据库自动生成. attribute_ ...

  3. Linux Centos 使用 yum 安装java

    centos 使用 yum 安装java 首先,在你的服务器上运行一下更新. yum update 然后,在您的系统上搜索,任何版本的已安装的JDK组件. rpm -qa | grep -E '^op ...

  4. HTML基本功之文档结构

    项目名 首页 命名为 index.html 样式文件夹 命名为 css  /*用来放样式文件*/ base.css  /*基本样式*/ index.css /*首页样式*/ global.css /* ...

  5. CAS在Java类中的应用

    CAS 这个指令全称 compare and swap 即比较替换指令,在现代处理器新加入的指令.指导思想:基于乐观锁机制.比较一个变量在内存值中的值和变量的当前值(旧值).如果相等,则认为该变量没有 ...

  6. Extjs 取消backspace事件

    Ext.getDoc().on('keydown',function(e){ if(e.getKey() == 8 && e.getTarget().type =='text' &am ...

  7. 基于Docker的ELK日志平台搭建

    1.安装Docker Docker可简单理解为一个轻量级的虚拟机.Docker对进程进行封装隔离,隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器.Docker和传统虚拟化方式的不同.传统虚拟 ...

  8. Django_form

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 1.创建Form类 # 创建一个类 from ...

  9. Office 365也是.NET Core应用开发新战场

    最近有幸阅读了陈希章花了一年时间为国内开发者贡献的<Office 365 开发入门指南>. 虽然早期接触过SharePoint的开发,2007年之后就再也没有接触SharePoint的开发 ...

  10. Android手机通过APN设置上网的方法

    今天一个朋友问了我关于android网络设置的问题,感觉还是挺有趣,特分享如下: 他是在香港买了一款LGP500的手机,系统是android系统,但是回来之后不能上网,于是在网上搜了很多资料,但是设置 ...