НЛП для семантического поиска

Преобразователи предложений: скрытые значения

Как современные языковые модели улавливают значение

Трансформеры полностью перестроили ландшафт обработки естественного языка (NLP). До трансформеров у нас был хороший перевод и классификация языков благодаря рекуррентным нейронным сетям (RNN) — их понимание языка было ограниченным и приводило к множеству мелких ошибок, а связность больших кусков текста была практически невозможной.

С момента представления первой модели трансформатора в статье 2017 года Все, что вам нужно — это внимание» [1], НЛП перешло от RNN к таким моделям, как BERT и GPT. Эти новые модели могут отвечать на вопросы, писать статьи (может быть, GPT-3 написал это), обеспечивать невероятно интуитивный семантический поиск — и многое другое.

Забавно то, что для многих задач последние части этих моделей такие же, как и в RNN — часто это пара NN с прямой связью, которые выводят предсказания модели.

Изменился вход для этих слоев. Плотные вложения, созданные моделями-трансформерами, содержат настолько больше информации, что мы получаем огромные преимущества в производительности, несмотря на использование одних и тех же конечных внешних слоев.

Эти все более богатые вложения предложений можно использовать для быстрого сравнения сходства предложений для различных вариантов использования. Такой как:

  • Семантическое текстовое сходство (СТС) — сравнение пар предложений. Мы можем захотеть определить закономерности в наборах данных, но чаще всего это используется для сравнительного анализа.
  • Семантический поиск — поиск информации (ИП) с использованием семантического значения. Имея набор предложений, мы можем искать с помощью предложения ‘query’ и определять наиболее похожие записи. Позволяет выполнять поиск по понятиям (а не по конкретным словам).
  • Группировка — мы можем группировать наши предложения, что полезно для моделирования темы.

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

Какой-то «Контекст»

Прежде чем мы углубимся в преобразователи предложений, было бы полезно понять, почему встраивания преобразователей намного богаче — и в чем разница между ванильным преобразователем и преобразователем предложений.

Трансформеры являются косвенными потомками предыдущих моделей RNN. Эти старые рекуррентные модели обычно строились из множества рекуррентных модулей, таких как LSTM или GRU.

В машинном переводе мы бы нашли сети кодер-декодер. Первая модель для кодирования исходного языка в вектор контекста, а вторая модель для декодирования этого в целевой язык.

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

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

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

Во время декодирования модель декодирует одно слово/шаг времени за раз. Выравнивание (например, сходство) между словом и всеми аннотациями кодировщика вычисляется для каждого шага.

Более высокое выравнивание привело к большему весу аннотации кодировщика на выходе шага декодера. Это означает, что механизм вычислил, на какие слова кодировщика следует обратить внимание.

Все наиболее эффективные кодировщики-декодеры RNN использовали этот механизм внимания.

Внимание — это все, что вам нужно

В 2017 году была опубликована статья под названием Внимание — это все, что вам нужно. Это стало поворотным моментом в НЛП. Авторы продемонстрировали, что мы можем удалить сети RNN и получить более высокую производительность, используя просто механизм внимания — с некоторыми изменениями.

Эта новая модель, основанная на внимании, была названа трансформером. С тех пор экосистема NLP полностью перешла от RNN к преобразователям благодаря их значительно более высокой производительности и невероятной способности к обобщению.

Первый преобразователь устранил необходимость в RNN за счет использования трех ключевых компонентов:

  • Позиционное кодирование
  • внимание к себе
  • Многоголовое внимание

Позиционное кодирование заменило ключевое преимущество RNN в НЛП — возможность учитывать порядок последовательности (они были рекуррентными). Он работал, добавляя набор различных активаций синусоидальной волны к каждому входному встраиванию в зависимости от положения.

Самовнимание — это когда механизм внимания применяется между словом и всеми другими словами в его собственном контексте (предложении/абзаце). Это отличается от ванильного внимания, которое специально фокусировалось на внимании между кодировщиками и декодерами.

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

Предварительно обученные модели

Новые модели трансформаторов гораздо лучше обобщались, чем предыдущие RNN, которые часто создавались специально для каждого варианта использования.

В моделях-трансформерах можно использовать одно и то же ядро модели и просто поменять местами несколько последних слоев для разных вариантов использования (без переобучения ядра).

Это новое свойство привело к появлению предварительно обученных моделей для НЛП. Предварительно обученные модели-трансформеры обучаются на огромном количестве обучающих данных — часто за большие деньги такие компании, как Google или OpenAI, а затем публикуются для бесплатного использования.

Одной из наиболее широко используемых из этих предварительно обученных моделей является BERT, или Bоднонаправленный Encoder Rпредставления от T. трансформеры от Google AI.

BERT породил целый ряд дополнительных моделей и производных, таких как distilBERT, RoBERTa и ALBERT, охватывающих такие задачи, как классификация, вопросы и ответы, POS-маркировка и многое другое.

BERT для схожести предложений

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

До преобразователей предложений подход к вычислению точного сходства предложений с помощью BERT заключался в использовании структуры кросс-кодировщика. Это означало, что мы должны были передать два предложения в BERT, добавить заголовок классификации в начало BERT и использовать его для вывода оценки сходства.

Сеть кросс-кодировщика дает очень точные оценки сходства (лучше, чем SBERT), но она не масштабируется. Если бы мы хотели выполнить поиск сходства в небольшом наборе данных из 100 000 предложений, нам нужно было бы выполнить вычисление логического вывода кросс-кодировщика 100 000 раз.

Чтобы сгруппировать предложения, нам нужно было бы сравнить все предложения в нашем наборе данных 100 000, в результате чего сравнений будет чуть менее 500 миллионов — это просто нереально.

В идеале нам нужно предварительно вычислить векторы предложений, которые можно сохранить, а затем использовать при необходимости. Если эти векторные представления хороши, все, что нам нужно сделать, это вычислить косинусное сходство между ними.

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

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

Решение отсутствия точной модели с разумной задержкой было разработано Нильсом Реймерсом и Ириной Гуревич в 2019 году с введением предложения-BERT (SBERT) и библиотеки sentence-transformers. .

SBERT превзошел предыдущие современные модели (SOTA) для всех распространенных задач семантического текстового сходства (STS) — подробнее об этом позже — за исключением одного набора данных (SICK-R).

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

Реймерс и Гуревич продемонстрировали резкое увеличение скорости в 2019 году. На поиск наиболее похожей пары предложений из 10 000 предложений с помощью BERT ушло 65 часов. С помощью SBERT вложения создаются за ~ 5 секунд и сравниваются с косинусным сходством за ~ 0,01 секунды.

Со времени статьи SBERT было построено гораздо больше моделей преобразования предложений с использованием аналогичных концепций, которые использовались при обучении оригинального SBERT. Все они обучены множеству похожих и непохожих пар предложений.

Используя функцию потерь, такую ​​как потеря softmax, потеря ранжирования с несколькими отрицательными значениями или потеря маржи MSE, эти модели оптимизируются для создания аналогичных вложений для похожих предложений и разнородных вложений в остальном.

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

*[3] В документе SBERT рассматриваются многие утверждения, методы и цифры этого раздела.

Преобразователи предложений

Мы объяснили архитектуру кросс-кодировщика для схожести предложений с BERT. SBERT аналогичен, но пропускает окончательную классификацию и обрабатывает одно предложение за раз. Затем SBERT использует пул средних значений на конечном выходном слое для создания встраивания предложений.

В отличие от BERT, SBERT точно настраивается на пары предложений с использованием сиамской архитектуры. Мы можем думать об этом как о двух параллельных идентичных BERT, которые имеют одинаковые сетевые веса.

На самом деле мы используем единую модель BERT. Однако, поскольку во время обучения мы обрабатываем предложение A, за которым следует предложение B, как пары, проще представить это как две модели со связанными весами.

Сиамская предварительная тренировка BERT

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

В подходе softmax-loss использовалась «сиамская» архитектура, настроенная на корпуса Stanford Natural Language Inference (SNLI) и Multi-Genre NLI (MNLI).

SNLI содержит 570 тысяч пар предложений, а MNLI — 430 тысяч. Пары в обоих корпусах включают premise и hypothesis. Каждой паре присваивается одна из трех меток:

  • 0 – залог, например. premise предполагает hypothesis.
  • 1нейтрально, premise и hypothesis могут быть истинными, но они не обязательно связаны.
  • 2противоречие, premise и hypothesis противоречат друг другу.

Учитывая эти данные, мы передаем предложение A (скажем, premise) в сиамский BERT A, а предложение B (hypothesis) — в сиамский BERT B.

Сиамский BERT выводит наши объединенные вложения предложений. В документе SBERT были результаты трех различных методов объединения. Это среднее, максимальное и [CLS]-объединение. Подход с объединением среднего показал наилучшие результаты как для наборов данных NLI, так и для наборов данных STSb.

Теперь есть два вложения предложений. Мы будем называть вложения A u, а вложения B v. Следующим шагом будет объединение u и v. Опять же, было протестировано несколько подходов к конкатенации, но наиболее эффективной оказалась операция (u, v, |u-v|):

|u-v| вычисляется, чтобы дать нам поэлементную разницу между двумя векторами. Наряду с двумя исходными вложениями (u и v) все они передаются в нейронную сеть с прямой связью (FFNN), которая имеет три выхода.

Эти три результата соответствуют нашим меткам подобия NLI 0, 1 и 2. Нам нужно рассчитать softmax из нашей FFNN, что делается в рамках функции кросс-энтропийных потерь. Softmax и метки используются для оптимизации этого softmax-loss.

Это приводит к тому, что вложения объединенных предложений для похожих предложений (метка 0) становятся более похожими, а вложения для разнородных предложений (метка 2) становятся менее похоже.

Помните, что мы используем сиамские BERT, а не двойные BERT. Это означает, что мы используем не две независимые модели BERT, а одну BERT, которая обрабатывает предложение A, за которым следует предложение B.

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

Тот факт, что этот подход к обучению работает, не является особенно интуитивным и действительно был описан Реймерсом как случайное создание хороших вложений предложений [5].

После выхода оригинальной статьи в этой области была проделана дальнейшая работа. Было построено гораздо больше моделей, таких как последние модели MPNet и RoBERTa, обученные на образцах 1B+ (обеспечивающие гораздо лучшую производительность). Мы рассмотрим некоторые из них в будущих статьях, а также лучшие подходы к обучению, которые они используют.

А пока давайте посмотрим, как мы можем инициализировать и использовать некоторые из этих моделей преобразования предложений.

Начало работы с преобразователями предложений

Самый быстрый и простой способ начать работу с преобразователями предложений — использовать библиотеку sentence-transformers, созданную создателями SBERT. Мы можем установить его с помощью pip.

pip install sentence-transformers

Мы начнем с оригинальной модели SBERT bert-base-nli-mean-tokens. Сначала мы загружаем и инициализируем модель.

На выходе мы видим объект SentenceTransformer, содержащий три компонента:

  • Сам преобразователь, здесь мы можем увидеть максимальную длину последовательности 128 токенов и указать, следует ли переводить в нижний регистр какие-либо входные данные (в данном случае модель нет). Мы также можем видеть класс модели, BertModel.
  • Операция объединения. Здесь мы видим, что мы создаем 768-мерное встраивание предложения. Мы делаем это, используя метод mean pooling.

Когда у нас есть модель, можно быстро построить вложение предложений с помощью метода encode.

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

Мы можем собрать быстрый пример STS, используя только функцию подобия косинуса и Numpy.

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

Здесь мы вычислили косинусное сходство между каждой комбинацией наших пяти вложений предложений. Которые:

Мы можем увидеть наивысшую оценку сходства в правом нижнем углу с 0.64. Как мы надеемся, это относится к предложениям 4 и 3, которые оба описывают плохую стоматологическую практику с использованием строительных материалов.

Другие преобразователи предложений

Хотя мы получили хорошие результаты от модели SBERT, с тех пор было построено гораздо больше моделей преобразования предложений. Многие из них мы можем найти в библиотеке sentence-transformers.

Эти новые модели могут значительно превзойти оригинальный SBERT. Фактически, SBERT больше не указан в качестве доступной модели на странице моделей SBERT.net.

Несколько самых эффективных моделей на странице моделей преобразователей предложений.

Мы рассмотрим некоторые из этих более поздних моделей более подробно в следующих статьях. А пока давайте сравним одного из самых эффективных и выполним нашу задачу STS.

Здесь у нас есть модель SentenceTransformer для all-mpnet-base-v2. Компоненты очень похожи на модель bert-base-nli-mean-tokens с небольшими отличиями:

  • max_seq_length увеличилось с 128 до 384. Это означает, что мы можем обрабатывать последовательности, которые в три раза длиннее, чем с помощью SBERT.
  • Базовая модель теперь MPNetModel [4], а не BertModel.
  • К вложениям предложений применяется дополнительный уровень нормализации.

Давайте сравним результаты STS all-mpnet-base-v2 с SBERT.

Семантическое представление более поздних моделей очевидно. Хотя SBERT правильно определяет 4 и 3 как наиболее похожую пару, он также приписывает достаточно высокое сходство другим парам предложений.

С другой стороны, модель MPNet проводит очень четкое различие между похожими и непохожими парами: большинство пар имеют оценку менее 0,1, а пара 4-3 имеет оценку 0,52.

Увеличивая разделение между непохожими и похожими парами, мы:

  1. Упрощение автоматического определения соответствующих пар.
  2. Подталкивание прогнозов ближе к целевым значениям 0 и 1 для разных и похожих пар, используемых во время обучения. Это то, что мы увидим больше в наших будущих статьях о тонкой настройке этих моделей.

Вот и все, что касается этой статьи, знакомящей с вложениями предложений и текущими моделями преобразователей предложений SOTA для создания этих невероятно полезных вложений.

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

Мы также продемонстрировали, что, несмотря на совсем недавнее появление SBERT в 2019 году, другие преобразователи предложений уже превосходят эту модель. К счастью для нас, SBERT легко отключить для одной из этих новых моделей с помощью библиотеки sentence-transformers.

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

[1] А. Вашвани и др., Внимание — это все, что вам нужно (2017), NeurIPS.

[2] Д. Багданау и др., Нейронный машинный перевод путем совместного обучения выравниванию и переводу (2015), ICLR.

[3] Н. Реймерс, И. Гуревич, Предложение-BERT: встраивание предложений с использованием сиамских сетей BERT (2019), ACL

[4] Модель MPNet, Документы с обнимающим лицом

[5] Н. Реймерс, Вывод естественного языка, преобразователи предложений на GitHub.

*Все изображения принадлежат автору, если не указано иное