Как сравнить сходство предложений, используя вложения из BERT - PullRequest
3 голосов
/ 02 марта 2020

Я использую пакет 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, все еще работать? Какие еще варианты у меня есть?

Ответы [ 2 ]

4 голосов
/ 03 марта 2020

В дополнение к уже хорошо принятому ответу я хочу указать вам на sentence-BERT, в котором более подробно обсуждается аспект сходства и значения конкретных c метрик (таких как косинусное сходство). У них также есть очень удобная реализация онлайн. Основным преимуществом здесь является то, что они, по-видимому, получают большую скорость обработки по сравнению с «наивным» сравнением встраивания предложений, но я недостаточно знаком с самой реализацией. Различие в на какое сходство вы хотите посмотреть. Специально для этого есть также большое обсуждение в одной из задач из SemEval 2014 (набор данных SICK), в которой более подробно об этом говорится. Исходя из описания вашей задачи, я предполагаю, что вы уже используете данные из одной из более поздних задач SemEval, которая также расширила их до многоязычного сходства.

3 голосов
/ 02 марта 2020

Вы можете использовать токен [CLS] в качестве представления для всей последовательности. Этот токен обычно добавляется к вашему предложению на этапе предварительной обработки. Этот токен, который обычно используется для задач классификации (см. Рисунок 2 и пункт 3.2 в документе BERT ).

Это самый первый токен встраивания.

В качестве альтернативы вы можете взять средний вектор последовательности (как вы говорите по первой (?) Оси), что может дать лучшие результаты в соответствии с документацией обнимающего лица (3-й совет).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...