Как устроен механизм внимания в трансформерах
Что проверяют
Можете ли вы выписать формулу внимания и объяснить каждую её часть, а не только сказать «модель смотрит на важные слова». Следом спрашивают, зачем делить на корень из размерности и почему внимание дорого на длинных контекстах.
Как отвечать
- проекции: каждый токен через обучаемые матрицы превращается в три вектора: запрос Q, ключ K и значение V;
- формула:
softmax(Q·Kᵀ / √d_k)·V. Скалярное произведение запроса со всеми ключами даёт оценки сходства, softmax по ключам превращает их в веса с суммой 1, и выход токена это взвешенная сумма значений; - масштаб: без деления на
√d_kпри большой размерности произведения растут, softmax насыщается почти до one-hot, градиенты затухают; - маски: причинная маска в декодере ставит
-infна будущие позиции до softmax, маска паддинга убирает пустые токены; - многоголовость: пространство делится на h голов размерности
d_model / h, каждая считает внимание отдельно, результаты склеиваются и проходят через выходную проекцию; - self и cross: в self-attention Q, K и V берутся из одной последовательности, в cross-attention запросы идут из декодера, а ключи и значения из выхода энкодера;
- позиции: самому вниманию порядок безразличен, поэтому нужны позиционные кодировки. В современных LLM чаще всего RoPE.
Цена: время и память растут квадратично от длины последовательности. FlashAttention считает то же самое точно, но не держит полную матрицу в медленной памяти GPU. На инференсе хранят KV-кэш, а GQA и MQA делят ключи и значения между головами, чтобы кэш был меньше. В PyTorch готовая реализация лежит в torch.nn.functional.scaled_dot_product_attention.
Где спотыкаются
Не могут объяснить деление на √d_k или называют его нормализацией «для красоты».
Применяют softmax не по той оси или накладывают маску после softmax, когда нулевых весов уже не получить без перенормировки.
Считают, что внимание само знает порядок слов, и забывают про позиционные кодировки. Рядом живёт ещё одна ошибка: выдавать карту весов внимания за объяснение решения модели, хотя надёжной интерпретацией она не является.