Перейти к основному содержимому

Механизм внимания в рекуррентных сетях

Рекуррентные нейронные сети призваны обрабатывать входные данные в виде последовательности элементов произвольной длины. Центральная задача при обработке таких данных - это полноценный учёт исторических элементов последовательности, которые нейросеть уже пронаблюдала.

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

Рекуррентные сети, основанные на гейтах, такие как LSTM и GRU позволяют лучше учитывать дальнюю историю за счёт замены численно неустойчивых многократных перемножений матриц на взвешенные суммы, что позволяет помнить историю лучше и эффективнее учитывать её в прогнозах.

Однако даже эти модели не могут полноценно обработать слишком длинные последовательности, поскольку вынуждены хранить информацию о всех ранее виденных наблюдениях (которых может быть очень много) в векторе фиксированного размера.

Для более эффективной обработки длинных последовательностей в нейронных сетях используется механизм внимания (attention mechanism), позволяющий на этапе генерации выхода обращаться к любому элементу входной последовательности напрямую, при котором потери информации не может быть в принципе!

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

Далее мы разберём механизм внимания более подробно на примере рекуррентной сети для задачи машинного перевода. Те же самые принципы могут использоваться для обработки последовательностей любого типа.

Идея внимания

Рассмотрим задачу машинного перевода (machine translation), т.е. автоматического перевода текста на с одного языка на другой. Эту задачу можно решить архитектурой many-to-many, используя две рекуррентных сети - кодировщик и декодировщик, как показано на схеме:

Кодировщик проходит по токенам входной последовательности (словам на исходном языке), после чего её итоговое внутреннее состояние кодирует всю эту последовательность целиком в виде вектора фиксированного размера hTh_T.

Внутреннее состояние декодировщика инициализируется состоянием hTh_T и осуществляет генерацию перевода в авторегрессионном режиме.

Указанная архитектура обладает недостатком, что переводимый текст может быть произвольной длины, но конструктивно его приходится кодировать в виде вектора фиксированного размера hTh_T, что приводит к потере информации о тексте, если он слишком длинный (чем он длиннее - тем больше).

В статье [1] предложено использовать механизм внимания (attention mechanism), чтобы при генерации каждого выходного токена декодировщик мог смотреть на все токены входной последовательности, как показано на рисунке:

Так кодировочной сети не придётся запоминать каждый входной токен, и потери информации не произойдёт.

Обратим внимание, что внимание нацелено на все входные токены, а не на какой-то один (soft attention). Это объясняется особенностями настройки нейросетей и позволяет повысить точность перевода, учитывая не только сами слова, но и контекст соседних слов, в котором они находятся.

Например, слово "замок" может быть переведено как "castle" или как "lock". Для разрешения неоднозначности необходимо анализировать соседние слова:

  • Замок имеет шесть башен и окружён глубоким рвом -> castle.

  • Замок заржавел, и ключ в нём не поворачивается -> lock.

В первом случае внимание восстановит смысл по таким словам, как "башня" и "ров". А во втором - по слову "ключ".

Технически механизм внимания использует 3 сущности:

  • запросы (queries)

  • ключи (keys)

  • значения (values)

Его работа вдохновлена SQL запросами к базе данных вида

select VALUE where KEY=QUERY

в которых считывается значение записи (VALUE), у которой ключ (KEY) совпадает с запросом (QUERY).

Графически это можно представить следующим образом:

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

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

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

Более конкретно, в работе [1] в качестве кодировщика использована двунаправленная рекуррентная сеть, сопоставляющая каждому входному токену xnx_n векторы двух внутренних состояний hn\overrightarrow{h}_n и hn\overleftarrow{h}_n для рекуррентных сетей, идущих слева-направо и справа-налево. Эти состояния конкатенируются в один вектор:

hn=[hn,hn],h_n=[\overrightarrow{h}_n, \overleftarrow{h}_n],

представляющий собой эмбеддинг слова с учётом его левого и правого контекста, то есть в контексте всего входного текста. Эти эмбеддинги в [1] представляют собой одновременно и ключи, и значения для всех TT входных токенов.

Декодировочная сеть, представляющая рекуррентную сеть, идущую слева-направо и имеет внутреннее состояние sms_m, пересчитываемое с использованием механизма внимания. Запросом выступает состояние декодировщика sms_m, а ключами и значениями - состояния кодировщика для всех элементов входной последовательности.

Генерация состояния sts_t в ней состоит из следующих этапов:

  1. Вычисляется степень соответствия каждого входного токена текущему состоянию, используя функцию score:
etj=score(st1,hj),j=1,2,...T,e_{tj}=\text{score}\left(s_{t-1},h_{j}\right),j=1,2,...T,

где TT - длина входного текста (число токенов).

  1. Вычисляются веса учета состояний кодировочной сети. Для этого степени соответствия пропускаются через SoftMax преобразование:
αti=exp(eti)/j=1Texp(etj),  j=1,2,...T\alpha_{ti}=\exp(e_{ti})/\sum_{j=1}^{T}\exp(e_{tj}),\;j=1,2,...T
  1. Вычисляется контекстный вектор, суммаризующий информацию об интересующих входных токенах в контексте текущего запроса:
ct=jαtjhjc_{t}=\sum_{j}\alpha_{tj}h_{j}
  1. Осуществляется пересчёт состояния декодировочной сети, используя контекстный вектор с предыдущего шага:
st=f(st1,yt1,ct)s_{t}=f\left(s_{t-1},y_{t-1},c_{t}\right)

Графически это можно представить следующим образом [1]:

Вычислительные требования

Как видим, у рекуррентной сети со вниманием повышенные требования на память и вычисления по сравнению с обычной:

  • требуется хранить ключи и значения (внутренние состояния кодировщика)

  • при генерации каждого выходного токена нужно вычислять и учитывать контекстный вектор, причём сложность его вычисления пропорциональна длине всей входной последовательности.

Поэтому на практике длинную входную последовательность разбивают на отдельные блоки и обрабатывают их отдельно. В машинном переводе естественно переводить не весь текст целиком, а каждое предложение по отдельности.

Вычисление соответствий

Вычислять соответствие можно по-разному. Ниже приведены основные варианты:

английское названиеформула
dot-productsThs^{T}h
scaled dot-productsTh/ds^{T}h/\sqrt{d}
content-basedsTh/(sh)s^{T}h/\left(\left\lVert s\right\rVert \left\lVert h\right\rVert \right)
additivewTtanh(W1s+W2h)w^{T}\tanh\left(W_{1}s+W_{2}h\right)
multiplicativesTWhs^{T}Wh
feed-forwardMLP(s,h)\text{MLP}(s,h)

Самым общим способом вычисления соответствия является применение многослойного персептрона к запросу и ключу. Additive attention является частным случаем, когда используется всего один скрытый слой с активацией гиперболического тангенса.

Результат использования

Использование механизма внимания в [1] позволило значительно повысить качество машинного перевода, измеренное по мере BLEU, особенно для длинных текстов.

Ниже приведено среднее значение этой меры при обучении на предложениях длины до 30 и до 50 слов

  • обычной many-to-many архитектурой (RNNenc)

  • many-to-many архитектурой с использованием внимания (RNNsearch) [1]:

Чем BLEU выше, тем модель осуществляет более точный перевод. Как видим, нейросеть с механизмом внимания работает точнее обычной many-to-many архитектуры, а её качество тем выше, чем на более длинных предложениях она обучалась.

Интерпретируемость

Помимо повышения точности, другим немаловажным преимуществом сети со вниманием является её повышенная интерпретируемость за счёт визуализации весов внимания.

Это можно делать для каждого выходного токена {αti}i\{\alpha_{ti}\}_i, а можно визуализировать все веса {αti}ti\{\alpha_{ti}\}_{ti} сразу в виде матрицы внимания (attention matrix) MRT×KM\in\mathbb{R}^{T\times K}, где

  • TT - длина входного предложения,

  • KK - длина выходного предложения (перевода),

а jj-й столбец содержит вектор вниманий на при генерации jj-го выходного токена [1]:

При корректно настроенном переводчике эта матрица будет близка к диагональной, поскольку последовательным входным словам обычно соответствуют последовательные выходные, за редкими исключениями, как в примере выше, когда

"European Economic Area" по-французски будет "zone économique européen".

Другие применения

Предложенная архитектура со вниманием может эффективно использоваться и в других приложениях, таких как распознавание речи по спектрограмме (speech recognition) и текстовом описании того, что показано на иллюстрации (image captioning), как показано на рисунке сверху и снизу [2]:

При распознавании речи о корректности настройки модели можно судить по тому, насколько матрица внимания близка к диагональной, поскольку последовательным звукам должны соответствовать последовательные распознанные символы.

При описании изображений входом является не последовательность, а всё изображение целиком, представленное в виде промежуточного представления изображения внутри свёрточного кодировщика (например, на промежуточном слое сети VGG) XRH×W×CX\in\mathbb{R}^{H\times W \times C}. Запросами в механизме внимания выступает внутреннее состояние рекуррентного декодировщика, последовательно генерирующего слова. А ключами и значениями выступают преобразованные CC-мерные векторы внутреннего представления изображения. Поскольку для этих векторов известны их координаты, то можно определить, куда было нацелено внимание сети на изображении, когда декодировщик генерировал каждое слово. Если слово соответствует правильному объекту на изображении, как для слова frisbee выше, то это свидетельствует в пользу того, что нейросеть настроилась корректно и не переобучилась.

Литература

  1. Bahdanau D. Neural machine translation by jointly learning to align and translate //arXiv preprint arXiv:1409.0473. – 2014.
  2. https://distill.pub/2016/augmented-rnns/