在机器学习的研究领域,调参往往是每位研究者必须面对的挑战。这一过程虽然听上去简单,但实践起来却异常复杂。调参的背后,通常伴随着熬夜研究论文和查阅 GitHub,进行大量实验,这不仅耗时,而且消耗大量计算资源,甚至让许多工程师感到疲惫不堪。
调参是否真的是一门玄学?为什么明明调整得当,但模型的效果却与期望总有差距呢?最近,ReddIT 上的一个帖子引发了关于机器学习调参领域的热议,讨论了各类迷信的看法和做法。
在机器学习中,超参数的调整是必不可少的技能。通过观察训练过程中的监测指标,如损失(loss)和准确率,研究者可以判断模型的训练状态,并及时调整超参数,以更科学地提升模型的性能。
每位研究者都会根据自己的经验进行模型调参,最终得出的经验往往是:
- Random seed = 0 得到不佳结果
- Random seed = 42 得到良好结果
- k-Means 中的偶数 k 导致有意义的分割
虽然有些人将这些经验称为 ML 的“迷信做法”,但实际上,这几乎是所有学者的共识。然而,也有网友对此持怀疑态度。例如,网友 @SlashSeRo 指出,这种现象甚至在著名的科学出版物中也时有发生,尤其在交叉验证不可行或易受其他参数影响的情况下,超参数优化(HPO)可能无效。
此外,虽然研究者的信任可能会导致新的深度学习模型在实际应用中未能优于传统模型的表现,但我们需意识到,确保模型的性能可复现和透明是非常艰巨的任务。这不仅消耗计算资源,还有可能错失在这一快速发展的领域发表论文和获得认可的机会。
为实现模型的最佳性能,各路网友纷纷分享自己的调参经验:有网友认为随机种子必须是 10 的倍数,最理想为 1000(不过这一观点也遭到反驳)。
除了随机种子的设置,一些研究者还分享了科研小技巧。模型训练过程几乎是黑箱,若程序出现错误,难以察觉。网友建议随时进行“打印”是一种良好习惯,首次运行程序时,打印所有可能的内容,能够让你了解程序的进展,防止陷入死循环。实际上,许多程序员都会这样做。
此外,日志记录也是必要的。在实验室进行科研时,运行一个程序可能需要几天,期间常常会遇到意外情况,比如突然断电或服务器崩溃。因此,随时保存日志是每个程序员的必备技能,通过查看日志,你可以了解程序的运行状态,粗略评估模型的性能,并查找错误。
还有网友分享了自己的 dropout 经验,认为超过 20% 的 dropout 会使模型难以恢复,但也有人表示自己用 90% 的 dropout 得到了最佳性能。还有网友总结批量大小应为 2 的幂次方。
以上便是网友们总结的一些 ML 调参小技巧。
尽管调参很重要,网友 @ostRich-scalp 也批评道,“大多数论文的结果都是胡说八道,期望能实现这些工作并建立一个可用于生产的模型,是一个巨大的错误。”
另一位网友 @SlashSeRo 接着说道,“令人难以置信的是,在 ACM、IEEE、IAAA 和 NeuRIPS 上发表的论文中,有多少完全依赖于作者的信任。希望所有知名期刊和会议都要求论文作者开源和复现代码,但这种情况依然只是例外。”
显然,机器学习是一门技术。尽管神经网络的黑箱特性限制了可解释性,但我们可以通过经验在较高层面解决问题。我们需要加载数据,建立框架,运行系统,设定度量标准,调整参数并分析误差,进行特征工程,最后进行结果可视化。经过多次迭代,推理的准确率终于不再提升。
那么,为什么各种迷信现象依旧层出不穷?或许是因为我们对这门学科的理解还不够深入。
不过,请记住 NIPS 2017 大会上图灵奖得主 Judea Pearl 演讲的最后一页:“数据科学只有在能够促进对数据的合理解读时,才能被称为科学。”
尽管如此,深度学习调参还是有可循的技巧,以下几点仅供参考:
- 寻找合适的学习率。学习率是一个重要参数,其适合值会因不同规模、批量大小、优化方式和数据集而异。我们需要在训练过程中不断寻找当前状态下的最优学习率。
- 权重初始化。虽然使用频率不高,但在没有预训练模型的领域,需自行初始化权重,常用的初始化算法有“kaiming_normal”或“xavier_normal”。
- 数据集处理,包括数据筛选和数据增强。
- 多模型融合,这是提升结果的终极策略,通常有几种方式,比如相同参数不同初始化、不同参数选取最佳组合、不同模型的线性融合等。
- 余弦退火和热重启的随机梯度下降。余弦退火逐步降低学习率,热重启则是在学习过程中突然回升。
- 尝试过拟合一个小数据集,关闭正则化、随机失活和数据扩充,只使用一小部分训练集进行训练,确保能够达到零损失。
调参的旅程,各有各的“路数”,找到适合自己的方式才是关键。
最后,不妨问问自己,炼丹的你有哪些独门秘籍呢?
[[[IMG_1]]]
[[[IMG_2]]]
[[[IMG_3]]]
[[[IMG_4]]]
[[[IMG_5]]]
