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 разделены: искать по одному признаку, а передавать — другую информацию.