《Machine Learning Yearning》笔记

设置开发集与测试集

  • 在大数据时代来临前,机器学习中的普遍做法是使用70%/30%的比例来随机划分出训练集和测试集。这种做法的确可行,但在越来越多的实际应用中,训练数据的分布与人们最终关心的分布情况往往不同,此时执意采取这样的划分其实是一个坏主意。
  • 合理地选择开发集合测试集,使之能够代表将来实际数据的情况,并期望算法能够运行良好。测试集不应该仅是简单地将可用的数据划分出30%,尤其是将来获取的数据在性质上可能会与训练集有所不同时。
  • 不要武断地认为测试集分布和训练集分布是一致的。尽可能地选择你最终期望算法能够正确处理的样本作为测试集,而不是随便选择一个你恰好拥有的训练集样本。
  • 开发集要能够体现核心任务。
  • 尽可能地选择服从相同分布的开发集和测试集。
  • 开发集的规模应该尽可能的大,至少要能够区分出你所尝试的不同算法之间的性能差异。通常来说,开发集的规模应该在1000到10000个样本数据之间,而当开发集样本容量为10000时,你讲很有可能检测到0.1%的性能提升。
  • 测试集的规模应该大到使你能够对整体系统的性能进行一个高度可信的评估。常见的启发式策略是将整体30%的数据用作测试集,这适用于总体数据量规模一般的情况(比如100至10000个样本)。我们并不需要将开发集合测试集的规模提升到远远超过评估算法性能所需的程度,也就是说,开发集和测试集的规模并不是越大越好。
  • 多值评估标准提高了在算法之间进行优劣比较的难度。
  • 首先定义一个“可接受的”运行时间,一般低于100ms。接着,在限定的运行时间范围内,尽可能地将分类器的准确率最大化。此时,运行时间代表着“满意度指标”——你的分类器必须在这个指标上表现得“足够好”;而准确度则代表着“优化指标”。
  • 如果要考虑N项不同的标准,或许需要设置N-1个”满意度“指标,即先要求它们满足一定的值或范围,下一步才是定义一个”优化“指标。
  • 每当开展一个新项目时,在不到一周(一般不会更长)的时间内给出一个初始的开发集、测试集和指标,提出一个不太完美的方案并迅速执行。一周的时间要求并不适用与成熟的应用程序。
  • 有三个主要原因可能导致开发集/评估指标错误地将分类器A排在B前面:
    • 你需要处理的实际数据的分布和开发集/测试集数据的分布不同;
    • 算法在开发集上过拟合了;
    • 该指标不是项目应当优化的目标。
      • 强烈建议你选择一个新的指标并为你的团队制定一个新的研究目标,而不是在不可信的指标上耗费太多时间,最终导致不得不回过头对分类器进行人工选择。
  • 被选择作为开发集和测试集的数据,应当与你未来计划获取并对其进行良好处理的数据悠着相同的分布,而不一定和训练集的数据分布一致。

基础误差分析

  • 如果在一开始就试图设计和构建出完美的系统会显得有些困难,不妨先花几天时间构建并训练一个最基础的系统。这能帮助你快速找到一些线索来决定在什么方向上投入时间。
  • 先预估一下该任务能提升多少系统精度。这样你就能更加理性地判断是否值得花一个月的时间做这件事,还是将这段时间用于其他任务。
    • 收集100个开发集中被误分类的样本,即造成系统误差的样本;
    • 认为查看这些样本,并计算其中不同类别的比例;
    • 查看误分类样本的这一过程称为误差分析。
  • 误差分析:指的是检查被算法误分类的开发集样本的过程,以便帮助你找到造成这些误差的原因。这将协助你确定各个项目的优先级并且获得探索新方向的灵感。
  • 在误差分析时并行评估多个想法
    • 创建一个电子表格,一边查看被误分类的100个开发集样本一边完善表格内容,可以加上一些能够帮助记住特定样本的备注。
    • 一个样本可能与多个类别都有关联。
    • 误差分析并不会产生一个明确的数学公式来告诉你什么任务的优先级最高。你还需要考虑在不同类别上的预期进展以及解决每个类别所需的工作量。
  • 在开发集中手动修正误标注样本不会带来不好的影响,但这样的做法并不是必要的:当你不知道整个系统的误差是10%还是9.4%时,这样处理会看起来不错。
  • 可以选择在系统改进到一定程度时再来考虑被误标注的样本,因为这些误差在整体误差中的占比会逐渐增大。
  • 如果决定改进标签质量,请仔细检查系统中被误分类和正确分类的样本标签。对于某个样本,可能原始标注和算法预测的标签都是错误的。如果你仅修复系统误分类的样本标签,则有可能在评估中引入偏差。
  • 将开发集明确地分为Eyeball和Blackbox开发两个子集将很有帮助,它使你了解在人为的误差分析过程中Eyeball开发集何时开始发生过拟合。
  • Eyeball开发集应该大到能够让你对算法的主要错误类别有所察觉。
  • 分类器的错误率越低,为了获得足够多的错误样本进行误差分析,需要的Eyeball开发集就越大。
  • 如果你正在处理一项,实际情况中人类也无法很好完成的任务,那么检查Eyeball开发集将不会有大的帮助,因为很难找出算法不能正确分类一个样本的原因。此时你可能也不需要建立Eyeball开发集。

偏差与方差

  • 最优错误率(“不可避免偏差”):假设我们决定,即使是世界上最好的语音系统,仍会有14%的误差,我们可以将其认为是学习算法的偏差“不可避免”的部分。
  • 可避免偏差:训练错误率和最优误差率之间的差值。
    • 如果可避免偏差值是负的,计算法在训练集上的表现比最优错误率要好,这意味着你正在过拟合训练集,并且算法已经过度记忆(over-memorized)训练集。你应该专注于有效降低方差的方法,而不是选择进一步减少偏差的方法。
  • 方差:开发错误和训练错误之间的差值。
  • 理论上来讲,我们可以通过训练一个大规模训练集将方差减少到接近零。因此只要拥有足够大的数据集,所有的方差都是可以“避免的”,所以不存在所谓的“不可避免方差”。
  • 在统计学上,最优错误率也被称为贝叶斯错误率(Bayes error rate),或贝叶斯率。
  • 减少可避免偏差:
    • 加大模型规模
    • 根据误差分析结果修改输入特征
    • 减少或者去除正则化
    • 修改模型架构
    • 不能凑效的方法
      • 添加更多的训练数据
  • 减少方差的技术:
    • 添加更多的训练数据
    • 加入正则化
    • 加入提前终止
    • 通过特征选择减少输入特征的数量和种类
    • 减小模型规模
    • 根据误差分析结果修改输入特征
    • 修改模型架构

学习曲线

  • 如果只关注了开发错误的曲线,当数据量变得越来越多时,将很难预测后续曲线的走向。即很难确切地知道曲线将趋于何值。
  • 存在训练集噪声致使难以正确理解曲线的变化时,有两种解决方案:
    • 数据量太小时,与其只使用部分样本训练单个模型,不如从原来的小样本中进行随机有放回抽样,选择几批不同的样本(每批选出的样本数相同)进行组合。在这些数据上训练不同的模型,并计算每个模型的训练和开发误差,最终,计算和绘制评价训练集误差和平均开发集误差。
    • 如果你的训练集偏向于一个类,或者它有许多类,那么选择一个“平衡”子集,而不是从固定数量的样本中随机抽取N个训练样本。更常见的做法是,确保每个类的样本比例尽可能地接近原始训练集。
  • 绘制一个学习曲线的成本可能非常高。

与人类表现水平对比

  • 在处理人类擅长的任务时,构建一个机器学习系统会更加简单:
    • 易于从人为标签中获取数据
    • 基于人类直觉进行误差分析
    • 使用人类表现水平来估计最优错误率,并设置可达到的“期望错误率”。有一个合理可实现的“期望错误率”可以帮助你去估计学习算法的可避免偏差。这反过来也帮你决定是否使用误差降低技术。
    • 只要开发集上存在着一些人类能正确处理而算法不能的样本,上述分析就是有用的。即使你的算法在整个开发集或是测试集上的表现已经超过了人类,这样做也是正确的。

在不同的分布上训练与测试

  • 如果你认为有些数据没有任何帮助,那么应该将这些数据排除在计算原因之外。
  • 如果没有巨大的计算资源,可以考虑给数据添加权重。
  • 数据不匹配:算法能够很好地泛化到与训练集相同分布的未知数据,但不能很好地泛化到与开发/测试集相同分布的未知数据。
  • 训练开发集:来自于训练集相同分布的数据组成的集合,通常比训练集小,用来评估算法能够泛化到与训练集相同分布的数据的能力,并对训练开发集进行评估。
  • 出现数据不匹配时:
    • 尝试理解数据属性在训练集和开发集分布之间的差异
    • 尝试找到更多的训练数据,以便更好地匹配你的算法碰到的开发集样本
  • 人工数据合成存在一定的挑战:有时候创建一个对人而言真实的合成数据比创建对计算机而言真实的数据要容易得多。如:同样的汽车噪音会不断重复,人无法识别而某种学习算法可能会“过拟合”。
  • 尽量避免给出合成数据的属性,这将使学习算法有可能将合成和非合成的样本区分开来。

你可能感兴趣的:(《Machine Learning Yearning》笔记)