机器学习最佳实践
机器学习数据集
一般将可用数据划分为70/30,即70%的数据用于训练,30%的数据用于验证/测试,当您拥有数百万个样本时这种方法是无效的。建议将数据划分为训练集(数百万个样本),dev set(~10k)和test set (~10k)。
“dev set是什么呢?”。您可以看到,我们为获得对机器学习模型性能的无偏估计而预留的数据部分是测试集。为避免任何偏差,我们不应使用测试集来做出有关模型的任何决策。那么,您将使用哪些数据来调整超参数或评估创建机器学习模型时的各种选择呢?我们使用dev set(有时称为验证集)来实现此目的。
“dev set和test set 的神奇数字10k来自哪里呢?”。它不是一成不变的。Dev set应足够大,以检测您正在尝试的算法之间的差异。有10,000个例子,你很有可能检测到0.1%的改善。这就是10k的来源。如果您希望检测到0.01%的改善,则需要100k样品。
理想情况下,您使用的所有数据都应来自与prod相同的分布,即您想要做的数据。
但是,情况并非总是如此。例如,您刚刚在国际市场上推出了您的产品。您可能从国内市场获得了大量可以利用的数据,但对于新模型,您确实希望在其他国家/地区的数据上做得很好。在这种情况下,您可以使用国内数据来训练模型,但请确保将国际用户的数据用于验证和测试集。重申一下,从与prod相同的发行版中获取验证和测试集非常重要。
既然您的验证和测试集来自相同的分布,那么机器学习模型在两者上都应该表现相同。然而,随着时间的推移,您的机器学习模型可能overfit dev集,因为你是用它来影响模型。当这种情况发生时,您的模型将在dev集上比测试集表现得更好。您将需要获得新的dev集或向dev集添加新的数据。
但是,如果训练集和验证集来自不同的分布,您将如何确定您的机器学习模型是否存在偏差/方差问题呢?
在这种情况下,由于数据分布的不同,训练误差将与dev误差不同。因此,这种差异无助于确定您的机器学习模型是否不拟合或过度拟合训练数据。
为了解决这个问题,您可以从dev set(称为train dev set)中获取一小部分数据样本,并将其添加到train set中。现在,您可以比较“train dev” error和dev error,以估计偏差和方差。
请记住,所有方差都是可以避免的。
如果大部分的训练集来自于不同的分布而不是prod,你可以做些什么来让模型在prod like分布的基础上学习更多?您可以添加一个二进制信号来表示输入数据中的分布,并调整您的误差函数,以便在训练期间为prod样本提供更多的权重。
以下是关于创建数据集的最后一个提示,关于构造反面示例。在分类任务中,直接从用户数据中获取正例。对于选择负面示例的标签,一种策略可以是从一组非正面标签中随机挑选。
但是,这样的标签可能相对容易被认为不正确,因此模型不会从中学到很多东西。为了使训练数据有效,我们必须选择难以训练的负面例子,即“最接近”正面的例子。
评估指标
精度,召回率,准确度,F1得分,AUC(ROC曲线下面积),NDCG是用于评估机器学习(ML)模型的一些常用指标。
虽然您要使用的度量标准取决于手头的任务,但重要的是要将单个度量标准用于您可以在机器学习模型的整个生命周期中使用的度量标准。当您评估多个路径以向前推进时,拥有single-number评估指标可提供清晰的方向感。
例如,您可以使用F1 Score,而不是Precision和Recall,这是两者的调和平均值。
如果您有N个对您很重要的标准(例如:机器学习模型的大小,运行时间和准确性),您可以考虑将它们的N-1(模型的大小和运行时间)设置为“满意”度量,即只要满足这些指标的某些阈值,您就会接受该模型。剩下的(准确度)将是single-number“优化”度量。
如果您的指标表现良好,但您没有看到其他测试的改进(例如:产品中的A / B测试),则可能意味着您对指标的选择是错误的或验证/测试集分布偏离产品分布。从prod数据中获取一个新的dev / test集样本,如果模型仍能很好地运行,那么就该重新考虑你的指标了。
误差分析
您如何确定您的模型改进的机会?你如何对它们进行优先排序?
虽然您可以根据不同的任务相关的方案测试来对机器学习模型进行建模,但是对于任何模型,您都可以做到:手动查看您的模型表现出性能欠佳的样本。
例如,假设我们进行分类任务。您可以查看算法错误分类的示例,并尝试了解错误的根本原因。
建议使用来自dev set的100个标记错误的例子。如果分类器的错误率是5%,那么您需要查看2000个例子来确定您要关注的100个例子。dev set的其余部分称为blackbox set,可用于决定模型和选择超参数。
当您查看错误标记的示例时,在所有示例中保留错误分类原因的计数有助于您优先确定首先修复的原因。
E2E深度学习
端到端语音识别效果很好。但自动驾驶的端到端学习呢?可能不是。以下注意事项将帮助您决定是否将学习任务拆分为较小的块。
- 当有大量训练(标记)数据时,端到端学习系统往往表现良好。
- 如果您有更多的数据可用于训练较小的学习任务,如果您要分解更大的任务,那么您可以考虑使用多个阶段。
- 通过将复杂的任务分解为更简单的子任务,您可能会为学习者提供可以帮助其更有效地学习任务的先验知识。
- 请注意,如果管道中的每个组件都在接近人类级别的级别上执行,但是整体架构远远低于人类级别,则必须重新配置子任务的配置。
超参数
以下是根据Andrew的重要性顺序的超参数。
- 初始学习率
- 优化参数(例如:对于Adam优化,超参数是β1,β2和ε)
- Mini-batch大小
- 隐藏单元数量
- 层数
- 学习率衰减
建议尝试每个超参数的随机值。随机搜索效率更高,因为对于相同数量的试验,您最终会为每个参数尝试更多值。
用适当的比例来取随机的值来尝试(在随机的情况下均匀分布并不是个好方法)
- 如果您在随机抽样中统一使用以尝试在0.0001和1之间的学习率的值,则它们中的大多数将介于0.1和1之间,并且非常少介于0.0001和0.1之间。
- 不在线性范围内选择随机值,在对数范围内选择随机值会更好。
- 对于范围是10 ^ -4和10 ^ 0,因此选择随机值r(在-4和0之间),并使用10 ^ r。
使用放大方法:如果范围从0.0001到0.1,您可以在第一轮中将0.01识别为最佳值,并在第二轮中找到0.011作为更好的选项,然后考虑0.01098,依此类推。
请注意,在一领域中工作的超参数在不同的领域中不一定很好。
其他
- 从现有神经网络架构的开源实现开始。更好的是,使用预先训练的网络并使用迁移学习来修改它们以解决您的问题。
- 当您没有足够的训练数据时,请考虑增加训练数据。
- 集成用于赢得竞赛,但通常不用于生产,尽管提高了约2%,因为它的计算成本很高(单个任务使用3到15个模型)。