Я читал статью о лексической замене на основе BERT (особенно пытаясь реализовать уравнение (2) - если кто-то уже реализовал всю статью, что также было бы здорово). Таким образом, я хотел получить как последние скрытые слои (единственное, в чем я не уверен - это порядок слоев в выходных данных: последний первый или первый первый?) И внимание от базовой модели BERT c BERT (bert-base- обсаженный).
Тем не менее, я немного не уверен, действительно ли библиотека *1006* с объятиями / трансформеров * выводит внимание (я использовал факел, но вместо этого я открыт для использования TF) для bert-base-uncased?
Из того, что я прочитал , я ожидал получить кортеж (logits, hidden_states, Внимание), но с приведенным ниже примером (работает, например, в Google Colab), я получаю длина 2 вместо.
Я неверно истолковываю то, что я получаю, или ошибаюсь? Я сделал очевидный тест и использовал output_attention=False
вместо output_attention=True
(в то время как output_hidden_states=True
, кажется, действительно добавляет скрытые состояния, как и ожидалось), и ничего не изменилось в выводе, который я получил. Это явно плохой признак моего понимания библиотеки или указывает на проблему.
import numpy as np
import torch
!pip install transformers
from transformers import (AutoModelWithLMHead,
AutoTokenizer,
BertConfig)
bert_tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
config = BertConfig.from_pretrained('bert-base-uncased', output_hidden_states=True, output_attention=True) # Nothign changes, when I switch to output_attention=False
bert_model = AutoModelWithLMHead.from_config(config)
sequence = "We went to an ice cream cafe and had a chocolate ice cream."
bert_tokenized_sequence = bert_tokenizer.tokenize(sequence)
indexed_tokens = bert_tokenizer.encode(bert_tokenized_sequence, return_tensors='pt')
predictions = bert_model(indexed_tokens)
########## Now let's have a look at what the predictions look like #############
print(len(predictions)) # Length is 2, I expected 3: logits, hidden_layers, attention
print(predictions[0].shape) # torch.Size([1, 16, 30522]) - seems to be logits (shape is 1 x sequence length x vocabulary
print(len(predictions[1])) # Length is 13 - the hidden layers?! There are meant to be 12, right? Is one somehow the attention?
for k in range(len(predictions[1])):
print(predictions[1][k].shape) # These all seem to be torch.Size([1, 16, 768]), so presumably the hidden layers?
Объяснение того, что сработало в конце, вдохновлено принятым ответом
import numpy as np
import torch
!pip install transformers
from transformers import BertModel, BertConfig, BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
config = BertConfig.from_pretrained('bert-base-uncased', output_hidden_states=True, output_attentions=True)
model = BertModel.from_pretrained('bert-base-uncased', config=config)
sequence = "We went to an ice cream cafe and had a chocolate ice cream."
tokenized_sequence = tokenizer.tokenize(sequence)
indexed_tokens = tokenizer.encode(tokenized_sequence, return_tensors='pt'
enter code here`outputs = model(indexed_tokens)
print( len(outputs) ) # 4
print( outputs[0].shape ) #1, 16, 768
print( outputs[1].shape ) # 1, 768
print( len(outputs[2]) ) # 13 = input embedding (index 0) + 12 hidden layers (indices 1 to 12)
print( outputs[2][0].shape ) # for each of these 13: 1,16,768 = input sequence, index of each input id in sequence, size of hidden layer
print( len(outputs[3]) ) # 12 (=attenion for each layer)
print( outputs[3][0].shape ) # 0 index = first layer, 1,12,16,16 = , layer, index of each input id in sequence, index of each input id in sequence