Вложения предложений BERT из трансформаторов

Aug 17 2020

Я пытаюсь получить векторы предложений из скрытых состояний в модели 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 Jindřich Aug 18 2020 at 08:37

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

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

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

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

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

2 cronoik Oct 07 2020 at 04:50

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

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

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