1. 机器学习为什么需要策略?
算法准确度还不够好:获取更多数据、多样化的训练数据集、增加迭代次数、更多层数/隐藏元/参数、正则化。
2. 如何使用此书来帮助你的团队
3. 先修知识与符号说明
当前具备实用价值的大部分机器学习算法都来自于监督学习。
4. 规模驱动机器学习发展
近期神经网络发展的主要因素有两个:数据可用性(数字化产生了海量可用数据)和计算规模(有能力训练出规模足够大的神经网络);
目前来说,提升算法性 能的更加可靠的方法仍然是训练更大的网络以及获取更多的数据;
在小数据集情况下,传统算法是否会表现得更好,取决于人们如何进行特征选择工程。
5. 验证集和测试集的定义
训练数据集的分布与人们最终所关心的分布情况往往不同;
验证集和测试集的使命就是引导你的团队对机器学习系统做出最重要的改变;
使用实际的用户数据对开发集和测试集进行更新;
不要武断地认为测试集分布和训练集分布是一致的。
6. 验证集和测试集应该服从同一分布
假设开发了一套能在验证集上运行性能良好,却在测试集上效果不佳的系统;如果验证集和测试集的分布相同,那么算法在验证集上过拟合了,解决方案是去获取更多的验证集数据;
但是如果验证集和测试集服从不同分布:
- 算法在验证集上过拟合了
- 测试集比验证集更难以预测
- 测试集不一定更难预测,但它与验证集性质并不相同(分布不同)
构建机器学习应用并非易事,而验证集和测试集分布的不匹配又会引入额外的不确定性。
7. 验证集和测试集应该有多大?
通常来说,开发集的规模应该在 1,000 到 10,000 个样本数据之间,而当开发集样本容量为 10,000 时,你将很有可能检测到这 0.1% 的性能提升;
它的规模应该大到使你能够对整体系统的性能进行一个高 度可信的评估;
即使开发集和测试集中样本的绝对数量一直在增长, 可总体上分配给开发集和测试集的数据比例正在不断降低。可以看出,我们并不需要将开发集 和测试集的规模提升到远远超过评估算法性能所需的程度,也就是说,开发集和测试集的规模 并不是越大越好。
8. 使用单值评估指标进行优化
多值评估指标提高 了在算法之间进行优劣比较的难度;
当你需要在多个分类器之间进行选择时,使用单值评估指标将帮助你更快速地作出决定;
取平均值或者加权平均值是将多个指标合并为一个指标的最常用方法之 一。
9. 优化指标和满意度指标
先要求它们满足一定的值或范围,下一步才是定义一个 “优化” 指标;
10. 通过开发集和度量指标加速迭代
建立一个机器学习系统时,往往会这么做:
尝试一些关于系统构建的想法(idea)。
使用代码(code)实现想法。
根据实验(experiment)结果判断想法是否行得通。(第一个想到的点子一般都行不 通!)在此基础上学习总结,从而产生新的想法,并保持这一迭代过程。
11. 何时修改开发集、测试集和指标
如果你渐渐发现初始的开发集、测试集和指标设置与期望目标有一定差距,那就尽快想办法去 改进它们;
有三个主要原因可能导致开发集/评估指标错误地将分类器 A 排在 B 前面:
- 你需要处理的实际数据的分布和开发集/测试集数据的分布情况不同:
- 假设你的初始开发集和测试集中主要是成年猫的图片,然而你在 app 上发现用户上传的更多 是小猫的图片,这就导致了开发集和测试集的分布与你需要处理数据的实际分布情况不同。在 这种情况下,需要更新你的开发集和测试集,使之更具代表性。
- 算法在开发集上过拟合了:
- 当你完成开发后,应该在测 试集上评估你的系统;
- 如果需要跟踪团队的进度,你可以每周或者每月在测试集上对系统进行一次定期评估。但不要 根据测试集指标对算法做出任何决策,包括是否将系统回滚到前一周的状态。
- 该指标不是项目应当优化的目标。
12. 小结:建立开发集和测试集
-
被选择作为开发集和测试集的数据,应当与你未来计划获取并对其进行良好处理的数据有
着相同的分布,而不一定和训练集的数据分布一致。
开发集和测试集的分布应当尽可能一致。
为你的团队选择一个单值评估指标进行优化。
当需要考虑多项目标时,不妨将它们整合到一个表达式里(比如对多个误差指标取平均) ,或者设定满意度指标和优化指标。
机器学习是一个高度迭代的过程:在出现最终令人满意的方案之前,你可能要尝试很多想 法。
拥有开发集、测试集和单值评估指标可以帮助你快速评估一个算法,从而加速迭代进程。
-
当你要探索一个全新的应用时,尽可能在一周内建立你的开发集、测试集和评估指标;而
在已经相对成熟的应用上,可以考虑花费更长的时间来执行这些工作。
-
传统的 70% / 30% 训练集/测试集划分对于大规模数据并不适用,实际上,开发集和测试
集的比例会远低于 30%.
-
开发集的规模应当大到能够检测出算法精度的细微改变,但也不需要太大;测试集的规模
应该大到能够使你能对系统的最终性作出一个充分的估计。
当开发集和评估指标对于团队已经不能提供一个正确的导向时,尽快修改它们:(i) 如果算 法在开发集上过拟合,则需要获取更多的开发集数据。(ii) 如果开发集与测试集的数据分布 和实际数据分布不同,则需要获取新的开发集和测试集。 (iii) 如果评估指标无法对最重要 的任务目标进行度量,则需要修改评估指标。
13. 快速构建并迭代你的第一个系统
如果在一开始就试图设计和构建出完美的系统会显得有些困难,不妨先花几天时间构建并训练 一个最基础的系统;
或许这个最基础的系统与我们所能构建的 “最佳” 系统相去甚远,但研究其中的基础功能也是 很有价值的:你能快速找到一些线索来帮助你决定在什么方向上投入时间。
14. 误差分析:根据开发集样本评估想法
- 建议你先预估一下该任务能提升多少系统精度;
- 这种简单的误差分析计算过程可以协助你快速评估,从而了解是否需要将处理狗样本的第三方 软件进行整合。它为是否值得进行这项投入给出了一个量化的基准。
误差分析(Error Analysis) 指的是检查被算法误分类的开发集样本的过程,以便帮助你找 到造成这些误差的原因。这将协助你确定各个项目的优先级(就像上面的例子所提到的那样) 并且获得探索新方向的灵感
15. 在误差分析时并行评估多个想法
误差分析并不会产生一个明确的数学公式来告诉你什么任务的优先级最高。你还需要考虑在不 同类别上的预期进展以及解决每个类别所需的工作量。
16. 清洗误标注的开发集和测试集样本
如果你不确定这些被误标注的图片是否起着关键作用,可以添加一个类别来跟踪记录误标注样本的比例;
如果开发集中误标注的部分的确影响了你的判断,那么花时间去修正这些标签就是值得的。
在项目初始阶段容许一些误标注的开发集/测试集样本并不罕见,你可以选择在系统改进到一 定程度时再来考虑被误标注的样本,因为这些误差在整体误差中的占比会逐渐增大。
17. 将大型开发集拆分为两个子集,专注其一
18. Eyeball 和 Blackbox 开发集该设置多大?
19. 小结:基础误差分析
-
当你开始一个新项目,尤其是在一个你不擅长的领域开展项目时,很难正确预判出最有前
景的方向。
所以,不要在一开始就试图设计和构建一个完美的系统。相反,应尽可能快(例如在短短 几天内)地构建和训练一个系统雏形。然后使用误差分析法去帮助你识别出最有前景的方 向,并据此不断迭代改进你的算法。
通过手动检查约 100 个被算法错误分类的开发集样本来执行误差分析,并计算主要的错误 类别。使用这些信息来确定优先修正哪种类型的错误。
考虑将开发集分为人为检查的 Eyeball 开发集和非人为检查的 Blackbox 开发集。如果在 Eyeball 开发集上的性能比在 Blackbox 开发集上好很多,说明你已过拟合 Eyeball 开发集 ,下一步应该考虑为其获取更多数据。
Eyeball 开发集应该足够大,以便于算法有足够多的错误分类样本供你分析。对大多数应 用来说,含有1000-10000个样本的 Blackbox 开发集已足够。
如果你的开发集不够大,无法按照这种方式进行拆分,那么就使用 Eyeball 开发集来执行 人工误差分析、模型选择和调超参。
20. 偏差和方差:误差的两大来源
- 有时获取更多的数据可能是在浪费时间。
- 实际上,在你的训练集上添加过多样本只会让你的算法难以在训练集上做的更好。
- 首先要解决的问题是提高算法在训练集上的性能。算法在开发/测试集上的性能通 常比在训练集上要差。所以,如果算法在已知样本上达到了 85% 的精度,那么是不可能在未 知样本上达到 95% 精度的。
- 粗略地说,偏差指的是算法在大型 训练集上的错误率;方差指的是算法在测试集上的表现低于训练集的程度。
21. 偏差和方差举例
22. 与最优错误率比较
- 最优错误率(“不可避免偏差”):14%。假设我们决定,即使是世界上最好的语音系 统,仍会有 14% 的误差。我们可以将其认为是学习算法的偏差“不可避免”的部分。
- 可避免偏差:1%。即训练错误率和最优误差率之间的差值。
- 方差:15%。即开发错误和训练错误之间的差值。
偏差和可避免偏差关系如下:偏差 = 最佳误差率(“不可避免偏差”)+ 可避免的偏差
这个“可避免偏差”反映了算法在训练集上的表现比起“最优分类器”差多少。
理论上来说,我们可以通过训练一个大规模训练集将方差减少到 接近零。因此只要拥有足够大的数据集,所有的方差都是可以“避免的”,所以不存在所谓的“不 可避免方差”。
23. 处理偏差和方差
● 如果具有较高的可避免偏差(欠拟合),那么加大模型的规模(例如通过添加层/神经元数量来增 加神经网络的大小)。
● 如果具有较高的方差(过拟合),那么增加训练集的数据量。
24. 偏差和方差间的权衡
25. 减少可避免偏差的技术
如果你的学习算法存在着很高的可避免偏差,你可能会尝试以下方法:
- 加大模型规模(例如神经元/层的数量):这项技术能够使算法更好地拟合训练集,从 而减少偏差。当你发现这样做会增大方差时,通过加入正则化可以抵消方差的增加。
- 根据误差分析结果修改输入特征:假设误差分析结果鼓励你增加额外的特征,从而帮助 算法消除某个特定类别的误差。(我们会在接下来的章节深入讨论这个话题。)这些新 的特征对处理偏差和方差都有所帮助。理论上,添加更多的特征将增大方差;当这种情 况发生时,你可以加入正则化来抵消方差的增加。
- 减少或者去除正则化(L2正则化,L1正则化,dropout):这将减少可避免偏差,但 会增大方差。
- 修改模型架构(比如神经网络架构)使之更适用于你的问题:这将同时影响偏差和方 差。
有一种方法并不能奏效:添加更多的训练数据:这项技术可以帮助解决方差问题,但它对于偏差通常没有明显的 影响。
26. 训练集误差分析
27. 减少方差的技术
如果你的学习算法存在着高方差问题,可以考虑尝试下面的技术:
- 添加更多的训练数据:这是最简单最可靠的一种处理方差的策略,只要你有大量的数据 和对应的计算能力来处理他们。
- 加入正则化(L2正则化,L1正则化,dropout):这项技术可以降低方差,但却增大 了偏差。
- 加入提前终止(例如根据开发集误差提前终止梯度下降):这项技术可以降低方差但却 增大了偏差。提前终止(Early stopping)有点像正则化理论,一些学者认为它是正则 化技术之一。
- 通过特征选择减少输入特征的数量和种类:这种技术或许有助于解决方差问题,但也可 能增加偏差。稍微减少特征的数量(比如从 1000 个特征减少到 900 个)也许不会对 偏差产生很大的影响,但显著地减少它们(比如从 1000 个特征减少到 100 个,10 倍 地降低)则很有可能产生很大的影响,你也许排除了太多有用的特征。在现代深度学习 研究过程中,当数据充足时,特征选择的比重需要做些调整,现在我们更可能将拥有的 所有特征提供给算法,并让算法根据数据来确定哪些特征可以使用。而当你的训练集很 小的时候,特征选择是非常有用的。
- 减小模型规模(比如神经元/层的数量):谨 慎使用。这种技术可以减少方差,同时可 能增加偏差。然而我不推荐这种处理方差的方法,添加正则化通常能更好的提升分类性 能。 减少模型规模的好处是降低了计算成本,从而加快了你训练模型的速度。如果加 速模型训练是有用的,那么无论如何都要考虑减少模型的规模。但如果你的目标是减少 方差,且不关心计算成本,那么考虑添加正则化会更好。
28. 诊断偏差与方差:学习曲线
随着训练集大小的增加,开发集误差应该降低。
29. 绘制训练误差曲线
30. 解读学习曲线:高偏差
31. 解读学习曲线:其它情况
32. 绘制学习曲线
33. 为何与人类表现水平进行对比
易于从人为标签中获取数据。举个例子,由于人类可以很好地识别图片中的猫,因此让 人们为你的学习算法提供高精度的带标签数据也很方便。
基于人类直觉进行误差分析。
使用人类表现水平来估计最优错误率,并设置可达到的“期望错误率”。
34. 如何定义人类表现水平
- 易于从人为标签中获取数据。你可以让一组医生为你提供错误率为2%的标签。
- 基于人类直觉进行误差分析。通过与医生讨论图像内容,你可以利用他们的直觉。
- 使用人类表现水平来估计最优错误率,并设置可达到的“期望错误率”。
35. 超越人类表现水平
只要在开发集上存在着一些人类能正确处理而算法不能的样本,前面提到的 技术就能够被应用。
36 何时在不同的分布上训练与测试
37 如何决定是否使用你所有的数据
38 如何决定是否添加不一致的数据
39 给数据添加权重
通过对额外的网络图像赋予更少的权重,你不需要构建一个庞大的神经网络来确保算法在这两 种类型的任务上都能很好地完成。