Использование внимания_маски во время прямого прохода в подстройке lm - PullRequest
4 голосов
/ 25 февраля 2020

У меня возник вопрос о коде тонкой настройки языковой модели в хранилище Hugging Face. Похоже, что метод forward модели BERT принимает в качестве входных данных аргумент с именем Внимание_Маска .

В документации говорится, что маска внимания является необязательным аргументом, используемым при группировании последовательностей. Этот аргумент указывает модели, на какие токены следует обращать внимание, а какие - нет. Например, методы кодирования токенизатора возвращают эту маску внимания, двоичный тензор, указывающий положение дополняемых индексов, чтобы модель не обращала на них внимания, что имеет смысл.

Если я не ошибаюсь, однако Я не вижу использования этой маски внимания в коде для тонкой настройки языковой модели. Действительно, во время прямого прохода только входные идентификаторы задаются как входные данные, cf этот код .

Мои вопросы: означает ли это, что мы не убиваем внимание на жетонах заполнения во время тренировки? Есть ли смысл принимать их во внимание? Или, может быть, я что-то пропустил в коде?

Большое спасибо за ваш ответ :)

РЕДАКТИРОВАТЬ

Я заметил, что способ, которым Hugging Face создает набор данных, приводит к заполнение не требуется (см. этот код )

1 Ответ

1 голос
/ 27 февраля 2020

Я согласен, что это действительно запутанная формулировка, но решение лежит за рамкой обнимающей части в PyTorch. Посмотрев на реализацию, на которую вы ссылались, вы обнаружите, что BertTokenizer имеет атрибут pad_value, который также заменяет дополненные значения указанным c индексом. Затем это, вероятно, передается в PyTorch, который может обрабатывать сами значения заполнения, например, в pad_sequence.

Действительно, pad_sequence также вызывается ранее в примере моделирования языка, см. здесь . Этого должно быть достаточно для того, чтобы модель игнорировала токены во время прямого прохода, не обращаясь к отдельной маске внимания. потеря по заданным c значениям, что здесь не так (поскольку потеря никогда не вычисляется явно, а просто возвращается моделью), что побудило меня рассмотреть это немного подробнее. Как я понимаю, есть также labels, который также содержит специфицированный токен c, см. Параметр masked_lm_labels здесь . Вместе это должно сформировать довольно четкую картину того, как эти значения игнорируются, без особой необходимости маски внимания. Похоже, что этот больше используется для «реальной маскировки» (т. Е. Цели обучения BERT), которая отличается от «маскировки заполнения», рассматриваемой в вашем вопросе.

...