Внимание в LLM · часть 1

Механизм внимания

Одна операция, на которой стоит весь трансформер: каждое слово оглядывается на остальные и подмешивает в себя то, что важно именно для него. Разберём её по винтикам — и посчитаем на живом примере, кто на кого смотрит.

Слову нужен контекст

Возьмём фразу «кошка лакает молоко, потому что она голодна». Что значит «она»? Само по себе местоимение пусто — его смысл живёт в другом слове фразы, в «кошке». Чтобы понять «она», модель должна дотянуться до нужного слова и втянуть его в себя.

Ранние сети читали текст по порядку, слово за словом, и дальний контекст размывался. Внимание отменяет дистанцию: каждое слово может напрямую заглянуть в любое другое и решить, насколько оно ему важно. «Она» смотрит на всю фразу разом и обнаруживает, что сильнее всего похоже на «кошку».

Запрос, ключ, значение

Каждый токен приходит в слой в виде вектора-эмбеддинга xi. Из него тремя обучаемыми матрицами получают три разные проекции — три роли одного слова:

qi=xiWQ,ki=xiWK,vi=xiWV

Удобная аналогия — поиск в библиотеке:

  • Запросq (query) — «что я ищу». У токена «она» это примерно «я местоимение, ищу существительное-подлежащее».
  • Ключk (key) — «чем я могу быть полезен», ярлык на каждом токене. У «кошки» ключ кричит «я существительное-подлежащее».
  • Значениеv (value) — «что я передам», собственно содержимое, которое утечёт к тому, кто на меня посмотрит.

Похожесть → веса

Насколько запрос токена i подходит к ключу токена j? Мерой служит скалярное произведение: чем сильнее векторы «смотрят в одну сторону», тем оно больше.

scoreij=qikjdk

Делим на dk (корень из размерности): иначе с ростом размерности скоры разбухают, и softmax «схлопывается» в одну точку.

Оценки — это ещё не веса: они любого знака и не нормированы. Пропустим строку оценок токена i через softmax — получим распределение αi, которое неотрицательно и суммируется в единицу:

αij=escoreijjescoreij,jαij=1

Наконец, новое представление токена i — это взвешенная сумма значений всех токенов с этими весами. Всё вместе — знаменитая формула внимания:

oi=jαijvj
Attention(Q,K,V)=softmax(QKdk)V

Слева — для одного токена, справа — та же операция сразу для всей матрицы.

Кто на кого смотрит

Ниже — живое внимание на нашей фразе. Векторы токенов заданы так, чтобы «похожесть» была осмысленной (существительные тянутся к существительным, объект к своему действию). Кликните слово — увидите, куда смотрит его запрос: строку оценок, их превращение в веса и итоговую смесь. В таблице справа — все веса сразу: строка i, столбец j — насколько токен i внимает токену j.

Ползунок «температуры» — это делитель оценок. Стандартное значение dk; при уменьшении делителя веса сильнее сосредотачиваются на максимальных оценках, а при увеличении приближаются к равномерному распределению.

Оставьте запрос «она» и сравните малый и большой делители оценок. Должен ли поменяться токен с наибольшим весом или только распределение массы? После этого смените сам запрос и повторите сравнение.

Одна голова внимания

T = 2.0
Токен запроса
Делитель оценок T
2,0
кошка1.82вес 29%
лакает0.38вес 7%
молоко0.06вес 5%
потому0.40вес 7%
что0.36вес 7%
она1.72вес 26%
голодна1.36вес 18%
Наибольший вескошка
Как запрос распределяет вниманиеПри фиксированном запросе положительный делитель меняет концентрацию весов, сохраняя порядок оценок. Смена запроса может изменить и сам этот порядок.

Обратите внимание на строку «она»: сильнее всего она смотрит на «кошку» — модель нашла, к чему относится местоимение, просто сравнив векторы. А «молоко» тянется к «лакает»: объект липнет к своему действию. Никаких правил грамматики — только скалярные произведения и softmax.