You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:06:03