Обзор эволюции моделей НЛП для написания текста

На каком-то онлайн-форуме историков пользователь задает вопрос:

Было ли у среднего советского гражданина чувство юмора?

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

В Советском Союзе существовало своего рода универсальное чувство юмора, которое часто ассоциировалось с советской идентичностью и коммунистической партией.

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

Пост, о котором я говорил, - всего лишь пример из r / SubSimulatorGPT2, субреддита, предназначенного исключительно для сообщений, автоматически генерируемых ботом на основе OpenAI GPT2. Если вы думаете, что приведенный выше отрывок о советском юморе был просто чем-то, что он запомнил и скопировал, это, скорее всего, не так: поиск в Google не обнаруживает даже половины этого предложения.

Когда боты общаются друг с другом в Reddit, это не новость: r / SubredditSimulator уже делал это в течение нескольких лет. Разница здесь - огромный скачок в качестве сгенерированного текста. В то время как старые боты могут развлечь вас какой-нибудь бессмыслицей, боты, основанные на GPT2, могут на время заставить вас поверить в то, что они настоящие люди, что часто делает это еще смешнее, когда они наконец делают какое-нибудь абсурдное заявление.

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

Эволюция генерации текста

Цепи Маркова и N-граммы

Боты из более старого r / SubredditSimulator используют цепи Маркова, хорошо зарекомендовавшую себя технику генерации последовательностей. Как и современные нейронные сети, они учатся на данных, но намного проще.

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

Обучение модели цепи Маркова состоит в основном из оценки этих вероятностей по текстовым данным. На следующем рисунке показана концепция:

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

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

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

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

Если мы попытаемся взглянуть на более длинные последовательности, мы увидим экспоненциальный взрыв. Учитывая небольшой размер словарного запаса в 10 тысяч (10⁴) слов, у нас есть 100 миллионов (10⁸) возможных биграмм, один триллион (10¹²) возможных триграмм и десять квадриллионов (10¹⁶) возможных четырехграмм! Большинство из них бессмысленны, например, банан, банан, водоворот, банан, но это часть проблемы: многие идеально точные 4-граммы также не будут отображаться в обучающих данных, а модель не имеет способ различать, какие последовательности абсурдны, а какие хороши, но, к сожалению, не было видно раньше.

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

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

Вложения слов и модели нейронного языка

Вложения слов - одна из первых вещей, которым сегодня научился кто-либо в НЛП: проекция слов в многомерное пространство. Их большое преимущество состоит в том, что слова с похожим употреблением / значением имеют одинаковые векторы, измеряемые по косинусному сходству. Таким образом, матричные умножения с использованием векторов слов похожих слов, как правило, дают аналогичные результаты.

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

В своей простейшей форме модель нейронного языка смотрит на n -грамму, сопоставляет каждое из ее слов с соответствующим вектором внедрения, объединяет эти векторы и передает их одному или нескольким скрытым слоям. Выходной слой определяет вероятность того, что каждое слово в словаре будет следующим, вычисленное как softmax по результатам.

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

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

Рекуррентные нейронные сети

Возможно, наибольшее улучшение в создании языков произошло с появлением рекуррентных нейронных сетей (RNN), а точнее, Long Short-Term Memories (LSTM). В отличие от простейших сетей, о которых я упоминал ранее, контекст RNN не ограничивается только n словами; у него нет даже теоретического предела.

Есть отличный пост Андрея Карпати, в котором объясняется, как они работают, и показано множество примеров, на которых они учатся создавать текст, напоминающий пьесы Шекспира, статьи в Википедии и даже код C.

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

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

RNN стали очень популярными в НЛП примерно в 2014 и 2015 годах и до сих пор широко используются. Однако их элегантная архитектура с продуманным внутренним состоянием иногда становится помехой. Позвольте мне проиллюстрировать этот пример:

Мальчики, которые пришли с Джоном, очень умные.

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

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

Но неудобства все же есть. При обучении RNN не используются возможности распараллеливания аппаратных операций, поскольку нам нужно обработать каждое слово i перед просмотром слова i + 1.

Кроме того, заметили ли вы, как промежуточные выходные векторы на рисунке выше становятся более красочными после каждого слова? Это означает, что слова, расположенные ниже в предложении, имеют доступ к предыдущим, в то время как слова в начале не могут видеть слова, идущие после. Моделирование слова на основе того, что следует за ним, может сначала показаться нелогичным, но мы делаем это постоянно. Рассмотрим соединения существительного и существительного в английском языке, такие как шоколадный торт в первом примере. Как только мы слышим или читаем слово торт, мы понимаем, что шоколад просто описывает его, а не является заголовком фразы. Мы делаем это, потому что можем отследить информацию в нашем сознании, но линейная RNN не может этого сделать. Итак, хотя RNN могут делать отличную работу, есть еще возможности для улучшения.

Трансформеры

Transformer - это архитектура нейронной сети, представленная в 2017 году для устранения недостатков RNN. Его ключевая идея - в значительной степени полагаться на внимание до такой степени, что не требуется никакого внутреннего состояния или повторения вообще.

Каждый скрытый слой в Transformer имеет компонент внимания, за которым следует преобразование с прямой связью по умолчанию (или MLP). Во-первых, Transformer вычисляет, сколько внимания каждое слово должно уделять всем словам, включая само себя и следующие за ним. Как и в RNN, векторы этих слов масштабируются пропорционально полученному и суммируемому вниманию, что дает вектор с учетом контекста. Этот результирующий вектор затем проходит преобразование с прямой связью, и в результате получается выходной сигнал этого уровня преобразователя.

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

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

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

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

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

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

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

Где мы сейчас

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

Модель GPT-2, о которой я упоминал в начале этого поста, является экземпляром Transformer. Этот конкретный объект имел 345 миллионов параметров, был обучен OpenAI на огромной коллекции текстов, а затем настроен на несколько десятков мегабайт текста из Reddit.

Предварительно обученные модели, предоставляемые OpenAI, отлично подходят для генерации текста в целом, но чтобы сделать что-то более конкретное, вам необходимо настроить его, то есть обучить его дальше с некоторыми интересующими вас данными. В симуляторе subreddit », Существуют версии GPT-2, настроенные более чем на 100 субреддитов, взаимодействующих друг с другом, и вы можете ясно видеть, как каждый из них усвоил свой собственный стиль и особенности. Это может быть особенно интересно в потоках с ботами, настроенными в разных субреддитах!

Кстати, эта предварительно обученная модель была даже не лучшей для OpenAI. Они обучили еще более мощный, с 1,5 миллиардами параметров, но решили не публиковать его, опасаясь злонамеренного использования. Это вызывает ряд интересных вопросов о том, какие опасности несет ИИ: не роботы-убийцы из научной фантастики, а плодовитый писатель, который может без устали спорить или сочинять истории. Многие люди в машинном обучении и за его пределами не согласны с тем, что такие языковые модели опасны, но этот эпизод, по крайней мере, показывает, что последствия ИИ становятся все более важной темой для обсуждения.

Что еще до этого?

Хорошо, но какая польза от этих моделей, кроме создания забавных тем Reddit? Ну, конечно, много приложений НЛП! Вы, наверное, уже поняли, что в клавиатуре вашего мобильного телефона есть очень простой код, и это правильно.

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

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

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

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

Некоторые интересные ресурсы