Внимание — это способность сосредоточиться на том, что важно. В отличие от памяти: речь идет не о сохранении как можно большего, а об отбрасывании того, что не нужно. 🕵️

В ML мы говорим, что алгоритм «использует механизм внимания», когда он явно учится:

  • Увеличивайте релевантные входные функции (и уменьшайте вес нерелевантных)
  • Связать части ввода внутри себя (или с выводом)

Неявного внимания недостаточно!

Но подождите, аразве не все модели на основе ИНС уже делают это? Хороший вопрос, и да. При наличии некоторых входных данных общие архитектуры ИНС (MLP, ConvNets, RNN…) автоматически узнают, на чем сосредоточиться. Это известно как имплицитное внимание, GLOW — отличный тому пример. Однако, несмотря на достоинства этих результатов, разработка архитектуры, которая продвигает это явное увеличение веса функции, имеет несколько преимуществ:

  • Более высокая вычислительная эффективность: ИНС могут быть меньше и быстрее обучаться.
  • Большая масштабируемость: размер архитектуры не зависит от размера входных данных.
  • Последовательная обработка статических данных: модель может просто запоминать важную информацию из разных областей входных данных.
  • Легкая интерпретация: поскольку они специально разработаны для привлечения внимания.

Похоже, хорошая сделка! 📈 Как мы можем сделать это внимание явным? Прежде чем перейти к механизмам внимания, важно быть на одной странице с представлениями входных разделов (вещи, которые будут взвешены или связаны в зависимости от задачи).

Понятие «взгляды».

Глимпсы — это представления разделов входных данных (т. н. кодирование входных данных). Например, проблесками распространенных форматов ввода могут быть:

  • Ввод текста:массив 1-горячей кодировки его букв. В качестве альтернативы они могут быть массивом вложений слов.
  • Входные данные изображения:разные фрагменты разделов изображения.
  • Видеовход: различные изображения, из которых состоит видео.
  • Аудиовход:представление звуковой волны на каждом временном шаге:

Внимание как поисковик

Механизмы внимания получают набор этих проблесков. Их работа состоит в том, чтобы в каждый момент времени выбирать наиболее значимые для задачи. По сути, они просто «ищут» наиболее релевантные проблемы в «базе данных проблесков» (также называемых кратким представлением данного ввода). Поэтому часто используется терминология поисковых систем:

  • 🔑 Ключи: описание функций просмотра. Они кодируют содержание и/или позицию проблеска.
  • 🔒Запросы. У каждого проблеска есть связанный запрос, который кодирует, как этот проблеск связан со всеми другими ключами проблеска. Связь между ключами и запросами определяется некоторой функцией подобия S(k,q), которая специфична для каждого механизма внимания (стандартной функцией подобия является скалярное произведение). Таким образом, тензор запросов содержит столько элементов, сколько рассмотрено проблесков.
  • 💰Ценность: функции Glimpse, которые взвешиваются (или комбинируются) и перенаправляются в последующие задачи.

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

Примечание.Каждый проблеск имеет связанный ключ, связанный запрос и связанное значение. «Магия» механизма внимания заключается в том, как эти значения объединяются для получения результата.

Другие важные понятия:

  • Вектор внимания: кодирует, насколько релевантен каждый проблеск желаемой задаче.
  • Матрица внимания: кодирует, насколько релевантен каждый взгляд по отношению ко всем остальным. Это полезно для извлечения отношений последовательности.
  • Контекст: выходные данные модуля внимания. Его получают путем применения вектора/матрицы внимания к ценностям.

Сейчас это может немного сбивать с толку🥴 но становится намного яснее, когда вы видите, как все вычисляется.

Виды внимания

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

  • 🔨 Пристальное внимание (также известное как недифференцируемое внимание): фокусируется на уникальном проблеске при каждой итерации. Поскольку это «трудное» решение, градиент нельзя распространить обратно, и мы полагаемся на методы обучения с подкреплением для обучения политике выбора мельком.
  • 🐑 Мягкое внимание (также известное как дифференцируемое внимание): позволяет обучать обратное распространение end2end, плавно объединяя все проблески (через вектор внимания или матрицу).

Независимо от этих подгрупп, мы также можем разделить методы по тому, на что ориентируется механизм при «поиске» проблесков:

  • 🧭 Внимание к местоположению: механизм внимания фокусируется на том, где искать во входных данных в зависимости от положения.
  • 🔐Ассоциативное внимание (также известное как внимание, основанное на содержании): основное внимание уделяется чтоискать.Связывает взгляды по их характеристикам (содержимому), а не по положению.
  • 🧘Интроспективное внимание: понятие внимания связано с внутренним состоянием сети (памятью).

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

Некоторые механизмы внимания

Масштабируемое скалярное произведение внимания

Функция подобия, используемая для связывания ключей и запросов, представляет собой скалярное произведение. Матрица внимания состоит из скалярного произведения между каждой парой ключ-запрос. Aᵢⱼ = kᵢ ⋅ qⱼ. Затем для каждого проблеска вектор контекста содержит взвешенную комбинацию между каждым проблеском значением и его отношениями.

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

Внимание нескольких голов

Шаги:

  1. Спроецируйте ключи, запросы и значения в n разных тензоров (n головок), используя старые добрые полносвязные (FC) слои.
  2. Примените масштабированное скалярное произведение к каждой голове (вверху, я имею в виду проекцию 🤭).
  3. Соедините каждый заголовок, и все готово :)

  • Идея состоит в том, что проецирование в разные встраивания позволяет каждой головке внимания «сосредоточиться» на разных аспектах входных данных.
  • Этот механизм часто используется в рамках парадигмы самовнимания: одни и те же входные данные x пересылаются как ключ, запрос и значение. Затем задачей уровня FC является изучение вложений ключ-запрос-значение. Матрица внимания кодирует, как части входных данных соотносятся друг с другом. В векторе контекста каждая проекцияпроекция объединяется с родственной проекцией в пределах одного и того же ввода.
  • В других случаях используется парадигма перекрёстного внимания: ключ и значение являются тензором (часто исходящим от кодировщика), а запрос — другим. Вы запрашиваете что-то из значений, а ключи помогают вам сосредоточиться.
  • Мы называем «головками» различные масштабированные скалярные произведения внимания, которые вычисляются параллельно, а затем объединяются.

В следующих постах мы обратим внимание на архитектуры на основе трансформаторов (каламбур), которые представляют собой просто объединение множества этих механизмов внимания.

Относительно-позиционное многоголовое внимание

Этот механизм добавляет позиционное кодирование в проекцию запроса. Таким образом, сеть совместно учитывает как контекст, так и положение проблесков.

Аддитивное внимание

Этот механизм объединяет все значения glimpse в один вектор. Функция подобия между ключами и запросами вычисляется путем добавления их вложений через соответствующие слои FC.

Внимание с учетом местоположения

Это добавляет элемент RNN в Additive Attention. На каждом временном шаге вычисляется новый вектор внимания, который итеративно передается следующему. Обратите внимание, что это «внимание к временному шагу» декодируется 1d Conv с ядрами f (размер объекта), чтобы соответствовать входному измерению.

Заключительные заметки

Оставайтесь с нами! 📻В следующем эпизоде ​​мы объединим эти механизмы внимания для создания моделей преобразования речи в текст SOTA👂. Вау, Я только что обнаружил, что можно выделять смайлики курсивом!! 🤯 🤯 Это дерьмо делает меня счастливым :)