как BertModel узнает, что нужно пропустить аргумент attention_mask при применении к одному предложению?

#bert-language-model #attention-model

#bert-language-model #внимание-модель

Вопрос:

Я создаю класс, который может генерировать вложение предложений как для одного предложения, так и для списка предложений, используя предварительно подготовленную BertModel. Из примера кода я вижу утверждение

 outputs = self.model(tokens_tensor, segments_tensors)
  

то есть без аргумента attention_mask . Тем не менее, он дает тот же результат, если я ввожу аргумент тензора маски внимания

 outputs = self.model(tokens_tensor, attention_tensors, segments_tensors)
  

При выполнении кода для всего набора данных, то attention_tensors абсолютно необходим.

Я понимаю причину, по которой маска внимания не требуется для одного предложения, но откуда код python знает, что второй аргумент на самом деле является segments_tensor , поскольку в документе он ожидает, что attention_tensors будет вторым аргументом.

https://huggingface.co/transformers/model_doc/bert.html

Ответ №1:

Если значение attention_mask не задано (и, следовательно None , задано ), везде явно задается значение единицы.

См . l. 803 в modeling_bert.py .

Комментарии:

1. Я рад видеть ссылки на строки, но мой первоначальный вопрос остается любопытным. и attention_mask, и segment_id являются необязательными параметризованными аргументами. Если вы не вводите attention_mask и сразу переходите к segment_id , как функция model.forward() узнает, что второй аргумент интерпретируется как segment_id, а не attention_mask ?