文章目录
在机器学习和深度学习的领域中,模型的调参(参数优化)是一个至关重要的步骤。良好的参数设置可以显著提升模型的性能。本文将介绍在模型调参过程中的关键步骤和技巧。
1. 学习率 & 优化器
一般来说,越大的batch-size使用越大的学习率。
原理很简单,越大的batch-size意味着我们学习的时候,收敛方向的confidence越大,我们前进的方向更加坚定,而小的batch-size则显得比较杂乱,毫无规律性,因为相比批次大的时候,批次小的情况下无法照顾到更多的情况,所以需要小的学习率来保证不至于出错。
不同batch size对应不同的最优lr:
大多数采用的优化算法还是adam和SGD+monmentum。
Adam 可以解决一堆奇奇怪怪的问题(有时 loss 降不下去,换 Adam 瞬间就好了),也可以带来一堆奇奇怪怪的问题(比如单词词频差异很大,当前 batch 没有的单词的词向量也被更新;再比如Adam和L2正则结合产生的复杂效果)。用的时候要胆大心细,万一遇到问题找各种魔改 Adam(比如 MaskedAdam[14], AdamW 啥的)抢救。
但看一些博客说adam的相比SGD,收敛快,但泛化能力差,更优结果似乎需要精调SGD。
adam,adadelta等, 在小数据上,我这里实验的效果不如sgd, sgd收敛速度会慢一些,但是最终收敛后的结果,一般都比较好。
如果使用sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞,我自己实验的结果也很好. 当然,也可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。
adam收敛虽快但是得到的解往往没有sgd+momentum得到的解更好,如果不考虑时间成本的话还是用sgd吧。
adam是不需要特别调lr,sgd要多花点时间调lr和initial weights。
2. batch size
在显存足够的条件下,最好采用较大的batch-size进行训练,找到合适的学习率后,可以加快收敛速度。
另外,较大的batch-size可以避免batch normalization出现的一些小问题,参考1
3. 网格搜索
网格搜索(Grid Search)是一种通过遍历给定的参数组合来优化模型性能的方法。它适用于参数数量较少时的情况。将所有可能的参数组合进行尝试,找到最优的组合。
4. 随机搜索
与网格搜索相比,随机搜索(Random Search)在参数空间内随机选择参数组合进行尝试。这种方法适用于参数空间较大时,可以在更广阔的范围内搜索最优参数。
5. 贝叶斯优化
贝叶斯优化是一种更为高级的参数优化方法,它利用概率模型预测参数组合的效果,并据此更新搜索策略。这种方法在处理高维参数和复杂约束时非常有效。
6. 使用交叉验证避免过拟合
在调参过程中,使用交叉验证(Cross-validation)能有效避免模型过拟合。通过将数据集分为几部分,分别用作训练和验证,可以更准确地评估模型在未见数据上的性能。
7. 考虑正则化
正则化技术,如L1和L2正则化,可以帮助减少模型复杂度,防止过拟合,是调整模型的一个重要方面。
8.
8. 实验和记录
在调参过程中,进行大量的实验并记录每次实验的设置和结果是非常重要的。这有助于理解哪些参数对性能影响最大,以及如何进一步调整参数以提高性能。
9. 模型的早停法
在训练过程中使用早停法(Early Stopping)可以在模型开始过拟合之前停止训练,这是一种有效的防止过拟合的策略。
10. 总结
调参是一个既艺术又科学的过程。理解模型的工作原理和数据的特性是关键。同时,调参也需要实验和实践的经验。希望本文能够帮助你更有效地调整模型参数,提升你的机器学习和深度学习模型的性能。
调参是机器学习和深度学习项目成功的关键,希望通过这篇文章,你能获得调参的启发和指导,从而在你的项目中取得更好的成果。
本文撰写过程中使用到的其他参考资料
其他学习资料
https://github.com/pytorch/pytorch/issues/4534:大致来说就是batch size为1时BN会出问题 ↩︎