Я немного потренировался с Bert Embedding. В частности, я использую модель BERT-Base Uncased с библиотеками PyTorch
import torch
from pytorch_pretrained_bert import BertTokenizer, BertModel, BertForMaskedLM
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
. Я заметил, что практически каждое слово, которое я смотрел на элементе № 308 в векторе, вставляющем вектор длиной 768: Отрицательный выброс со значениями ниже -2, возможно, в половине случаев ниже -4.
Это действительно странно. Я пытался что-то гуглить по поводу «bert embedding 308», но ничего не смог найти.
Интересно, есть ли объяснение этому «явлению».
Вот моя рутина для извлечения вложений:
def bert_embedding(text, bert_model, bert_tokenizer, layer_number = 0):
marked_text = "[CLS] " + text + " [SEP]"
#the default is the last layer: 0-1 = -1
layer_number -= 1
tokenized_text = bert_tokenizer.tokenize(marked_text)
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
segments_ids = [1] * len(tokenized_text)
tokens_tensor = torch.tensor([indexed_tokens])
segments_tensors = torch.tensor([segments_ids])
with torch.no_grad():
encoded_layers, _ = bert_model(tokens_tensor, segments_tensors)
return encoded_layers[layer_number][0][:]