Что такое attention
DeepSchoolАвторы: Ксения Рябинова, Марк Страхов
Редактура: Александр Гончаренко, Тимур Фатыхов, Денис Рябоконь
Интуиция
Бывают ситуации, когда нам нужно, чтобы сеть “смотрела” не только на локальный контекст, а сразу на все изображение, т.е. на глобальный контекст.
Что нужно, чтобы сверточная сеть “видела” сразу всю картинку? Например, можно добавить слоев и увеличить глубину. Еще можно увеличить размерность сверток или изменить сам сверточный слой (например, заменить на dilated). А можно использовать attention-слой.
Простой attention-слой
Attention-слоев бывает много разных, но основная идея всегда одна: мы рассчитываем релевантность какой-либо информации и агрегируем ее.
Рассмотрим самый простой вариант: взвесим feature-map по одной из осей.
Feature-map может быть любой. Например, это могут быть фичи с любой части сети или эмбеддинги каких-либо сущностей.
Запишем attention в виде формулы:
Поставим в формулу матрицы из примера на первом рисунке.
Операция похожа на global-pooling, но с одним отличием: фичи у feature-map теперь взвешены с помощью attention-scores. Attention-scores меняются в зависимости от входа сети.
Attention часто называют умным пуллингом. Потому что мы не просто усредняем по фичам (или находим максимум), а хитро взвешиваем, и веса у нас каждый раз разные. Таким образом получаем больше вариативности.
Attention может быть локальным и глобальным, может применяться к разным фичам (к каналам, к эмбеддингам токенов и др.). Но по сути мы выполняем взвешивание скорами, которые меняются в зависимости от входных данных.
Вот, собственно, и все.
Заметка
Attention - это операция, которая рассчитывает релевантность, а затем агрегирует входные данные в соответствии с этой релевантностью. Но часто в статьях, упоминающих attention, всплывают сущности под названием Query, Key и Value. Эти термины легко могут запутать, поэтому давайте с ними разберемся.
Откуда берутся Query, Key, Value?
Рассмотрим на примере Dot-product Self-attention (Self-attention - это attention, который применяется к одной и той же feature-map, a Dot-product означает, что внутри расчета релевантности есть скалярное произведение).
Query, Key и Value - это тензоры, которые участвуют в расчете attention. Судя по всему, традиция называть так эти тензоры пошла из статьи “Attention is all you need”. Эти тензоры получаются после умножения feature-map X на веса W. Как правило W - это обычные тензоры, которые мы обучаем. Функции активации после умножения на W нет! В статье “Attention is all you need” Dot-product Self-attention выглядит примерно так:
Похожие термины есть в retrieval-системах (поиск релевантных сущностей по запросу). Например, когда вы ищите видео в Ютубе, поисковый движок проецирует ваш запрос (Query) на множество сущностей (Keys) в базе данных. Сущностью может быть хеш от видео, название видео, описание, никнейм автора и т.д. Эти сущности связаны с базой видеофайлов (Values) из которых нам и надо выбрать релевантные (Result). Attention-механизм можно понимать как retrieval-процесс. Более подробно можно прочитать здесь.