构建机器学习项目1

Introduction to ML Strategy

  • Why ML Strategy

image.png
  • Orthogonalization

建立机器学习系统的挑战之一是,有太多可以尝试和改变的东西,最高效的机器学习人员,都非常清楚需要调整什么来实现一个预期效果, 我们称这一过程为正交化

为保证有监督机制的的学习系统良好地运行 通常你需要保证四件事准确无误


image.png

Setting up your goal

  • Single number evaluation metric

无论你是选择超参调优 或是选择不同的机器学习算法 还是在构建机器学习系统时 尝试不同的配置项 你都会发现 如果你有单一的量化评估指标 可以让你知道新的方法比上一次是更好还是更糟 那么整个进程会加快很多 所以当团队在启动一个机器学习项目时 我常常建议 设置一个单一的量化评估指标


image.png

许多机器学习的团队都有一个很好的验证集 来评估精准率和召回率 和一个单一量化评估指标 有时候我们会称之为single row number,这个评估指标可以帮你快速判断哪个分类器更好 所以一个好的验证集和单一量化评估指标 可以提高迭代的效率,它加速整个流程 让你的机器学习算法不断改进

image.png
  • Satisficing and Optimizing metric

假设除了准确率之外你还关心运行时间也就是对一个图像分类需要多少时间,这个表中分类器A需要80毫秒(millisecond) B需要95毫秒 C需要1,500毫秒 也就是1.5秒才能甄别一个图像 你当然可以将准确率和运行时间组合成一个 整体评价指标(overall evaluation metric) 比如说整体代价是 准确率-0.5*运行时间 但是将准确率和运行时间用这样的公式整合 看起来有些刻意 这就像二者的线性加权和


image.png

你可能想要选择一个分类器 它在确保运行时间的前提下提供最大准确率 比如说它甄别图像所花费的时间 必须<=100毫秒 在这个例子中我们说准确率是优化指标 因为你想要最大化准确率 你希望准确率尽可能的高 但是运行时间是我们我们所说的满足指标 意味着它必须足够好 必须<100毫秒 一旦超出即不予考虑 至少不大考虑 所以用这种方式对准确率和运行时间进行权衡或者说通盘考虑相当合理

通过定义优化指标和满足指标 你就有了挑选"最优"分类器的明确方向
更一般的说 如果你有N个关心的指标 有时候选择其中的一个加以优化是个合理的策略 你想要它的表现尽可能的好 那么剩下的N-1就是满足指标 意味着他们只要达到某种阈值(threshold)就可以了

  • Train/dev/test distributions

设置训练集开发集的方法 或开发集和测试集, 将会对你或者你的团队在 构建机器学习应用的进展 中产生巨大的影响

例如,分类器的数据要使用这四个国家,它可能是随机选择的地区。 我们让前四个地区的数据作为开发集 另外四个地区的数据, 也可能是随机选择的 作为测试集 事实证明,这是一个非常糟糕的想法 因为在这个例子中 你的开发集和测试集来自不同的分布。
把所有数据随机打乱然后分为开发和测试集 这样开发和测试集都拥有了八个地区的数据 这样开发和测试集就来自相同的分布了 分布在你拥有的所有数据中

image.png

记住一个重要的地方 设定开发集时和 你的评估方法 就像放置一个目标然后 告诉你的团队你们的目标是什么 因为你一旦确定了开发集和评估方法 团队就可以很快尝试各种不同的方法 并进行实验 很快利用开发集 和评估方法来评估选择器并选取最好的一个

image.png

image.png

推荐的设置开发集和测试集的方法是,选择的开发集和测试集能够反映出 将来预计得到的数据,和你认为重要的数据 特别地 这里的开发和测试集 应该来自相同的分布所以无论未来你需要预测什么样的数据 一旦你 试着获取这样的数据 无论这个数据是什么 把它同时放进你的开发和测试集中 因为这样你就瞄准了 实际上你想要瞄准的目标 团队也可以有效的开发 可以在同一目标上表现良好

  • Size of the dev and test sets

深度学习中 我们拥有更大量的数据 因此使用远小于20%或30%的数据 作为开发集或测试集是非常合理的 而且因为深度学习算法极度需要数据 在拥有大量数据的问题中 训练集会占有更高的比例

image.png

深度学习算法极度需要数据 在拥有大量数据的问题中 训练集会占有更高的比例 那么 测试集应该多大呢 测试集的作用 是在系统开发完成后 帮我们评估最终系统的性能 因此 测试集的大小只要足够能 保证对系统整体性能评估的高置信度即可

image.png
  • When to change dev/test sets and metrics

在这种情况下 当你的评估指标 无法正确地对算法的优劣进行排序时 就像此例中错误地判断算法A更优秀 这时你就应该 修改评估指标 可能也要修改开发集或测试集


image.png

需要记住的是 当你发现评估指标 无法对算法的优劣给出正确的排序时 那么就需要考虑定义一个新的评估指标

image.png
image.png

整体的方针是 如果在你当前使用的指标和数据上 获得很好的性能 并不对应于做好你真正关心的事情 那就需要修改你的指标 和/或你的开发集和测试集 让它们能更好地反应 你真正需要算法做好的事情 通过评估指标和开发集 你可以 更快地对算法A还是算法B更好做出决定 可以确实地提高你和你的团队进行迭代的速度 所以我的建议是 即便你无法定义一个完美的评估指标和开发集 你也应该尽快将它们确定下来 以此来驱动你们团队的迭代速度 如果之后发现选的不好 你有了更好的想法 你完全可以再进行修改 对于大对数团队 我不建议 在没有任何评估指标和开发集的情况下 进行长时间的开发 因为这实际上会 降低你们团队进行迭代和改善算法的效率

Comparing to huma-level performance

  • Why human-level performance

image.png

你若超越了人类的表现,有时反而慢下来 我认为有两个主要原因 为什么当你超越人类级别的表现时进展往往放慢

原因之一,人类级别的表现 在许多任务中都离贝叶斯最优误差不远 人非常擅长看着图像去分辨是否有一只猫 或收听音频并写出字幕 因此,可能算法超越人类级别的表现之后并没有 那么大的改善空间

第二个原因,只要你的表现还不如人类水平 那么实际上你可以用某些工具来提高 而当你超越了人类的水平后,就很难再有工具来提高了 就是这样子


image.png
  • Avoidable bias

image.png
  • Understanding human-level performance

image.png

你的训练误差和贝叶斯误差的差距告诉你 可以避免的偏差问题有多大 而训练误差和开发集误差的差距 告诉你方差问题有多大 你的算法是否可以做到更好的泛化 我们这里讨论的和 之前把训练集误差和0%比较有很大的不同

image.png

之前的评估了训练集误差 并且把它和0做了比较 那时的目的只是为了理解我们的偏差有多大 而且这只是适用于那些贝叶斯误差本就差不多为0的问题 比如猫的识别 人类在这个问题上的表现几乎完美 所以贝叶斯误差也几乎就是0 在这个情况下我们的分析没有问题 但是对于哪些有噪声的数据 比如嘈杂环境下的语音识别 甚至很难听清楚说的是什么 并准确的转录出来 对于这样的问题 有一个好的贝叶斯误差估计 可以很好的帮助你评估可避免的偏差和方差 从而更利于做决定究竟是专注于偏差降低技术 还是方差降低技术

image.png

概括一下 人类水平表现的值给你提供了 对贝叶斯误差的估计 这让你可以更快速的决定你的算法 更应该降低偏差还是方差,这个方法在你超越人类水平表现之前是一直有效的 那是你可能找不到一个好的贝叶斯误差估计了 仍然可以让你的判断更容易

  • Surpassing human-level performance

如果你的误差已经比 人类团队通过讨论和辩论才能达到的误差还小 那么你就更难以依靠人类的直觉 来判断还能从哪些方面来优化 算法的性能了 在这个例子里 一旦超过了这个0.5%的阈值 对这个机器学习问题进行优化的 方法和方向就变得不明确了 这并不意味着你无法取得任何进展 你仍然可能取得重大进展 只是用于指明方向的 工具不那么好用了

image.png
image.png
  • Improving your model performance

image.png

如果想要改善你的机器学习系统 建议看看你的训练误差和贝叶斯误差估计值间的差距 这能让你估计可避免偏差 换句话说 就是你需要试着在训练集优化到什么程度 然后再看看你的开发集误差 和训练集误差间的差距 来估计你的方差问题有多大 换句话说 你需要付出多大的努力 来把你训练集的结果推广到开发集

image.png

无论你想把可避免偏差降低到什么程度 我会尝试用一些策略,比如 训练一个更大的模型 这样你的训练集结果会更好,又或者 训练更长的时间 用更好的优化算法 比如,加入Momentum或者RMS Prop 或者用更好的算法 比如Adam算法 又或者 你可以试试寻找 更好的神经网络架构或者更准确来说 超参数 这可能包括从改变激活函数 到改变层数或者隐含单元数的各个方面 虽然你这么做可能会增大模型的规模 因为要训练其他模型 或者模型架构 比如循环神经网络(RNN)或者卷积神经网络(CNN)

下一步你会发现方差是主要问题 有很多方法你可以尝试 包括 尝试获得更多的数据,因为用更多的数据来训练 可以帮助你更好地把结果推广到开发集那些你没有遇到过的数据上 你可以试试正则化 包括L2正则化 随机失活法(dropout) 或者我们之前讲过的数据集扩增 又或者 同样地你还可以试试不同的神经网络架构 或者超参数搜索 看看是否能帮你 找到一个更好的构架更适合这个问题

你可能感兴趣的:(构建机器学习项目1)