深度学习调参指南

深度学习调参指南:优化性能与资源消耗的平衡

欢迎来到深度学习调参的指南!本篇博客适用于对最大化深度学习性能感兴趣的工程师和研究人员,前提是你具备机器学习和深度学习概念的基本知识。在本文中,我们将聚焦于超参数调优的过程,同时还会涉及一些深度学习其他方面的内容。让我们从开始新项目的指南开始

1. 开始新项目的指南

在开始调优之前,确保以下工作已完成:

  1. 问题制定、数据清理等基本工作。
  2. 有一个工作流设置用来进行训练和评估。
  3. 已选择并实现适当的评估指标,以代表部署环境中的性能。

1.1 选择模型架构

在开始一个新项目时,我们建议先选择一个有效且常用的模型架构。这样可以快速让模型进入工作状态,之后再构建自定义模型也是可行的。模型架构通常包含各种超参数,如层数、层宽度和激活函数类型。

如果可能,找到一篇与问题相关的论文,并复现其中的模型作为起点。

1.2 选择优化器

没有一个优化器适用于所有类型的机器学习问题和模型架构。我们建议从针对手头问题类型的最常用优化器开始。一开始,使用成熟且流行的优化器,然后根据需要进一步调整。

1.3 选择Batch Size

Batch Size 是决定训练速度和计算资源消耗的重要因素。适当选择Batch Size 对于优化性能非常关键。确定合适的Batch Size 通常需要经过以下步骤:

  1. 确定可行的Batch Size,并估计训练吞吐量:找到加速器(GPU/TPU)内存支持的最大Batch Size。通过少量实验运行不同Batch Size 的训练,以确定每步的时间,从而估计训练吞吐量。
    训练吞吐量 = 每秒处理的样本数量 训练吞肚量 训练吞吐量= \frac{每秒处理的样本数量}{训练吞肚量} 训练吞吐量=训练吞肚量每秒处理的样本数量
    或者,我们可以估计每步时间:
    每步时间 = B a t c h S i z e 训练吞吐量 每步时间=\frac{Batch Size}{训练吞吐量} 每步时间=训练吞吐量BatchSize
  2. 选择合适的Batch Size以最小化训练时间:增加Batch Size 可以减少训练步数,从而减少训练时间。通常最小化训练时间的Batch Size 是最大的Batch Size。
  3. 选择合适的Batch Size以最小化资源消耗:考虑前期成本和使用成本,选择合适的Batch Size 来平衡资源消耗。

1.4 选择初始配置

在开始超参数调优之前,我们必须确定初始配置。这包括模型配置、优化器超参数和训练步数。确定初始配置时,我们建议找到一个简单、相对快速、资源消耗较低的配置,以获得合理的结果。

选择一个快速且消耗资源较少的初始配置可以使超参数调优更加高效。

在本文的后续章节,我们将深入探讨超参数调优的过程,包括学习率、正则化超参数等的调整。同时,我们会涉及更多关于深度学习调参的有用信息。

2. 提高模型性能的科学方法

在第一章中,我们已经建立了一个起点,选择了模型架构、优化器和合适的Batch Size。现在,我们将进一步探讨提高模型性能的科学方法,以最大化我们的效用。

2.1 增量调整策略

在优化模型性能时,采用增量调整策略是一个明智的选择。我们从简单的配置开始,逐步添加功能和改进,同时深化对问题的理解。通过不断调整,我们会找到越来越好的配置,并不断更新最佳配置,称之为“上线”。

这个增量调整策略需要重复以下四个步骤:

  1. 确定下一轮实验的目标:明确下一步想要改进的方面。
  2. 设计并展开实验:根据目标设置实验并进行实验。
  3. 从实验结果中获取经验:收集实验结果并学习经验教训。
  4. 考虑是否上线新的最佳配置:根据实验结果决定是否采用新的最佳配置。

通过这个迭代过程,我们将逐步优化模型,不断提升性能。

2.2 探索与利用

在优化模型过程中,我们应该将重点放在进一步理解问题上,而不仅仅是降低验证集错误率。大部分时间应该用于“探索”,只有一小部分时间用于“利用”。

通过深入理解问题,我们可以避免不必要的更改,确定验证集效果对哪些超参数敏感,发现新方向,删除无效的方向,并缩小搜索空间以提高调整效率。这样的探索可以帮助我们更好地理解问题,并最终优化模型性能。

2.3 选择下一轮实验的目标

在优化模型过程中,每轮实验都应该有一个明确的目标,并且范围要足够小,这样实验才能真正朝着目标取得进展。如果我们试图一次添加多个特征或回答多个问题,可能无法理清各自的影响。

举个例子,实验的目标可以包括:

  • 尝试对训练流程进行改进,例如使用新的正则化器、预处理方法等。
  • 了解特定模型超参数(例如激活函数)的影响。
  • 最大化验证集指标。

每个目标都应该是具体的,明确指定了想要改进的方面。这样,我们可以集中精力去解决特定问题,而不是同时处理过多的变化。

2.4 设计下一轮实验

在确定了实验的目标和冗余超参数后,我们将设计一组研究以朝着实验目标取得进展。这些研究包含一系列试验,每个试验都是超参数配置的不同组合。

2.4.1 识别目标超参数、冗余超参数和固定超参数

对于给定的目标,所有超参数将被归类为目标超参数、冗余超参数或固定超参数。

  • 目标超参数:我们希望测量其对模型性能的影响的超参数。
  • 冗余超参数:必须优化才能公平比较不同目标超参数值的超参数,类似于统计中的冗余参数。
  • 固定超参数:在当前轮次实验中保持固定值的超参数,它们不需要改变,或者我们不希望它们改变。

固定超参数对实验结果的结论产生限制,因为实验过程中这些参数不会变化。因此,我们需要谨慎选择哪些超参数固定,以避免产生错误结论。

2.4.2 创建一组研究

创建研究的过程涉及几个方面:

  1. 选择试验所需的超参数变量。
  2. 选择这些超参数的取值范围(即搜索空间)。
  3. 选择试验次数。
  4. 选择自动搜索算法(如果使用自动搜索算法)。

我们希望通过实验来运行训练流程,同时优化冗余超参数,以公平地比较不同的目标超参数值。在简单情况下,我们可以为每个目标超参数值单独设计一个研究,并调整冗余超参数。这样我们可以比较不同目标超参数值的性能。

在更复杂的情况下,我们可能需要比较大量目标超参数值,并且无法进行大量独立的研究。此时,我们可以将目标超参数与冗余超参数放在相同的搜索空间中,并使用搜索算法对两种超参数的值进行采样。在这种情况下,我们需要确保搜索算法能够均匀地搜索目标超参数的值,以避免对不同目标超参数值进行不公平的比较。

2.4.3 平衡实验的信息量和成本

在设计实验时,我们需要分配有限的预算,以充分满足以下三个要求:

  1. 比较足够多目标超参数的不同值。
  2. 在足够大的搜索空间上调整冗余超参数。
  3. 对冗余超参数的搜索空间进行足够密集的采样。

这三个要求确保我们能够从实验中获得足够多的经验,有信心得出合理的结论。

然而,要同时满足这三个要求可能需要增加试验次数,从而增加资源成本。在实践中,我们需要在这三个需求之间进行平衡,根据问题的特点和计算资源限制来进行分配。在进行一项研究后,我们需要总结该研究是否充分搜索了冗余超参数空间,以公平地比较不同目标超参数值的性能。

2.5 从实验结果中获取经验

在实验过程中,我们不仅要关注实现每组实验的原始科学目标,还要注意其他问题的出现。如果发现问题,我们应该进行实验的修改并重新运行。最终,每组实验的目标是评估实验为该目标提供的证据。

然而,有时在取得实验进展之前,我们需要解决一些问题。在分析一组实验结果之前,我们应该问自己以下额外的问题:

  1. 搜索空间够大吗?如果研究的最佳点在搜索空间的边界附近,可能需要扩展搜索空间。
  2. 是否从搜索空间中采样了足够多的点?如果没有,可能需要运行更多的试验。
  3. 每项研究中有多少试验是不可行的?如果有很多不可行的点,可能需要调整搜索空间或重新参数化。
  4. 模型是否存在优化问题?我们可以从最佳试验的训练曲线中学到什么?
  5. 在试验中是否发现过拟合问题?如果是,可能需要使用额外的正则化技术。
  6. 在训练曲线的最后阶段,试验是否仍能改进?如果是,可能需要增加训练步数或调整学习率计划。
  7. 在训练后期,训练误差或验证误差是否存在较高的步与步之间的方差?可能的补救措施包括增加Batch Size、使用更多的验证数据、使用学习率衰减或使用Polyak平均法。

通过回答上述问题,我们可以优化研究,改进搜索空间和抽样更多试验,或采取其他纠正措施,以便朝着最初的目标取得进展。

2.5.1 识别错误的搜索空间边界

如果从搜索空间中采样的最佳点靠近其边界,那么搜索空间可能有问题。在这种情况下,可能需要扩展搜索空间边界,以找到更优秀的点。为了检查搜索空间边界,我们可以绘制基本超参数轴图,其中绘制了已完成的试验的验证目标值与一个超参数(例如学习率)的关系。每个点对应一次试验,验证目标值通常应该是在训练期间达到的最佳值。如果最佳点聚集在搜索空间的边缘,可能需要扩展搜索空间边界。

2.5.2 没有在搜索空间中采样足够的点

确定是否已经足够密集地采样搜索空间可能很难。在实践中,我们通常会采样我们能够负担得起的代价,并通过查看各种超参数轴图来校准直觉,了解有多少点位于搜索空间的“好”区域。

2.5.3 检查训练曲线

检查训练曲线是识别常见故障模式的简单方法,并且可以帮助我们优先考虑下一步采取的行动。我们通常会查看至少是最好的几次试验的训练曲线,并关注以下问题:是否出现过拟合?训练或验证误差在训练后期存在较高的步与步之间的方差吗?在训练结束时,试验是否仍然能够改进?这些问题有助于指导下一步的实验设计。

2.5.4 使用isolation图检测更改是否有用

isolation图是一种特殊的基本超参数轴图,用于在目标超参数的不同值之间进行同类比较。通过绘制isolation图,我们可以更轻松地确定导致最佳性能的超参数设置。这对于比较不同超参数值的效果非常有用。

2.5.5 自动化常用的绘图

为了节省时间,最好自动化生成尽可能多的图表。我们可以自动生成基本超参数轴图、训练曲线以及其他有用的可视化。这样,我们可以更方便地查看实验结果并进行比较。

以上这些方法有助于从实验结果中获取经验,并指导下一步的实验设计和参数调整。同时,随着实验的进行,我们会逐渐学习和发现新的方法来优化研究。

2.6 确定是否采用此训练工作流更改或超参数配置

在决定是否对模型或训练程序进行改变或采用新的超参数配置时,我们需要理解导致结果中不同变化的来源。有几个主要的变化来源可以导致结果的不一致性:

  1. 训练程序方差、再训练方差或试验方差:来自于不同随机种子的训练运行之间的差异。例如,不同的随机初始化、数据shuffle、dropout掩码、数据增强操作模式和并行运算的顺序都可能导致试验方差。
  2. 超参数搜索方差或学习方差:由我们选择超参数的程序引起的结果变化。例如,在相同搜索空间中使用两个不同种子的Quasi-Random-Search搜索可能导致不同的超参数值。
  3. 数据收集和抽样方差:训练数据、验证数据和测试数据的随机分割或训练数据生成过程的方差。

当我们试图得出超出超参数空间中单个点的结论时,我们最关心的是学习方差。学习方差取决于试验次数和搜索空间,并且通常大于试验方差。

在决定采用一个候选变化之前,我们可以运行最佳试验多次,以估计训练方差。这样可以帮助我们确定是否要采用一个新的超参数点(或其他变化),并确保采用的改变能够产生真正的改进,而不会增加过多的复杂性。

2.7 探索结束后

一旦我们完成对“好”搜索空间的探索,并确定了哪些超参数需要调整,贝叶斯优化工具是一个值得考虑的选择。在这一阶段,我们关注的重点从学习更多优化经验转向产生一个最佳配置,以便启动模型或以其他方式使用。

此时,我们应该有一个精确的搜索空间,该空间包含最佳观察试验周围的局部区域,并已经进行了充分的采样。我们的探索工作应该揭示了最重要的要调整的超参数及其合理的范围。

我们可以使用这些超参数来构建搜索空间,并在预算范围内进行最终的自动调整研究。在这种情况下,贝叶斯优化工具可以自动找到最佳超参数配置。

此时,我们还应该考虑检查模型在测试集上的性能。在决定是否采用通过贝叶斯优化找到的最佳配置时,我们需要保证这种改变确实能够产生显著的改进,同时避免引入不必要的复杂性。

3. 确定每次训练运行的步数

在进行模型训练时,有两种主要类型的工作模式:受计算限制的和不受计算限制的。

当训练为受计算限制时:训练受限于我们愿意等待的时间,而不是受训练数据量或其他因素的限制。在这种情况下,加快训练速度等于改善训练效果,最佳训练时间是我们愿意等待的时间范围内。

当训练为不受计算限制时:我们可以负担得起更长的训练时间,只要我们愿意。在这种情况下,我们期望能够训练到非常低的训练误差,但训练时间更长可能并不显著地改善验证误差。慷慨的训练时间预算可以使调整更容易,特别是在调整学习率衰减计划时,因为它们之间有强烈的相互作用。

3.1 当训练不受计算限制时如何决定该训练多久

在不受计算限制的情况下,我们主要目标是确保我们训练的时间足够长,使模型达到最佳效果,同时避免在训练步数上过度浪费。在有疑问的情况下,我们应该倾向于选择延长训练时间。我们不需要在训练过程中调整max_train_steps参数以获得更好的效果,而是选择一个值并将其用于所有实验,并根据实验结果来优化该值。

为了确定合适的max_train_steps起始候选值,我们可以使用学习率搜索算法。该算法在短时间内进行试验,并找到在恒定学习率更新策略下,能够“完美”拟合训练集所需的步数。这个起始值作为max_train_steps的候选值。

在决定max_train_steps时,我们还应考虑模型架构或数据的变化,因为这些因素可能会影响合适的训练步数。

3.2 当训练受计算限制时如何决定该训练多久

在训练受计算限制的情况下,我们需要在有限的资源和耐心内获得尽可能多的理解,以便更好地调整模型超参数。我们建议进行两轮调整:

第一轮:进行短时间的训练来找到较佳的模型和优化器超参数。在这一轮中,我们可以通过快速转换时间的试验来获得尽可能多的问题理解。

第二轮:在第一轮中找到的最佳超参数配置上进行较长时间的训练,以获得最终模型。这一轮的训练时间可以比第一轮更长,以进一步提升模型的性能。

在第一轮中,我们可以尝试使用不同的学习率衰减计划。不过,对于学习率衰减计划的调整潜力相对较小,而其他超参数通常会有更显著的影响。

通过逐渐增加训练步数限制,我们可以在每一轮中获得最大的理解,并逐步优化最终的训练模型。在每一轮中,我们都要确保之前的选择仍然是正确的,并根据需要进行调整。

最终,我们可以运行少量长时间的实验来在最佳超参数点上获得最终模型,以确保我们在较短的训练时间内得出的结论在长时间训练后仍然适用。

4. 关于训练管道的额外补充

本章主要涉及训练管道的优化和一些额外注意事项。下面我们详细介绍各个部分:

4.1 优化输入管道

输入管道的性能可能受限于多种因素,如数据读取速度、数据预处理复杂度等。为了优化输入管道的性能,可以考虑以下干预措施:

  • 使用性能分析工具,如Perfetto(用于JAX)或TensorFlow Profiler(用于TensorFlow),来诊断性能受限的输入管道。
  • 确保数据存放位置与训练进程一致,以避免I/O延迟,尤其是在通过网络读取训练数据时。
  • 对于昂贵的在线数据预处理,考虑进行一次性的离线预处理,并将结果保存以提高效率。
  • 使用预读取工具,如tf.data.Dataset.prefetch,来提前预读取数据以加快训练。这样可以使GPU在训练时不会因为等待数据而处于闲置状态,从而提高训练效率。

4.2 评估模型性能

在评估模型性能时,有一些实践可以帮助获得更准确的结果:

  • 使用比训练时更大的batch size进行评估,以减少评估过程中的随机性影响。
  • 定期评估模型性能,在固定步长间隔进行评估,而不是固定的时间间隔,以便更好地追踪训练曲线。
  • 选择样本进行定期评估时,要注意样本量、数据平衡等问题,以确保采样数据集的性能与整个数据集相似。

4.3 保存检查点并追溯选择最佳检查点

为了确保模型在训练过程中的弹性和恢复能力,建议定期保存检查点。检查点是模型在训练过程中的快照,可以用于恢复模型状态或在训练中断后继续训练。

最佳检查点不一定是最后一个检查点,尤其是在验证集性能不随时间持续增加时,应该选择回顾性地选择最佳检查点。可以使用验证集性能作为衡量指标,在训练过程中选择验证集性能最好的检查点作为最佳检查点。

4.4 设置实验跟踪

跟踪不同实验的结果对于解决建模问题非常有帮助。在跟踪实验时,可以使用电子表格记录实验的配置、运行次数、最佳模型性能等信息,以方便实验的回顾和对比。

通过实验跟踪,可以更清晰地了解每次实验的效果和对比不同配置之间的性能差异。这有助于更好地理解模型的行为,并指导后续的实验设计和参数调整。

4.5 BatchNorm的实现细节

BatchNorm通常可以用LayerNorm替代,但在一些情况下,BatchNorm可能仍然需要使用。在多设备设置中使用BatchNorm时,需要注意设备之间的数据同步问题。

BatchNorm是一种用于加速训练的技术,它可以减少内部协变量偏移,并加速梯度下降过程。在多设备设置中,如果每个设备上的BatchNorm参数更新不同步,可能会导致性能下降或训练不稳定。

因此,在多设备训练中,需要确保设备之间的BatchNorm参数保持同步。可以使用分布式训练框架来实现参数同步,例如使用Horovod或其他分布式训练工具。

4.6 多主机管道的注意事项

在多主机训练中,需要注意以下方面的问题:

  • 日志记录:只在一台主机上进行日志记录,避免多台主机同时写入日志导致冲突和混乱。
  • 评估:只在一台主机上进行模型性能评估,以确保评估结果的一致性。
  • 随机数生成器:保持各台主机上的随机数生成器种子一致,避免随机性导致的不一致结果。
  • 检查点:检查点的保存应该在一台主机上进行,确保检查点的一致性和恢复能力。
  • 数据分片:对数据进行适当的分片以提高性能,并确保数据在多个主机上的分片一致性。

通过注意这些问题,可以保证多主机训练的顺利进行,避免因多台主机之间的不一致性而导致的问题。这样可以充分利用多设备的计算资源,加快训练速度,提高模型性能。

猜你喜欢

转载自blog.csdn.net/weixin_42010722/article/details/131848416