Skip to main content

Hugging Face 转换器超参数优化

本报告解释了 Hugging Face 转换器超参数优化的三种策略。
Created on January 4|Last edited on January 27
本报告是作者Ayush Chaurasia所写的"Hyperparameter Optimization for HuggingFace Transformers"的翻译


从零开始训练一个 NLP 模型需要数百个小时。相反,使用预先训练好的模型并针对特定任务对其进行微调要容易得多。使用 Hugging Face 转换器库,我们可快速加载预先训练好且带有数个额外层的 NLP 模型,并在特定任务上运行一些微调 epoch。Tune 提供了使用 SOTA 调优算法执行可伸缩超参数调优的高级抽象。

Table of Contents



超参数调优实验

在本报告中,我们比较了 3 种不同的优化策略——网格搜索、贝叶斯优化和基于种群的训练,观察哪种策略可在最短时间内产生更准确的模型。
我们使用来自 Hugging Face 转换器的标准无壳 BERT 模型,并且我们想要对来自 SuperGLUE 基准测试的 RTE 数据集进行微调。我们将看到所选择的超参数会对最终模型性能产生重大影响。
我们将使用以下方法对模型进行调优实验:

Ray Tune 和 W&B

在 W&B 中使用 Ray Tune 存在很多优势:
  • Tune 提供了最先进的可伸缩超参数调优算法
  • 该实验可以轻松从笔记本电脑扩展至由 GPU 驱动的服务器,而无需更改任何代码
  • 实验可以在 2 行代码中跨 GPU 并行化
  • 使用W&B 实验跟踪,你可以在一个地方进行实用推断
  • 使用配备 Ray Tune 的 W&B,可以获取最新进度.

启用 W&B 跟踪

有两种方法可以通过 W&B 使用 Tune 跟踪进度。
  • 在调用 tune.run 时,你可以将 WandbLogger 作为记录器进行传递。这可以对报告给 Tune 的所有指标进行跟踪。
  • 你可以使用 @wandb_mixin 函数装饰器并调用 wandb.log 对所需指标进行跟踪。Tune 使用配置字典中所传递的信息初始化 W&B 运行。
config = {
....
"wandb":{
"project": "Project_name",
"api_key": #Your W&B API KEY,
#Additional wandb.init() parameters
}
}


网格搜索(基线):

为了建立基线,我们将进行网格搜索,在论文作者所描述的空间中找到最佳超参数集。
{
"per_gpu_batch_size": [16, 32],
"learning_rate": [2e-5, 3e-5, 5e-5],
"num_epochs": [2, 3, 4]
}
现在让我们观察一下指标的可视化情况,以比较性能。
analysis = tune.run(
...
resources_per_trial={'gpu': #num_gpu,
'cpu': #num_cpu }, # Tune will use this information to parallelize the tuning operation
config=config
...
)




使用异步 HyperOpt 进行贝叶斯搜索

在贝叶斯搜索中,我们拟合一个高斯过程模型,试图预测参数性能(即损失),并用于通知未来超参数。我们还将其与早期停止算法和异步超频带相结合,提前停止性能不佳的试验,以避免浪费资源。

在这个实验中,我们还搜索了 weight_decay 和 warmup_steps,并对搜索空间进行了扩展:
{
"per_gpu_batch_size": (16, 64),
"weight_decay": (0, 0.3),
"learning_rate": (1e-5, 5e-5),
"warmup_steps": (0, 500),
"num_epochs": (2, 5)
}
我们总共进行了 60 次试验,其中 15 次用于初始随机搜索。
现在让我们看一下结果。



基于种群的训练

基于种群的训练使用引导式超参数搜索,但不需要为新超参数配置重新开始训练。我们并未丢弃表现不佳的试验,而是通过复制其网络权重和超参数开发出良好的运行性能,然后在继续训练的同时探索新的超参数配置。

通俗来讲,该算法所基于的基本思想为:
  • 在给定时间步长(或迭代)T 下,对某些样本运行超参数优化过程。
  • 在每次 T 迭代后,对运行进行比较,将表现良好的运行权重复制到表现不佳的运行当中,并改变其超参数值,使之接近表现良好的运行值。
  • 终止表现最差的运行。虽然该算法思想看似很简单,但从零开始构建需要进行很多复杂的数学优化。Tune 为 SOTA PBT 算法提供了一个可扩展且易于使用的实现方法。
以下是我们将要使用的搜索空间:
{
"per_gpu_batch_size": [16, 32, 64],
"weight_decay": (0, 0.3),
"learning_rate": (1e-5, 5e-5),
"num_epochs": [2, 3, 4, 5]
}
我们仅运行 8 次试验,远少于贝叶斯优化,因为我们并非终止不佳试验,而是从良好试验中复制相关数据。
让我们来看看结果。


Run set
0








获胜者:Hugging Face 模型基于种群的训练

所得出的重要结论为:基于种群的训练是我们 Hugging Face 转换器模型超参数优化的最有效方式。然而,我们还得到了一些有关 NLP 模型超参数调优的其他见解,这些见解可能具有更深层次的意义:
  • 使用贝叶斯优化法可避免局部最小值:在使用贝叶斯优化法时,必须提供一组初始“随机猜测”。直观地说,这在进行贝叶斯优化前提供了更多相关信息。否则,该优化器可能具有局限性,且对少数样本过拟合。
  • 缩短迭代时间十分重要:始终确保对我们机器的所有计算资源进行了合理利用。任何可并行运行的过程都应并行运行。
  • 调整 PBT 扰动/突变间隔:使用 PBT 时,扰动间隔为一个重要考虑因素,或者说我们想探索和开发的超参数频率为多少。在实验中,我们在每个 epoch 结束后均进行了该突变。然而,过于频繁进行该操作反而会适得其反,因为如果仅训练几个批处理步骤,模型性能就会产生偏差。
  • 随机种子也会对我们的准确率结果造成影响。除调整上述超参数外,还可对不同随机种子进行扫描,以找到最佳模型。两步法在这里可能最有效:首先,使用早期停止算法对许多不同的种子进行训练,然后仅选择表现最佳的种子,使用基于种群的训练对其他超参数进行调整。

几点结语

在这些实验中,有一些关键点需要注意:
  • 所有的实验均通过使用 Tune 在 8 个 GPU 上进行并行化。
  • 这些实验可在不改变代码的情况下扩大或缩小
  • 我们将所有重要指标、推断,甚至本报告均放在同一地方,并且可轻易共享
  • 这些推断可用来准确量化使用适当搜索方法所节省的资源
  • 这种整体结构可提高团队效率
Iterate on AI agents and models faster. Try Weights & Biases today.