Как получить вывод промежуточных слоев предварительно обученной модели BERT в библиотеке HuggingFace Transformers? - PullRequest
1 голос
/ 27 апреля 2020

(я слежу за этим уроком по написанию статей о внедрении слов BERT, и в этом уроке автор обращается к промежуточным слоям модели BERT.)

Я хочу, чтобы получить доступ к последним, скажем, 4 последним слоям одного входного токена модели BERT в TensorFlow2 с помощью библиотеки Transformers HuggingFace. Поскольку каждый слой выводит вектор длиной 768, последние 4 слоя будут иметь форму 4*768=3072 (для каждого токена).

Как я могу реализовать это в TF / keras / TF2, чтобы получить промежуточные слои предварительно обученной модели для входного токена? (позже я попытаюсь получить токены для каждого токена в предложении, но пока достаточно одного токена).

Я использую модель BERT HuggingFace:

!pip install transformers
from transformers import (TFBertModel, BertTokenizer)

bert_model = TFBertModel.from_pretrained("bert-base-uncased")  # Automatically loads the config
bert_tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
sentence_marked = "hello"
tokenized_text = bert_tokenizer.tokenize(sentence_marked)
indexed_tokens = bert_tokenizer.convert_tokens_to_ids(tokenized_text)

print (indexed_tokens)
>> prints [7592]

вывод - токен ([7592]), который должен быть вводом для модели BERT.

1 Ответ

3 голосов
/ 29 апреля 2020

Третий элемент вывода модели BERT - это кортеж, который состоит из выходных данных слоя внедрения, а также скрытых состояний промежуточных слоев. Из документации :

hidden_states (tuple(tf.Tensor), необязательно, возвращается при config.output_hidden_states=True): кортеж tf.Tensor (один для вывода вложения + по одному на выход каждого слоя) формы (batch_size, sequence_length, hidden_size).

Скрытые состояния модели на выходе каждого слоя плюс начальные выходы вложения.

Для модели bert-base-uncased config.output_hidden_states по умолчанию True. Поэтому, чтобы получить доступ к скрытым состояниям 12 промежуточных слоев, вы можете сделать следующее:

outputs = bert_model(input_ids, attention_mask)
hidden_states = outputs[2][1:]

В кортеже hidden_states 12 элементов, соответствующих всем слоям от начала до последнего и каждому из это массив формы (batch_size, sequence_length, hidden_size). Так, например, чтобы получить доступ к скрытому состоянию третьего слоя для пятого токена всех образцов в пакете, вы можете сделать: hidden_states[2][:,4].


Обратите внимание, что если загружаемая модель по умолчанию не возвращает скрытые состояния, тогда вы можете загрузить конфигурацию, используя класс BertConfig и передать аргумент output_hidden_state=True, например:

config = BertConfig.from_pretrained("name_or_path_of_model",
                                    output_hidden_states=True)

bert_model = TFBertModel.from_pretrained("name_or_path_of_model",
                                         config=config)
...