Я пытаюсь получить векторы предложений из скрытых состояний в модели BERT. Взглянув на инструкции huggingface BertModel, здесь, в которых говорится :

from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-cased')
model = BertModel.from_pretrained("bert-base-multilingual-cased")
text = "Replace me by any text you'd like."
encoded_input = tokenizer(text, return_tensors='pt') 
output = model(**encoded_input)

Итак, сначала обратите внимание, поскольку это есть на веб-сайте, это / не / запускается. Вы получаете:

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'BertTokenizer' object is not callable

Но похоже, что небольшое изменение исправляет это, поскольку вы не вызываете токенизатор напрямую, а просите его кодировать ввод:

encoded_input = tokenizer.encode(text, return_tensors="pt")
output = model(encoded_input)

Хорошо, но получаемые мною тензоры имеют другую форму, чем я ожидал:

>>> output[0].shape
torch.Size([1,11,768])

Это много слоев. Какой слой лучше использовать для встраивания предложений? [0]? [-1]? В среднем несколько? У меня есть цель сделать с ними косинусное сходство, поэтому мне нужен правильный вектор 1xN, а не тензор NxK.

Я вижу, что популярный проект bert-as-a-service, похоже, использует [0]

Это правильно? Есть ли документация по каждому слою?

5
Mittenchops 18 Авг 2020 в 06:00

2 ответа

Лучший ответ

Я не думаю, что существует единственная авторитетная документация, в которой говорится, что и когда использовать. Вам нужно поэкспериментировать и измерить то, что лучше всего для вашей задачи. Последние наблюдения по поводу BERT красиво обобщены в этой статье: https://arxiv.org/pdf/2002.12327.pdf.

Я думаю, что практическое правило таково:

  • Используйте последний слой, если вы собираетесь настроить модель под вашу конкретную задачу. И как можно лучше настраивайте, достаточно нескольких сотен или даже десятков обучающих примеров.

  • Используйте средние слои (7-й или 8-й), если вы не можете точно настроить модель. Интуиция, лежащая в основе этого, заключается в том, что сначала слои создают все более и более абстрактное и общее представление ввода. В какой-то момент представление становится более целевым для предтренировочной задачи.

Bert-as-services по умолчанию использует последний слой (но его можно настроить). Здесь это будет [:, -1]. Однако он всегда возвращает список векторов для всех входных токенов. Вектор, соответствующий первому специальному (так называемому [CLS]) токену, считается вложением предложения. Отсюда [0] в сниппере, о котором вы говорите.

5
Jindřich 18 Авг 2020 в 16:31

Хотя существующий ответ Jindrich в целом правильный, он не рассматривает вопрос полностью. ОП спросил, какой слой он должен использовать для вычисления косинусного сходства между встраиваемыми предложениями, и краткий ответ на этот вопрос: нет . Такая метрика, как косинусное сходство, требует, чтобы размеры вектора вносили равный и значимый вклад, но это не относится к BERT. Джейкоб Девлин (один из авторов статьи о BERT) написал:

Я не уверен, что это за векторы, поскольку BERT не генерирует значимые векторы предложений. Похоже, что это среднее объединение токенов слов для получения вектора предложения, но мы никогда не предполагали, что это будет генерировать осмысленные представления предложений. И даже если они являются достойными представлениями при подаче в DNN, обученную для последующей задачи, это не означает, что они будут значимыми с точки зрения косинусного расстояния. (Поскольку косинусное расстояние - это линейное пространство, где все измерения имеют одинаковый вес).

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

2
Community 7 Окт 2020 в 13:06