run_mlm.py脚本设置learning_rate参数不生效该如何解决?
问题排查与解决方法
以下是run_mlm.py自定义学习率不生效的常见原因及对应解决方式:
恢复训练时加载了旧checkpoint的状态
Hugging Face Trainer默认会从
output_dir下已有的checkpoint自动恢复训练,此时会直接加载checkpoint中保存的优化器、学习率调度器状态,覆盖命令行传入的学习率参数。
解决方式:- 从头训练的话,先清空
output_dir目录,或确保你代码中{overwrite}变量值为True,强制覆盖旧输出目录 - 从旧checkpoint继续训练但要使用新学习率的话,在调用命令中新增参数
--ignore_optimizer_scheduler_states,即可忽略加载旧的优化器、调度器状态,使用命令行传入的新配置
- 从头训练的话,先清空
参数传入优先级被覆盖
首先确认你使用的Transformers版本支持
learning_rate命令行传参,其次可以在脚本中TrainingArguments初始化的位置打印参数值,确认命令行传入的6e-4是否成功被接收:from transformers import TrainingArguments # 初始化后加一行打印 print(args.learning_rate)如果你额外使用了
--auto_find_batch_size等自动调优参数,部分自动调参逻辑会自动修改学习率适配batch size,可临时关闭这类参数测试。学习率调度器逻辑导致未达到峰值
首先计算你的总训练步数是否大于你设置的
warmup_steps=6000:总训练步数 = (训练集样本数 ÷ 训练batch size ÷ 梯度累积步数)× 训练epoch数
如果总步数和6000接近,学习率还没升到设置的峰值就进入衰减阶段,就会出现你看到的最大值偏低的情况。你可以临时将学习率调度器改为固定值带warmup测试:
在调用命令中新增参数--lr_scheduler_type constant_with_warmup,如果warmup结束后学习率稳定在6e-4,即可确认是原来的衰减调度器逻辑导致的问题。
你原来的调用代码可参考如下修改测试:
os.system( f"python {script} \ --model_type {model} \ --config_name './models/{model}/config.json' \ --train_file './content/{data}/train.txt' \ --validation_file './content/{data}/test.txt' \ --learning_rate 6e-4 \ --weight_decay 0.01 \ --warmup_steps 6000 \ --adam_beta1 0.9 \ --adam_beta2 0.98 \ --adam_epsilon 1e-6 \ --tokenizer_name './tokenizer/{model}' \ --output_dir './{out_dir}' \ --do_train \ --do_eval \ --num_train_epochs 40 \ --overwrite_output_dir True \ --ignore_optimizer_scheduler_states \ --lr_scheduler_type linear \ --ignore_data_skip" )
内容的提问来源于stack exchange,提问作者jbm
相关产品推荐
相关产品推荐

