各位炼丹er们,调参是你们最头疼的环节吗?
现在,一份上线不到一天就狂揽1200+星的《深度学习调优手册》来了。
这可能是市面上首个如此全面的炼丹宝典,由5位谷歌工程师大佬合作总结。
这些大佬们都已在深度学习领域“踩坑”多年、工作成果应用从语音识别到天文学都有涉猎。
为了这份手册,他们总结了自己在训练网络、带新工程师、以及和同事交流时get到的各种经验和技巧。
连“深度学习之父”Geoffrey Hinton都来盛赞:
来看看具体都有些啥。
本手册适用范围为:对系统地最大化深度学习模型性能感兴趣的工程师和研究人员,包括个人和团队。
默认翻开这本手册的都掌握了机器学习基本知识和深度学习概念。
其中内容主要聚焦超参数调整,因为这是作者们在工作中耗时最多、收获也最多的环节。
具体一共分为四大部分:
第一部分从训练一个新的模型开始,教大家如何选择:
(1)模型架构(2)优化器(3)batch size(4)初始配置。
比如,在选择优化器时,由于所有类型的机器学习问题和模型架构中都不存在最好的那一个,那么我们就坚持选择时下最流行、最成熟的那一个(尤其对于新项目来说)。
这里作者们推荐(但不限于):SGDM和更通用的Adam、NAdam,特别提醒:Adam有4个可调超参数 ,它们都很重要。
而在选择batch size时,需要注意它只是决定训练速度,不应该直接用于调整验证集的性能。
因为有研究表明,只要所有超参数都经过良好调整(尤其是学习率和正则化超参数)并且训练步数足够,任何batch size值都应该可以获得相同的性能。
通常来说,理想的batch size是可用硬件支持的最大值。
具体如何选择,手册在这里作出了非常详细的解释:
初始配置方面,指导原则是找到一个简单、相对快速、资源消耗相对较低的配置,好获得一个“合理”的结果。
所谓简单,就是切记不要在开始时就添加一些花里胡哨的东西,现阶段没用不说还浪费时间。
比如在找到一个合适的学习率之前,就不要想着各种花式的decay schedule。
本部分的经验建立以下两点前提之上:
- 我们已经有一个完全运行的训练pipeline以及能够获得合理结果的配置;
- 有足够的计算资源用于进行有意义的调整实验、用于并行运行多个训练项目。
具体一共分为7个小部分:
第1部分标题为“逐步调整策略”,即从一个简单的配置开始,逐步进行改进,需要重复以下四个步骤:
- 为下一轮实验确定范围适当的目标;
- 设计并运行实验,朝着目标取得进展;
- 分析结果;
- 考虑是否推出新的最佳配置。
后续部分就是围绕上面四个步骤进行详细的展开,超参数如何选择和修改也在本节作为重点出现。
比如不管我们的实验目标是什么,我们都需要将超参数分为三类:科学超参数、nuisance超参数和固定超参数。
如果我们的目标是“确定具有更多隐藏层(hidden layer)的模型是否会减少验证错误”,那么隐藏层数就是一个科学超参数,这是我们在设计新实验时需要首先确定的。
需要修改的主要是第二类。
当我们进行到第三步,也就是分析结果时,需要额外问自己以下几个问题:
搜索空间是否足够大?是否从里面采样了足够多的点?该模型是否存在优化问题?我们可以从最佳试验的训练曲线中学到什么?
具体怎么判断和解决这些问题,手册也有非常详细的解释。
最后,当我们确定好了应该调整哪些超参数,就可以善用贝叶斯优化工具了。
在这部分,手册根据工作负载的不同分了两部分来展开,分别为:
- 工作负载为计算密集型(CPU密集型)时,训练步数如何设置?
- 工作负载为非计算密集型(IO密集型)时,训练步数如何设置?
通俗来讲,计算密集型与非计算密集型就是受不受计算量的限制。而我们要解决的问题,就是无论在哪种情况下,如何让模型都能达到最佳效果。
也不多说废话,直接举个栗子来看宝典中是如何讲的?
当工作负载受计算限制时,也就是说计算资源成为主要的限制因素,首先面临的问题就是:
如果训练损失在无限期的改善,有没有必要这样一直训练下去?
宝典给出的答案是:没有! 多轮调整最明智,1~3轮最实用。
并且还附有两轮调整的具体建议:
- 第1轮:较短的运行时间以找到好的模型和优化器超参数
- 第2轮:不要在良好的超参数点上长时间运行以获得最终模型
(详见手册)
关于当工作负载不受计算限制时,调整的部分主要围绕max_train_steps,具体这里就不再赘述。
到这里,宝典差不多就接近尾声了,谷歌研究员们还贴心地给出了一份pipeline训练的补充指南,内容包括:
- 优化输入pipeline
- 评估模型性能
- 保存检查点并回顾性地选择最佳检查点
- 建立实验跟踪
- Batch规范化实现细节
- multi-host pipelines的注意事项
在“优化输入pipeline”部分,宝典列出了导致输入pipeline的一些常见原因,并给出了一些小tips。
关于“评估模型性能”,也给出了详细的操作步骤。
……
宝典全文的链接也已附在文末,感兴趣的朋友可以扔进收藏夹了。
mem it~
一共4位谷歌在职大佬,1位哈佛的在读博士生(以前也在谷歌工作了5年多)。
Varun Godbole,目前是谷歌AI的一名软件工程师,主要经验集中在建模和构建处理大型数据集的基础设施方面。
之前,他的研究领域是计算机视觉和医学图像的交叉点,合著的论文“International evaluation of an AI system for breast cancer screening”曾登上Nature。
George E. Dahl,是谷歌大脑团队的研究科学家,他的研究集中在高度灵活的模型上,并且他还对语言、感知数据以及化学、生物和医学数据的应用感兴趣。
George在多伦多大学攻读博士学位时,主要解决语音识别、计算化学和自然语言文本处理等问题的深度学习方法,其中包括一些首次成功的深度声学模型。
Justin Gilmer,谷歌大脑的研究科学家,他在Google Scholar上引用已经破万,主要研究方向为深度学习、组合型、随机图论。
量子位前不久的《几十年数学难题被谷歌研究员意外突破!曾因不想搞数学自学编程,当年差点被导师赶出门》讲的正是这位科学家。
Christopher Shallue,目前正在攻读哈佛大学的天体物理学博士学位,在此之前,他曾在谷歌工作了5年10个月。
在谷歌工作的那段时间,Shallue有3年多的时间在谷歌大脑担任机器学习研究工程师,研究的内容包括:
- 开发识别系外行星的机器学习技术(包括神经网络首次发现行星)
- 加快超级计算机规模的机器学习培训
- 实证研究机器学习中的优化算法和超参数调整
- TensorFlow 中的开源参考模型实现(图像字幕、句子嵌入、系外行星探测)
Zachary Nado,谷歌大脑的研究工程师,本科就读期间,曾先后在谷歌和SpaceX实习,研究领域包括数据挖掘与建模、机器智能、NLP等。
宝典传送门:
https://github.com/google-research/tuning_playbook
“