Transformers 如何用 Trainer.hyperparameter_search 做超参数搜索? 📅 发布时间:2026/9/11 12:33:24 👁 浏览次数: Transformers 如何用 Trainer.hyperparameter_search 做超参数搜索【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers在微调模型时学习率、批大小、训练轮数这些超参数会显著影响最终结果。Transformers 的Trainer.hyperparameter_search可以帮你自动调参它按你指定的后端Optuna、Ray Tune 或 WB跑多轮实验每轮用一组不同的超参数完整训练一遍最后把表现最好的组合返回给你。本文给出从安装后端到拿到最优参数并重新训练的完整可执行路径适用前提是你已经准备好训练/评估数据集并且用的是 PyTorch 的Trainer流程。准备条件安装一个搜索后端。hyperparameter_search依赖外部后端三选一即可文档pip install命令见 docs/source/en/hpo_train.mdpip install optuna # 或 pip install wandb # 或 pip install ray[tune]后端决定每轮超参数如何采样、以及结果如何反馈给下一轮。如果多个后端都装了却没显式指定Trainer会按 默认后端选择逻辑 自动挑一个可用的并打印日志提示用的是哪个一个都没装时会抛RuntimeError并列出各后端的安装命令。因此下面主路径里我会显式传backendoptuna。必须用model_init而非model初始化Trainer。每个 trial 都要用同一份初始权重从零开始训练所以模型要通过一个返回新模型实例的函数传入。Trainer不允许同时传model和model_init会抛ValueError: Trainer requires either a model or model_init argument, but not both.见 trainer.py。需要配置评估。目标函数是从evaluate方法返回的指标里算出来的默认取eval_loss。所以要让搜索有意义TrainingArguments里要打开评估例如eval_strategy并给Trainer传入eval_dataset。与optimizers参数互斥。如果你同时传了model_init和optimizersTrainer会报错。需要自定义优化器/调度器时得子类化Trainer并覆写create_optimizer_and_scheduler。第一步用 model_init 初始化模型model_init在每次实验开始时被调用返回一个全新模型实例保证所有 trial 从相同初始权重出发见 model_init 说明。下面沿用文档里的示例模型Qwen/Qwen3-0.6B你可换成自己的模型from transformers import AutoModelForCausalLM def model_init(trial): return AutoModelForCausalLM.from_pretrained(Qwen/Qwen3-0.6B) trainer Trainer( model_initmodel_init, argsargs, # 你的 TrainingArguments已开启评估 train_datasettrain_dataset, eval_dataseteval_dataset, )model_init可以有 0 个或 1 个参数。传 1 个参数时Trainer会把后端的trial对象传进来你可以在这里采样不属于TrainingArguments、而是属于模型结构本身的超参数例如在测试 test_trainer_hyperparameter.py 里就用trial.suggest_int采样了模型配置项a、b。注意这个区别见下文的警告。第二步定义搜索空间 hp_spacehp_space是可选的。不传时Trainer会按后端使用内置默认搜索空间hp_space is None时回退到default_hp_space_optuna/default_hp_space_ray见 trainer.py。Optuna 默认空间覆盖learning_rate1e-6~1e-4对数采样、num_train_epochs1~5、seed1~40、per_device_train_batch_size[4, 8, 16, 32, 64]见 default_hp_space_optunaRay 默认空间见 default_hp_space_ray。要自定义时函数返回一个字典格式取决于后端三种后端写法见 docs/source/en/hpo_train.md。以 Optuna 为例def hp_space(trial): return { learning_rate: trial.suggest_float(learning_rate, 1e-6, 1e-4, logTrue), per_device_train_batch_size: trial.suggest_categorical(per_device_train_batch_size, [16, 32, 64, 128]), }关键限制hp_space返回的键名必须是TrainingArguments里的有效字段。在_hp_search_setup中Trainer会把这些值 setattr 到args上如果某个键在TrainingArguments里不存在只会打印警告Trying to set {key} in the hyperparameter search but there is no corresponding field in TrainingArguments.并被跳过不会真正生效。模型内部超参数请改放到model_init(trial)里采样。第三步定义目标函数 compute_objectivecompute_objective接收evaluate返回的指标字典返回一个要优化的标量。它是可选的不传时默认行为是Trainer没收到任何指标就用eval_loss否则返回所有指标的总和见 default_compute_objective。建议显式传入以避免依赖这个回退逻辑def compute_objective(metrics): return metrics[eval_loss]第四步运行搜索best_run trainer.hyperparameter_search( hp_spacehp_space, compute_objectivecompute_objective, n_trials30, directionminimize, backendoptuna, )各参数依据 方法签名backendoptuna、ray或wandb。不传则自动选可用后端。direction单目标用minimize优化验证损失或maximize优化 accuracy/F1 这类指标。n_trials实验轮数。方法签名里的默认值是20但同一方法的 docstring 文字写的是 100两处不一致——为避免歧义建议像上面这样总是显式传入。hp_name可选自定义 trial 命名函数。**kwargs透传给后端。Optuna 后端可接收optuna.study.create_study的参数以及Study.optimize的timeout、n_jobs、gc_after_trialRay 后端可接收tune.run的参数其中resources_per_trial默认 1 个 CPU 核 1 个 GPU若有 GPU。对于 Optuna 单目标搜索Trainer还会调用后端的should_prune()允许中途剪掉表现差的 trial见 pruning 逻辑。验证结果检查 BestRunhyperparameter_search返回一个BestRun包含最优 run 的信息best_run.objective # 该 run 达到的目标值 best_run.hyperparameters # 得到该结果的超参数组合BestRun的完整字段为run_id最优 run 的 id若保存了模型对应 checkpoint 文件夹名以run-{run_id}结尾、objective目标值、hyperparameters超参数组合、run_summaryRay 后端时为ray.tune.ExperimentAnalysis实验总结。上面打印出的具体数值只作为文档示例理解字段含义即可你的实际值取决于数据与模型。应用最优参数重新训练拿到best_run.hyperparameters后把其中的最优超参数写回TrainingArguments在完整数据集上重新训练一次得到最终模型。这一步文档明确要求搜索阶段只是为了挑参数见 docs/source/en/hpo_train.md。限制与常见报错按文档和源码执行中容易踩到的点没传model_init抛RuntimeError: To use hyperparameter search, you need to pass your model through a model_init function.同时传了model和model_init抛ValueError不允许两者并存。传了model_init又传了optimizers不兼容需要子类化覆写create_optimizer_and_scheduler。没装任何后端抛RuntimeError附带各后端安装命令。hp_space返回了非TrainingArguments字段只警告、不生效需改到model_init(trial)采样。DeepSpeed 下做搜索必须设置args.deepspeed否则抛ValueError: For sweeps with deepspeed, args.deepspeed must be set见 deepspeed 分支。可选多目标优化把direction传成minimize/maximize的列表并让compute_objective返回多个值列表即可做多目标搜索返回类型变为list[BestRun]。测试 TrainerHyperParameterMultiObjectOptunaIntegrationTest 给出了一个示例compute_objective返回metrics[eval_loss], metrics[eval_accuracy]。多目标时 Optuna 不会做should_prune()剪枝。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考