Как я могу получить все выходные данные последнего кодировщика трансформатора в предварительно обученной модели Bert, а не только выход токена cls?

Я использую pytorch, и это модель из ссылка:

from transformers import BertTokenizerFast, BertForSequenceClassification
bert = BertForSequenceClassification.from_pretrained("bert-base-uncased",
                                                     num_labels=int(data['class'].nunique()),
                                                     output_attentions=False,
                                                     output_hidden_states=False)

а в функции forward, которую я создаю, я вызываю x1, x2 = self.bert(sent_id, attention_mask=mask). Теперь, насколько я знаю, x2 - это выход cls (который является выходом первого кодировщика трансформатора), но опять же, я не думаю, что понимаю выход модели. но мне нужен выход всех 12 последних энкодеров трансформатора. Как я могу это сделать в pytorch?


comment
Вроде бы не чистый питорч. Вы имеете в виду класс в Huggingface Transformers? Если да, укажите это в вопросе и укажите соответствующий тег. huggingface.co/transformers/model_doc/   -  person LudvigH    schedule 09.12.2020
comment
Ну, я использую pytorch, следовательно, тег, и да, я имею в виду класс в Huggingface Transformers, и я отредактировал вопрос и добавил ссылку.   -  person Alaa Grable    schedule 09.12.2020
comment
Милая. Тогда я думаю, что ваш вопрос хорош, и вы можете проголосовать за него. К сожалению, я не знаком с huggingface, поэтому ничем не могу вам помочь.   -  person LudvigH    schedule 09.12.2020


Ответы (2)


В идеале, если вы хотите изучить выходы всего слоя, вы должны использовать BertModel, а не BertForSequenceClassification. Потому что BertForSequenceClassification наследуется от BertModel и добавляет линейный слой поверх модели BERT.

from transformers import BertModel
my_bert_model = BertModel.from_pretrained("bert-base-uncased")

### Add your code to map the model to device, data to device, and obtain input_ids and mask

sequence_output, pooled_output = my_bert_model(ids, attention_mask=mask)

# sequence_output has the following shape: (batch_size, sequence_length, 768), which contains output for all tokens in the last layer of the BERT model.

sequence_output содержит вывод для всех токенов на последнем уровне модели BERT.

Чтобы получить выходы всех слоев кодировщика трансформатора, вы можете использовать следующее:

my_bert_model = BertModel.from_pretrained("bert-base-uncased")
sequence_output, pooled_output, all_layer_output = model(ids, attention_mask=mask, output_hidden_states=True)

all_layer_output - это выходной кортеж, содержащий выходы встраивания слоя + выходы всего слоя. Каждый элемент в кортеже будет иметь форму (batch_size, sequence_length, 768)

Следовательно, чтобы получить последовательность выходных данных на уровне 5, вы можете использовать all_layer_output[5]. As, all_layer_output[0] содержит выходы вложений.

person Ashwin Geet D'Sa    schedule 09.12.2020
comment
Привет, Эшвин, может быть, вы могли бы добавить output_hidden_states=True к своему вопросу и немного объяснить его, потому что OP также хотел знать, как он может выводить вывод каждого уровня кодирования. - person cronoik; 10.12.2020
comment
Привет, Cronoik, если я не скручиваю, OP запрашивает вывод последнего слоя, а не каждого слоя. Возможно, OP может отредактировать вопрос, чтобы добавить ясности. - person Ashwin Geet D'Sa; 10.12.2020

подробно описано в документе: https://huggingface.co/transformers/model_doc/bert.html#transformers.BertModel.

from transformers import BertModel, BertConfig

config = BertConfig.from_pretrained("xxx", output_hidden_states=True)
model = BertModel.from_pretrained("xxx", config=config)

outputs = model(inputs)
print(len(outputs))  # 3

hidden_states = outputs[2]
print(len(hidden_states))  # 13

embedding_output = hidden_states[0]
attention_hidden_states = hidden_states[1:]
person eric    schedule 28.04.2021