机器学习模型在同一数据集上训练产生不同结果的3个原因
如果你正在学习机器学习模型(不论什么任务),在本地机器上研究开发之后,能够在测试集上运行。却发现模型在通过构建管道部署时一直失败,但是该模型是在本地开发时使用的相同测试集上测试好的。
本文将解释这种奇怪现象产生的原因,并提出如何检测真实模型回归的建议。
本文案例使用代码链接:
https://github.com/hsm207/why_models_fail
从本地开发阶段开始看
假设我们正在构建一个模型来对MNIST数据集进行分类。目标是构建一个在测试集上准确率至少为95%的分类器。
几次尝试,终于实现了这一目标:

但是,再次运行训练和评估逻辑会产生不同的结果:

运行相同的模型训练和测试代码会产生不同的结果
结果略有不同,我们的目的就是想知道变化的原因。按道理来说,完全相同的代码运行多次应该会产生相同的结果。
回顾发现在训练时开启了数据洗牌(data shuffling),这是构建机器学习模型时的常见做法。也许如果你在训练中禁用随机洗牌(random shuffling),那么在不同的训练中结果将会保持不变?
构建机器学习模型时的常见做法相关解释:
https://datascience.stackexchange.com/questions/24511/why-should-the-data-be-shuffled-for-machine-learning-tasks
这是在训练期间禁用随机洗牌后第一次运行的结果:

训练期间关闭数据shuffle后的首次运行
这是第二次运行的结果:

训练期间关闭数据 shuffle 后的第二次运行
结果还是不一样!但至少现在差距变小了……
然后想起模型在训练开始时随机初始化它的参数!所以断定,修复随机种子肯定会解决这个问题。
修复随机种子知识点:
https://github.com/tensorflow/tensorflow/blob/c256c071bb26e1e13b4666d1b3e229e110bc914a/tensorflow/python/framework/random_seed.py#L215-L216
将随机种子设置为1时,会发生以下情况:

在训练期间修复随机种子并禁用数据洗牌后的首次运行
第二次运行:

在训练期间修复随机种子并禁用数据洗牌后的第二次运行
Ok现在结果是相同的,继续构建一个管道来训练模型并将其部署到生产中。
管道模型
从构建管道中读取日志:

来自构建管道的训练和测试日志
随机种子已固定为1,并且已禁用训练数据混洗,就像在本地机器上所做的一样。但为什么结果不一样呢?
管道模型和本地模型之间的差异真的很小,也许这可能是硬件浮点算法实现中的错误。
好消息是这个“错误”已经在互联网上被讨论了很多。坏消息是它不是一个错误。简而言之,机器之间的差异源于浮点规范的定义方式以及硬件供应商如何实现它们。除了忍了这个差异没有别的办法。
举个例子
使用MNIST数据集,它有 60,000 个训练示例和 10,000 个测试示例。考虑到问题的复杂性,这足以确保机器学习模型在每次运行时都能训练到收敛。
但实际上我们不太可能从如此大的数据集开始。
我们要提前考虑数据集大小对同一台机器上运行的变化的影响。
现在我们只有1,000个训练样例和500个测试样例,则变化如下:

假设有1000个训练示例,测试准确度的变化
在只有1000个训练示例的情况下,我们预计模型的表现相对于在整个训练集中进行训练时较差。图8证实了这一点(在整个测试集上测试时的中位数测试准确度介于86.5%和87.0%之间,而在完整训练集上训练时的中位数为 97%)。
图 8 还显示,与在完整测试集上进行评估相比,仅在 500 个测试示例上进行评估时,测试准确性的变化要高得多。
有了正确的数据集,固定的随机种子,没有数据洗牌,你最终可以在你的500个样本测试集上得到89%的测试精度,这并不是模型的真实性能的真实反映。因此,不应该关闭来自随机种子和数据洗牌的随机性,以便我们可以估计模型性能的不确定性。
但是如何确保模型的后续工作(例如添加新特征、超参数调整)不会意外引入回归?
如何检查模型回归
前面的部分已经表明,在小数据集上训练和测试的模型的评估指标可能会有很多变化。因此,如果您的模型具有 90% 的准确率,那么下一次运行可能会偶然返回 88% 的准确率,这使得设置检测回归的最小阈值变得困难。
人们可能很想寻找一种随机种子,这将使本地模型和管道模型的结果差异尽可能小,但我认为这不是对时间的最佳利用。
相反,我建议在管道中运行几次训练和测试作业,并计算运行中评估指标的均值和标准差。这些数字在机器上是稳定的,因此可以用来可靠地确定是否引入了回归。
结论
这篇文章描述了机器学习模型每次在同一数据集上训练会产生不同结果的 3 个原因,即:
输入:训练数据批处理并输入模型的方式很重要
模型架构:随机权重初始化、随机采样和 dropout 等技术将通过设计将随机性引入模型的输出中
硬件:不同的硬件可以不同地实现浮点运算
本文还建议使用在一系列训练和测试运行上计算出的评估指标的均值和标准差作为检测模型回归的方法。
文章来源:
https://pub.towardsai.net/why-your-build-pipelines-always-fail-your-machine-learning-model-a09484d551f6
免责声明:所载内容来源互联网,仅供参考。转载稿件版权归原作者和机构所有,如有侵权,请联系我们删除。
关注公众号更多人工智能干货等你来!
如有问题,温柔的说,别直接喷/(ㄒoㄒ)/~~
