newsmode
search
Меню
arrow_back Назад

Some Intuition on Attention and the Transformer

auto_awesomeКраткое саммари

Юджин Ян даёт интуитивное объяснение механизма внимания (attention) и архитектуры Transformer для тех, кто уже прочитал статью «Attention Is All You Need» и в общих чертах знаком с темой. Автор показывает, что до появления attention перевод выполнялся encoder-decoder сетями, которые были вынуждены сжимать всё входное предложение в один вектор фиксированного размера, создавая информационное «бутылочное горлышко» и проблемы с дальними зависимостями. Attention снял эти ограничения, позволив декодеру обращаться к разным словам входа на каждом шаге и обрабатывать всё предложение параллельно. Через аналогию с библиотекой объясняются векторы query, key и value, а также роль скалярного произведения и softmax при вычислении весов внимания. Разбирается, зачем нужны несколько голов внимания (фокус на разных словах и избыточность), несколько слоёв (избыточность и расширение рецептивного поля) и skip-связи (сглаживание плохой фильтрации и сохранение входа). В завершение приводится цитата Andrej Karpathy о том, что Transformer — это универсальный дифференцируемый компьютер: выразительный, оптимизируемый и эффективный.

Немного интуиции о внимании и архитектуре Transformer

[ deeplearning llm ] · чтение на 8 мин

ChatGPT и другие чат-боты (например, Bard, Claude) вывели LLM в мейнстрим. В результате всё больше людей за пределами кругов ML и NLP пытаются понять концепцию внимания (attention) и модель Transformer. Здесь мы разберём ряд вопросов и постараемся дать интуитивное понимание архитектуры Transformer. Целевая аудитория — это люди, которые прочитали статью и в общих чертах понимают, как работает внимание.

Для простоты я в основном буду говорить о «словах» в «предложении». Тем не менее внимание применимо к любому произвольному набору элементов в последовательности. Например, вместо слов у нас могли бы быть токены, события или товары. А вместо предложения — абзац, поведение в рамках сессии или история покупок.

Что такого особенного во внимании?

Рассмотрим в качестве примера машинный перевод. До появления внимания большинство переводов выполнялось с помощью encoder-decoder сети. Энкодер кодирует входное предложение («I love you») с помощью рекуррентной модели, а декодер декодирует его на другой язык («我爱你»).

Кодирование входного предложения в вектор фиксированного размера для декодера (источник)

При таком подходе энкодеру приходилось втискивать весь вход в вектор фиксированного размера, который затем передавался декодеру, — этот единственный вектор должен был передать всё о входном предложении! Естественно, это приводило к информационному «бутылочному горлышку». С механизмом внимания нам больше не нужно кодировать входные предложения в единый вектор. Вместо этого мы позволяем декодеру обращать внимание (attend) на разные слова входного предложения на каждом шаге генерации выхода. Это увеличивает информационную ёмкость — от единого вектора фиксированного размера до всего предложения (из векторов).

Кроме того, в прежних рекуррентных моделях между входными и выходными словами были длинные пути. Если у вас было предложение из 50 слов, декодеру приходилось вспоминать информацию из шага, отстоящего на 50 шагов назад, для первого слова (и эти данные нужно было втиснуть в единый вектор). В результате рекуррентным моделям было трудно справляться с дальними зависимостями. Внимание решило эту проблему, позволив каждому шагу декодера видеть всё входное предложение и решать, на какие слова обращать внимание. Это сократило длину пути и сделало её одинаковой на всех шагах декодера.

Наконец, прежние языковые модели сильно опирались на рекуррентный подход: чтобы закодировать предложение, мы начинаем с первого слова (w1) и обрабатываем его, чтобы получить первое скрытое состояние (h1). Затем мы подаём второе слово (w2) вместе с предыдущим скрытым состоянием (h1), чтобы вывести следующее скрытое состояние (h2). И так далее. К сожалению, этот процесс был последовательным и не допускал распараллеливания. Внимание справилось с этим, считывая всё предложение за один раз и вычисляя представление каждого слова на основе предложения параллельно.

Что такое векторы query, key и value?

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

В механизме внимания query относится к слову, для которого мы вычисляем внимание. В случае энкодера вектор query указывает на текущее входное слово (так называемый контекст). Например, если контекстом было первое слово входного предложения, у него был бы вектор query q1.

Keys представляют слова входного предложения. У первого слова есть вектор key k1, у второго слова — вектор k2 и так далее. Векторы key помогают модели понять, как каждое слово соотносится с контекстным словом. Если первое слово является контекстом, мы сравниваем keys с q1.

Внимание — это то, какой вес слово-query (например, q1) должно придать каждому слову в предложении (например, k1, k2 и т. д.). Это вычисляется через скалярное произведение между вектором query и всеми векторами key. (Скалярное произведение говорит нам, насколько похожи два вектора.) Если скалярное произведение для пары query-key велико, мы уделяем ей больше внимания. Затем эти скалярные произведения проходят через softmax, который делает так, чтобы оценки внимания (по всем keys) в сумме давали 1.

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

Что делают энкодер и декодер?

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

В отличие от него, декодер принимает входы, такие как токен начала предложения и (опционально) эмбеддинги от энкодера, и возвращает вероятности для выбора следующего слова. Self-attention позволяет декодеру фокусироваться на разных частях уже сгенерированного выхода; cross-attention (он же encoder-decoder attention) помогает ему обращать внимание на выход энкодера.

Как декодер генерирует слова?

Декодер выдаёт вероятность следующего слова (то есть с каждым возможным словом связана вероятность). Таким образом, мы можем сгенерировать следующее слово, жадно выбирая слово с наибольшей вероятностью. В качестве альтернативы можно применить beam search и оставить топ n предсказаний, сгенерировать слово после следующего для каждого из этих топ-n предсказаний и выбрать ту комбинацию, у которой меньше ошибка.

Зачем нужно несколько голов внимания?

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

Рассмотрим предложение: «The chicken crossed the road carelessly» («Курица беспечно перешла дорогу»). Следующие слова релевантны для «crossed» и на них следует обращать внимание:

«chicken» — это субъект, который совершает переход. «road» — это объект, который пересекают. Переход совершается «carelessly» (беспечно).

Если бы у нас была одна голова внимания, мы могли бы фокусироваться лишь на одном слове — либо «chicken», либо «road», либо «crossed». Несколько голов позволяют нам обращать внимание сразу на несколько слов. Это также обеспечивает избыточность: если какая-то одна голова откажет, у нас есть другие головы внимания, на которые можно положиться.

Зачем нужно несколько слоёв внимания?

Несколько слоёв внимания создают избыточность (помимо наличия нескольких голов внимания). Если бы у нас был только один слой внимания, этому слою пришлось бы выполнять работу безупречно — такая конструкция могла бы быть хрупкой и приводить к неоптимальным результатам. Мы можем решить это с помощью нескольких слоёв внимания, где каждый использует выход предыдущего слоя со страховочной сеткой из skip-связей. Таким образом, если какой-то один слой внимания ошибётся, skip-связи и нижележащие слои могут смягчить проблему.

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

Зачем нужны skip-связи?

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

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

• • •

Наконец, вот что сказал Andrej Karpathy о трансформерах (и внимании).

Transformer — это великолепная архитектура нейронной сети, потому что это универсальный дифференцируемый компьютер. Она одновременно: 1) выразительна (в прямом проходе) 2) оптимизируема (через backpropagation + градиентный спуск) 3) эффективна (граф вычислений с высокой степенью параллелизма) — Andrej Karpathy (@karpathy) October 19, 2022

Ссылки

Промпт для OG-изображения: «words in a sentence, emphasis on the words, with a pair of glasses, in the style of contrasting tones, artifacts of online culture, innovative page design, complexity theory, bold black and whites, bold color scheme –ar 2:1 –version 5.1»

Если это оказалось полезным, пожалуйста, цитируйте эту заметку так:

Yan, Ziyou. (May 2023). Some Intuition on Attention and the Transformer. eugeneyan.com. https://eugeneyan.com/writing/attention/.

или

@article{yan2023attention, title = {Some Intuition on Attention and the Transformer}, author = {Yan, Ziyou}, journal = {eugeneyan.com}, year = {2023}, month = {May}, url = {https://eugeneyan.com/writing/attention/} }



Присоединяйтесь к 11 800+ читателям, получающим обновления о машинном обучении, RecSys, LLM и инженерии.