Механизмы разреженного внимания и несколько аналогий с кодами программирования

Для этого поста мы ссылаемся на бумагу Динамический вывод с нейронными интерпретаторами Рахаман и др. (2021).

Обзор

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

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

Ввод и вывод

Предположим, что входной набор содержит векторные вложения фрагментов изображения или целых изображений. Эти элементы являются векторами определенной размерности dᵢₙ. Входной набор дополнительно включает в себя один или несколько изученных векторов, называемых маркерами CLS, для которых соответствующие выходные данные взаимодействуют с соответствующими классификаторами. Результатом является другой набор векторов, размерность которого равна dₒᵤₜ (с той же кардинальностью, что и входной набор).

Скрипты

Нейронный интерпретатор — это набор nскриптов, отображающих один набор векторов X= {x₁ , x₂, …} на другой Y = {y₁ , y₂, …} с таким же количеством элементы:

Увеличение количества скриптов nₛ увеличит глубину архитектуры. Сценарий состоит из четырех компонентов:

  1. модуль вывода типа;
  2. механизм сопоставления типов;
  3. набор функций;
  4. интерпретатор.

Вскоре мы опишем эти четыре компонента.

Функции

Каждый скрипт содержит функции. Функции — это инструкции с векторным значением для других компонентов скрипта. Формально функция fᵤ представляет собой пару (s, c) где s называется подпись, а c называется code (в качестве индекса используется u). Сигнатура представляет собой нормализованный вектор размеров d(type) и указывает механизму сопоставления типов (см. ниже), какие входные данные должны быть направлены на fᵤ (обратите внимание на аналогию с кодирование). Вектор c, параметр обучения для каждой функции, представляет собой код, который сообщает что делать (подробности чуть позже). Каждый f имеет собственный код, который всегда будет одинаковым.

Например, f₁, f₂ и f₃ имеют общие глобальные параметры, но все они имеют собственные коды. Образцы могут гибко переходить от одной функции к другой. Способ маршрутизации каждой выборки через сеть полностью независим и определяется для каждой выборки отдельно. Каждый пример имеет свой собственный независимый путь к сети, и сама маршрутизация полностью изучена.

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

Сопоставление типов и вывод

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

a) В начале элемент входного набора x обрабатывается модулем MLP (называемым модулем выведения типов) для получения >введите вектор t с размерностью dₜᵧₚₑ. Этот вектор лежит в той же единичной гиперсфере 𝓣, которая содержит векторы сигнатур s.

б) Рассмотрим функцию fᵤ. Определите функцию расстояния на основе сходства косинуса между t и сигнатурой s, то есть d𝓣= 1 - s·t .

c) Затем выполняется своего рода softmax с нормализацией, возвращая коэффициент Cᵤᵢ. Однако для Cᵤᵢ устанавливается значение 0, если расстояние между s и tбольше, чем τ, значение, называемое параметром усечения. Это вносит разреженность в модель. Исправьте u и i, тогда Cᵤᵢ — это совместимость между функцией fᵤ и набором элемент x: x может быть обработан fᵤ, только если Cᵤᵢ достаточно большой. Если Cᵤᵢ= 0, то fᵤ не может получить доступ к x.

Модулированные линейные слои и модулированные MLP

Следующие конструкции необходимы для определения механизма внимания в дальнейшем. Эти конструкции следует интерпретировать как программируемые модули (программа определяется кодом c). Модулированные линейные слои действуют как линейные слои с той лишь разницей, что вместо x линейное преобразование применяется к

x´ = x ⊗ LayerNorm(W𝒸 c)

где W𝒸 — это обучаемая матрица, которая представляет собой набор параметров, общих для всех функций в одном скрипте (символ ⊗ обозначает продукт на входе). Суммируя

где W — весовая матрица, а b — смещение. Определив модулированный линейный уровень, можно также сложить L из них (используя один и тот же код c) с вкраплениями функций активации GELU, чтобы получить модулированный MLP:

ModAttn

Используется разновидность условного (то есть обусловленного кодовым вектором c функции fᵤ) многоголового механизма внимания. Запросы, ключи и значения оцениваются с использованием слоев ModLin (вместо простых линейных слоев) для каждой головки h:

Затем снова рассмотрим коэффициенты совместимости {Cᵤᵢ}; эти величины будут служить модуляторами при оценке веса собственного внимания. Веса собственного внимания задаются нормализующим выражением

где эпсилон избегает деления на ~ 0 членов и

Например, исправьте fᵤ и голову h. Тогда у нас есть

и после нормализации вес Wᵢⱼ – это вес внимания между элементами x и x. Интуитивно понятно, что информация о x и x смешивается с fᵤ в начале. h, только если Wᵤₕᵢⱼ не равно 0. Это может произойти в двух случаях: 1) оба коэффициента совместимости не равны нулю (то есть fᵤ > может получить доступ как к x, так и к x) или 2) весам собственного внимания (часть softmax) близок к нулю. Наконец, вычисляется следующая линейная комбинация

и окончательный вывод

где точка с запятой, отделяющая h от ui, указывает, что результаты различных головок складываются (как обычно при многоголовом внимании) в один единственный объект.

Строка кода

Строка кода слой — это слой ModAttn, за которым следует слой ModMLP (см. рисунок ниже справа). Оба эти слоя имеют один и тот же вектор состояния, и между ними существуют взвешенные остаточные связи.

Строка кода (LOC) – это строка уровня кода, применяемая в параллельных потоках,
по одной на функцию, как показано на рис. 5 (справа). Входные данные LOC, например {xᵤᵢ}, записываются с дополнительным индексом u, что означает, что это конкретные входные данные для функции. fᵤ. Если функция fᵤ не может получить доступ к xᵤᵢ, тогда fᵤ действует на xᵤᵢ в качестве функции идентификации. Например, сосредоточьтесь на конкретной функции fᵤ и на ее конкретных входных данных {xᵤᵢ} по мере изменения i. Затем

где ãᵤᵢ — это выходные данные уровня внимания (ModAttn); затем

где ᵤᵢ — это выходные данные модуля MLP (фактически, уровня ModMLP). Обратите внимание, что если fᵤ не может получить доступ к xᵤᵢ (то есть Cᵤᵢ = 0), то вывод yᵤᵢ — это просто xᵤᵢ.

Устный переводчик

Уровень интерпретатора представляет собой стек LOC, использующих одни и те же функциональные коды. Интерпретатор передает заданный элемент набора в несколько параллельных вычислительных потоков, по одному для каждой функции. Пусть количество сложенных LOC равно nₗ. Пусть X = {x₁ , x₂, …} и C = {Cᵤ₁, C₂, …}, затем

где

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

Увеличение количества LOC nₗ увеличивает глубину архитектуры, а также количество параметров.

Итерация функций

Мы уже видели, что общая модель представляет собой набор из нескольких сценариев. Сценарий может быть выражен как повторяющееся применение итерации функций (FnIter).

где FnIter определяется как композиция механизма сопоставления типов и интерпретатора.

Количество итераций функции nᵢ может увеличиваться без увеличения количества параметров, поэтому FnIter может обеспечить глубокое совместное использование единиц.

Эксперименты

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

Поддержите этот блог.

Полезные ссылки

Оригинальная статья о Neural Interpreters.

Приятное обсуждение с авторами (видео).