15 / 37 · Нейросетевые модели последовательностей
Внимание до трансформеров
На каждом шаге декодера сравнить его состояние с каждым состоянием энкодера, превратить оценки в веса через softmax и подать декодеру взвешенную сумму состояний энкодера; это убирает узкое место фиксированного вектора, а абляция на задаче перевода измеряет, сколько это стоит.
На этой странице 10
Энкодер–декодер из предыдущей заметки сжимает источник в одно состояние фиксированного размера ещё до того, как декодер что-либо напишет, и выходы показывают цену: гладкие предложения не о том. Декодер должен иметь возможность смотреть на источник по ходу письма и смотреть на разные его части для разных слов перевода. Богданау, Чо и Бенджио (2015) добавили именно это и назвали вниманием (attention). Эта заметка строит механизм, вручную проходит один шаг и показывает эксперимент, который измеряет, что он даёт.
Обозначения. Состояния энкодера (по одному на токен источника; , если энкодер двунаправленный). Состояние декодера на шаге . Оценки , веса , вектор контекста .
Отправная точка: последнее состояние как единственный канал#
Декодер инициализируется и дальше работает сам. Нет операции, которой шаг декодера мог бы прочитать именно . Состояния вычисляются и выбрасываются.
Механизм#
На шаге декодера :
- Оценить каждое состояние энкодера относительно состояния декодера. Простейшая оценка (attention score) — скалярное произведение, ; оно велико, когда два вектора смотрят в одну сторону. Есть и другие варианты (ниже), но какой бы ни использовался, на выходе одно число на позицию источника.
- Нормировать через softmax по позициям источника: Веса образуют распределение по источнику: «сколько от каждого токена источника использовать сейчас».
- Агрегировать в вектор контекста — взвешенную сумму состояний энкодера:
- Предсказать по состоянию декодера и контексту вместе, например конкатенировав их перед выходным слоем: , и подать также на следующий шаг декодера.
Каждая операция дифференцируема, поэтому оценивание выучивается обратным распространением ошибки от функции потерь перевода; ничто не говорит модели, какое слово источника соответствует какому слову перевода. Веса пересчитываются на каждом шаге: шаг может смотреть на первое слово источника, а шаг — на последнее.
Размерности для одного шага и батча из : состояния энкодера , состояние декодера , оценки , веса , контекст . По всему переводу длины веса образуют тензор ; именно его показывают тепловые карты в заметке о переводе.
Разобранный пример#
Три состояния энкодера в двух измерениях, , , , и состояние декодера :
| 1 | |||
| 2 | |||
| 3 |
Знаменатель равен . Контекст — . Это точка внутри треугольника, натянутого на состояния энкодера, ближе всего к тем, на которые было похоже состояние декодера; ничего не выбрано, всё смешано в пропорции.
Один шаг внимания: что куда идёт
Рисунок проводит четыре шага механизма на этих числах; кнопки под ним показывают их по одному. По сравнению с рисунком энкодера–декодера в энкодере ничего не меняется. Меняется связь энкодера с декодером: вместо одного вектора, переданного один раз, декодер на каждом шаге обращается ко всем состояниям энкодера с весами, которые вычисляет сам.
Функции оценки#
Скалярное произведение предполагает, что и живут в одном пространстве и имеют сравнимый масштаб. Распространены два обобщения (Luong, Pham and Manning, 2015):
| Название | Параметры | |
|---|---|---|
| скалярное (dot) | нет | |
| общее, билинейное (general) | ||
| аддитивное (additive; Bahdanau et al., 2015) |
Аддитивная форма была исходной; скалярная — самая дешёвая, и с выученной проекцией обеих сторон именно её использует заметка о self-attention. Косинусное сходство, которое делит на нормы, тоже годится как оценка, но выбрасывает информацию о величине, которой модель может пользоваться; стандартный выбор — ненормированное скалярное произведение, в трансформере масштабированное константой.
Свидетельство: убрать узкое место из трансформера#
Чистое сравнение — не LSTM с вниманием против LSTM без него, потому что эти модели различаются в нескольких отношениях. Более точный эксперимент использует однослойный трансформер из заметки о переводе, декодер которого читает энкодер ровно через описанный выше механизм (там он называется cross-attention). Две версии обучаются одинаково по 10 эпох на Multi30k:
| Декодер может смотреть на | BLEU на тесте |
|---|---|
| все состояний энкодера | 0.320 |
| только первое состояние энкодера (искусственное узкое место) | 0.190 |
| энкодер–декодер на LSTM без внимания (предыдущая заметка) | 0.152 |
Ограничение декодера одним вектором энкодера стоит 0.13 BLEU и опускает трансформер почти до уровня LSTM. Всё остальное (self-attention внутри декодера, полносвязные слои, эмбеддинги) не меняется, поэтому разницу можно приписать доступу декодера ко всему набору состояний источника. Проблема — в узком месте, а внимание — его устранение.
В этой задаче выученные веса интерпретируемы. Если нарисовать их матрицей, где строки — токены перевода, а столбцы — токены источника, cross-attention однослойной модели близко к диагонали, причём каждый английский токен смотрит на немецкий токен, следующий за тем, который он переводит: модель предсказывает следующий токен, и самое полезное, что можно прочитать, — слово источника, соответствующее следующему выходу.
Что даёт внимание#
- Нет сводки фиксированного размера. Декодер читает векторов, какой бы длины ни был источник. Длинные предложения больше не сжимаются сильнее коротких.
- Выравнивание даром. Веса — мягкое выравнивание слов, выученное только по парам переводов.
- Короткий путь градиента. Функция потерь на шаге перевода доходит до состояния энкодера через одну взвешенную сумму, а не через рекуррентных шагов, что облегчает проблему затухания из заметки о RNN.
Что изменилось#
| Энкодер–декодер | С вниманием | |
|---|---|---|
| Информация об источнике на шаге | , фиксированная | , пересчитывается |
| Используемые состояния энкодера | только | все |
| Дополнительные вычисления на шаге | — | оценок, один softmax, одна взвешенная сумма |
| Дополнительные параметры | — | нет (dot) до (general, additive) |
| BLEU, Multi30k, декодер однослойного трансформера | 0.190 (с узким местом) | 0.320 |
Ограничения#
- Энкодер по-прежнему рекуррентный. Состояния вычисляются последовательно, поэтому энкодер не распараллеливается вдоль источника, и каждое по-прежнему несёт источник только через цепочку рекурсий.
- Внимание только между декодером и энкодером. Внутри источника токен узнаёт о токене только через рекурсию; внутри перевода — так же. Нет причин, по которым та же оценка не могла бы связывать позиции одной последовательности между собой.
- Цена шага — . Для предложений нормально; для документов уже заметно, а когда каждая позиция смотрит на каждую, цена становится квадратичной.
- Мягкие веса — не объяснения. Почти диагональное выравнивание на наборе подписей к изображениям не обобщается до утверждения, что веса внимания показывают, что модель «использует» (Jain and Wallace, 2019).
Что нужно запомнить#
- Внимание на шаге : оценки между состоянием декодера и каждым состоянием энкодера, softmax по , контекст , предсказание по .
- Веса — распределение по позициям источника, пересчитываемое для каждого выходного токена и выучиваемое по функции потерь задачи.
- Оценка скалярным произведением самая дешёвая; аддитивный и билинейный варианты добавляют параметры.
- Если убрать у декодера доступ ко всем состояниям энкодера, в остальном идентичная модель теряет на Multi30k 0.13 BLEU.
- Внимание убирает узкое место, но не рекурсию.
Ноутбук#
week04_lstm_attention_transformer.ipynb. Номера ячеек считают все ячейки, включая текстовые, начиная с 1. Приведённые числа взяты из прогона, сохранённого в курсе; у ячеек, изменённых с тех пор под текущие версии библиотек, сохранённого выхода нет.
- Ячейки 58–64 определяют и обучают однослойный
Seq2SeqTransformer(скрытый размер 128, 8 голов); у ячейки обучения нет сохранённого выхода, а текстовая ячейка 64 приводит BLEU на тесте, 0.32. Модель описывает заметка о переводе. - Ячейки 72–79 извлекают веса cross-attention декодера с помощью forward hook (тензор
[32, 31, 32]весов батч × перевод × источник, каждая строка в сумме даёт 1) и рисуют их для шести коротких тестовых пар; описанный выше почти диагональный шаблон со сдвигом на один токен виден на сохранённом рисунке. - Ячейки 81–86 определяют
Seq2SeqTransformerNoCA, чейdecodeпередаёт в качестве памяти энкодера толькоencoded_input[:, :1](состояние первого токена источника), обучают её так же; текстовая ячейка 86 приводит её BLEU, 0.19.
Дальше#
Внимание сравнивало состояние декодера с состояниями энкодера. Ничто в механизме не требует, чтобы стороны были из разных сетей: последовательность может смотреть на саму себя, когда каждая позиция оценивает каждую другую и агрегирует их значения. Так рекурсия исчезает совсем, потому что новое представление каждой позиции — взвешенная сумма, вычисленная одним матричным произведением параллельно по всей последовательности. Следующая заметка записывает self-attention в матричной форме, с запросами, ключами и значениями, и на нём строится трансформер.
Литература#
- D. Bahdanau, K. Cho, Y. Bengio. Neural Machine Translation by Jointly Learning to Align and Translate. ICLR, 2015. Аддитивное внимание.
- M.-T. Luong, H. Pham, C. D. Manning. Effective Approaches to Attention-based Neural Machine Translation. EMNLP, 2015. Оценки dot, general и concat; глобальное и локальное внимание.
- S. Jain, B. C. Wallace. Attention is not Explanation. NAACL, 2019.
- D. Jurafsky, J. H. Martin. Speech and Language Processing, 3rd ed. draft. Глава 13 (машинный перевод; энкодер–декодер с вниманием).