More attention, please!

More attention, please!

@notmagicneuralnetworks

Итак, перед нами стоит задача машинного перевода (Seq2Seq): получение одной последовательности из другой, причем они могут быть разной длинны.

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

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

Однако, при переводе текста мы можем фокусировать свое внимание на некоторых словах. На картинке ниже приведен такой пример:

Attention (или механизм внимания) как раз выполняет эту функцию.

Допустим, наш текст уже прошелся по энкодеру (слово за словом) и у нас уже имеются скрытые представления (hidden-ы) на каждом слое.

Когда мы начинаем формировать перевод, пусть скрытые состояния декода посмотрят на все скрытые состояния энкодера и выберут для себя наиболее важные.

Например, формируем мы первое слово перевода. На вход рекуррентному слою подается:

  1. эмбеддинг токена<bos>, который говорит о начале предложения
  2. вектор контекста из энкодера (который передает всю информацию о тексте) становится скрытым состоянием декодера (hidden)

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

То есть, скрытое состояние декодера скалярно перемножается с каждым скрытым состоянием энкодера. После, все эти значения пропускаются через Softmax, чтобы получить вероятности важности каждого слова (w1, w2, ... ). Далее, формируется вектор контекста (c): каждое состояние энкодера умножается на соответствующие им вероятности (w1, w2, ... ). Этот вектор контекста возвращается в декодер и учитывается при выходе из рекуррентной ячейки (формировании распределения вероятностей на слова).

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

Весьма логично, что слово dogs теснее всего связано со словом собак, а слову очень соответствуют целых два слова: very и much.

Report Page