有些模型被训练过一次,然后就很少或不更新了。但大多数模型会在其生命周期的某个时间点被更新。这可能每隔几个月就会发生,比如可能又有一批来自抗体测试的湿实验室数据进来;也可能每周都会发生,比如纳入一组新的图像数据和相关的对象标签;在流媒体环境下也可能每隔几分钟就发生,比如更新基于用户浏览和购买各种纱线产品的新数据。平均来说,每一次更新都有望在整体上改善模型,但在特定情况下,模型可能会变得更糟,甚至完全崩溃。以下是一些可能导致这种崩溃的原因。
过拟合
正如我们之前简要概述过的典型模型生命周期中所讲的,一个好的模型会对新的、以前未见过的数据进行很好的泛化,而不仅是狭隘地记忆其训练数据。每次模型被重新训练或更新时,我们都需要通过使用预先保留的验证数据来检查过拟合情况。但是,如果我们一直重复使用相同的验证数据,就有可能导致最终不可避免地过拟合这些重复使用的验证数据。
出于这个原因,定期刷新验证数据并确保我们没有愚弄自己是很重要的。例如,如果 yarnit.ai 上关于购买的验证数据集从未更新,而我们客户的行为随着时间的推移而改变,倾向于更明亮的羊毛,那么我们的模型将无法跟踪这种购买偏好的变化,因为我们在评价模型时会认为学习这种行为的模型比没学习这种行为的模型“质量低”。重要的是,模型质量评估包括对模型性能的真实验证。
缺乏稳定性
每次对模型进行重新训练,都不能保证其预测结果在不同的模型版本之间是 稳定的 。模型的一个版本可能在识别猫方面表现很好,在识别狗方面表现很差,而另一个版本则可能在狗方面表现好一些,在猫方面表现差一些——即使两个模型在验证数据上的总的精确度是相似的。在某些情况下,这可能是一个重要的问题。
例如,设想一个用于检测信用卡欺诈并关闭可能已被泄露的信用卡的模型。一个精度为99%的模型在一般情况下可能是非常好的,但如果该模型每天都被重新训练,并且每天在不同的1%的用户身上犯错,那么三个月后,可能整个用户群都会因为错误的模型预测而带来不便。在我们所关心的预测的部分评估模型质量是很重要的。
深度学习的特殊性
近年来,深度学习方法已经变得如此重要,因为它们能够在许多领域达到很好的预测性能。然而,深度学习方法也伴随着一系列特定的脆弱性和潜在的漏洞。因为它们被广泛使用,而且从机器学习运维的角度来看,它们有特定的特殊性和需要关注的地方,所以我们在这里会对深度学习模型进行详细介绍。
当深度学习模型从头开始训练时——如果没有事先的信息——它们会从一个随机的初始状态开始,以随机的顺序输入大量的训练数据流,通常是小批量的。该模型做出其当前的最佳预测(早期的预测很糟糕,因为该模型还没有学到很多东西),然后显示正确的标签。一旦数学计算完成,即计算 损失梯度 ,模型的内部就应该被更新。当使用这个损失梯度时,一个小的更新会被应用到模型内部,试图使模型稍微好一点。这种对随机排列的小批次进行小的修正的过程被称为 随机梯度下降 (SGD),并被重复数百万或数十亿次。当确定模型在保留的验证数据上显示出良好的性能后,我们就停止训练。
关于这一过程的主要理念如下:
深度学习依赖于随机化
在最初的随机状态下,数据是以随机顺序显示的。在大规模的并行化设置中,由于网络和并行计算的影响,随机性甚至是更新处理方式中固有的。因此,在相同的数据上以相同的设置重复训练相同的模型,可能会导致最终模型的大幅不同。
要知道训练何时“完成”可能很困难
模型在保留的验证数据上的表现通常会随着训练步数的增加而提高,但有时在早期会出现反弹,如果模型通过过于紧密地记忆训练数据而开始过拟合该数据,那么后期往往会明显变差。我们通常选择一个在中间点表现良好的 检查点 版本,从而停止训练,并在性能收敛到一个好的水平时选择最好的模型。不幸的是,没有正式的方法可以知道我们现在看到的性能是否是我们可以得到的最好的。事实上,最近针对各种模型发现的 double-dip 现象表明,我们以前关于何时停止的概念可能不是最佳的 [2] 。
深度学习模型在训练中有时会出现爆炸
我们采取小步走而不是大步走的原因是,很容易从数学悬崖上掉下来,使模型的内部结构陷入难以恢复的状态。事实上, 梯度爆炸 是一个技术术语,意味着适当的危险。在这种状态下结束的模型在预测或中间计算中经常给出 NaN (不是一个数字)值。这种行为也会表现为模型的验证性能突然变差。
深度学习对超参数十分敏感
如前所述,超参数是必须对其进行调整以使机器学习模型在任何给定的任务或数据集上获得最佳性能的各种数字设置。其中最明显的是学习率,它控制每步更新的大小。步骤越小,模型就越不可能梯度爆炸或产生奇怪的预测结果。但训练时间越长,使用的计算量就越大。其他设置也有重大影响,比如内部状态有多大或多复杂,小批量有多大,以及应用各种试图压制过拟合的方法的力度。深度学习模型对这种设置非常敏感,这意味着需要进行大量的实验和测试。
深度学习是资源密集型的
SGD的训练方法能有效地产生好的模型,但依赖于数量巨大的微小更新。事实上,用于训练一些模型的计算量相当于成千上万的CPU核心连续运行了几个星期。
深度学习方法出错时,它们的结果可能十分离谱
深度学习方法会从其训练数据中进行推断,这意味着以前未见过的新数据点越不熟悉,就越有可能出现完全偏离基础或超出典型行为范围的极端预测。这些类型的高置信度错误可能是系统级错误行为的重要来源。
现在你了解了模型创建中可能出现问题的结构,从更广泛的角度来了解训练模型所需的基础设施可能会很有用。