Attention как взвешенное суммирование

Формулы Q/K/V + упрощённая реализация.

Если убрать весь маркетинг вокруг LLM и трансформеров, attention – это очень простая идея: каждый элемент последовательности смотрит на другие элементы и берёт их в разной степени важности.

Математически это всего лишь взвешенное суммирование.

Инженерно – это самый важный блок в архитектуре Attention Is All You Need.

Разберёмся спокойно, без лишней суеты.

Интуиция: внимание как "умное среднее"

Представим предложение:

“The bank approved the loan.”

Слово bank может означать и "банк", и "берег". Чтобы понять смысл, модель должна "посмотреть" на другие слова – approved, loan – и понять контекст.

Механизм attention делает следующее:

  1. Для каждого слова считает, насколько оно связано с другими словами.

  2. Превращает эти оценки в веса.

  3. Делает взвешенную сумму представлений слов.

Формально:

outputi=j=1nαijvj\text{output}_i = \sum_{j=1}^{n} \alpha_{ij} \cdot v_j

где:

  • vjv_j – вектор значения (value) слова j

  • αij\alpha_{ij} – насколько слово i “внимательно” к слову j

  • jαij=1\sum_j \alpha_{ij} = 1

Это обычное взвешенное среднее. Но веса считаются не вручную, а через Q/K/V.

Откуда берутся Q, K и V

Каждое входное слово представлено вектором xRdx \in \mathbb{R}^d.

Из него линейными преобразованиями получаем три новых вектора:

Q=XWQK=XWKV=XWVQ = XW_Q \\ K = XW_K \\ V = XW_V Где:

  • WQ,WK,WVW_Q, W_K, W_V – обучаемые матрицы

  • QQ – query (запрос)

  • KK – key (ключ)

  • VV – value (значение)

Интуитивно:

  • Query – "что я ищу?"

  • Key – "что я предлагаю?"

  • Value – "что я передаю, если меня выбрали?"

Скалярное произведение как мера похожести

Чтобы понять, насколько слово ii связано со словом jj, берём:

scoreij=QiKj\text{score}_{ij} = Q_i \cdot K_j

Это скалярное произведение. Если векторы сонаправлены – значение большое. Если ортогональны – около нуля.

Чтобы избежать слишком больших чисел, делим на dk\sqrt{d_k}:

scoreij=QiKjdk\text{score}_{ij} = \frac{Q_i \cdot K_j}{\sqrt{d_k}}

Это называется Scaled Dot-Product Attention.

Превращаем score в вероятности

Чтобы получить веса, применяем softmax:

αij=exp(scoreij)kexp(scoreik)\alpha_{ij} = \frac{\exp(\text{score}_{ij})}{\sum_k \exp(\text{score}_{ik})}

Теперь:

  • все веса положительные

  • сумма по jj равна 1

Полная формула Attention

В матричной форме:

Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^T}{\sqrt{d_k}} \right)V

Это ключевая формула трансформера.

27.1 Scaled dot product attention

Мини-пример с числами

Пусть у нас 2 токена и размерность 2.

Считаем score

Для первого токена:

После softmax:

Output:

0.73V1+0.27V2[7.3,5.4]0.73 * V_1 + 0.27 * V_2 ≈ [7.3, 5.4]

Мы получили смесь значений.

Упрощённая реализация Attention на PHP

Ниже – минималистичная версия scaled dot-product attention.

Это не оптимизированый код. Это демонстрация идеи.

Где здесь обучение?

Матрицы:

  • WQW_Q

  • WKW_K

  • WVW_V

обучаются через backpropagation.

Градиенты проходят:

  1. Через умножение на VV

  2. Через softmax

  3. Через деление на d\sqrt{d}

  4. Через QQ и KK

  5. Через линейные слои

Именно поэтому attention полностью дифференцируем.

Геометрическая интерпретация

Attention – это:

Проекция запроса в пространство ключей

→ измерение угла

→ смешивание значений

Если представить векторы в 2D, то скалярное произведение – это: QKcos(θ)\lVert Q \rVert \, \lVert K \rVert \cos(\theta)

Чем меньше угол – тем больше вклад.

27.2 Вклад угла между векторами на скалярное произведение

Почему это революция?

До трансформеров были:

  • RNN

  • LSTM

  • GRU

Они обрабатывали текст последовательно.

Attention позволил:

  • Параллельную обработку

  • Глобальный контекст

  • Масштабирование

И стал основой моделей вроде OpenAI и их GPT-линейки.

Self-Attention

В self-attention:

Q=K=V=XWQ = K = V = XW

То есть все три получаются из одного входа.

Каждый токен "смотрит" на всех остальных.

Что важно понять разработчику

Attention – это не магия.

Это:

  1. Линейные преобразования

  2. Скалярное произведение

  3. Softmax

  4. Взвешенная сумма

И... Всё.

Если вы понимаете матрицы и взвешенные средние – вы понимаете attention.

Как использовать это в PHP-проектах

В реальных PHP-проектах вы врядли будете реализовывать attention вручную.

Но понимание нужно, чтобы:

  • понимать, что происходит в LLM API

  • строить собственные lightweight-модели

  • оптимизировать embedding-поиск

  • объяснять клиенту, почему модель "так решила"

Last updated