深度学习调参指南:优化性能与资源消耗的平衡
欢迎来到深度学习调参的指南!本篇博客适用于对最大化深度学习性能感兴趣的工程师和研究人员,前提是你具备机器学习和深度学习概念的基本知识。在本文中,我们将聚焦于超参数调优的过程,同时还会涉及一些深度学习其他方面的内容。让我们从开始新项目的指南开始
在开始调优之前,确保以下工作已完成:
在开始一个新项目时,我们建议先选择一个有效且常用的模型架构。这样可以快速让模型进入工作状态,之后再构建自定义模型也是可行的。模型架构通常包含各种超参数,如层数、层宽度和激活函数类型。
如果可能,找到一篇与问题相关的论文,并复现其中的模型作为起点。
没有一个优化器适用于所有类型的机器学习问题和模型架构。我们建议从针对手头问题类型的最常用优化器开始。一开始,使用成熟且流行的优化器,然后根据需要进一步调整。
Batch Size 是决定训练速度和计算资源消耗的重要因素。适当选择Batch Size 对于优化性能非常关键。确定合适的Batch Size 通常需要经过以下步骤:
在开始超参数调优之前,我们必须确定初始配置。这包括模型配置、优化器超参数和训练步数。确定初始配置时,我们建议找到一个简单、相对快速、资源消耗较低的配置,以获得合理的结果。
选择一个快速且消耗资源较少的初始配置可以使超参数调优更加高效。
在本文的后续章节,我们将深入探讨超参数调优的过程,包括学习率、正则化超参数等的调整。同时,我们会涉及更多关于深度学习调参的有用信息。
在第一章中,我们已经建立了一个起点,选择了模型架构、优化器和合适的Batch Size。现在,我们将进一步探讨提高模型性能的科学方法,以最大化我们的效用。
在优化模型性能时,采用增量调整策略是一个明智的选择。我们从简单的配置开始,逐步添加功能和改进,同时深化对问题的理解。通过不断调整,我们会找到越来越好的配置,并不断更新最佳配置,称之为“上线”。
这个增量调整策略需要重复以下四个步骤:
通过这个迭代过程,我们将逐步优化模型,不断提升性能。
在优化模型过程中,我们应该将重点放在进一步理解问题上,而不仅仅是降低验证集错误率。大部分时间应该用于“探索”,只有一小部分时间用于“利用”。
通过深入理解问题,我们可以避免不必要的更改,确定验证集效果对哪些超参数敏感,发现新方向,删除无效的方向,并缩小搜索空间以提高调整效率。这样的探索可以帮助我们更好地理解问题,并最终优化模型性能。
在优化模型过程中,每轮实验都应该有一个明确的目标,并且范围要足够小,这样实验才能真正朝着目标取得进展。如果我们试图一次添加多个特征或回答多个问题,可能无法理清各自的影响。
举个例子,实验的目标可以包括:
每个目标都应该是具体的,明确指定了想要改进的方面。这样,我们可以集中精力去解决特定问题,而不是同时处理过多的变化。
在确定了实验的目标和冗余超参数后,我们将设计一组研究以朝着实验目标取得进展。这些研究包含一系列试验,每个试验都是超参数配置的不同组合。
对于给定的目标,所有超参数将被归类为目标超参数、冗余超参数或固定超参数。
固定超参数对实验结果的结论产生限制,因为实验过程中这些参数不会变化。因此,我们需要谨慎选择哪些超参数固定,以避免产生错误结论。
创建研究的过程涉及几个方面:
我们希望通过实验来运行训练流程,同时优化冗余超参数,以公平地比较不同的目标超参数值。在简单情况下,我们可以为每个目标超参数值单独设计一个研究,并调整冗余超参数。这样我们可以比较不同目标超参数值的性能。
在更复杂的情况下,我们可能需要比较大量目标超参数值,并且无法进行大量独立的研究。此时,我们可以将目标超参数与冗余超参数放在相同的搜索空间中,并使用搜索算法对两种超参数的值进行采样。在这种情况下,我们需要确保搜索算法能够均匀地搜索目标超参数的值,以避免对不同目标超参数值进行不公平的比较。
在设计实验时,我们需要分配有限的预算,以充分满足以下三个要求:
这三个要求确保我们能够从实验中获得足够多的经验,有信心得出合理的结论。
然而,要同时满足这三个要求可能需要增加试验次数,从而增加资源成本。在实践中,我们需要在这三个需求之间进行平衡,根据问题的特点和计算资源限制来进行分配。在进行一项研究后,我们需要总结该研究是否充分搜索了冗余超参数空间,以公平地比较不同目标超参数值的性能。
在实验过程中,我们不仅要关注实现每组实验的原始科学目标,还要注意其他问题的出现。如果发现问题,我们应该进行实验的修改并重新运行。最终,每组实验的目标是评估实验为该目标提供的证据。
然而,有时在取得实验进展之前,我们需要解决一些问题。在分析一组实验结果之前,我们应该问自己以下额外的问题:
通过回答上述问题,我们可以优化研究,改进搜索空间和抽样更多试验,或采取其他纠正措施,以便朝着最初的目标取得进展。
如果从搜索空间中采样的最佳点靠近其边界,那么搜索空间可能有问题。在这种情况下,可能需要扩展搜索空间边界,以找到更优秀的点。为了检查搜索空间边界,我们可以绘制基本超参数轴图,其中绘制了已完成的试验的验证目标值与一个超参数(例如学习率)的关系。每个点对应一次试验,验证目标值通常应该是在训练期间达到的最佳值。如果最佳点聚集在搜索空间的边缘,可能需要扩展搜索空间边界。
确定是否已经足够密集地采样搜索空间可能很难。在实践中,我们通常会采样我们能够负担得起的代价,并通过查看各种超参数轴图来校准直觉,了解有多少点位于搜索空间的“好”区域。
检查训练曲线是识别常见故障模式的简单方法,并且可以帮助我们优先考虑下一步采取的行动。我们通常会查看至少是最好的几次试验的训练曲线,并关注以下问题:是否出现过拟合?训练或验证误差在训练后期存在较高的步与步之间的方差吗?在训练结束时,试验是否仍然能够改进?这些问题有助于指导下一步的实验设计。
isolation图是一种特殊的基本超参数轴图,用于在目标超参数的不同值之间进行同类比较。通过绘制isolation图,我们可以更轻松地确定导致最佳性能的超参数设置。这对于比较不同超参数值的效果非常有用。
为了节省时间,最好自动化生成尽可能多的图表。我们可以自动生成基本超参数轴图、训练曲线以及其他有用的可视化。这样,我们可以更方便地查看实验结果并进行比较。
以上这些方法有助于从实验结果中获取经验,并指导下一步的实验设计和参数调整。同时,随着实验的进行,我们会逐渐学习和发现新的方法来优化研究。
在决定是否对模型或训练程序进行改变或采用新的超参数配置时,我们需要理解导致结果中不同变化的来源。有几个主要的变化来源可以导致结果的不一致性:
当我们试图得出超出超参数空间中单个点的结论时,我们最关心的是学习方差。学习方差取决于试验次数和搜索空间,并且通常大于试验方差。
在决定采用一个候选变化之前,我们可以运行最佳试验多次,以估计训练方差。这样可以帮助我们确定是否要采用一个新的超参数点(或其他变化),并确保采用的改变能够产生真正的改进,而不会增加过多的复杂性。
一旦我们完成对“好”搜索空间的探索,并确定了哪些超参数需要调整,贝叶斯优化工具是一个值得考虑的选择。在这一阶段,我们关注的重点从学习更多优化经验转向产生一个最佳配置,以便启动模型或以其他方式使用。
此时,我们应该有一个精确的搜索空间,该空间包含最佳观察试验周围的局部区域,并已经进行了充分的采样。我们的探索工作应该揭示了最重要的要调整的超参数及其合理的范围。
我们可以使用这些超参数来构建搜索空间,并在预算范围内进行最终的自动调整研究。在这种情况下,贝叶斯优化工具可以自动找到最佳超参数配置。
此时,我们还应该考虑检查模型在测试集上的性能。在决定是否采用通过贝叶斯优化找到的最佳配置时,我们需要保证这种改变确实能够产生显著的改进,同时避免引入不必要的复杂性。
在进行模型训练时,有两种主要类型的工作模式:受计算限制的和不受计算限制的。
当训练为受计算限制时:训练受限于我们愿意等待的时间,而不是受训练数据量或其他因素的限制。在这种情况下,加快训练速度等于改善训练效果,最佳训练时间是我们愿意等待的时间范围内。
当训练为不受计算限制时:我们可以负担得起更长的训练时间,只要我们愿意。在这种情况下,我们期望能够训练到非常低的训练误差,但训练时间更长可能并不显著地改善验证误差。慷慨的训练时间预算可以使调整更容易,特别是在调整学习率衰减计划时,因为它们之间有强烈的相互作用。
在不受计算限制的情况下,我们主要目标是确保我们训练的时间足够长,使模型达到最佳效果,同时避免在训练步数上过度浪费。在有疑问的情况下,我们应该倾向于选择延长训练时间。我们不需要在训练过程中调整max_train_steps参数以获得更好的效果,而是选择一个值并将其用于所有实验,并根据实验结果来优化该值。
为了确定合适的max_train_steps起始候选值,我们可以使用学习率搜索算法。该算法在短时间内进行试验,并找到在恒定学习率更新策略下,能够“完美”拟合训练集所需的步数。这个起始值作为max_train_steps的候选值。
在决定max_train_steps时,我们还应考虑模型架构或数据的变化,因为这些因素可能会影响合适的训练步数。
在训练受计算限制的情况下,我们需要在有限的资源和耐心内获得尽可能多的理解,以便更好地调整模型超参数。我们建议进行两轮调整:
第一轮:进行短时间的训练来找到较佳的模型和优化器超参数。在这一轮中,我们可以通过快速转换时间的试验来获得尽可能多的问题理解。
第二轮:在第一轮中找到的最佳超参数配置上进行较长时间的训练,以获得最终模型。这一轮的训练时间可以比第一轮更长,以进一步提升模型的性能。
在第一轮中,我们可以尝试使用不同的学习率衰减计划。不过,对于学习率衰减计划的调整潜力相对较小,而其他超参数通常会有更显著的影响。
通过逐渐增加训练步数限制,我们可以在每一轮中获得最大的理解,并逐步优化最终的训练模型。在每一轮中,我们都要确保之前的选择仍然是正确的,并根据需要进行调整。
最终,我们可以运行少量长时间的实验来在最佳超参数点上获得最终模型,以确保我们在较短的训练时间内得出的结论在长时间训练后仍然适用。
本章主要涉及训练管道的优化和一些额外注意事项。下面我们详细介绍各个部分:
输入管道的性能可能受限于多种因素,如数据读取速度、数据预处理复杂度等。为了优化输入管道的性能,可以考虑以下干预措施:
在评估模型性能时,有一些实践可以帮助获得更准确的结果:
为了确保模型在训练过程中的弹性和恢复能力,建议定期保存检查点。检查点是模型在训练过程中的快照,可以用于恢复模型状态或在训练中断后继续训练。
最佳检查点不一定是最后一个检查点,尤其是在验证集性能不随时间持续增加时,应该选择回顾性地选择最佳检查点。可以使用验证集性能作为衡量指标,在训练过程中选择验证集性能最好的检查点作为最佳检查点。
跟踪不同实验的结果对于解决建模问题非常有帮助。在跟踪实验时,可以使用电子表格记录实验的配置、运行次数、最佳模型性能等信息,以方便实验的回顾和对比。
通过实验跟踪,可以更清晰地了解每次实验的效果和对比不同配置之间的性能差异。这有助于更好地理解模型的行为,并指导后续的实验设计和参数调整。
BatchNorm通常可以用LayerNorm替代,但在一些情况下,BatchNorm可能仍然需要使用。在多设备设置中使用BatchNorm时,需要注意设备之间的数据同步问题。
BatchNorm是一种用于加速训练的技术,它可以减少内部协变量偏移,并加速梯度下降过程。在多设备设置中,如果每个设备上的BatchNorm参数更新不同步,可能会导致性能下降或训练不稳定。
因此,在多设备训练中,需要确保设备之间的BatchNorm参数保持同步。可以使用分布式训练框架来实现参数同步,例如使用Horovod或其他分布式训练工具。
在多主机训练中,需要注意以下方面的问题:
通过注意这些问题,可以保证多主机训练的顺利进行,避免因多台主机之间的不一致性而导致的问题。这样可以充分利用多设备的计算资源,加快训练速度,提高模型性能。