使用simpletransformers微调NER模型配置labels_list仍出现classifier权重不匹配错误
错误根因
你使用的预训练权重dslim/bert-base-NER是面向通用NER任务训练的成品模型,自带的token分类层输出维度固定为9(对应通用NER的9种BIO标签)。你自定义任务的标签数为13,即使配置了labels_list,Simple Transformers默认加载全量预训练权重时,仍会因为分类层权重维度不匹配报错。
解决方法
按优先级可依次尝试以下方案:
- 方案1:添加
ignore_mismatched_sizes=True参数
初始化NERModel时传入该参数,会自动跳过维度不匹配的分类层权重,仅加载BERT主体的预训练参数,分类层会按照你设置的13类标签随机初始化。修改后的代码如下:from simpletransformers.ner import NERModel, NERArgs model_args = NERArgs() model_args.labels_list = ["ENT1", "ENT2", "ENT3", "ENT4", "ENT5", "ENT6", "ENT7", "ENT8", "ENT9", "ENT10", "ENT11", "ENT12", "ENT13"] model = NERModel( "bert", "dslim/bert-base-NER", args=model_args, ignore_mismatched_sizes=True ) - 方案2:更换为基础BERT预训练权重
如果不想使用已训练过NER的权重,可以替换为没有NER分类头的通用预训练模型,比如bert-base-cased(英文场景)、bert-base-chinese(中文场景),这类模型初始化时会直接按照labels_list的长度生成对应维度的分类层,不会出现维度冲突。 - 方案3:检查标签列表完整性
确认你的labels_list是否包含了非实体标签O,很多开发者会遗漏该标签导致实际标签数和配置的列表长度不一致。如果你的任务中需要O标签,需要把它也加入labels_list中,对应调整标签总数量。
内容的提问来源于stack exchange,提问作者Shaida Muhammad
相关产品推荐
相关产品推荐

