《Machine Learning Yearning》总结

目录

数据

  • 就目前来说,提升算法性能的更加可靠的方法仍然是训练更大的网络以及获取更多的数据
  • 不要武断地认为测试集分布和训练集分布是一致的,仔细地评估数据集非常重要
  • 开发集和测试集应该与你最终想要解决的数据分布一致,而训练集则未必需要符合这个要求
    • 在训练数据不足的情况下,你可以尝试引入额外的训练数据,只要它们能提供对训练有价值的信息(这里的思想类似pretrain和finetune,此时你的模型应该有足够的复杂度来应对这些额外的信息)
    • 如果模型在引入额外数据的训练数据集和引入额外数据的测试数据集中都表现的很好,但在不引入额外数据的测试数据集中表现糟糕,那么这种情况称为:数据不匹配。此时可以考虑在目标函数中对不同数据来源的样本分配不同的损失权重以进行弥补
      • 同时,你可以进一步把引入额外数据的训练集分割为训练集和训练测试集,然后评估偏差,方差和数据不匹配误差(训练测试集与开发集之间的误差)
      • 在解决数据不匹配问题时,你可以考虑人工合成数据,但千万要小心由此引入的过拟合问题(人工合成数据可能含有一些人类不容易察觉到但极容易被模型发现的特征)
  • 假设你的团队开发了一套能在开发集上运行性能良好,却在测试集上效果不佳的系统。如果此时开发集和测试集的分布相同,那么你就能清楚地明白问题所在:算法在开发集上过拟合了(overfit)。解决方案显然就是去获取更多的开发集数据
  • 开发集的规模应该尽可能的大,至少要能够区分出你所尝试的不同算法之间的性能差异
    • 开发集越大,对算法性能的评估就越精确
    • 当然,也没有必要矫枉过正,因为过大的(不必要的)开发集同时也会拖慢你的模型训练速度(这也意味着验证idea和迭代系统的速度)
  • 传统的 70% / 30% 训练集/测试集划分对于大规模数据并不适用,实际上,开发集和测试集的比例可能会远低于 30%

评估

  • 尽量用单一的评估指标来衡量算法的性能
    • 比如把查准率和查全率合并为F1指标,或者采用其他类似的加权平均手段来获得单一的评估指标
    • 把评估指标区分为“优化指标”和“满意度指标”,比如:
      • 在性能满足一定要求的前提下,尽可能地提升准确率
      • 在准确率满足一定要去的前提下,尽可能地压缩文件大小等

优化

  • 当我们想要优化一个模型时,要尽可能快地重复以下步骤:
    • 考虑一些关于系统构建的想法(idea)
    • 使用代码(code)实现想法
    • 根据实验(experiment)结果判断想法是否行得通
      • 在此基础上学习总结,从而产生新的想法,并保持这一迭代过程
  • 当你要探索一个全新的应用时,尽可能在一周内建立你的开发集、测试集,评估指标和基础模型;而在已经相对成熟的应用上,可以考虑花费更长的时间来执行这些工作
  • 当开发集和评估指标对于团队已经不能提供一个正确的导向时,尽快修改它们:
    • (i) 如果算法在开发集上过拟合,则需要获取更多的开发集数据
    • (ii) 如果开发集与测试集的数据分布和实际数据分布不同,则需要获取新的开发集和测试集
    • (iii) 如果评估指标无法对最重要的任务目标进行度量,则需要修改评估指标
  • 不要根据测试集指标对算法做出任何决策,包括是否将系统回滚到前一周的状态。坚持这样做会导致算法在测试集上开始过拟合,并且不要再指望通过测试集对你的系统性能进行完全无偏估计
  • 误差分析(Error Analysis)——努力查明你的误差来源何处?占比多少?这些信息可以对你后续的精力分配带来很大的帮助:
    • 比如误分类样本A占所有误分类样本的5%,而所有误分类样本占所有测试样本的10%(也就是系统精度为90%),那么针对误分类样本A的优化最多只能使系统的精度提升0.5%(90%→90.5%)
    • 当开发集太大导致你无法针对误差样本进行一一分析时,可以考虑把开发集分成较小的分析集和剩下较大的黑盒集,然后针对分析集进行分析和优化,当分析集开始出现过拟合时,再重新划分两个集合
      • 分析集当中应该包含至少100个左右的误分类样本,数量太少的话可能不足以充分反映误差的来源
  • 我们把开发集上的误差称为“偏差”,把测试集与开发集之间的误差差距称为“方差”
    • 低偏差,高方差:过拟合,需要增加训练数据量
    • 高偏差,低方差:欠拟合,需要增加模型复杂度
    • 高偏差,高方差:同时欠拟合和过拟合
    • 低偏差,低方差:模型拟合的很好
  • 人类在当前数据集上的判断错误率为最优错误率(贝叶斯错误率 Bayes error rate),通过与最优错误率进行比较,我们可以更准确地评估模型的改进空间(因为监督学习的能力不会超过标注数据的水平,而标注数据的水平大多数情况下不会超过人类能力水平)
  • 学习曲线:训练集误差和开发集误差随训练数据量变换的曲线
    • 在图表中标注你期望模型最终达到的错误率水平
    • 这有助于你判断收集更多数据对模型的改进潜力
    • 注意:小规模数据集中的样本和类别分布应该尽可能地接近原始数据集
      《Machine Learning Yearning》总结
  • 在人工智能领域有一种非常常见的 “设计模式”:首先学习一个近似的得分函数Scorex(.),然后使用近似最大化算法计算argmax。如果你能够发现这种模式,就能够使用?优化验证测试(Optimization Verificationtest)来分析误差是源于评价函数还是argmax的检索过程:
    • \(S^*\)为正确的输出,\(S_{out}\)为实际输出,然后分别计算\(Score(S^*)\)\(Score(S_{out})\)
    • 如果前者大于后者,说明评价函数没问题,我们要优化检索过程
    • 如果后者大于前者,说明评价函数不能正确反映结果质量,我们要改善评价函数

其他

  • 只有当end2end的标注数据足够多时,此类训练方式的表现才能超过手工做预处理和后处理的机器学习系统
    • 即:end2end的效果可能更好,但这同时也依赖更大规模的数据

相关推荐