Изучение дикого запада генерации естественного языка - от 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
После этих расчетов легко создать текст. шаги для получения следующего грамма:
- Посмотрите на последние n-1 грамм (история).
- Получите распределение следующего слова из модели n-грамм.
- Отберите грамм на основе соответствующего распределения. (Обратите внимание, что есть разные способы выбора следующего грамма, которые описаны в конце этой статьи.)
Чтобы сгенерировать последовательность из k граммов, мы просто зацикливаем описанный выше процесс, обновляя историю сгенерированными граммами на каждом шагу.
При таком упрощенном подходе возникает проблема разреженности:
- Как мы уже упоминали, если грамм никогда не встречался в исторических данных, n-грамм присваивает 0 вероятность (0 числитель). В общем, мы должны сгладить распределение вероятностей, так как все должно иметь хотя бы небольшую вероятность.
- Если последовательность 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 для предсказания следующего символа мы можем выполнить шаги ниже, чтобы сгенерировать новый текст:
- Начните с выбора строки, инициализирующей состояние RNN, и установки количества генерируемых символов.
- Получите прогноз как распределение следующего символа, используя начальную строку и состояние RNN. Используйте категориальное распределение, чтобы вычислить индекс предсказанного символа.
- Используйте этот предсказанный символ как наш следующий вход в модель.
- Состояние 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 (значения). Следовательно, на каждом этапе декодера у нас есть прямое соединение с кодировщиком, но мы фокусируемся на разных частях исходного предложения.
Сетевая диаграмма выше делает математически:
- Вычислите скалярное произведение скрытого состояния декодера (s на шаге t) с каждым скрытым состоянием кодера (h₁,…, h_N), чтобы получить оценки внимания (eᵗ)
- Используйте мягкий воск, чтобы получить распределение внимания (αᵗ) на этом этапе.
- Используйте это распределение, чтобы получить выходной сигнал внимания (a на шаге t) как взвешенную сумму скрытых состояний кодировщика.
- Соедините вывод внимания со скрытым состоянием декодера ([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 оспаривает опыт портала недвижимости, используя эти знания. Надеюсь, после прочтения статьи вы стали лучше разбираться в генерации текста и теперь можете найти полезные приложения для своей отрасли. Если вы хотите узнать больше, ниже приведены некоторые полезные и полезные ресурсы:
- CS224n: обработка естественного языка с глубоким обучением. Стэнфорд, зима 2019 (курс, который послужил источником вдохновения для этого блога)
- А. Карпаты. Неоправданная эффективность рекуррентных нейронных сетей, 2015 г.
- К. Олах. Понимание сетей LSTM, 2015 г.
- З. Се. Генерация нейронного текста: Практическое руководство. Препринт arXiv arXiv: 1711.09534v1, 2017
- Z. Hu. На пути к контролируемой генерации текста, 2018 г.
- Https://www.tensorflow.org/beta/tutorials/text/text_generation
- Https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html
Особая благодарность моим коллегам из Zoopla, которые ценят обмен знаниями и экспериментирование с новыми идеями, а также Яну Тайхманну за его отзывы и поддержку статьи.