Huggingface从零训练RoBERTa类模型加载预训练权重问题咨询
问题确认
你看到的提示确实说明当前训练是基于roberta-base的公开预训练权重做微调,不是从零开始的随机初始化训练。
问题产生的原因
你运行脚本时传入的参数--model_name_or_path roberta-base优先级高于--config_name,run_mlm.py的默认逻辑会优先加载model_name_or_path对应的预训练权重,即使你指定了自定义配置目录也不会覆盖权重加载逻辑。
另外你的自定义config.json还有两处不匹配的问题:
- 你训练的自定义分词器词表大小是52000,但从
roberta-base导出的配置里vocab_size仍然是默认的50265,词表维度不匹配 - 你训练参数里设置了
max_seq_length=1024,但原配置里max_position_embeddings只有514,无法支持1024长度的序列输入
修改步骤
- 调整训练启动命令
把参数--model_name_or_path roberta-base替换为--model_type roberta,修改后命令如下:
python transformer_run_mlm.py \ --model_type roberta \ --config_name ./my_dir/ \ --tokenizer_name ./my_dir/ \ --no_use_fast_tokenizer \ --train_file ./my_own_training_file.txt \ --validation_split_percentage 10 \ --line_by_line \ --output_dir /my_output_dir/ \ --do_train \ --do_eval \ --per_device_train_batch_size 64 \ --per_device_eval_batch_size 16 \ --learning_rate 1e-4 \ --max_seq_length 1024 \ --seed 42 \ --num_train_epochs 100
这样脚本就只会读取你自定义的配置,不会加载任何公开预训练权重,自动随机初始化模型参数。
- 修正自定义配置文件
建议直接通过RobertaConfig生成适配你需求的配置,不要从预训练模型导出,可以避免参数遗留问题,生成代码参考:
from transformers import RobertaConfig config = RobertaConfig( vocab_size=52000, # 匹配你自定义分词器的词表大小 max_position_embeddings=1026, # 适配1024的最大序列长度(RoBERTa默认多预留2个位置) hidden_size=768, num_attention_heads=12, num_hidden_layers=12, hidden_act="gelu", attention_probs_dropout_prob=0.1, hidden_dropout_prob=0.1, intermediate_size=3072, layer_norm_eps=1e-05, initializer_range=0.02, type_vocab_size=1, pad_token_id=1, bos_token_id=0, eos_token_id=2, architectures=["RobertaForMaskedLM"] ) # 保存到自定义目录 config.save_pretrained("./my_dir/")
修改完成后重新启动训练,就不会再出现加载roberta-base预训练权重的提示,模型完全从零开始训练。
内容的提问来源于stack exchange,提问作者Chaoannricardo
相关产品推荐
相关产品推荐

