Вложения предложений 101

В этой статье я представлю тему встраивания предложений. Мы узнаем, что такое вложения предложений и чем они могут быть полезны. Мы рассмотрим некоторые базовые (и даже наивные) методы создания вложений предложений, а также некоторые последние достижения в этой области. Мы закончим экспериментом, который я провел по измерению качества визуализации документа при использовании различных методов встраивания предложений. Итак, без лишних слов, давайте сразу приступим!

Статья будет организована следующим образом:

Часть 1. Что такое встраивание предложений?
Часть 2. Пример приложения
Часть 3. Некоторые основные методы
Часть 4. SentenceBERT [1] — The New Kid on the Block
Часть 5. SimCSE [2] — ввод неконтролируемых вложений предложений
Часть 6. Эксперимент — измерение качества визуализации документа — набор данных Kaggle News [3]

Часть 1. Что такое вложения предложений?

Вложения в машинном обучении — это векторные представления сущностей в мире, поэтому вложения предложений — это просто векторные представления предложений. Обычно мы говорим, что они представляют собой распределенные векторные представления, и это означает, что у нас нет сопоставления 1:1 признаков в данных с элементами в векторе (например, один элемент вектора, представляющий «счастье» предложения), а скорее эти черты распределяются между различными элементами вектора способами, которые мы не можем предопределить.

Например, на рисунке 1 мы видим игрушечный пример генерируемых вложений предложений. Мы видим, что встраиваниям удается уловить семантическое сходство между первыми двумя (вопросы о еде) и двумя последними (факты, связанные с расписанием) предложениями, сохраняя при этом разницу между этими двумя группами.

Часть 2. Пример приложения

Итак, для чего вообще нужны эти вложения предложений? Давайте посмотрим на гипотетический пример приложения, о котором я подумал (это всего лишь пример, я уверен, что вы сможете вызвать в воображении больше этих идей, когда увидите его).

На рис. 2 мы видим пример приложения, в котором пользователь пишет фрагмент кода (сортировка вставками в Python) и хочет найти похожие фрагменты кода (возможно, чтобы найти лучшие реализации или ту же функцию на других языках). Пользователь берет этот код и использует методы встраивания предложений для преобразования фрагмента кода в распределенное векторное представление. Затем пользователь запрашивает базу данных других внедрений фрагментов кода и, используя K ближайших соседей с косинусным сходством, находит фрагменты, наиболее похожие на входной фрагмент.

Часть 3. Некоторые основные методы

Самые основные методы в этой области основаны на подсчете. Простейший пример методов, основанных на подсчете, показан в верхней части рисунка 3, где подсчет каждого слова в предложении является записью в векторном представлении предложения. Это нераспределенное векторное представление, так как одна характеристика предложения (конкретное количество слов) может быть сопоставлена ​​непосредственно с одной записью в векторе представления. Другие методы, такие как TF-IDF, развили это путем нормализации этих значений по частоте каждого слова во всем наборе данных, но они по-прежнему основаны на подсчете и не учитывают порядок слов в предложении (который может быть основным источником потери данных).

Второй метод показан внизу рисунка 3, где определенные методы встраивания слов используются готовыми, а представление предложения берется как среднее этих вложений слов. Вложения слов могут быть сгенерированы любым методом (GloVe [5], word2vec, BERT и т. д.), но позже мы увидим, что есть недостаток в том, чтобы просто взять среднее значение этих векторов без предварительной их настройки, чтобы лучше соответствовать задаче построения предложения. вложения.

Часть 4 — SentenceBERT — Новичок в блоке

Большой прогресс в области встраивания предложений произошел в 2019 году, когда Нильс Реймерс и Ирина Гуревич опубликовали статью Sentence-BERT. Они представили новый метод тонкой настройки известной модели BERT для создания вложений, которые будут хорошо сопоставимы с использованием косинусного сходства.

Первоначальная статья BERT [4] касалась проблемы семантического текстуального сходства, где цель состояла в том, чтобы оценить, насколько похожи пары предложений (пример показан на рисунке 4), и даже были получены новые современные результаты по конкретный эталон.

Проблема с подходом BERT заключалась в его невероятной неэффективности. BERT решил эту задачу путем кодирования токенов сразу двух предложений (разделенных специальным [SEP]token) и вывода уровня сходства в конце, как показано на рисунке 5, взятом из оригинальной статьи BERT. Чтобы найти наиболее похожую пару в наборе данных из 10 000 предложений, BERT потребовал бы примерно 65 часов времени логического вывода. Таким образом, цель SBERT состояла в том, чтобы создать вложения, которые можно сравнивать просто с помощью косинусного подобия, но при этом давать самые современные результаты в эталонных задачах STS.

Здесь я сосредоточусь на одном из решений, предложенных в статье SBERT, которое заключается в использовании сиамских сетей для помеченных пар предложений из набора данных задачи вывода на естественном языке (NLI). Пары предложений в этом наборе данных были помечены одним из следующих вариантов: следствие, противоречие или нейтральность.

Задача точной настройки, введенная SBERT и примененная к исходной предварительно обученной модели BERT, заключалась в том, чтобы взять каждую помеченную пару предложений и использовать сиамские сети для создания вектора, содержащего оба представления BERT (конкатенация v, u, |u-v|, где u и v — это выходы BERT). Поверх этой структуры прикрепляется сеть прямого распространения с функцией softmax, и ее выходные данные определяют, является ли пара предложений следствием, противоречием или нейтральным. Описанный выше процесс изображен на рисунке 6.

Эта простая задача тонкой настройки создала улучшенную модель BERT, которая генерирует представления предложений, которые можно сравнивать, используя простое косинусное сходство! В таблице 1 (взятой из оригинальной статьи SBERT) авторы показывают, что они значительно превосходят наивные методы (среднее вложение GloVe, среднее вложение BERT), а также превосходят другие методы встраивания предложений, которые мы здесь не рассмотрели.

Но что, если в наших данных нет помеченных пар предложений, которые мы можем использовать для обучения SBERT? Вот тут-то и появляется SimCSE…

Часть 5. SimCSE. Ввод предложений без присмотра

SimCSE, написанный Tianyu Gao, Xingcheng Yao и Danqi Chen, представляет новый способ точной настройки языковых моделей с целью создания встраивания предложений. В этой статье авторы используют контрастное обучение, где положительным примером является само предложение, пропущенное через другую маску отсева (подробнее об этом позже).

Примечание. В документе также представлен контролируемый способ создания вложений предложений с использованием контрастного обучения. В этой статье я решил сосредоточиться на неконтролируемой части. Полную информацию см. в оригинальном документе.

Сначала давайте освежим в памяти контрастное обучение: основная идея состоит в том, чтобы сблизить близких соседей и раздвинуть несоседних. В этом примере мы будем следовать за Марио, Луиджи и Йоши. Марио и Луиджи — близнецы, поэтому мы хотим, чтобы вложения, представляющие их, были близки в векторном пространстве. Йоши симпатичный, но не очень похож на Марио и Луиджи, поэтому мы хотим, чтобы его изображение было дальше.

Но как добиться этого численно? Используя функцию потерь, конечно! В сравнительном обучении мы обычно используем функцию потерь, называемую InfoNCE. Рисунок 8 — это инфографика, которая поможет нам понять функцию потерь InfoNCE, давайте рассмотрим ее шаг за шагом.

Во-первых, в числителе мы видим, что у нас есть показатель степени сходства h_i и (h_i)^+ (извините за плохое обозначение). Мы видим, что h_i представляет Марио, а (h_i)^+ представляет Луиджи, поэтому мы, конечно, хотим, чтобы числитель был большим. С другой стороны, в знаменателе у нас есть сумма сходств Марио h_i со всеми другими элементами в пакете (h_j)^+ , включая Луиджи, но также включает в себя другие вещи, на которые мы не хотим, чтобы Марио был похож, в том числе самолет, блюдо и Йоши, конечно. Мы видим, что числитель является частью знаменателя, а если проводить аналогию с тортом — числитель является частью знаменателя. Этот фрагмент должен быть максимально большим, чтобы максимизировать сходство между Марио и Луиджи и свести к минимуму сходство между Марио и всем остальным в пакете.

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

Теперь мы знаем, как работает контрастное обучение, но каких «Марио, Луиджи и Йоши» использовал SimSCE, когда не было размеченных данных такого рода? Получается, что для заданного предложения они дважды пропускали его через BERT, каждый раз используя другую маску отсева (напоминаем — отсев — это функция, которая случайным образом обнуляет часть ввода), таким образом получая два немного разных встраивания для данного предложения . Для отрицательных примеров они просто использовали все остальные предложения в мини-пакете (при хорошей перетасовке — другие предложения должны быть совсем другими).

На рисунке 9 показан пример этого (содержит рисунок из оригинальной статьи SimCSE). Слева мы видим, что предложение «Бегут две собаки» проходит по сети два раза, образуя положительную пару, а все остальные предложения в пакете (Главный серфинг на море, Ребенок на скейтборде ) служат отрицательными парными образцами. Справа просто напоминание о том, как работает отсев путем случайного маскирования входных данных.

Хорошо, но почему это вообще должно работать? Какова теоретическая основа этого? Здесь авторы SimCSE объясняют нам два термина, называемых выравниванием и единообразием.

На рисунке 10 мы можем видеть уравнения для выравнивания и однородности вместе с нашими верными друзьями Марио, Йоши и Луиджи. Выравнивание — это ожидаемое расстояние между вложениями парных экземпляров. Термин слева — это «потеря» мировоззрения, которую мы постараемся свести к минимуму. Мы видим, что он содержит расстояния между вложениями всех положительных пар (Мариоса и Луиджиса), которые мы хотим минимизировать. Справа мы видим потерю однородности. У нас есть e в отрицательной степени расстояний между всеми отрицательными парами (Мариосом и Йоши), которые мы хотим максимизировать.

Авторы утверждают, что предварительно обученные модели обычно имеют хорошее выравнивание, то есть пары положительных образцов будут близки в пространстве встраивания, но плохую однородность, то есть пары отрицательных образцов не будут достаточно далеко друг от друга. Рисунок 11 взят из исходной статьи SimCSE и показывает, что им удалось сохранить хорошее выравнивание при улучшении однородности (сведя к минимуму потерю однородности). Красные звездочки представляют модель SimCSE, а другие символы — другие проверенные базовые уровни.

Когда мы смотрим на результаты SimCSE на тестовых задачах STS в таблице 2, мы видим результаты, аналогичные результатам SBERT, которые мы рассмотрели ранее, только на этот раз — не использовались размеченные данные о сходстве предложений! Они доработали только 1 миллион предложений из Википедии. На мой взгляд, это довольно впечатляюще.

Часть 6. Эксперимент. Измерение качества визуализации документа. Набор данных Kaggle News.

Вот и все, что касается теоретической части этой статьи. Сейчас я собираюсь показать эксперимент, который я провел с использованием вышеуказанных моделей по визуализации документов в 2D-пространстве.

Код, который я использовал для этого эксперимента, доступен здесь — https://github.com/erap129/DocumentVisualizations.

Набор данных категории новостей от Kaggle — https://www.kaggle.com/datasets/rmisra/news-category-dataset (выпущенный под лицензией Attribution 4.0 International (CC BY 4.0)) содержит новостные статьи, принадлежащие к 42 различным категориям. . Каждая статья в наборе данных содержит следующие поля данных: category, headline, authors, link, short_description, date. Я взял только поля headline, short_description и создал новое поле, которое назвал long_description. Моя цель состояла в том, чтобы создать вложения long_description каждой новостной статьи, используя несколько методов, и проверить, какой из методов дает наилучшую двухмерную визуализацию данных. Поэтому здесь необходимо задать несколько вопросов.

  • Как я создал 2D-визуализацию с учетом встраивания предложений конкретной статьи?

Я использовал алгоритм UMAP. Существует множество документации, касающейся этого замечательного алгоритма уменьшения размерности, поэтому я не буду вдаваться в подробности здесь. Скажу лишь, что я использовал гиперпараметры по умолчанию во всех экспериментах без какой-либо настройки.

  • Как я количественно сравнивал качество различных визуализаций? Что значит иметь «хорошую» визуализацию?

Сравнение визуализации делается, конечно же, визуально на глаз. Но что, если мы все еще хотим получить метрику, за которую мы можем держаться? Может быть, мы сталкиваем друг с другом десятки алгоритмов и у нас нет времени все рассмотреть? Я наткнулся на эту статью — Выбор хороших представлений многомерных данных с использованием согласованности классов, в которой предлагается мера, называемая согласованность расстояния, которая определяется следующим образом:

Для каждой точки x' в визуализируемом пространстве v(X) мы проверяем, отличается ли центр тяжести ближайшего класса от класса x, а затем разделите на N количество выборок, чтобы получить число от 0 до 1. Поскольку DSC ​​ визуализации ниже, это означает, что кластеры, представляющие разные группы в визуализация более заметна, что хорошо. Эта мера применяется только тогда, когда данные помечены, как в нашей ситуации с набором данных новостей.

  • Какие методы дали какие результаты? Соответствуют ли мои выводы документам SBERT и SimCSE?

Перейдем к результатам эксперимента. Для простоты я использовал только 5 категорий из набора данных новостей Kaggle: еда и напитки, мировая почта, спорт, развод и стиль. Я сравнил следующие методы создания визуализаций:

  • TF-IDF — основанный на подсчете метод создания векторов, представляющих документы. Используется в качестве базовой.
  • bert_average — средние значения внедрения всех токенов в документ, взятые из последнего слоя модели BERT (не настроены для предложений)
  • bert_cls — встраивание токена [CLS], взятого из последнего уровня BERT.
  • sbert_average — средние значения встраивания из SBERT (контролируемая точная настройка BERT для предложений)
  • sbert_cls — встраивание токена [CLS], взятого из последнего слоя SBERT.
  • simcse_average — средние значения внедрения из SimCSE (неконтролируемая тонкая настройка BERT для предложений)
  • simcse_cls — встраивание токена [CLS], взятого из последнего слоя SimCSE.

Вот результаты меры DSC ​​:

Мы видим очень похожие результаты с документами SBERT и SimCSE. Нетонко настроенный BERT имеет серьезную конкуренцию простой базовой линии TF-IDF. После контролируемой точной настройки (SBERT) результаты резко улучшаются, а также благодаря неконтролируемой точной настройке (SimCSE). В BERT и SBERT использование средних вложений токенов в качестве основы для уменьшения размерности было выгоднее, чем встраивание токена [CLS], в то время как для SimCSE верно обратное.

Давайте посмотрим на фактическую визуализацию для каждого метода, чтобы лучше понять, что здесь было сделано. Быстрая проверка подтверждает метрику DSC — методы, получившие более низкий DSC, дают более различимые кластеры в визуализации:

  • TF-IDF

  • bert_average

  • bert_cls

  • sbert_average

  • sbert_cls

  • simcse_average

  • simcse_cls

Заключение

В этой статье мы:

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

Для будущей работы, я думаю, было бы интересно попробовать SimCSE на других типах текстовых данных, а не только на естественном языке. Например, написать модель, которая находит похожие фрагменты кода, как я предлагал во второй части этой статьи. Тот факт, что SimCSE не нуждается в контролируемых данных для точной настройки предложений, позволяет проводить обучение на различных типах данных.

Надеюсь, вам понравилось читать и вы узнали что-то новое. Спасибо за прочтение!

Рекомендации

[1] — Документ SentenceBERT — https://arxiv.org/abs/1908.10084
[2] — Документ SimCSE — https://arxiv.org/abs/2104.08821
[3 ] — Набор данных категорий новостей Kaggle — https://www.kaggle.com/datasets/rmisra/news-category-dataset
[4] — Бумага BERT — https://arxiv.org/abs/ 1810.04805
[5] — GloVe embeddings — https://nlp.stanford.edu/projects/glove/