О чём урок
Самовнимание (self-attention) решает задачу, с которой мы столкнулись в прошлом уроке: как собрать для каждого токена информацию о его прошлом, да ещё и с весами, которые зависят от содержания, а не только от позиции. После этого урока вы будете понимать, откуда берутся запросы, ключи и значения, почему в формуле внимания появляется деление на √d_k, и сможете построчно читать класс CausalSelfAttention из nanoGPT, включая обе его ветки: быструю (flash attention) и ручную.
Неофициальный курс AI University по открытому коду (MIT). В уроке приводится код из karpathy/nanoGPT © Andrej Karpathy, лицензия MIT; комментарии переведены на русский, объяснения написаны нашей командой. Курс не связан с автором кода и не одобрен им.
В прошлом уроке мы собирали представление токена как простое среднее эмбеддингов всех предыдущих токенов (включая его самого). Это работало, но у такого среднего есть существенный недостаток: все прошлые токены вносят одинаковый вклад. Токен «кот» и токен «и» получают одинаковый вес, хотя для предсказания следующего слова они явно не равноценны.
Самовнимание решает эту проблему, делая веса усреднения зависимыми от содержания токенов: каждый токен сам «решает», какие прошлые токены для него важны, и смотрит на них внимательнее. Технически это по прежнему взвешенное среднее прошлых значений, но веса теперь не константы, а результат вычисления, зависящего от векторов токенов.
Прежде чем переходить к обучаемым весам, закрепим три эквивалентных способа посчитать простое (невзвешенное) причинное среднее: они понадобятся нам как база, на которую мы «наденем» softmax с обучаемыми весами.
Третий способ выглядит избыточно сложным для простого среднего, но он нарочно построен так же, как будущее внимание: матрица scores размера (T, T) заполняется значениями (пока нулями), будущее закрывается значением -inf, а softmax превращает строки в веса, суммирующиеся в единицу. Осталось заменить нули на содержательные числа, зависящие от токенов, и получить настоящее внимание.
Идея самовнимания в том, чтобы каждый токен формировал три разных вектора на основе своего эмбеддинга x:
План урока
- От среднего к вниманию: напоминание про CausalBoW
- Запросы, ключи и значения
- Одна голова внимания: формы тензоров по шагам
- Многоголовое внимание
- CausalSelfAttention в nanoGPT
- Self-attention, cross-attention и зачем нужны позиции
- Попробуйте сами
- Итоги
Урок входит в полный доступ. Полный текст и видео открываются после оплаты. Первые уроки каждого курса бесплатны.