使用预训练的掩码语言模型训练 AllenNLP 对抗性偏见缓解器时出错

Posted

技术标签:

【中文标题】使用预训练的掩码语言模型训练 AllenNLP 对抗性偏见缓解器时出错【英文标题】:Error when training AllenNLP adversarial bias mitigator using a pretrained masked language model 【发布时间】:2021-11-23 18:34:30 【问题描述】:

我正在尝试使用“AdversarialBiasMitigator”以及 AllenNLP 预训练的 MLM(来自此处:https://storage.googleapis.com/allennlp-public-models/bert-masked-lm-2020-10-07.tar.gz)创建一个对抗性去偏的 bert 掩码语言模型。 我使用的训练数据是 WinoBias 数据集的变体,经过编辑以用于掩码语言建模。此数据的格式是 pandas df,第一列包含句子(已包含 [CLS]、[SEP] 和 [MASK] 标记),第二列包含目标(这是一个性别代词) . 我已经编辑了 masked_language_model_reader.py 以正确读取我的 pandas df,并且我已经编辑了 adversarial_bias_mitigator 配置文件。其余文件(adversarial_bias_mitigator.py 和 masked_language_model.py)我保持不变,所以我认为错误的来源必须在配置或我创建的 mlm 数据集阅读器中。

我在数据集阅读器中所做的主要更改是将分词器更改为 PretrainedTransformerTokenizer,并将 _read() 方法编辑为以下内容:


    @overrides
    def _read(self, file_path: str):
            import pandas as pd
            data= pd.read_csv(file_path)
            targets = data.iloc[:,0].tolist()
            sentences = data.iloc[:,1].tolist()
            zipped = zip(sentences, targets)
            for t, s in zipped:
                    sentence = s
                    tokens = self._tokenizer.tokenize(sentence) 
                    target = str(t)
                    t = Token("[MASK]")
                    yield self.text_to_instance(sentence, tokens, [target])

其余部分与原来的 masked_language_model_reader.py (https://github.com/allenai/allennlp-models/blob/aed4876f04a73c7effddf41b3164e1fb6fb6c275/allennlp_models/lm/masked_language_model_reader.py) 几乎保持一致。我知道上面不是很 Python,但它是我能想到的最简单的方法,而且我的数据集不是那么大(只有 1000 个句子),所以我认为这不是计算时间的问题。

在 CLI 中运行所有相关文件时,出现以下错误:

2021-10-02 10:52:20,351 - 信息 - allennlp.training.gradient_descent_trainer - 训练 0it [00:00, ?it/s] 加载实例:0it [00:00, ?it/s] 加载实例:162it [00:00, 1616.98it/s] 加载实例:324it [00:00, 1545.78it/s] 加载实例:479it [00:00, 1524.23it/s] 加载实例:681it [00:00, 1713.15it/s] 加载实例:1049it [00:00, 1764.63it/s] 0it [00:00, ?it/s] 2021-10-02 10:52:20,959 - 关键 - 根 - 未捕获的异常 Traceback(最近一次调用最后一次):文件 “/usr/local/bin/allennlp”,第 8 行,在 sys.exit(run()) 文件“/usr/local/lib/python3.7/dist-packages/allennlp/ma​​in.py”,行 46,在运行中 main(prog="allennlp") 文件 "/usr/local/lib/python3.7/dist-packages/allennlp/commands/init.py", 第 122 行,主要 args.func(args) 文件“/usr/local/lib/python3.7/dist-packages/allennlp/commands/train.py”, 第 121 行,在 train_model_from_args file_friendly_logging=args.file_friendly_logging,文件“/usr/local/lib/python3.7/dist-packages/allennlp/commands/train.py”, 第 187 行,在 train_model_from_file return_model=return_model,文件“/usr/local/lib/python3.7/dist-packages/allennlp/commands/train.py”, 第 260 行,在 train_model 中 file_friendly_logging=file_friendly_logging,文件“/usr/local/lib/python3.7/dist-packages/allennlp/commands/train.py”, 第 504 行,在 _train_worker 指标 = train_loop.run() 文件“/usr/local/lib/python3.7/dist-packages/allennlp/commands/train.py”, 第 577 行,运行中 返回 self.trainer.train() 文件“/usr/local/lib/python3.7/dist-packages/allennlp/training/gradient_descent_trainer.py”, 750号线,在火车上 指标,epoch = self._try_train() 文件“/usr/local/lib/python3.7/dist-packages/allennlp/training/gradient_descent_trainer.py”, 第 773 行,在 _try_train train_metrics = self._train_epoch(epoch) 文件“/usr/local/lib/python3.7/dist-packages/allennlp/training/gradient_descent_trainer.py”, 第 490 行,在 _train_epoch batch_outputs = self.batch_outputs(batch, for_training=True) 文件 “/usr/local/lib/python3.7/dist-packages/allennlp/training/gradient_descent_trainer.py”, 第 383 行,在 batch_outputs 中 output_dict = self._pytorch_model(**batch) 文件 "/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py", 第 1071 行,在 _call_impl 中 结果 = forward_call(*input, **kwargs) 文件“/usr/local/lib/python3.7/dist-packages/allennlp/fairness/adversarial_bias_mitigator.py”, 第 121 行,向前 predictor_output_dict = self.predictor.forward(*args, **kwargs) 文件 “/usr/local/lib/python3.7/dist-packages/allennlp_models/lm/models/masked_language_model.py”,第 110 行,向前 embeddings = self._text_field_embedder(tokens) 文件“/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py”, 第 1071 行,在 _call_impl 中 结果 = forward_call(*input, **kwargs) 文件“/usr/local/lib/python3.7/dist-packages/allennlp/modules/text_field_embedders/basic_text_field_embedder.py”, 第 103 行,向前 token_vectors = embedder(**tensors, **forward_params_values) 文件 “/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py”, 第 1071 行,在 _call_impl result = forward_call(*input, **kwargs) TypeError: forward() got an unexpected keyword argument 'tokens'

我似乎无法弄清楚问题所在。我不明白为什么传递“令牌”会成为问题?我想知道它是否是我在数据中读取的方式以及它是否没有正确格式化为实例,但是与原始脚本相比,我的方法似乎没有明显的问题好吧。 为了尝试解决这个问题,我还添加到了配置中:

    "token_indexers": 
              "bert": 
                "type": "single_id"
              

还有:

    "sorting_keys":["tokens"]

我不确定这些事情是否相关或有助于/恶化问题!

感谢您的帮助。

【问题讨论】:

【参考方案1】:

TypeError: forward() got an unexpected keyword argument 'tokens'

数据集阅读器中的字段名称应与模型预期的字段名称相匹配。您可以查看模型的forward函数来获取正确的字段名称。

【讨论】:

以上是关于使用预训练的掩码语言模型训练 AllenNLP 对抗性偏见缓解器时出错的主要内容,如果未能解决你的问题,请参考以下文章

您可以使用特定于任务的架构从头开始训练 BERT 模型吗?

如何在 AllenNLP 中训练语义角色标注模型?

当知识图谱遇上预训练语言模型

梳理NLP预训练模型

梳理NLP预训练模型

BERT:深度双向预训练语言模型