Рассмотрим генеративную задачу, а именно генерацию изображений. Поставим цель - напрямую смоделировать плотность распределения данных $\pi(x)$ с помощью нейронной сети. Таким образом, мы аппроксимируем истинную плотность $\pi(x)$ параметрической моделью $p(x|\theta)$, где $\theta$ - параметры сети.
Ключевая проблема заключается в том, что выход нейронной сети, как правило, не гарантирует выполнения условия нормировки. Чтобы $p(x|\theta)$ являлась корректной функцией плотности вероятности, она должна удовлетворять следующему свойству:
$$ \int p(x|\theta) dx = 1
$$
Для решения этой проблемы вводится ненормированная модель $\hat{p}(x|\theta)$, которую часто называют энергетической функцией, представляющая собой непосредственный выход нейронной сети. Корректная плотность $p(x|\theta)$ тогда определяется через явную нормировку:
$$ p(x|\theta) = \frac{\hat p(x|\theta)}{\int \hat p(x|\theta)dx} $$
Здорово, конечно, но абсолютно непонятно, как брать интеграл по всем возможным выходам нейронной сети, это аналитически и вычислительно неразрешимая задача. Для того, чтобы обойти вычисление интеграла рассмотрим логарифм плотности.
$$ \log p(x|\theta) = \log \hat p(x|\theta) - log \int \hat p(x|\theta)dx $$
Теперь заметим, что если мы возьмем $\nabla_x$ по левой и правой частям, то чудесным образом нам удастся избавиться от интеграла. Так как интеграл уже выинтегрировал весь $x$, то он более от него не зависит и градиент по нему будет равен 0.
$$ \nabla_x \log p(x|\theta) = \nabla_x \log \hat p(x|\theta) - \nabla_x log \int \hat p(x|\theta)dx = \nabla_x \log \hat p(x|\theta) + 0 $$
Круто! Мы получили важный результат: градиент логарифма истинной нормированной плотности (левая часть) равен градиенту логарифма ненормированного выхода нейронной сети (правая часть). Эта величина $\nabla_x \log p(x|\theta)$ имеет собственное название - score-функция.
Теперь вместо того, чтобы моделировать саму плотность $p(x|\theta)$, мы перешли к моделированию ее градиента по $x$. Геометрически score-функция - это векторное поле, которое в каждой точке $x$ (т.е. для каждого изображения) указывает направление наискорейшего роста плотности вероятности. То есть показывает, как нам нужно сдвинуть значения пикселей в нашей картинке, чтобы семпл был более похож на самый вероятный семпл из распределения, которое мы пытаемся аппроксимировать.
Если у нас есть нейронная сеть, которая обучена аппроксимировать score-функцию $\nabla_x \log p(x|\theta)$, мы можем использовать ее для генерации новых семплов $x$. Например, мы можем воспользоваться динамикой Ланжевена (этот подход лежит в основе моделей Noise Conditional Score Networks) или ancestral sampling-ом (используется в диффузиях).
Важно отметить, что до сих пор мы обсуждали моделирование безусловной плотности $p(x)$. Такая модель позволяет генерировать семплы, в целом похожие на обучающие данные (например, случайное изображение пса, если модель обучена на собаках). Однако на практике часто требуется условная генерация, то есть возможность управлять процессом и создавать изображения, соответствующие конкретному запросу $y$. Этим запросом может быть текст или метка класса. Вместо того, чтобы моделировать $\nabla_x \log p(x|\theta)$, нам нужно моделировать $\nabla_x \log p(x|y, \theta)$.
Распишем $\nabla_x \log p(x|y)$ по формуле Байеса:
$$ \begin{align*} p(\mathbf{x}|\mathbf{y}) &= \frac{p(\mathbf{x}) p(\mathbf{y}|\mathbf{x})}{p(\mathbf{y})}
\\
\nabla_{\mathbf{x}} \log p(\mathbf{x}|\mathbf{y}) &= \nabla_{\mathbf{x}} \log p(\mathbf{x}) + \nabla_{\mathbf{x}} \log p(\mathbf{y}|\mathbf{x}) - \nabla_{\mathbf{x}}\log p(\mathbf{y}) \end{align*} $$
Поскольку $p(y)$ (априорная вероятность класса $y$) не зависит от $x$, ее градиент $\nabla_x \log p(y)$равен нулю. Так мы приходим к фундаментальному разложению:
$$ \nabla_x \log p(x|y) = \underbrace{\nabla_x \log p(x)}{\text{Безусловная score-функция}} + \underbrace{\nabla_x \log p(y|x)}{\text{Градиент классификатора}} $$
Наша условная score-функция распалась на сумму двух членов: