机器学习yearning总结一

近期吴恩达(机器学习&深度学习的大拿)发布了一片文章,叫machine learning yearning。其实就是一些机器学习的相关经验,碰到各种问题的时候如何解决,如何更快速更准确地得到预测模型,解决当前的问题。下面是自己读完的一些体会总结:

【机器学习为何需要策略】

他举了一个例子,在机器学习已经成为无数应用基石的今天,假如你已经拥有一个猫咪识别的深度神经网络模型,但是目前的算法准确度不是很高,你的团队有如下建议:

1、获得更多数据,即更多猫咪数据

2、收集更加多样化的训练数据,猫咪的位置颜色等等

3、增加梯度下降的迭代次数

4、尝试一个更大更多层次的网络or更小更少层次的网络

5、加入正则化

6、.......

面对这些建议你将如何选择,也许选了一个很糟糕的方向,结果一个多月下来没有任何的效果。这本书就是告诉你,根据一些线索如何去尝试,判断哪些有用哪些没有用,从而达到高效提升的目的。

【规模驱动机器学习的发展】

其实机器学习在几十年前就有了,为何现在才火起来呢?主要有两点:

1、数据,目前人们在手机电脑上花的时间越来越多,可以方便地收集到大量的数据

2、计算能力,随着硬件的发展,我们现在有能力处理海量的数据

但是,基于LR的模型,随着数据量的增加,也会最终log级趋于平稳,具体如下:

传统的机器学习并不知道如何处理这么大量的数据,而新的神经网络学习确能获得更好的表现,具体如下:

其实提升算法性能,往往就是朝这两个方向努力,增加数据量,使用更复杂的模型。

【开发集和测试集】

之前大家一般都是对全量的数据进行随机分为70%的训练集和30%的测试集,但是我们发现我们的训练数据的分布可能和真实数据的分布完全不一样,比如还是猫咪图片,网站上下载的图片数据和用户上传的图片数据差别很大(用户上传的一般质量差,分辨率低),这样就会导致训练的模型泛化能力比较差。

我么通常认为:

训练集:用于运行学习算法

开发集:用于调整参数、选择特征,有时用来交叉验证用的

测试集:用于评估算法的好坏,但不会改变算法的参数等

其实开发集和测试集的目的就是就是引导我们对机器学习系统做出最重要的改变。

所以我们应该合理的选择我们的开发集和测试集,而不是简单的对数据进行七三开。特别当推出一个app时,可能没有任何数据,也需要想办法让朋友使用收集一些数据,如果实在没有数据,网上数据也可以,不过需要注意不能泛化的风险。

选择理想的开发集和测试集是需要投入的,不用武断的认为训练集和测试集分布是一致的。尽可能的选择你期望算法能正确处理的样本作为测试集,而不是随机选择一个你恰好拥有的一个训练样本。

【开发集和测试集应该同分布】

如果分布不同,那么就会导致在开发集上的效果很好,而在测试集上的效果比较差。而如果开发集和测试集是同分布的,出现了测试集效果不好,那么基本上就是过拟合了,可以通过增加数据来进行优化。

但如果分布不同,那么问题就变得复杂了:

1、算法在开发集上过拟合了?

2、测试集比开发集更难预测?尽管算法已经很好了,但是很难有进一步提升空间

3、测试集不一定难预测,而是和开发集分布不同,这种情况对于模型的再多的调试都是无用功。

如果我们只是在应用上想取得进展,而不是搞研究,那么最好还是选择同分布的开发集和测试集

【开发集和测试集应该多大】

比如如果两个算法准确度只差0.1%,那么选择开发集100个样本肯定是太少的,至少要10000个样本。但有时候涉及到利润的时候,也许0.01%的提升也会非常有效果,那么样本量就要远大于10000了。

测试集如何选择呢?它的规模应该大到能够对整体的系统进行一个高置信度的评估即可。一般是将所有数据的30%作为测试集,但是现在动辄就是上亿的数据,这个比例也一直在下降,我们没必要将开发集和测试集提升到整体系统评估的所需的程度,所以并不是越大越好。

【单一指标&满意度指标】

我们知道,在计算最终结果的时候对于二分类,一般都会被化为四类结果:真正例,假正例,真负例,假负例,然后由此能算出召回率和准确率,这两个指标是此消彼长,导致不知道该如何优化了,所以此时需要将多个指标合并为一个指标,这样才可以更好的优化,比如f1-score。

另外就是我们的满意度可能并不是关注整体的f1-score,因为这个得分提高不一定会使我们的产品体验更好,需要结合产品满意度指标进行模型指标的建设。

比如对于目前的智能语音系统:更多关注的是用户实际说了唤醒词,但是没有被唤醒,也就是假负例率,所以此时可以要求24小时不能允许多于2次这样的行为出现。

【通过开发集和度量指标快速迭代】

对于一些新的问题,我们很难知道哪些方法更有效,所以需要不断的尝试然后找到令人满意的答案:过程就是提出想法-代码实现-根据实验进行分析

【何时修改开发集测试集和指标】

我们一般面临一个问题,需要快速的收集好开发集和测试集进行模型训练尝试分析,而不是花费很大的力气去进行想一个非常好的方案。当然也有团队这么做的。当训练的结果和实际的预期有差异的时候,这个时候就需要分析开发集测试集以及指标了。

比如模型认为A比B好,但是我们认为B更好,那么问题在哪里呢?

1、测试集和开发集分布不同,导致模型&参数不具有代表性

2、算法在开发集上过拟合了,不能很好的泛化

3、指标不是产品应该优化的目标(比如A分类器比B好,是因为A出的都是色情图片,那这肯定和我们的预期不符,所以需要我们的指标进行修改,从而使算法能够对色情图片进行降权等)

这大概是文章的第一大部分,后面还有2个大部分,后面再一一总结,感觉自己写了一遍以后体会又加深了许多。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181106G01JWX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券