机器学习为何每次运行结果都不同?2025年6月21日 | 阅读 4 分钟 ![]() 机器学习模型可以成为强大的工具:有些模型试图预测未来趋势,有些模型则致力于识别图像或处理自然语言。然而,对于大量的实践者来说,在使用相同数据和参数的情况下,观察到模型每次运行的结果都不同是常见现象。当你在努力追求实验的一致性时,这可能会让人非常困惑。 让我们来考虑导致这种现象的最重要原因以及如何处理它。 模型参数的随机初始化大多数机器学习模型,特别是神经网络,在开始训练时会用随机值初始化其权重和偏置。也就是说,初始值取决于模型在训练过程中收敛到的点。 如果每次运行的权重初始化都不同,那么优化过程可能会走一条略微不同的路径。这可能导致最终训练模型的差异,进而引起结果的不同。请为模型的初始化设置一个随机种子。如今,包括 TensorFlow 和 PyTorch 在内的多数库都支持此功能,因此你可以定义一个种子值以确保结果的可复现性。 随机训练算法许多机器学习模型是使用随机优化技术进行更新的,例如随机梯度下降(SGD)。这些技术依赖于训练数据的随机抽样,即每次迭代使用小批量(mini-batches)。选择用于训练的数据点的随机性会影响模型的收敛性,因此每次训练的结果都会略有不同。请使数据加载具有确定性,例如通过为数据混洗设置一个种子;同时,训练过程也需要在不同运行中使用相同的小批量。 非确定性操作一些机器学习框架的操作,特别是那些为在 GPU 上高性能并行执行而设计的操作,从定义上来说不是确定性的。例如,某些矩阵乘法或特定的卷积操作在不同运行之间可能产生微小的浮点计算差异。尽可能强制执行确定性操作。几乎所有库都提供了关闭非确定性行为的选项,尽管这通常会降低训练速度。 数据混洗数据混洗是在训练前对数据进行混洗的常见做法,以确保模型不会以有偏见的方式学习。然而,数据混洗的方式引入了随机性,这会影响训练过程和最终结果。 为数据混洗设置一个固定的随机种子以保持一致性。 硬件和并行计算用于训练模型的可用硬件,包括 GPU 和 CPU,都会增加结果产生中的变异性。并行执行中的计算可能不会每次都产生相同的周期:它会在一次计算与另一次计算之间产生微小的差异。因此,需要关键可复现性的应用程序应该在单台设备上进行训练,并尽量减少并行计算。 浮点数精度这导致一些计算会舍入计算机中存储的极小的十进制值。虽然有时这些微小差异并不重要,但它们确实会累加起来导致输出变化。尽量使用相似的硬件和库以防止浮点数表示上的差异。 使用更高的精度,例如 64 位浮点数,具体取决于可用框架。以上操作会带来计算成本。 提前停止和周期限制诸如提前停止等技术——即在验证性能停止改进并防止训练过拟合时停止训练过程。由于数据抽样或初始化的随机性,训练停止点可能会有所不同。 固定训练的周期数,或设置一个通用的提前停止标准。 正则化技术Dropout 和其他正则化技术会引入随机性以提高泛化能力。例如,Dropout 在训练过程中会随机忽略某些神经元,迫使网络学习冗余的表示。 如果对可复现性有要求,请为 Dropout 机制设置随机种子。 外部库的更改使用不同版本的机器学习库或框架也可能导致结果发生变化。底层代码的优化或更新可能会改变训练过程。记录您使用的库版本,并在您的项目中进行文档记录。 数据集可变性如果在运行之间数据集被更新或以不同方式预处理,这可能导致结果的差异。例如,缺失值以不同方式处理或特征缩放应用不一致都可能导致差异。保持一致的数据集和预处理流程。保存并重用预处理后的数据进行未来的运行。 为什么可复现性很重要?在机器学习中,可复现性至关重要,尤其是在研究和部署方面。这将确保结果可信,并能被他人交叉验证。这对于调试和改进模型也至关重要,因为一致的结果可以更轻松地发现问题并测试新想法。 调和可复现性与变异性虽然可复现性是好的,但机器学习的本质总是存在一定的变异性。而且,有时变异性可以帮助模型跳出局部最小值,从而实现更好的泛化。在这里,可复现性与算法实验之间的平衡仍然很重要。 下一主题什么是多层建模 |
我们请求您订阅我们的新闻通讯以获取最新更新。