Содержание курса 15 / 37

15 / 37 · Нейросетевые модели последовательностей

Внимание до трансформеров

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

Что нужно знать

Модели sequence-to-sequence

На этой странице 10

Энкодер–декодер из предыдущей заметки сжимает источник в одно состояние фиксированного размера ещё до того, как декодер что-либо напишет, и выходы показывают цену: гладкие предложения не о том. Декодер должен иметь возможность смотреть на источник по ходу письма и смотреть на разные его части для разных слов перевода. Богданау, Чо и Бенджио (2015) добавили именно это и назвали вниманием (attention). Эта заметка строит механизм, вручную проходит один шаг и показывает эксперимент, который измеряет, что он даёт.

Обозначения. Состояния энкодера h1,…,hS∈RHh_1, \dots, h_S \in \mathbb R^{H} (по одному на токен источника; 2H2H, если энкодер двунаправленный). Состояние декодера st∈RHs_t \in \mathbb R^{H} на шаге tt. Оценки et,ie_{t,i}, веса αt,i\alpha_{t,i}, вектор контекста ctc_t.

Отправная точка: последнее состояние как единственный канал#

Декодер инициализируется s0=f(hS)s_0 = f(h_S) и дальше работает сам. Нет операции, которой шаг tt декодера мог бы прочитать именно h3h_3. Состояния h1,…,hS−1h_1, \dots, h_{S-1} вычисляются и выбрасываются.

Механизм#

На шаге декодера tt:

  1. Оценить каждое состояние энкодера относительно состояния декодера. Простейшая оценка (attention score) — скалярное произведение, et,i=st⋅hie_{t,i} = s_t \cdot h_i; оно велико, когда два вектора смотрят в одну сторону. Есть и другие варианты (ниже), но какой бы ни использовался, на выходе одно число на позицию источника.
  2. Нормировать через softmax по позициям источника: αt,i=exp⁡(et,i)∑j=1Sexp⁡(et,j),∑iαt,i=1, αt,i>0.\alpha_{t,i} = \frac{\exp(e_{t,i})}{\sum_{j=1}^S \exp(e_{t,j})}, \qquad \sum_i \alpha_{t,i} = 1,\ \alpha_{t,i} > 0. Веса образуют распределение по источнику: «сколько от каждого токена источника использовать сейчас».
  3. Агрегировать в вектор контекста — взвешенную сумму состояний энкодера: ct=∑i=1Sαt,i hi∈RH.c_t = \sum_{i=1}^S \alpha_{t,i}\, h_i \in \mathbb R^{H}.
  4. Предсказать по состоянию декодера и контексту вместе, например конкатенировав их перед выходным слоем: P(yt∣y<t,x)=softmax(Wo[st;ct])P(y_t \mid y_{<t}, x) = \mathrm{softmax}(W_o [s_t; c_t]), и подать ctc_t также на следующий шаг декодера.

Каждая операция дифференцируема, поэтому оценивание выучивается обратным распространением ошибки от функции потерь перевода; ничто не говорит модели, какое слово источника соответствует какому слову перевода. Веса пересчитываются на каждом шаге: шаг t=1t = 1 может смотреть на первое слово источника, а шаг t=5t = 5 — на последнее.

Размерности для одного шага и батча из BB: состояния энкодера [B,S,H][B, S, H], состояние декодера [B,H][B, H], оценки [B,S][B, S], веса [B,S][B, S], контекст [B,H][B, H]. По всему переводу длины TT веса образуют тензор [B,T,S][B, T, S]; именно его показывают тепловые карты в заметке о переводе.

Разобранный пример#

Три состояния энкодера в двух измерениях, h1=(1,0)h_1 = (1, 0), h2=(0,1)h_2 = (0, 1), h3=(1,1)h_3 = (1, 1), и состояние декодера s=(0.9,0.2)s = (0.9, 0.2):

iiei=s⋅hie_i = s \cdot h_iexp⁡(ei)\exp(e_i)αi\alpha_i
10.90.92.4602.4600.3680.368
20.20.21.2211.2210.1830.183
31.11.13.0043.0040.4490.449

Знаменатель равен 2.460+1.221+3.004=6.6852.460 + 1.221 + 3.004 = 6.685. Контекст — 0.368 (1,0)+0.183 (0,1)+0.449 (1,1)=(0.817,0.632)0.368\,(1, 0) + 0.183\,(0, 1) + 0.449\,(1, 1) = (0.817, 0.632). Это точка внутри треугольника, натянутого на состояния энкодера, ближе всего к тем, на которые было похоже состояние декодера; ничего не выбрано, всё смешано в пропорции.

Рисунок

Один шаг внимания: что куда идёт

Оценки, веса и контекст для трёх состоянийОценки 0.9, 0.2, 1.1; веса 0.368, 0.183, 0.449; контекст (0.817, 0.632).новое10h101h211h30.90.2sts·h = 0.9s·h = 0.2s·h = 1.11softmax0.3680.1830.4492h1×0.3680.000h2×0.0000.183h3×0.4490.449+0.8170.632ct3Wo [st; ct]softmaxyt4входсостояниевеса и гейтывыходОценки, веса и контекст для трёх состоянийОценки 0.9, 0.2, 1.1; веса 0.368, 0.183, 0.449; контекст (0.817, 0.632).новое10h101h211h30.90.2st0.90.21.11softmax0.3680.1830.4492h1×0.3680.000h2×0.0000.183h3×0.4490.449+0.8170.632ct3Wo [st; ct]softmaxyt4входсостояниевеса и гейтывыход
Числа разобранного примера: три состояния энкодера и состояние декодера s = (0.9, 0.2). Состояние декодера сравнивается скалярным произведением с каждым состоянием энкодера (1), softmax превращает оценки в веса 0.368, 0.183, 0.449 (2), контекст — взвешенная сумма состояний энкодера, (0.817, 0.632) (3), и следующее слово предсказывается по состоянию декодера вместе с контекстом (4). Новое по сравнению с seq2seq: вместо одного s₀ в начале декодер на каждом шаге заново смешивает все состояния энкодера.

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

Функции оценки#

Скалярное произведение предполагает, что sts_t и hih_i живут в одном пространстве и имеют сравнимый масштаб. Распространены два обобщения (Luong, Pham and Manning, 2015):

Названиеet,ie_{t,i}Параметры
скалярное (dot)st⊤his_t^\top h_iнет
общее, билинейное (general)st⊤Whis_t^\top W h_iW∈RH×HW \in \mathbb R^{H \times H}
аддитивное (additive; Bahdanau et al., 2015)v⊤tanh⁡(W1st+W2hi)v^\top \tanh(W_1 s_t + W_2 h_i)W1,W2,vW_1, W_2, v

Аддитивная форма была исходной; скалярная — самая дешёвая, и с выученной проекцией обеих сторон именно её использует заметка о self-attention. Косинусное сходство, которое делит на нормы, тоже годится как оценка, но выбрасывает информацию о величине, которой модель может пользоваться; стандартный выбор — ненормированное скалярное произведение, в трансформере масштабированное константой.

Свидетельство: убрать узкое место из трансформера#

Чистое сравнение — не LSTM с вниманием против LSTM без него, потому что эти модели различаются в нескольких отношениях. Более точный эксперимент использует однослойный трансформер из заметки о переводе, декодер которого читает энкодер ровно через описанный выше механизм (там он называется cross-attention). Две версии обучаются одинаково по 10 эпох на Multi30k:

Декодер может смотреть наBLEU на тесте
все SS состояний энкодера0.320
только первое состояние энкодера (искусственное узкое место)0.190
энкодер–декодер на LSTM без внимания (предыдущая заметка)0.152

Ограничение декодера одним вектором энкодера стоит 0.13 BLEU и опускает трансформер почти до уровня LSTM. Всё остальное (self-attention внутри декодера, полносвязные слои, эмбеддинги) не меняется, поэтому разницу можно приписать доступу декодера ко всему набору состояний источника. Проблема — в узком месте, а внимание — его устранение.

В этой задаче выученные веса интерпретируемы. Если нарисовать их матрицей, где строки — токены перевода, а столбцы — токены источника, cross-attention однослойной модели близко к диагонали, причём каждый английский токен смотрит на немецкий токен, следующий за тем, который он переводит: модель предсказывает следующий токен, и самое полезное, что можно прочитать, — слово источника, соответствующее следующему выходу.

Что даёт внимание#

  • Нет сводки фиксированного размера. Декодер читает SS векторов, какой бы длины ни был источник. Длинные предложения больше не сжимаются сильнее коротких.
  • Выравнивание даром. Веса αt,i\alpha_{t,i} — мягкое выравнивание слов, выученное только по парам переводов.
  • Короткий путь градиента. Функция потерь на шаге перевода tt доходит до состояния энкодера hih_i через одну взвешенную сумму, а не через S+tS + t рекуррентных шагов, что облегчает проблему затухания из заметки о RNN.

Что изменилось#

Энкодер–декодерС вниманием
Информация об источнике на шагеs0s_0, фиксированнаяctc_t, пересчитывается
Используемые состояния энкодератолько hSh_Sвсе h1,…,hSh_1, \dots, h_S
Дополнительные вычисления на шаге—SS оценок, один softmax, одна взвешенная сумма
Дополнительные параметры—нет (dot) до O(H2)O(H^2) (general, additive)
BLEU, Multi30k, декодер однослойного трансформера0.190 (с узким местом)0.320

Ограничения#

  • Энкодер по-прежнему рекуррентный. Состояния hih_i вычисляются последовательно, поэтому энкодер не распараллеливается вдоль источника, и каждое hih_i по-прежнему несёт источник только через цепочку рекурсий.
  • Внимание только между декодером и энкодером. Внутри источника токен ii узнаёт о токене jj только через рекурсию; внутри перевода — так же. Нет причин, по которым та же оценка не могла бы связывать позиции одной последовательности между собой.
  • Цена шага — O(S)O(S). Для предложений нормально; для документов уже заметно, а когда каждая позиция смотрит на каждую, цена становится квадратичной.
  • Мягкие веса — не объяснения. Почти диагональное выравнивание на наборе подписей к изображениям не обобщается до утверждения, что веса внимания показывают, что модель «использует» (Jain and Wallace, 2019).

Что нужно запомнить#

  • Внимание на шаге tt: оценки et,ie_{t,i} между состоянием декодера и каждым состоянием энкодера, softmax по ii, контекст ct=∑iαt,ihic_t = \sum_i \alpha_{t,i} h_i, предсказание по [st;ct][s_t; c_t].
  • Веса — распределение по позициям источника, пересчитываемое для каждого выходного токена и выучиваемое по функции потерь задачи.
  • Оценка скалярным произведением самая дешёвая; аддитивный и билинейный варианты добавляют параметры.
  • Если убрать у декодера доступ ко всем состояниям энкодера, в остальном идентичная модель теряет на 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 в матричной форме, с запросами, ключами и значениями, и на нём строится трансформер.

Литература#