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

这门课是讲一些分析机器学习问题的方法,如何更快速高效的优化机器学习系统,以及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)、更多的训练数据、尝试新的网络架构、更好的超参数。

  

 

posted @ 2017-11-18 17:38  ZonghaoChen  阅读(221)  评论(0编辑  收藏  举报