Ошибка при обучении смягчителя предвзятости AllenNLP с использованием предварительно обученной языковой модели в маске

#python #json #bert-language-model #allennlp #mlmodel

Вопрос:

Я пытаюсь создать враждебно искаженную языковую модель в маске берта, используя «AdversarialBiasMitigator», наряду с предварительно обученным MLM AllenNLP (отсюда: https://storage.googleapis.com/allennlp-public-models/bert-masked-lm-2020-10-07.tar.gz). Обучающие данные, которые я использую, являются вариацией набора данных WinoBias, отредактированного для работы с моделированием на языке масок. Формат этих данных представляет собой df pandas, в первом столбце которого содержатся предложения (которые уже содержат маркеры [CLS], [SEP] и [МАСКА]), а во втором столбце содержится цель (которая является местоимением по признаку пола). Я отредактировал masked_language_model_reader.py чтобы правильно прочитать в моем pandas df, и я отредактировал файл конфигурации adversarial_bias_mitigator. Остальные файлы (adversarial_bias_mitigator.py и masked_language_model.py) Я сохранил то же самое, поэтому я думаю, что источником ошибки должна быть либо конфигурация, либо средство чтения набора данных mlm, которое я создал.

Основные изменения, которые я внес в средство чтения набора данных, — это изменение токенизатора на предварительный преобразователь и редактирование метода _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). Я знаю, что вышесказанное не очень по-питонски, но это самый простой способ, который я мог придумать, и мой набор данных не так велик (всего 1000 предложений), поэтому я не думаю, что это проблема вычислительного времени.

При запуске всех соответствующих файлов в интерфейсе командной строки появляется следующая ошибка:

2021-10-02 10:52:20,351 — информация — allennlp.обучение.gradient_descent_trainer — обучение 0it [00:00, ?к/с] загрузка экземпляры: 0it [00:00, ?к/с] загрузка экземпляры: 162it [00:00, 1616.98 к/с] загрузка экземпляры: 324it [00:00, 1545.78 к/с] загрузка экземпляры: 479it [00:00, 1524.23 к/с] загрузка экземпляры: 681it [00:00, 1713.15 к/с] загрузка экземпляры: 1049it [00:00, 1764.63 к/с] 0it [00:00, ?к/с] 2021-10-02 10:52:20,959 — критический — корень — Неперехваченное исключение обратная трассировка (самый недавний призыв последнего): файл «/usr/местные/Бен/allennlp», строка 8, в файле sys.выход(запуска()) Файл «/usr/локальный/lib/python3.7/dist-packages/allennlp/main.py«, строка 46, в run main(prog=»allennlp») Файл «/usr/локальный/lib/python3.7/dist-пакеты/allennlp/команды/инициализация.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, в файле run return self.trainer.train () «/usr/local/lib/python3.7/dist-packages/allennlp/training/gradient_descent_trainer.py», строка 750, в метриках поездов, эпоха = Файл self._try_train () «/usr/local/lib/python3.7/dist-packages/allennlp/training/gradient_descent_trainer.py», строка 773, в _try_train train_metrics = self._train_epoch(эпоха) Файл «/usr/local/lib/python3.7/dist-packages/allennlp/training/gradient_descent_trainer.py», строка 490, в _train_epoch batch_outputs = self.batch_outputs(замес, for_training=истина) файл «/usr/local/lib/python3.7/dist-packages/allennlp/training/gradient_descent_trainer.py», строка 383, в batch_outputs output_dict = самоуправления._pytorch_model(**пакетный) файл «/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py», линия 1071, в результате _call_impl = forward_call(*вход, **kwargs) файл «/usr/local/lib/python3.7/dist-packages/allennlp/fairness/adversarial_bias_mitigator.py», строка 121, в прямом predictor_output_dict = самоуправления.предсказатель.вперед(*параметр args, **kwargs) файл «/usr/местные/библиотека/питон3.7/dist-packages/allennlp_models/lm/models/masked_language_model.py», строка 110, в прямых вложениях = self._text_field_embedder(токены) Файл «/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py», строка 1071, в файле _call_impl result = forward_call(*ввод, **кварги) «/usr/local/lib/python3.7/dist-packages/allennlp/modules/text_field_embedders/basic_text_field_embedder.py», строка 103, в прямом token_vectors = встраиватель(**тензоры, **значения forward_params_) Файл «/usr/локальный/lib/python3.7/dist-пакеты/факел/nn/модули/модуль.py», строка 1071, в _call_impl результат = forward_call(*ввод, **кварги) Ошибка типа: forward() получил неожиданный аргумент ключевого слова «токены»


Кажется, я не могу понять, в чем проблема. Я не могу понять, почему передача «токенов» будет проблемой? Мне интересно, так ли это, как я читаю данные, и правильно ли они форматируются в экземпляр, но опять же, я, похоже, не вижу очевидной проблемы с моим методом по сравнению с исходным сценарием. Чтобы попытаться устранить проблему, я также добавил в конфигурацию:

     "token_indexers": {
              "bert": {
                "type": "single_id"
              }
 

так же как:

     "sorting_keys":["tokens"]
 

Я не уверен, связано ли что-либо из этого или помогает/усугубляет проблему!

Спасибо за любую помощь.

Ответ №1:

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

Имя поля в считывателе набора данных должно совпадать с именем поля, которое ожидает модель. Вы можете проверить forward функцию модели, чтобы получить правильное имя поля.