Курс Stanford CS236 предлагает глубокое изучение генеративного ИИ, и в рамках третьей лекции подробно рассматривается семейство авторегрессионных моделей. Эта технологическая концепция лежит в основе современных больших языковых моделей, включая ChatGPT, позволяя эффективно решать задачи генерации сложных последовательностей. Слушатели курса знакомятся с математическими основами перехода от простых вероятностных таблиц к гибким глубоким нейронным сетям.
🎯 Основы генеративного моделирования и цепное правило 0:05
Процесс обучения любой генеративной модели начинается с набора данных — независимых и одинаково распределенных (IID) выборок из неизвестного истинного распределения данных $P_{data}$. Задача исследователя заключается в определении семейства моделей $P_\theta$ (множества вероятностных распределений в том же пространстве) и последующей оптимизации параметров $\theta$. В современном глубоком обучении под $\theta$ чаще всего понимаются веса нейронной сети.
Оценка качества модели и ее подгонка под реальные данные происходят путем минимизации расхождения (дивергенции) между распределениями. Поскольку у исследователей есть доступ только к дискретным выборкам, наиболее естественным методом обучения становится максимизация правдоподобия (Maximum Likelihood).
По словам лектора, качественная генеративная модель позволяет решать широкий спектр прикладных задач:
- Сэмплирование (генерация): Выбор новых векторов данных в соответствии со сформированной моделью вероятностей.
- Детекция аномалий: Оценка того, насколько правдоподобен тот или иной входящий объект. Это помогает выявлять состязательные (adversarial) атаки, чья вероятность в рамках естественного распределения будет крайне низкой.
- Неконтролируемое обучение представлений: Извлечение полезных признаков и структурных паттернов данных в качестве побочного продукта обучения сильной модели.
Математическим фундаментом авторегрессионных моделей выступает фундаментальное цепное правило теории вероятностей (Chain Rule). Любое совместное распределение $n$ переменных можно без потери общности разложить на произведение условных вероятностей:
$$P(x_1, x_2, ..., x_n) = \prod_{i=1}^n P(x_i | x_1, ..., x_{i-1})$$
Данное правило абсолютно универсально и справедливо для любого распределения при любом выбранном порядке переменных. Однако на практике, как утверждает ведущий, некоторые варианты упорядочивания могут оказаться эффективнее других, если они отражают естественную причинно-следственную структуру данных. В отличие от байесовских сетей доверия, которые полагаются на жесткие предположения об условной независимости для сокращения таблиц вероятностей, нейронные авторегрессионные модели аппроксимируют эти сложные условные функции целиком с помощью гибких нейросетевых архитектур. Теорема об универсальной аппроксимации гарантирует, что достаточно глубокая сеть способна уловить любые сложные взаимосвязи между переменными.
🖼️ Авторегрессионное моделирование изображений: от простых сетей к FVSBN 11:35
В качестве классического примера рассматривается задача построения генеративной модели для бинаризованного набора данных MNIST (рукописные цифры). Каждое изображение состоит из 784 пикселей ($28 \times 28$), принимающих значения 0 (черный) или 1 (белый). Модели необходимо присвоить корректную вероятность каждой из огромного числа возможных комбинаций пикселей.
Для применения цепного правила к двумерному изображению требуется задать жесткий порядок обхода. Стандартным решением является растровое сканирование (raster scan) — слева направо и сверху вниз (от верхнего левого к нижнему правому углу). Задача многомерного моделирования при этом распадается на цепочку простых задач классификации (предсказание значения одного пикселя на основе всех предыдущих).
Ранним примером такой архитектуры является полностью видимая сигмоидная сеть доверия (Fully Visible Sigmoid Belief Network, FVSBN). В этой модели условная вероятность активации $i$-го пикселя задается с помощью логистической регрессии:
$$P(x_i = 1 | x_{<i}) = \sigma \left( \alpha_0^{(i)} + \sum_{j=1}^{i-1} \alpha_j^{(i)} x_j \right)$$
Процесс генерации (сэмплирования) в такой сети происходит строго последовательно:
- Вычисляется априорная вероятность для самого первого (верхнего левого) пикселя, которая на практике почти всегда близка к нулю.
- На основе выбранного значения первого пикселя запускается модель логистической регрессии для второго пикселя, из распределения которой сэмплируется конкретное значение.
- Процедура повторяется шаг за шагом для каждого последующего элемента вплоть до нижнего правого пикселя.
Главным недостатком модели FVSBN, по мнению лектора, является плохая масштабируемость. Поскольку для каждой из $n$ переменных требуется отдельный вектор коэффициентов $\alpha$, общая сложность по числу параметров растет квадратично — как $O(n^2)$. Эксперименты на наборе данных Caltech 101 показывают неудовлетворительные результаты: вместо четких объектов модель генерирует аморфные размытые пятна. Логистическая регрессия оказывается недостаточно мощной, чтобы уловить нелинейные зависимости между пикселями.
🚀 Эволюция к NADE: совместное использование весов 28:09
Для повышения гибкости модели была разработана архитектура NADE (Neural Autoregressive Density Estimation). В ней логистическая регрессия заменяется на однослойную нейронную сеть с общим скрытым слоем $h_i$ для каждого шага.
Для вычисления вероятности $i$-го пикселя все предыдущие значения пропускаются через линейный слой с последующей нелинейностью:
$$h_i = \text{sigm}(W_{:, <i} x_{<i} + c)$$
Полученный вектор скрытых признаков затем проецируется на финальный выходной слой для получения параметра распределения Бернулли. Чтобы избежать избыточности и изолированного обучения $n$ отдельных сетей, авторы NADE применили стратегию разделения весов (weight tying). Вместо набора независимых матриц для каждой позиции используется одна большая глобальная матрица весов, из которой для каждого шага берется соответствующий срез (колонка).
Подобный подход дает важные преимущества:
- Снижение риска переобучения: Сокращение общего числа параметров делает модель более устойчивой и улучшает генерализацию.
- Линейная сложность: Количество параметров теперь масштабируется линейно, а не квадратично относительно размерности входа $n$.
- Вычислительная эффективность: При расчете совместной вероятности объекта (например, при обучении) скрытые состояния $h_i$ можно вычислять рекуррентно, просто добавляя вклад от очередного пикселя к уже посчитанному на предыдущем шаге вектору.
На практике NADE демонстрирует значительное улучшение качества генерации по сравнению с FVSBN, успешно воссоздавая структурные особенности цифр MNIST. При авторегрессионном сэмплировании модель выдает мягкие распределения вероятностей для каждого пикселя, что позволяет улавливать тонкие градации и вариации формы.
📊 Расширение моделей: работа с цветом и непрерывными данными 44:26
Базовые варианты авторегрессионных моделей рассчитаны на бинарные данные, однако их принципы легко масштабируются на другие типы признаков. Для моделирования полноцветных изображений, где каждый пиксель может принимать $K$ дискретных значений интенсивности (от 0 до 255), выходной слой сети модифицируется. Вместо сигмоиды применяется операция softmax, формирующая полноценное категориальное распределение вероятностей по всем $K$ уровням яркости. Каждому значению сопоставляется нормированная вероятность через экспоненциальное масштабирование.
Если же данные являются непрерывными (например, звуковые волны или спектрограммы речи), дискретизация может оказаться неэффективной. В этом случае выход нейронной сети параметризует непрерывную функцию плотности вероятности — например, смесь из $K$ гауссиан (Mixture of Gaussians).
Чтобы задать гибкое мультимодальное распределение с несколькими пиками (модами), сеть должна предсказать $2K$ чисел на каждом шаге:
- $K$ математических ожиданий (средних значений) для каждого из распределений.
- $K$ стандартных отклонений (дисперсий), для которых принудительно обеспечивается неотрицательность.
🎭 От автокодировщиков к генеративным моделям: архитектура MADE 49:33
Вычислительный граф моделей типа NADE внешне напоминает классический автокодировщик (Autoencoder), принимающий на вход вектор $x$ и возвращающий его реконструированную копию $\hat{x}$. Традиционный автокодировщик состоит из энкодера, сжимающего данные в латентное пространство, и декодера, восстанавливающего оригинал по скрытому коду. Обучение происходит за счет минимизации среднеквадратичной ошибки или кросс-энтропии реконструкции.
Однако стандартный автокодировщик не является генеративной моделью. Без явных ограничений сеть легко скатывается к тривиальному тождественному отображению (Identity Mapping), просто копируя входные сигналы на выход. В ней отсутствует упорядоченность вычислений, необходимая для последовательного сэмплирования новых объектов.
Решением данной проблемы стала архитектура MADE (Masked Autoencoder for Distribution Estimation). Ее ключевая идея заключается в превращении стандартного автокодировщика в полноценную авторегрессионную модель путем наложения бинарных масок на матрицы весов. Маски жестко блокируют определенные связи в сети, гарантируя, что предсказанное значение $\hat{x}_i$ не может зависеть от самого входа $x_i$ или любых последующих элементов в рамках выбранного порядка.
Алгоритм построения масок в MADE устроен следующим образом:
- Каждому нейрону в скрытых слоях присваивается случайный целочисленный индекс $m$, определяющий максимальный номер входной переменной, от которой этот нейрон имеет право получать информацию.
- При переходе между слоями весовые коэффициенты умножаются на маску: связь разрешена только в том случае, если индекс принимающего нейрона строго больше (или равен, в зависимости от слоя) индекса передающего нейрона.
- На финальном слое маска гарантирует соблюдение строгого авторегрессионного факторизационного распределения.
Основным преимуществом MADE, как подчеркивает лектор, является колоссальное ускорение процесса обучения. Во время тренировки сети доступны все истинные значения вектора $x$, что позволяет вычислить условные вероятности для всех компонентов за один единственный прямой проход (forward pass) через маскированную сеть, вместо $n$ последовательных запусков. Тем не менее, на этапе инференса (генерации) модель все еще остается строго последовательной и требует пошагового выполнения вычислений для каждой переменной.
🔄 Рекуррентные нейросети (RNN) как авторегрессионные модели 1:10:42
Еще одним подходом к авторегрессионному моделированию длинных последовательностей является использование рекуррентных нейронных сетей (RNN). По мере продвижения по цепочке переменных размер контекста (истории) постоянно увеличивается, что усложняет прямую условную фильтрацию. Архитектура RNN решает эту проблему за счет концепции скрытого состояния $h_t$, которое служит компактным динамическим резюме всей предшествующей информации.
Обновление скрытого состояния и расчет выходов происходят циклически:
$$h_{t+1} = \tanh(W_{hh} h_t + W_{xh} x_{t+1} + b_h)$$
Вектор $h_{t+1}$ аккумулирует в себе историю и преобразуется выходным слоем в параметры распределения для следующего шага. Поразительным свойством RNN является то, что количество обучаемых параметров (матриц переходов) остается абсолютно статичным и не зависит от длины последовательности $n$. Это представляет собой предельную форму разделения весов во времени. При этом модель не накладывает марковских ограничений памяти: теоретически граф вычислений сохраняет зависимости со всеми прошлыми шагами.
В качестве иллюстрации возможностей лектор приводит символьные языковые модели (Character-level Language Models), обученные генерировать текст посимвольно. Будучи натренированной на собрании сочинений Шекспира или статьях Википедии, простая трехслойная RNN демонстрирует удивительную способность воспроизводить не только лексическую структуру и пунктуацию, но и синтаксическую разметку Markdown, включая корректное закрытие скобок и генерацию псевдоссылок.
Однако, несмотря на теоретическую выразительность, рекуррентные модели обладают критическим недостатком, из-за которого они уступили позиции в современных коммерческих LLM. По словам ведущего, последовательный характер развертывания рекуррентного цикла создает непреодолимое «узкое горлышко» при обучении. RNN невозможно эффективно распараллелить на современных графических процессорах (GPU), так как вычисление текущего шага строго требует завершения всех предыдущих операций.