Some Intuition on Attention and the Transformer
Юджин Ян даёт интуитивное объяснение механизма внимания (attention) и архитектуры Transformer для тех, кто уже прочитал статью «Attention Is All You Need» и в общих чертах знаком с темой. Автор показывает, что до появления attention перевод выполнялся encoder-decoder сетями, которые были вынуждены сжимать всё входное предложение в один вектор фиксированного размера, создавая информационное «бутылочное горлышко» и проблемы с дальними зависимостями. Attention снял эти ограничения, позволив декодеру обращаться к разным словам входа на каждом шаге и обрабатывать всё предложение параллельно. Через аналогию с библиотекой объясняются векторы query, key и value, а также роль скалярного произведения и softmax при вычислении весов внимания. Разбирается, зачем нужны несколько голов внимания (фокус на разных словах и избыточность), несколько слоёв (избыточность и расширение рецептивного поля) и skip-связи (сглаживание плохой фильтрации и сохранение входа). В завершение приводится цитата Andrej Karpathy о том, что Transformer — это универсальный дифференцируемый компьютер: выразительный, оптимизируемый и эффективный.
Some Intuition on Attention and the Transformer
Немного интуиции о внимании и архитектуре Transformer
[ deeplearning llm ] · чтение на 8 мин
ChatGPT and other chatbots (e.g., Bard, Claude) have thrust LLMs into the mainstream. As a result, more and more people outside ML and NLP circles are trying to grasp the concept of attention and the Transformer model. Here, we’ll address some questions and try to provide intuition on the Transformer architecture. The intended audience is people who have read the paper and have a basic understanding of how attention works.
ChatGPT и другие чат-боты (например, Bard, Claude) вывели LLM в мейнстрим. В результате всё больше людей за пределами кругов ML и NLP пытаются понять концепцию внимания (attention) и модель Transformer. Здесь мы разберём ряд вопросов и постараемся дать интуитивное понимание архитектуры Transformer. Целевая аудитория — это люди, которые прочитали статью и в общих чертах понимают, как работает внимание.
To keep it simple, I’ll mostly refer to “words” in a “sentence”. Nonetheless, attention can apply to any generic set of items in a sequence. For example, instead of words, we could have tokens, events, or products. And instead of a sentence, we could have a paragraph, in-session behavior, or purchase history.
Для простоты я в основном буду говорить о «словах» в «предложении». Тем не менее внимание применимо к любому произвольному набору элементов в последовательности. Например, вместо слов у нас могли бы быть токены, события или товары. А вместо предложения — абзац, поведение в рамках сессии или история покупок.
What’s the big deal about attention?
Что такого особенного во внимании?
Consider machine translation as an example. Before attention, most translation was done via an encoder-decoder network. The encoder encodes the input sentence (“I love you”) via a recurrent model and the decoder decodes it into another language (“我爱你”).
Рассмотрим в качестве примера машинный перевод. До появления внимания большинство переводов выполнялось с помощью encoder-decoder сети. Энкодер кодирует входное предложение («I love you») с помощью рекуррентной модели, а декодер декодирует его на другой язык («我爱你»).
Encoding an input sentence into a fixed-size vector for the decoder (source)
Кодирование входного предложения в вектор фиксированного размера для декодера (источник)
Via this approach, the encoder had to cram the entire input into a fixed-size vector which is then passed to the decoder—this single vector had to convey everything about the input sentence! Naturally, this led to an informational bottleneck. With attention, we no longer have to encode input sentences into a single vector. Instead, we let the decoder attend to different words in the input sentence at each step of output generation. This increases the informational capacity, from a single fixed-size vector to the entire sentence (of vectors).
При таком подходе энкодеру приходилось втискивать весь вход в вектор фиксированного размера, который затем передавался декодеру, — этот единственный вектор должен был передать всё о входном предложении! Естественно, это приводило к информационному «бутылочному горлышку». С механизмом внимания нам больше не нужно кодировать входные предложения в единый вектор. Вместо этого мы позволяем декодеру обращать внимание (attend) на разные слова входного предложения на каждом шаге генерации выхода. Это увеличивает информационную ёмкость — от единого вектора фиксированного размера до всего предложения (из векторов).
Furthermore, previous recurrent models had long paths between input and output words. If you had a 50-word sentence, the decoder had to recall information from 50 steps ago for the first word (and that data had to be squeezed into a single vector). As a result, recurrent models had difficulty dealing with long-range dependencies. Attention addressed this by letting each step of the decoder see the entire input sentence and decide what words to attend to. This cut down path length and made it consistent across all steps in the decoder.
Кроме того, в прежних рекуррентных моделях между входными и выходными словами были длинные пути. Если у вас было предложение из 50 слов, декодеру приходилось вспоминать информацию из шага, отстоящего на 50 шагов назад, для первого слова (и эти данные нужно было втиснуть в единый вектор). В результате рекуррентным моделям было трудно справляться с дальними зависимостями. Внимание решило эту проблему, позволив каждому шагу декодера видеть всё входное предложение и решать, на какие слова обращать внимание. Это сократило длину пути и сделало её одинаковой на всех шагах декодера.
Finally, prior language models leaned heavily on a recurrent approach: To encode a sentence, we start with the first word (w1) and process it to get the first hidden state (h1). Then, we input the second word (w2) with the previous hidden state (h1) to derive the next hidden state (h2). And so on. Unfortunately, this process was sequential and prevented parallelization. Attention tackled this by reading the entire sentence in one go and computing the representation of each word, based on the sentence, in parallel.
Наконец, прежние языковые модели сильно опирались на рекуррентный подход: чтобы закодировать предложение, мы начинаем с первого слова (w1) и обрабатываем его, чтобы получить первое скрытое состояние (h1). Затем мы подаём второе слово (w2) вместе с предыдущим скрытым состоянием (h1), чтобы вывести следующее скрытое состояние (h2). И так далее. К сожалению, этот процесс был последовательным и не допускал распараллеливания. Внимание справилось с этим, считывая всё предложение за один раз и вычисляя представление каждого слова на основе предложения параллельно.
What are query, key, and value vectors?
Что такое векторы query, key и value?
Imagine yourself in a library. You have a specific question (query). Books on the shelves have titles on their spines (keys) that suggest their content. You compare your question to these titles to decide how relevant each book is, and how much attention to give each book. Then, you get the information (value) from the relevant books to answer your question.
Представьте себя в библиотеке. У вас есть конкретный вопрос (query). У книг на полках есть названия на корешках (keys), которые подсказывают их содержание. Вы сравниваете свой вопрос с этими названиями, чтобы решить, насколько релевантна каждая книга и сколько внимания ей уделить. Затем вы получаете информацию (value) из релевантных книг, чтобы ответить на свой вопрос.
In attention, the query refers to the word we’re computing attention for. In the case of an encoder, the query vector points to the current input word (aka context). For example, if the context was the first word in the input sentence, it would have a query vector q1.
В механизме внимания query относится к слову, для которого мы вычисляем внимание. В случае энкодера вектор query указывает на текущее входное слово (так называемый контекст). Например, если контекстом было первое слово входного предложения, у него был бы вектор query q1.
The keys represent the words in the input sentence. The first word has key vector k1, the second word has vector k2, and so on. The key vectors help the model understand how each word relates to the context word. If the first word is the context, we compare the keys to q1.
Keys представляют слова входного предложения. У первого слова есть вектор key k1, у второго слова — вектор k2 и так далее. Векторы key помогают модели понять, как каждое слово соотносится с контекстным словом. Если первое слово является контекстом, мы сравниваем keys с q1.
Attention is how much weight the query word (e.g., q1) should give each word in the sentence (e.g., k1, k2, etc). This is computed via a dot product between the query vector and all the key vectors. (A dot product tells us how similar two vectors are.) If the dot product between a query-key pair is high, we pay more attention to it. These dot products then go through a softmax which makes the attention scores (across all keys) sum to 1.
Внимание — это то, какой вес слово-query (например, q1) должно придать каждому слову в предложении (например, k1, k2 и т. д.). Это вычисляется через скалярное произведение между вектором query и всеми векторами key. (Скалярное произведение говорит нам, насколько похожи два вектора.) Если скалярное произведение для пары query-key велико, мы уделяем ей больше внимания. Затем эти скалярные произведения проходят через softmax, который делает так, чтобы оценки внимания (по всем keys) в сумме давали 1.
Each word is also represented by a value which contains the information of that word. These value vectors are weighed by the attention scores that sum to 1. As a result, each context word is now represented by an attention-based weightage of all the words in the sentence, where the most relevant words have higher weight.
Каждое слово также представлено value, которое содержит информацию об этом слове. Эти векторы value взвешиваются оценками внимания, которые в сумме дают 1. В результате каждое контекстное слово теперь представлено основанной на внимании взвешенной комбинацией всех слов предложения, где наиболее релевантные слова имеют больший вес.
What does the encoder and decoder do?
Что делают энкодер и декодер?
The encoder takes a text input, such as a sentence, and returns a sequence of embeddings. These output embeddings can then be used for classification, translation, semantic similarity, etc. Self-attention enables the encoder to weigh the importance of each word and capture both short and long-range dependencies.
Энкодер берёт текстовый вход, например предложение, и возвращает последовательность эмбеддингов. Эти выходные эмбеддинги затем можно использовать для классификации, перевода, семантического сходства и т. д. Self-attention позволяет энкодеру взвешивать важность каждого слова и улавливать как ближние, так и дальние зависимости.
In contrast, the decoder takes inputs such as a start-of-sentence token and (optional) embeddings from the encoder, and returns probabilities to select the next word. Self-attention enables the decoder to focus on different parts of the output generated so far; cross-attention (aka encoder-decoder attention) helps it attend to the encoder’s output.
В отличие от него, декодер принимает входы, такие как токен начала предложения и (опционально) эмбеддинги от энкодера, и возвращает вероятности для выбора следующего слова. Self-attention позволяет декодеру фокусироваться на разных частях уже сгенерированного выхода; cross-attention (он же encoder-decoder attention) помогает ему обращать внимание на выход энкодера.
How does the decoder generate words?
Как декодер генерирует слова?
The decoder outputs the probability of the next word (i.e., every possible word has an associated probability). Thus, we can generate the next word by greedily picking the word with the highest probability. Alternatively, we can apply beam search and keep the top n predictions, generate the word after next for each of these top n predictions, and select whichever combination had less error.
Декодер выдаёт вероятность следующего слова (то есть с каждым возможным словом связана вероятность). Таким образом, мы можем сгенерировать следующее слово, жадно выбирая слово с наибольшей вероятностью. В качестве альтернативы можно применить beam search и оставить топ n предсказаний, сгенерировать слово после следующего для каждого из этих топ-n предсказаний и выбрать ту комбинацию, у которой меньше ошибка.
Why have multiple attention heads?
Зачем нужно несколько голов внимания?
Multiple heads lets the model consider multiple words simultaneously. Because we use the softmax function in attention, it amplifies the highest value while squashing the lower ones. As a result, each head tends to focus on a single element.
Несколько голов позволяют модели рассматривать несколько слов одновременно. Поскольку в механизме внимания мы используем функцию softmax, она усиливает наибольшее значение и подавляет меньшие. В результате каждая голова склонна фокусироваться на одном элементе.
Consider the sentence: “The chicken crossed the road carelessly”. The following words are relevant to “crossed” and should be attended to:
Рассмотрим предложение: «The chicken crossed the road carelessly» («Курица беспечно перешла дорогу»). Следующие слова релевантны для «crossed» и на них следует обращать внимание:
«chicken» — это субъект, который совершает переход. «road» — это объект, который пересекают. Переход совершается «carelessly» (беспечно).
If we had a single attention head, we might only focus on a single word, either “chicken”, “road”, or “crossed”. Multiple heads let us attend to several words. It also provides redundancy, where if any single head fails, we have the other attention heads to rely on.
Если бы у нас была одна голова внимания, мы могли бы фокусироваться лишь на одном слове — либо «chicken», либо «road», либо «crossed». Несколько голов позволяют нам обращать внимание сразу на несколько слов. Это также обеспечивает избыточность: если какая-то одна голова откажет, у нас есть другие головы внимания, на которые можно положиться.
Why have multiple attention layers?
Зачем нужно несколько слоёв внимания?
Multiple attention layers builds in redundancy (on top of having multiple attention heads). If we only had a single attention layer, that attention layer would have to do a flawless job—this design could be brittle and lead to suboptimal outcomes. We can address this via multiple attention layers, where each one uses the output of the previous layer with the safety net of skip connections. Thus, if any single attention layer messed up, the skip connections and downstream layers can mitigate the issue.
Несколько слоёв внимания создают избыточность (помимо наличия нескольких голов внимания). Если бы у нас был только один слой внимания, этому слою пришлось бы выполнять работу безупречно — такая конструкция могла бы быть хрупкой и приводить к неоптимальным результатам. Мы можем решить это с помощью нескольких слоёв внимания, где каждый использует выход предыдущего слоя со страховочной сеткой из skip-связей. Таким образом, если какой-то один слой внимания ошибётся, skip-связи и нижележащие слои могут смягчить проблему.
Stacking attention layers also broadens the model’s receptive field. The first attention layer produces context vectors by attending to interactions between pairs of words in the input sentence. Then, the second layer produces context vectors based on pairs of pairs, and so on. With more attention layers, the Transformer gains a wider perspective and can attend to multiple interaction levels within the input sentence.
Наращивание слоёв внимания также расширяет рецептивное поле модели. Первый слой внимания создаёт контекстные векторы, обращая внимание на взаимодействия между парами слов во входном предложении. Затем второй слой создаёт контекстные векторы на основе пар пар, и так далее. С большим числом слоёв внимания Transformer обретает более широкую перспективу и может обращать внимание на несколько уровней взаимодействий внутри входного предложения.
Why have skip connections?
Зачем нужны skip-связи?
Because attention acts as a filter, it blocks most information from passing through. As a result, a small change to the inputs of the attention layer may not change the outputs, if the attention score is tiny or zero. This can lead to flat gradients or local optima.
Поскольку внимание действует как фильтр, оно блокирует прохождение большей части информации. В результате небольшое изменение входов слоя внимания может не изменить выходы, если оценка внимания крошечная или равна нулю. Это может приводить к плоским градиентам или локальным оптимумам.
Skip connections help dampen the impact of poor attention filtering. Even if an input’s attention weight is zero and the input is blocked, skip connections add a copy of that input to the output. This ensures that even small changes to the input can still have noticeable impact on the output. Furthermore, skip connections preserve the input sentence: There’s no guarantee that a context word will attend to itself in a transformer. Skip connections ensure this by taking the context word vector and adding it to the output.
Skip-связи помогают ослабить влияние плохой фильтрации внимания. Даже если вес внимания для входа равен нулю и вход заблокирован, skip-связи добавляют копию этого входа к выходу. Это гарантирует, что даже небольшие изменения входа всё равно могут заметно повлиять на выход. Кроме того, skip-связи сохраняют входное предложение: нет никакой гарантии, что контекстное слово будет обращать внимание само на себя в трансформере. Skip-связи обеспечивают это, беря вектор контекстного слова и добавляя его к выходу.
• • •
• • •
Finally, here’s what Andrej Karpathy had to say about Transformers (and Attention).
Наконец, вот что сказал Andrej Karpathy о трансформерах (и внимании).
The Transformer is a magnificient neural network architecture because it is a general-purpose differentiable computer. It is simultaneously:
1) expressive (in the forward pass)
2) optimizable (via backpropagation+gradient descent)
3) efficient (high parallelism compute graph)
Transformer — это великолепная архитектура нейронной сети, потому что это универсальный дифференцируемый компьютер. Она одновременно: 1) выразительна (в прямом проходе) 2) оптимизируема (через backpropagation + градиентный спуск) 3) эффективна (граф вычислений с высокой степенью параллелизма) — Andrej Karpathy (@karpathy) October 19, 2022
References
Ссылки
Attention Is All You Need The Illustrated Transformer Transformers From Scratch Transformers From Scratch (да, то же название, это не ошибка) Understanding the Attention Mechanism in Sequence Models
OG image prompt: “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”
Промпт для 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»
If you found this useful, please cite this write-up as:
Если это оказалось полезным, пожалуйста, цитируйте эту заметку так:
Yan, Ziyou. (May 2023). Some Intuition on Attention and the Transformer. eugeneyan.com. https://eugeneyan.com/writing/attention/.
Yan, Ziyou. (May 2023). Some Intuition on Attention and the Transformer. eugeneyan.com. https://eugeneyan.com/writing/attention/.
or
или
@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/}
}
@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/} }
Join 11,800+ readers getting updates on machine learning, RecSys, LLMs, and engineering.
Присоединяйтесь к 11 800+ читателям, получающим обновления о машинном обучении, RecSys, LLM и инженерии.