Я использую пакет HuggingFace Transformers для доступа к предварительно обученным моделям. Поскольку моему варианту использования нужны функциональные возможности как для Engli sh, так и для Arabi c, я использую модель с предварительным обучением bert-base-multilingual-case. Мне нужно уметь сравнивать сходство предложений, используя что-то вроде косинусного сходства. Чтобы использовать это, мне сначала нужно получить вектор внедрения для каждого предложения, а затем вычислить косинусное сходство.
Во-первых, каков наилучший способ извлечь c семантику c вложения из БЕРТ модель? Достаточно ли будет взять последнее скрытое состояние модели после подачи предложения?
import torch
from transformers import BertModel, BertTokenizer
model_class = BertModel
tokenizer_class = BertTokenizer
pretrained_weights = 'bert-base-multilingual-cased'
tokenizer = tokenizer_class.from_pretrained(pretrained_weights)
model = model_class.from_pretrained(pretrained_weights)
sentence = 'this is a test sentence'
input_ids = torch.tensor([tokenizer.encode(sentence, add_special_tokens=True)])
with torch.no_grad():
output_tuple = model(input_ids)
last_hidden_states = output_tuple[0]
print(last_hidden_states.size(), last_hidden_states)
Во-вторых, если это достаточный способ получить вложения из моего предложения, у меня теперь есть другая проблема, когда векторы вложения имеют разные длины в зависимости от длины исходного предложения. Вывод формы: [1, n, vocab_size]
, где n
может иметь любое значение.
Чтобы вычислить косинусное сходство двух векторов, они должны быть одинаковой длины. Как я могу сделать это здесь? Может ли что-то столь же наивное, как первое суммирование по axis=1
, все еще работать? Какие еще варианты у меня есть?