Изучение дикого запада генерации естественного языка - от n-грамм и RNN до Seq2Seq

Введение в модели естественного языка, как это преподается на занятиях по НЛП в Стэнфорде

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

Моделирование языка (LM) - это задача предсказания того, какое слово будет следующим или, в более общем смысле, система, которая присваивает вероятность фрагменту текстовой последовательности.

N-грамм - это простейшая языковая модель, производительность которой ограничена отсутствием сложности. Упрощенные модели, подобные этой, не позволяют добиться беглости, достаточного количества языковых вариаций и правильного стиля письма для длинных текстов. По этим причинам нейронные сети (NN) рассматриваются как новый золотой стандарт, несмотря на их сложность и рекуррентные нейронные сети. (RNN) стала фундаментальной архитектурой для последовательностей любого типа. В настоящее время RNN считается «ванильной» архитектурой для текста, но у RNN есть свои проблемы: они не могут надолго запоминать контент прошлого и с трудом создают длинные релевантные текстовые последовательности. По этим причинам другие архитектуры, такие как Long Short Term Memory (LSTM) и Gated Recurrent Units (GRU) были разработаны и стали современным решением для многих задач NLG. В этой статье мы рассмотрим эволюцию этих фундаментальных идей и моделей.

Несомненно, Обработка естественного языка (NLP) и Генерация (NLG) претерпели значительные улучшения, особенно последний пять лет, и именно поэтому мы используем и извлекаем выгоду из приложений языковых моделей несколько раз в день. Каждый раз, когда мы набираем текст в поле поиска или вводим текст на телефоне, негласная модель предсказывает следующие ближайшие символы или слова. Gmail и LinkedIn предлагают целые предложения на основе наших предыдущих бесед и виртуальных помощников (например, Siri или Alexa) генерировать человеческие ответы. Чат-боты становятся все более важной частью обслуживания клиентов, а google translate обеспечивает заметно лучший перевод для огромного количества языков. Сложно создать длинный и понятный текст, сохраняя контроль над семантикой вывода. Это решается с помощью такой архитектуры, как Sequence-to-Sequence (Seq2Seq), которая используется для задач условной генерации текста, но мы поговорим об этом позже в этой статье.

N-грамм

Самая простая языковая модель - это модель n -грамм. Текст - это не что иное, как последовательность символов (или слов). распределение вероятностей следующего слова x ⁽ᵗ⁺¹⁾ из словаря V = {W ₁,…, W | ᵥ |}:

Следовательно, последовательность слов x ⁽¹⁾, x ⁽²⁾,…, x ⁽ᵀ⁾ имеет вероятность:

N-грамм предполагает, что следующее слово x ⁽ᵗ⁺¹⁾ зависит только от предыдущего n-1 слова.

С математической точки зрения это означает:

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

Пример для 4-граммового LM:

H̵e̵l̵l̵o̵, ̵ ̵I̵ хотел бы ____

P (слово | хотел бы) = подсчитать (хотелось бы слово) / подсчитать (хотелось бы)

P (просмотр | хотел бы) = 0,03, P (книга | хотел бы) = 0,04

После этих расчетов легко создать текст. шаги для получения следующего грамма:

  1. Посмотрите на последние n-1 грамм (история).
  2. Получите распределение следующего слова из модели n-грамм.
  3. Отберите грамм на основе соответствующего распределения. (Обратите внимание, что есть разные способы выбора следующего грамма, которые описаны в конце этой статьи.)

Чтобы сгенерировать последовательность из k граммов, мы просто зацикливаем описанный выше процесс, обновляя историю сгенерированными граммами на каждом шагу.

При таком упрощенном подходе возникает проблема разреженности:

  1. Как мы уже упоминали, если грамм никогда не встречался в исторических данных, n-грамм присваивает 0 вероятность (0 числитель). В общем, мы должны сгладить распределение вероятностей, так как все должно иметь хотя бы небольшую вероятность.
  2. Если последовательность n – 1 грамм никогда не встречалась в исторических данных, мы не можем рассчитать вероятность следующего грамма (0 знаменатель ). В этом случае мы должны просто использовать более короткий n-грамм (т.е. вместо этого использовать n-1-граммовую модель). Этот метод называется откладыванием.

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

«В то время как производство сумок и обувная промышленность, фондовый рынок вырос сразу после этого»

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

NN

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

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

Должно быть много общего в том, как мы обрабатываем входящие вложения слов.

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

RNN, GRU и LSTM

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

Скрытое состояние - это линейная комбинация предыдущего скрытого состояния и входных данных текущей модели, которая затем подвергается нелинейности (например, сигмоид, tanh). Мы пытаемся изучить общую функцию (A на диаграмме выше) того, как нам следует обращаться со словом с учетом контекста предыдущих слов , при этом изучая общее представление о языке и контексте.

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

  1. Начните с выбора строки, инициализирующей состояние RNN, и установки количества генерируемых символов.
  2. Получите прогноз как распределение следующего символа, используя начальную строку и состояние RNN. Используйте категориальное распределение, чтобы вычислить индекс предсказанного символа.
  3. Используйте этот предсказанный символ как наш следующий вход в модель.
  4. Состояние RNN, возвращаемое моделью, передается обратно в модель, так что теперь у нее больше контекста, а не только ввод (предсказанный предыдущий символ). (см. рисунок развертывания RNN выше)

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

Можно предсказать последнее слово в предложении «Солнце светит в небе». Но сложнее предугадать последнее слово предложения «Погода в ноябре в основном солнечная». когда 100 слов ранее было предложение «Я планирую поездку на Кипр».

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

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

Повторяющиеся модули (A на схеме) в LSTM и GRU имеют разную структуру, что делает их способными изучать долгосрочные зависимости . В их структуре используются вентили, которые состоят из слоя нейронной сети нелинейности (например, сигмоидной) и операции умножения или сложения.

Существуют различные типы ворот, которые можно использовать для обновления состояний. Например, ворота забвения решают, какую информацию мы собираемся выбросить, а ворота ввода решают, какую новую информацию мы собираемся сохранить. Ключевой характеристикой LSTM является состояние ячейки (верхняя горизонтальная линия на диаграмме LSTM выше), которое проходит через сеть только с некоторыми незначительными линейными взаимодействиями, позволяющими информации просто течь по сети. GRU - это более быстрый (но менее мощный) вариант LSTM, который объединяет состояние ячейки и скрытое состояние.

Модель условного языка - Seq2Seq

До сих пор мы видели разные модели (n-gram, RNN, LSTM, GRU), которые могут генерировать текст, но мы не исследовали, как мы можем генерировать текст на основе условия, отличного от начального текста. Вот некоторые приложения для создания условного текста:

Имя автора Текст в авторском стиле

Тема Статья на эту тему

Электронное письмо Тема письма (также известное как резюме)

Вопрос Ответ на вопрос в произвольной форме (также известный как чат-бот)

Статья Резюме этой статьи (также известное как резюме)

Изображение Текст, описывающий изображение (также известный как подписи к изображению)

Описание кода на естественном языке Код (также известный как генерация кода)

Предложение Предложение переведено на другой язык (он же машинный перевод)

В модели условного языка мы хотим присвоить вероятности последовательности слов (y) с учетом некоторого обусловливающего контекста (x):

Эта парадигма называется моделированием Seq2Seq и стала большим прорывом в 2014 году для нейронного машинного перевода. С тех пор это был ведущий стандартный метод, и google translate использовал его в 2016 году. Для обучения такой модели нам потребуется большой объем параллельных данных .

Архитектура Seq2Seq представляет собой модель единой нейронной сети, состоящую из двух RNN:

  • кодировщик: создает кодировку фиксированной длины (вектор действительных чисел), инкапсулирующую информацию о вводе. В машинном переводе кодировщик извлекает всю необходимую информацию из исходного предложения для кодирования.
  • A декодер (по сути, условный LM): языковая модель, которая генерирует целевую последовательность, обусловленную кодировкой, созданной кодировщиком. При машинном переводе декодер генерирует переведенное предложение исходного предложения.

Декодер обучается с помощью метода, называемого принуждение учителя. Это означает, что «учитель» заставляет входы декодера быть золотыми целевыми входами, а не его предсказаниями. Целевая последовательность - это смещение входной последовательности на одно слово, чтобы сеть училась предсказывать следующее слово. Обратное распространение в Seq2Seq работает от конца до конца (один конец - это функции потерь, а другой - начало RNN кодировщика), и мы изучаем всю систему в отношении единовременной потери.

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

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

В случае Seq2Seq каждое скрытое состояние s𝘵 (запрос) декодера относится ко всем скрытым состояниям кодировщика h₁,…, h_N (значения). Следовательно, на каждом этапе декодера у нас есть прямое соединение с кодировщиком, но мы фокусируемся на разных частях исходного предложения.

Сетевая диаграмма выше делает математически:

  1. Вычислите скалярное произведение скрытого состояния декодера (s на шаге t) с каждым скрытым состоянием кодера (h₁,…, h_N), чтобы получить оценки внимания (eᵗ)
  2. Используйте мягкий воск, чтобы получить распределение внимания (αᵗ) на этом этапе.
  3. Используйте это распределение, чтобы получить выходной сигнал внимания (a на шаге t) как взвешенную сумму скрытых состояний кодировщика.
  4. Соедините вывод внимания со скрытым состоянием декодера ([a; s]) и действуйте, как в модели Seq2Seq без внимания.

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

  • Жадный: мы всегда выбираем слово с наибольшей вероятностью (также известное как argmax). Мы выбираем лучший вариант, который у нас есть прямо сейчас, и пути назад нет. Тем не менее, это не обязательно даст нам argmax для всего предложения.
  • Поиск луча. Поиск луча отслеживает k вероятных вариантов на каждом этапе, чтобы местные максимумы. Когда k small (k = 1 для жадных), мы можем получить грамматически неестественные, бессмысленные неправильные предложения. Когда k больше, эти проблемы уменьшаются, но это более дорого и дает больше общих ответов, сходящихся к безопасному «правильному» ответ, который, однако, менее актуален.
  • Выборка. Мы выбираем из усеченного условного распределения вероятностей слов, т. е. из первых k наиболее вероятных слов. При использовании этого метода предложения обычно не имеют особого значения из-за случайности. Обратите внимание, что k = 1 совпадает с жадным декодированием, k = размер словаря совпадает с чистая выборка.

Последние слова

Мы рассмотрели различные методы генерации текста от простого n-грамма подхода к различным архитектурам RNN, включая LSTM и GRU. Мы также изучили архитектуру S eq2Seq, которая при внимании может обрабатывать условную генерацию текста проблемы типа машинного перевода.

У этих моделей есть множество вариантов использования за пределами Google и моей команды - команда Data Science в Zoopla оспаривает опыт портала недвижимости, используя эти знания. Надеюсь, после прочтения статьи вы стали лучше разбираться в генерации текста и теперь можете найти полезные приложения для своей отрасли. Если вы хотите узнать больше, ниже приведены некоторые полезные и полезные ресурсы:

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