CS224N: языковые модели, RNN, seq2seq и внимание (конспект)
Пересказ конспектов Stanford CS224N о языковых моделях и машинном переводе: n-граммы и оконная нейронная модель, RNN и перплексия, затухающие и взрывающиеся градиенты, отсечение градиента, GRU и LSTM, двунаправленные сети, seq2seq, внимание Богданау и Луонга, стратегии декодирования, BLEU, большой словарь, копирование и подслова.
Часть 1. Языковые модели и рекуррентные сети
Заголовок раздела «Часть 1. Языковые модели и рекуррентные сети»Языковая модель
Заголовок раздела «Языковая модель»Языковая модель приписывает вероятность последовательности слов. По цепному правилу вероятностей
и вся сложность — в условных вероятностях. Языковые модели нужны везде, где из нескольких вариантов текста надо выбрать правдоподобный: в распознавании речи, машинном переводе, исправлении ошибок.
n-граммы. Классический приём — считать, что слово зависит только от предыдущих (марковское предположение), и оценивать вероятности частотами: . Две проблемы: разреженность (если тройка ни разу не встречалась, вероятность нулевая — спасает сглаживание, добавление малого числа к счётчикам; если не встречался даже префикс — откат к более короткому контексту, backoff) и память (число n-грамм растёт с корпусом и с , поэтому больше 5 почти не берут).
Оконная нейронная модель (Бенжио и др., 2003): склеить векторы предыдущих слов, пропустить через скрытый слой и softmax по словарю. Разреженности нет — похожие слова получают похожие векторы, — но окно по-прежнему фиксированное, и каждое место в окне имеет свои веса.
Рекуррентная сеть читает текст по одному слову и хранит скрытое состояние , в которое «сворачивается» вся история:
Веса одни и те же на каждом шаге — поэтому число параметров не зависит от длины текста, а сеть применима к последовательностям любой длины.
flowchart LR X1["x₁"] --> H1["h₁"] X2["x₂"] --> H2["h₂"] X3["x₃"] --> H3["h₃"] H0["h₀"] -->|"W(hh)"| H1 -->|"W(hh)"| H2 -->|"W(hh)"| H3 H1 --> Y1["ŷ₁"] H2 --> Y2["ŷ₂"] H3 --> Y3["ŷ₃"]
Функция потерь и перплексия. На каждом шаге — кросс-энтропия между предсказанным распределением и настоящим следующим словом; по корпусу — среднее . Модели сравнивают по перплексии: в конспекте она записана как (при логарифме по основанию 2; с натуральным логарифмом — ). Перплексия — это «эффективное число вариантов», из которых модель выбирает следующее слово: чем меньше, тем увереннее и точнее модель.
Плюсы и минусы RNN. Плюсы: вход любой длины, размер модели не растёт с длиной, в принципе учитывается вся история. Минусы: вычисления последовательны (медленно, плохо параллелятся), и на практике информацию с далёких шагов сеть удерживает плохо. Память тоже велика: для обратного прохода нужно хранить состояния всех шагов.
Затухающие и взрывающиеся градиенты
Заголовок раздела «Затухающие и взрывающиеся градиенты»Градиент потерь на шаге по состоянию на шаге содержит произведение якобианов
. Каждый множитель включает и производную
нелинейности, и если их нормы стабильно меньше единицы, произведение затухает экспоненциально (сеть «не чувствует»
далёкие слова), а если больше — взрывается (обучение срывается, появляются NaN). Конспект приводит пример: в коротком тексте «Jane walked into the room. John walked in too. Jane said hi to ___»
модель легко подставит «John», а если между фразами вставить ещё одно длинное предложение, информация о Джоне доходит
до места предсказания уже слишком ослабленной.
Средства, перечисленные в конспекте:
- Отсечение градиента (gradient clipping, Миколов): если норма градиента больше порога, его масштабируют до этого порога. Просто и надёжно против взрыва.
- Против затухания — инициализация единичной матрицей и ReLU вместо сигмоиды (производная ReLU — 0 или 1, она не «сжимает» градиент).
- Глубокие и двунаправленные RNN: две сети читают текст слева направо и справа налево, их состояния склеиваются, так что каждое слово видит и прошлый, и будущий контекст; слои можно складывать стопкой.
GRU и LSTM
Заголовок раздела «GRU и LSTM»Главное решение проблемы долгих зависимостей — вентили, которые учатся решать, что сохранить, а что забыть.
GRU (gated recurrent unit): вентиль обновления решает, сколько взять от старого состояния, вентиль сброса — сколько прошлого учитывать при вычислении нового кандидата:
Когда близок к единице, состояние почти копируется без изменений — и градиент проходит через много шагов, не затухая.
LSTM (long short-term memory) хранит отдельную ячейку памяти и управляет ею тремя вентилями — входным , забывания и выходным :
где каждый вентиль — сигмоида от линейной функции и . Ячейка обновляется сложением, а не умножением на матрицу, — это и есть «шоссе» для градиента. Та же идея позже появилась в остаточных связях трансформеров (урок 3.4.2).
Часть 2. Машинный перевод: seq2seq и внимание
Заголовок раздела «Часть 2. Машинный перевод: seq2seq и внимание»Seq2seq
Заголовок раздела «Seq2seq»До нейросетей перевод делали статистические системы из многих частей (модели выравнивания, фразовые таблицы, языковые модели). Seq2seq (Суцкевер и др., 2014; Чо и др., 2014) — одна сквозная сеть из двух частей:
- кодировщик читает исходное предложение (часто задом наперёд или двунаправленно, несколькими слоями LSTM) и сжимает его в вектор контекста — последнее скрытое состояние;
- декодировщик — языковая модель, обусловленная этим вектором: начиная с токена начала, генерирует перевод слово за словом, подавая на вход предыдущее слово, пока не выдаст токен конца.
Обучение — кросс-энтропия на правильных переводах (на вход декодировщику подают правильное предыдущее слово, а не своё предсказание).
Внимание
Заголовок раздела «Внимание»Проблема seq2seq — бутылочное горлышко: всё предложение, каким бы длинным оно ни было, должно уместиться в один вектор фиксированного размера. Качество перевода падает на длинных предложениях. При этом человек-переводчик, выбирая очередное слово, смотрит на определённые слова оригинала.
Внимание (Богданау, Чо, Бенжио, 2014) даёт декодировщику на каждом шаге свой вектор контекста — взвешенную сумму состояний кодировщика :
где — предыдущее состояние декодировщика, а — небольшая сеть, оценивающая, насколько слово оригинала важно для шага . Веса — мягкое выравнивание слов перевода со словами оригинала, которое модель выучивает сама, без разметки; их удобно рисовать картой и смотреть, что с чем сопоставилось. С вниманием качество на длинных предложениях перестаёт падать.
flowchart LR
subgraph enc["Кодировщик"]
H1["h₁"] --- H2["h₂"] --- H3["h₃"] --- H4["h₄"]
end
H1 -->|"α₁"| C(("cᵢ = Σ αⱼ hⱼ"))
H2 -->|"α₂"| C
H3 -->|"α₃"| C
H4 -->|"α₄"| C
S["sᵢ₋₁ (декодировщик)"] -.->|"оценки eᵢⱼ → softmax"| C
C --> D["sᵢ → следующее слово"]Варианты Луонга (Луонг, Фам, Мэннинг, 2015): глобальное внимание смотрит на все слова оригинала, а оценку можно считать по-разному — скалярным произведением , билинейной формой или маленькой сетью; локальное внимание сначала предсказывает позицию выравнивания и смотрит только на окно вокруг неё.
Google NMT (2016) показал, что одна модель может переводить между многими парами языков, если добавить ко входу токен целевого языка, — и даже переводить между парами, которых не было в обучении («перевод с нуля», zero-shot).
Отсюда прямой путь к трансформеру: «Attention Is All You Need» (2017) убрал рекуррентность и оставил только внимание. Это тема урока 4.4.2 и наших переводов Transformer Explainer.
Как генерировать: декодирование
Заголовок раздела «Как генерировать: декодирование»Модель выдаёт распределение следующего слова; как из него получить предложение?
- Сэмплирование из предков (ancestral sampling) — на каждом шаге случайно выбирать слово по распределению. Несмещённо, но с большой дисперсией: каждый запуск даёт другой перевод.
- Жадный поиск — каждый раз брать самое вероятное слово. Быстро, но ранняя ошибка уже не исправляется.
- Поиск лучом (beam search) — держать лучших частичных гипотез и на каждом шаге расширять их, оставляя снова лучших. На практике в переводе используют именно его.
Подробнее о стратегиях генерации — в уроке 4.1.3.
Как оценивать перевод
Заголовок раздела «Как оценивать перевод»Оценка людьми — эталон, но дорого и медленно. Оценка через другую задачу (например, ответы на вопросы по переводу) косвенна. Стандарт автоматической оценки — BLEU (Папинени и др., 2002): доля n-грамм перевода (обычно до 4-грамм), встречающихся в эталонных переводах, с геометрическим средним по и штрафом за краткость, чтобы нельзя было набрать балл, выдав пару точных слов:
BLEU хорошо коррелирует с людьми на уровне корпуса, но плохо — на отдельном предложении и не замечает верных перефразирований. О метриках и их ограничениях — в уроке 7.3.1.
Большой словарь и редкие слова
Заголовок раздела «Большой словарь и редкие слова»Softmax по словарю из сотен тысяч слов дорог. Конспект перечисляет приёмы:
- Ускорить softmax: оценка через шумовой контраст (NCE, родственник отрицательного сэмплирования из word2vec) и иерархический softmax.
- Уменьшить словарь: обучать на подмножествах данных с ограниченным целевым словарём (Жан и др.) и при переводе строить «список кандидатов» для каждого предложения — самых частых слов плюс вероятных переводов каждого исходного слова (в конспекте приведены значения = 15–50 тыс., = 10–20).
- Неизвестные слова: механизм копирования (Гульчехре и др.) — модель решает, сгенерировать слово из словаря или скопировать его из оригинала по распределению внимания. Авторы Google NMT замечали, что это ненадёжно в масштабе и что редкие слова иногда лучше транслитерировать.
- Подслова и символы: разбивать редкие слова на части — BPE (Зеннрих и др., 2016), символьные модели и гибриды «слова + символы для неизвестных слов» (Луонг и Мэннинг, 2016). Подсловная токенизация победила и стала стандартом всех современных LLM — см. урок 4.2.2 «BPE».
Словарик
Заголовок раздела «Словарик»| EN | RU |
|---|---|
| language model, n-gram, backoff | языковая модель, n-грамма, откат |
| hidden state, perplexity | скрытое состояние, перплексия |
| vanishing / exploding gradients | затухающие / взрывающиеся градиенты |
| gradient clipping | отсечение градиента |
| GRU, LSTM, gate, memory cell | GRU, LSTM, вентиль, ячейка памяти |
| encoder, decoder, seq2seq | кодировщик, декодировщик, seq2seq |
| attention, alignment | внимание, выравнивание |
| greedy search, beam search | жадный поиск, поиск лучом |
| BLEU, brevity penalty | BLEU, штраф за краткость |
| copy mechanism, subword | механизм копирования, подслово |