为何我们的机器学习项目会失败?
构建大型机器学习系统是一项复杂的任务,但作为数据科学家,我们往往会忽视项目的一些关键环节。
然而,我们是否考虑过,在拥有模型之后,如何将它们成功部署?
我曾目睹许多机器学习项目因为缺乏明确的部署计划而注定失败。本文将探讨如何使一个机器学习项目成功落地,即如何将项目推向生产环境。
无需模型即可获得基准结果。
以时间序列模型为例,我们使用RMSE(均方根误差)作为评估指标。测试集上的模型性能为RMSE 3.64。
问题是,3.64是否是一个好的RMSE值?我们需要一个基准RMSE值。
这个基准值可以从当前使用的模型中获得,或者通过简单的启发式方法得出。对于时间序列模型,基准值通常是前一天的预测结果。对于图像分类任务,可以通过随机选择1000个有标签样本来确定基准值,而人类的准确性可以作为参考。如果人类在该任务中的准确率低于70%,那么你的模型如果能达到类似水平,就可以考虑进行自动化处理。
经验教训:在创建模型之前,先了解预期结果,避免不切实际的期望。
现在,你已经创建了自己的模型。它在本地测试集上的表现优于基准或当前模型,那么下一步该怎么做?
有两种选择:
经验教训:如果新模型比当前生产模型表现更好,那么等待上线是没有意义的。
你的模型是否优于基准?它在本地测试集上表现出色,但能否在实际环境中正常运行?
为了验证模型优于现有模型的假设,可以设置A/B测试。一部分用户(测试组)看到的是新模型的预测结果,另一部分用户(对照组)则继续使用旧模型。
理想情况下,这是部署模型的正确方式。你可能会发现,模型的表现并不如预期。
错误并不可怕,可怕的是没有预料到可能出现的问题。
很难确切指出模型在生产环境中表现不佳的原因,但可能包括以下几点:
经验教训:不要全面投入生产,A/B测试是前进的好方法。始终准备一些可以依赖的东西(例如,一个旧模型)。总有意料之外的情况发生。
我创建了一个令人印象深刻的机器学习模型,准确率达到90%,但预测需要10秒。
这样的延迟可接受吗?对于某些应用场景可能是,但对于大多数实际应用来说并不合适。
过去有许多Kaggle竞赛的获胜者创建了庞大的模型集成,占据了排行榜的首位。例如,在Kaggle的Otto分类挑战中,有一个模型集成了33个模型和8种特征工程方法。
另一个例子是Netflix百万美元推荐引擎挑战,由于工程成本问题,Netflix团队最终并未采用获奖解决方案。
那么,如何使模型在机器上既准确又高效?
这时引入了教师-学生模型或“知识蒸馏”的概念。在知识蒸馏过程中,我们使用一个更大且已训练好的教师模型来训练一个更小的学生模型。
教师模型的软标签(概率)被用作学生模型的训练数据。关键在于,教师模型提供的是类别概率而非硬标签。例如,水果分类器可能会给出“苹果0.9,梨0.1”的概率,而不是“苹果1.0,梨0.0”。这样做的原因是软标签包含更多信息,告诉学生模型,苹果确实有一点像梨。学生模型通常可以接近教师模型的性能,即使参数量减少了1-2个数量级。
经验教训:有时预测时间有限,因此需要更轻量级的模型。可以尝试构建更简单的模型,或针对特定场景采用知识蒸馏技术。
世界在不断变化,你的模型权重也必须随之调整。
周围的世界变化迅速,两个月前有效的策略现在可能不再适用。某种程度上,我们建立的模型是对现实世界的反映,如果世界在变,模型也应该随之变化。
因此,从一开始就要考虑定期升级模型作为维护的一部分。
维护周期的频率取决于具体业务需求。例如,在广告预测系统中,用户行为和购买模式不断变化,需要较高的更新频率。而在情绪分析系统中,由于语言结构变化不大,更新频率可以相对较低。
此外,反馈回路在机器学习系统中至关重要。假设你用猫狗分类器预测一张图像为狗,但置信度较低。我们能从这些低置信度的例子中学到什么?可以将这些样本手动检查并用于重新训练模型,从而提高分类器的准确性。
经验教训:在考虑模型投入生产时,应制定利用反馈机制进行维护和改进的计划。
在将模型投入生产前,我认为这些步骤非常重要。
尽管这不是你需要考虑的所有事项和潜在问题的完整清单,但它可以作为你在创建机器学习系统时的重要参考。