Перейти к содержимому
ПереводыMIT, Berkeley, CMU

LLM Visualization: 3D-прогулка по маленькой GPT — путеводитель

Как пользоваться трёхмерной визуализацией Брендана Бикрофта (bbycroft.net/llm) и пересказ её пошагового гида: модель nano-gpt на 85 тысяч параметров сортирует буквы A, B, C, а вы видите каждое умножение — эмбеддинги, LayerNorm, самовнимание, softmax, проекцию, MLP и выход.

LLM Visualization Брендана Бикрофта — трёхмерная модель работающей GPT-подобной сети прямо в браузере. Каждое число, которое модель обрабатывает, нарисовано отдельной клеткой: зелёные клетки — данные, синие — обучаемые веса. Слева — пошаговый гид, который ведёт от входных токенов до вероятностей на выходе, подсвечивая нужные блоки и подставляя настоящие числа.

  1. Когда открывать. После уроков 4.4.2 «Self-attention» и 4.5.1 «Блок трансформера», ещё лучше — после того как вы написали свою мини-GPT в уроке 4.6.1. Тогда каждый блок в 3D узнаётся как строчка вашего кода.

  2. Идите по гиду слева и нажимайте «продолжить»: камера сама подлетает к нужному месту.

  3. Наводите курсор на клетки — всплывает, из каких чисел и по какой формуле посчитано значение.

  4. Сравните масштабы. Рядом с маленькой nano-gpt в той же сцене стоят схемы GPT-2 (small) и GPT-2 (XL) — без весов, только форма (схема GPT-3 в коде есть, но отключена). Видно, во сколько раз больше настоящие модели.

Нужен компьютер с нормальной видеокартой и современный браузер с WebGL; на телефоне работает плохо. Запустить у себя можно из исходников: yarn, затем yarn dev.

Это nano-gpt всего на 85 тысяч параметров — игрушечная модель из проекта minGPT Андрея Карпатого. Её задача простая: получить последовательность из шести букв (например, «C B A B B C») и отсортировать их по алфавиту — «ABBBCC». Словарь состоит из трёх токенов — A, B, C, — каждому сопоставлен номер. Размер эмбеддинга — 48, у внимания 3 головы, блоков трансформера — 3. Модель уже обучена; визуализация показывает только инференс (вычисление ответа), а не обучение.

Каждый токен входа сначала превращается в вектор из 48 чисел — эмбеддинг. Затем вся последовательность векторов проходит сверху вниз через несколько слоёв — трансформеров. На выходе модель выдаёт для каждой позиции вероятности следующего токена: на шестой позиции — вероятности, что дальше будет ‘A’, ‘B’ или ‘C’. В примере модель почти уверена, что это ‘A’. Этот прогноз дописывается в конец входа, и всё повторяется — так модель генерирует ответ по одному токену.

Гид посвящён только инференсу; веса заранее обучены, и вычисления идут прямо в браузере. Модель принадлежит семейству GPT («генеративный предобученный трансформер»), которое можно описать как «предсказатель токенов по контексту»: OpenAI представила его в 2018 году, к нему относятся GPT-2, GPT-3 и GPT-3.5 Turbo — основа ChatGPT. Гид вдохновлён проектом nanoGPT и видеосерией Андрея Карпатого, а сама игрушечная модель взята из minGPT.

Номера токенов — единственное место, где в модели встречаются целые числа; дальше всё в вещественных числах. Для каждого токена берётся столбец матрицы эмбеддингов токенов с номером, равным индексу токена (индексация с нуля), и столбец матрицы позиционных эмбеддингов с номером позиции. Оба столбца — обучаемые веса (они синие). Их сумма — вектор длины 48. Сделав это для всех токенов, получаем матрицу размера T×CT \times C: TT — «время» (позиция в последовательности), CC — «каналы» (их ещё называют признаками, измерениями или размером эмбеддинга). CC — гиперпараметр, выбираемый как компромисс между размером модели и качеством. Эта матрица и есть вход модели.

Первый шаг блока трансформера — нормализация слоя: каждый столбец (позиция) нормализуется отдельно. Для столбца считаются среднее E[x]E[x] и дисперсия Var⁡[x]\operatorname{Var}[x], из каждого значения вычитается среднее и результат делится на Var⁡[x]+ε\sqrt{\operatorname{Var}[x] + \varepsilon} (ε\varepsilon защищает от деления на ноль). Затем каждый элемент умножается на обучаемый вес и к нему прибавляется обучаемый сдвиг. Цель — среднее 0 и стандартное отклонение 1 в каждом столбце: это делает обучение глубокой сети устойчивее.

Самовнимание — «сердце» трансформера: единственное место, где столбцы матрицы «разговаривают» друг с другом; во всех остальных фазах их можно рассматривать независимо. Слой состоит из нескольких голов; рассматривается одна.

Для каждого столбца строятся три вектора — запрос Q, ключ K и значение V — умножением на матрицу весов с добавлением сдвига. Каждый элемент выхода — скалярное произведение строки матрицы весов на входной столбец, то есть линейная комбинация всех элементов входа. Аналогия — словарь в программировании: по ключу находим значение. Но вместо одной записи внимание возвращает взвешенную смесь всех значений: веса — скалярные произведения запроса текущего столбца с ключами столбцов, нормализованные softmax.

Важная деталь: запрос сравнивается только с ключами прошлых столбцов (и своим), поэтому внимание каузальное — токены не видят будущее. После скалярного произведения результат делится на d\sqrt{d}, где dd — длина векторов Q/K/V, чтобы большие значения не доминировали в softmax. Выход для столбца — сумма векторов V других столбцов с весами из строки матрицы внимания: сильнее всего в него входят значения столбцов с большими оценками.

Softmax превращает вектор в набор чисел от 0 до 1 с суммой 1: каждое значение возводится в экспоненту, а затем делится на сумму экспонент. Тонкость — численная устойчивость: при больших входах экспоненты огромны. Поскольку прибавление константы ко всем входам не меняет результат, из всех значений вычитают максимум. В визуализации для каждой строки хранятся промежуточные агрегаты: максимум и сумма сдвинутых экспонент. Название: «жёсткий» вариант — argmax (1 у максимума, 0 у остальных), а softmax — его «мягкая» версия, которая подчёркивает наибольшее значение, но сохраняет распределение по всем.

Выходы голов складываются «стопкой»: три вектора длины C/3C/3 превращаются в один длины CC (длина вектора в голове равна CC, делённому на число голов). Затем каждый столбец умножается на матрицу проекции со сдвигом. Результат не передаётся дальше напрямую, а прибавляется поэлементно ко входу блока — это остаточная связь (зелёная вертикальная стрелка). Как и нормализация слоя, она нужна, чтобы глубокие сети нормально учились.

Вторая половина блока — многослойный перцептрон из двух слоёв. Перед ним снова нормализация слоя. Каждый столбец независимо проходит: (1) линейное преобразование со сдвигом, расширяющее вектор до длины 4C4C; (2) поэлементную функцию активации GELU — она похожа на ReLU, но вместо излома у неё гладкая кривая; (3) линейное преобразование со сдвигом обратно к длине CC. Результат снова прибавляется ко входу MLP — остаточная связь.

Нормализация → самовнимание → проекция → остаточная связь → нормализация → MLP → остаточная связь: это полный блок. Блоки повторяются несколько раз, выход одного — вход следующего, «остаточный путь» тянется через всю сеть. Что именно делает каждый слой, сказать трудно, но общая картина такая: ранние слои учат простые закономерности (в языке — грамматику, синтаксис, простые ассоциации), поздние — более абстрактные связи и смысл в контексте.

Выход последнего блока проходит нормализацию слоя и линейное преобразование без сдвига, которое переводит каждый столбец из длины CC в длину словаря. Получаются оценки для каждого токена — логиты (от «log-odds», логарифма шансов: «лог», потому что следующий softmax их экспоненцирует). Softmax превращает их в вероятности. Для следующего шага берутся вероятности последнего столбца, и следующий токен выбирается случайно с этими вероятностями (токен с вероятностью 0,9 выпадет в 90% случаев); можно и всегда брать самый вероятный. Температура управляет «гладкостью» распределения: логиты делятся на неё перед softmax; высокая температура делает распределение равномернее, низкая — сосредотачивает его на самых вероятных токенах.

LLM VisualizationTransformer Explainer
Модельnano-gpt, 85 тыс. параметров (+ схемы GPT-2 small и XL)GPT-2 small, 124 млн параметров
Входшесть букв A/B/Cлюбой английский текст
Сильная сторонавидно каждое умножение и каждую матрицувидно смысл: внимание между словами, температура, top-k/top-p
Когда открыватьпосле своей мини-GPT (4.6.1)после урока о самовнимании (4.4.2)
ENRU
walkthroughпошаговый гид
inference vs trainingинференс (вычисление ответа) и обучение
token embedding, position embeddingэмбеддинг токена, позиционный эмбеддинг
time (T), channels (C)время (позиция), каналы (размер эмбеддинга)
layer normalizationнормализация слоя
causal self-attentionкаузальное самовнимание
projection, residual pathwayпроекция, остаточный путь (остаточная связь)
MLP, GELUмногослойный перцептрон, GELU
logits, log-oddsлогиты, логарифм шансов
sampling, temperatureвыбор (сэмплирование), температура