Query, Key, Value: идея механизма

Самая важная абстракция трансформера — три роли, в которых выступает каждый токен: query, key и value. Разберём их на понятной аналогии.

Query, Key, Value — три вектора, которые модель строит из каждого токена: запрос (что я ищу), ключ (чем я могу быть полезен) и значение (что я передам).

Аналогия: поиск в библиотеке

Представьте, что вы ищете информацию.

  • Query (запрос) — то, что вы ищете: «книги про космос».
  • Key (ключ) — ярлык на каждой книге: «астрономия», «кулинария», «история».
  • Value (значение) — само содержимое книги, которое вы заберёте.

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

Как это устроено у токенов

Каждый токен через свой эмбеддинг порождает три вектора:

ВекторРоль токена
Query (Q)«какую информацию я сейчас ищу в контексте?»
Key (K)«по какому признаку меня можно найти?»
Value (V)«что именно я отдам тому, кто меня выберет?»

Чтобы понять токен «ключ», его query как бы спрашивает: «есть ли рядом слово, проясняющее мой смысл?». Key у слова «двери» отвечает: «я — про вход, помещение». Их совпадение даёт высокий вес — и «ключ» вбирает value слова «двери».

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

Это не магия и не ручная разметка. У модели есть три обучаемые матрицыW_Q, W_K, W_V. Эмбеддинг токена умножается на каждую из них и даёт, соответственно, его query, key и value:

q = embedding @ W_Q     # запрос токена
k = embedding @ W_K     # ключ токена
v = embedding @ W_V     # значение токена

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

Зачем разделять K и V

Тонкий, но важный момент: по чему искать и что передавать — разные вещи. Ключ отвечает за «насколько я релевантен запросу», а значение — за «какую информацию я несу». Разделив их, модель может, например, находить токен по одному признаку, а забирать у него совсем другую информацию. Поэтому K и V — отдельные векторы, а не один.

Итог

  • Каждый токен играет три роли: query (что ищу), key (чем полезен), value (что передам).
  • Внимание сравнивает query одного токена с key всех остальных и забирает их value со взвешиванием.
  • Q, K, V получаются умножением эмбеддинга на обучаемые матрицы W_Q, W_K, W_V.
  • K и V разделены: искать по одному признаку, а передавать — другую информацию.
Проверьте себя
1. За что отвечает вектор query токена?
AЗа то, какую информацию токен сейчас ищет в контексте
BЗа хранение эмбеддинга
CЗа позицию токена
DЗа размер словаря
2. Откуда берутся векторы Q, K, V для токена?
AИх вводит пользователь
BЭмбеддинг токена умножается на обучаемые матрицы W_Q, W_K, W_V
CОни случайны на каждом шаге
DОни совпадают с one-hot вектором
3. Зачем разделять key и value, а не использовать один вектор?
AЧтобы сэкономить память
BЧтобы по одному признаку находить токен, а передавать у него другую информацию
CЭто требование железа
DЧтобы ускорить токенизацию
Поддержать проект