机器学习策略

为什么需要机器学习策略?

ml-strategy-1

当我们在做一个机器学习项目的时候,如果准确率是90%,下一步应该怎么优化呢?可能的一些想法:

  • 收集更多的数据
  • 让训练集更多样性
  • 增加迭代次数
  • 尝试使用Adam
  • 扩大神经网络
  • 减小神经网络
  • 尝试droput
  • 加L2正则
  • 网络结构优化
    • 激活函数
    • 隐藏层

可以尝试的优化点太多,哪个更有效呢?如果收集了6个月数据去扩大样本,最后发现没有效果,时间就白白浪费了。
ML策略就是找到优化模型的最优路径。

正交化

正交化或正交性是一种系统设计属性,可确保修改算法的指令或组件不会对系统的其他组件产生或传播副作用。

调整老式电视机:

电视的每一个旋钮有单独功能,并且对其他功能没有影响。按顺序调整每一个旋钮很容易把图像调整到最佳位置。如果有这样一个旋钮,组合了多个旋钮的功能,用这个旋钮去调整画面会很困难。

模型训练过程:

  1. 调整模型,先保证其在训练集上表现良好(策略:更大的神经网络,Adom等)。
  2. 调整模型,使期在开发集上表现良好(策略:加入正则项, 增加样本量等)。
  3. 调整模型,使其在测试集上表现良好(策略:扩大开发集)。
  4. 在真实环境中的表现良好(策略:优化损失函数等)。

在训练神经网络时尽量不要使用”提前停止”技巧,虽然很多人这么做,但不便于分析模型的问题,因为”提前停止”使模型在训练集上的表现变差,测试集上的表现变好,同时影响两个集合的表现,不符合正交化思想。

单一评估指标

在下表中,A分类器召回更好,B分类器准确度更高,哪个更好呢?

分类器 准确度 召回
A 95% 90%
B 98% 85%

多个指标评估模型会遇到上述问题,无法判断模型好坏。应该使用单一指标,如在本例中可以使用F1值评估。如下表,A分类器F1更高,也就更好。

分类器 精度 召回 F1
A 95% 90% 92.4%
B 98% 85% 91.0%

满足条件和优化指标

评估分类器性能有不同标准,一般分为两类:满足条件和优化指标。

分类器 准确率 运行时间
A 90% 80ms
B 92% 95ms
C 95% 1500ms

例如,生产环境要求单个样本预测需控制在100ms以内,在上表中可看出A和B符合要求,从中选则准确率较高的B。本例中,准确率是指标,运行时间是满足条件。

训练集/开发集/测试集划分

训练集用来拟合模型,开发集评估模型,帮助选择合适的超参数,测试集最终评估效果。
划分训练集,开发集和测试集非常重要,必需从全部样本中随机选出,保证三个集合有相同的分布。

开发集/测试集的大小

在传统机器学习任务中,数据量一般较小,数据集划分通常采用7:3, 6:2:2的策略。近些年,数据收集更容易,如果量级达到数十万、数百万,甚至更多时,就没必要划分太多数据给开发集和测试集了。一般来说,测试集一万+的数据就够用了。

常常有人把数据集分成训练集/测试集,训练好的模型不断在测试集上测试,其实这里的”测试集”应该叫开发集。测试集应该做为模型最后的评估,不能用于模型迭代。有时候,只需要训练集和开发集,不设置测试集也可以,不过保险起见最好预留一部分样本作最后的测试。

什么时候调整训练集/开发集/测试集和评估指标

有时候常规评估方法,并不能反应模型真实的好坏,比如下面这个例子:
猫的图像识别

  • 评估指标: 错误率
  • 算法A: 3%
  • 算法B: 5%

看起来算法A更好,因为错误率比B低。假如在A中的错误样本中有很多色情图片,而算法B中几乎没有色情图片,显然在实际应用中应该选B。

在这个例子中,错误率并没有反应我们的真实需求。在这种情况下,需要重新定义评估指标,比如在这个例子中,如果一般图片预测成猫,计算损失时给1陪权重,色情图片预测成猫,给10倍权重。这样,加权之后的评估指标能真实的衡量算法的好坏。

正交化思想

在这个算法优化的过程中,需要模型有反色情图片的能力,按着正交化的思想,首先要确定问题,再次是思考如何达到这个目标。

  • 确定目标(本例中,反色情图片)
  • 如何达到这个目标(计算损失时,给错误的样本不同的权重)

如何达到这个目标并不重要,重要的是正交化思想。这里确定目标和如何实现是独立的,就像电视机的旋钮两个旋钮互不影响。

另外,如果线下训练好的模型与线上差别很大,这时候要观察开发集/测试集是不是与真实线上真实的样本相近。比如,线下测试都是高清大图,而线上用户产生的图片很多是模糊的、构图不专业的。这时要改变开发集/测试集,尽量接近真实环境产生的样本。

误差分析

优化算法过程中,如果还没达到预期,需要人工检查一下算法的错误,这就是误差分析。

误差分析:

  • 取~100个开发集中分错的样本
  • 人工统计错误类型
图片 大猫 模糊 光线太暗 备注
1
2
3
总占比 8% 43% 61% 13%

如上表,在所有可能的错误类型中,模糊是最突出的问题,在后续优化中应优先解决模糊图片的问题。

清除标注错误的数据

深度学习对随机误差是不敏感的,如果发现训练集中有标错的样本而且比较随机,可以修正也可以不做处理。

在开发集/测试集中发现标记错误的样本,是否需要修正呢?

首先,在误差分析加入一列,记录标记错误的情况,如下表:

图片 大猫 模糊 光线太暗 标记错误 备注
1
2
3
总占比 8% 43% 61% 13% 6%

如果错误标记的样本对模型评估影响很大,验证影响评估模型的能力,应该花时间修正标记错误的样本。

快速搭建你的第一个系统,并进行迭代

如果你正在开发一个全新的机器学习应用,应该尽快建立一个原型,然后快速迭代。在语因识别中,要解决的问题有很多,比如:噪音、口音、离麦克风太远、儿童音、结巴等。每个方向都能优化模型,但是应该从哪开始呢?

建议快速搭建一个原型系统,在这基础之上快速迭代。原型系统虽然很简陋,但是能帮助快速定位问题,通过之前说的偏差/方差分析和错误分析等技巧来决定下一步优先做什么。特别是错误分析,让你了解大部分错误是什么,比如离麦克风太远导致了大部分错误,那下一步要集中精力先优化这个问题。

当然这也不绝对,如果在你研究的领域有大量参考文献和成熟的方法,也可以基于前人的研究直接建立一个复杂的系统,比如人脸识别。