Self-attention с нуля

Урок 10 из 16 курса «Нейросети с нуля: по открытому коду Андрея Карпати»: неофициальный курс AI University по открытому коду (MIT). Урок входит в платный доступ; первые уроки курса бесплатно.

О чём урок

Самовнимание (self-attention) решает задачу, с которой мы столкнулись в прошлом уроке: как собрать для каждого токена информацию о его прошлом, да ещё и с весами, которые зависят от содержания, а не только от позиции. После этого урока вы будете понимать, откуда берутся запросы, ключи и значения, почему в формуле внимания появляется деление на √d_k, и сможете построчно читать класс CausalSelfAttention из nanoGPT, включая обе его ветки: быструю (flash attention) и ручную.

Неофициальный курс AI University по открытому коду (MIT). В уроке приводится код из karpathy/nanoGPT © Andrej Karpathy, лицензия MIT; комментарии переведены на русский, объяснения написаны нашей командой. Курс не связан с автором кода и не одобрен им.

В прошлом уроке мы собирали представление токена как простое среднее эмбеддингов всех предыдущих токенов (включая его самого). Это работало, но у такого среднего есть существенный недостаток: все прошлые токены вносят одинаковый вклад. Токен «кот» и токен «и» получают одинаковый вес, хотя для предсказания следующего слова они явно не равноценны.

Самовнимание решает эту проблему, делая веса усреднения зависимыми от содержания токенов: каждый токен сам «решает», какие прошлые токены для него важны, и смотрит на них внимательнее. Технически это по прежнему взвешенное среднее прошлых значений, но веса теперь не константы, а результат вычисления, зависящего от векторов токенов.

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

Третий способ выглядит избыточно сложным для простого среднего, но он нарочно построен так же, как будущее внимание: матрица scores размера (T, T) заполняется значениями (пока нулями), будущее закрывается значением -inf, а softmax превращает строки в веса, суммирующиеся в единицу. Осталось заменить нули на содержательные числа, зависящие от токенов, и получить настоящее внимание.

Идея самовнимания в том, чтобы каждый токен формировал три разных вектора на основе своего эмбеддинга x:

План урока

  1. От среднего к вниманию: напоминание про CausalBoW
  2. Запросы, ключи и значения
  3. Одна голова внимания: формы тензоров по шагам
  4. Многоголовое внимание
  5. CausalSelfAttention в nanoGPT
  6. Self-attention, cross-attention и зачем нужны позиции
  7. Попробуйте сами
  8. Итоги

Урок входит в полный доступ. Полный текст и видео открываются после оплаты. Первые уроки каждого курса бесплатны.

Полезные гиды