Диффузия и потоки

Ланжевеновская динамика

Сэмплирование по одному только score — и почему без шумового члена оно не работает

Шаг 94 из 117 · ~26 мин

Один шаг

Есть score. Как из него получить выборки? Ответ короче ожидаемого:

xk+1=xk+ϵxlogp(xk)+2ϵzk,zkN(0,I)x_{k+1} = x_k + \htmlData{k=drift}{\epsilon\, \nabla_x \log p(x_k)} + \htmlData{k=noise}{\sqrt{2\epsilon}\, z_k}, \qquad z_k \sim \mathcal{N}(0, I)

Первое слагаемое — обычный градиентный подъём по logp\log p (блок 5). Второе — шум, и множитель у него 2ϵ\sqrt{2\epsilon}, а не ϵ\epsilon: это ровно тот масштаб, при котором стационарным распределением цепи оказывается pp, а не что-то другое.

При ϵ0\epsilon \to 0 и числе шагов \to\infty распределение xkx_k сходится к pp. Заметьте, чего здесь нет: ни нормировочной константы, ни самой плотности — только её score.

Почему без шума не работает

Уберите шумовой член, и останется градиентный подъём. Он находит моду и там остаётся. Поставьте температуру в нуль и посмотрите на readout «доля времени у мод».

сила guidance γ 1
шаг ε 0.05
температура T 1
макс. |score|
17.72
длина пути
98.5
доля времени у мод
32.4%
Температура умножает только шумовой член. При T = 1 это честное сэмплирование, при T = 0 — градиентный подъём, при T > 1 — сэмплирование из более плоского распределения. Длина пути показывает, сколько пространства обошло блуждание: у подъёма она мала, потому что он останавливается.

Разница между двумя режимами — это разница между двумя разными задачами:

градиентный подъёмЛанжевен
что находитодну модувыборку из pp
соотношение модтеряетсясохраняется
куда сходитсяточкараспределение
зачем нуженоптимизациягенерация

Для генеративной модели первый столбец бесполезен: он даёт «самое типичное» изображение, а нужны разные.

Три источника ошибки

Теория обещает сходимость при ϵ0\epsilon \to 0 и бесконечном числе шагов. На практике не то и не другое, и стоит понимать, чем именно платят.

Смещение дискретизации. При конечном ϵ\epsilon стационарное распределение цепи — не pp, а что-то рядом, и расхождение растёт с ϵ\epsilon. Исправляется поправкой Метрополиса–Гастингса (блок 3, урок 170), которая делает цепь точной ценой шага принятия/отклонения.

Конечное время смешивания. Чтобы перейти из одной моды в другую, блуждание должно пройти область низкой плотности, где score почти нулевой (урок 040) и движение случайно. Время такого перехода растёт экспоненциально с глубиной разделяющей ямы. Практически это означает, что цепь застревает в той моде, где стартовала.

Неизвестный score вне носителя. Сеть обучалась там, где были данные. Стартовая точка блуждания берётся из широкого распределения — то есть заведомо оттуда, где оценка score недостоверна.

Отжиг по уровням шума

Последние две проблемы решаются одним приёмом, и он же оказывается диффузией.

Возьмём семейство зашумлённых версий распределения: pσp_\sigma — это данные плюс гауссов шум масштаба σ\sigma. Тогда

σ\sigmaчто происходит с pσp_\sigma
большоепочти гауссиана; мод нет, ям нет, носитель — всё пространство
среднеемоды проступают, но разделены неглубоко
малоепочти исходные данные, ямы глубокие

Сэмплирование идёт от большого σ\sigma к малому, каждый раз запуская Ланжевена на несколько шагов и передавая результат дальше. При большом σ\sigma переходы между модами дёшевы, потому что ям почти нет; к моменту, когда ямы появляются, точка уже находится в правильной области.

Это в точности annealed Langevin, и это же — обратный процесс диффузии, записанный по-другому. Урок 060 покажет, что и обучение здесь то же самое.

Что дают ручки виджета

ручкачто меняетчто видно
шаг ϵ\epsilonразмер и подъёма, и шумабольшой ϵ\epsilon — грубее и быстрее, смещение растёт
температура TTтолько шумT=0T=0 — подъём, T=1T=1 — сэмплирование, T>1T>1 — плоское распределение
guidance γ\gammaумножает scoreсэмплирование из pγp^\gamma: моды острее, хвосты беднее

Про третью строку стоит сказать точно, потому что она пригодится в уроке 080. Умножение score на γ\gamma — это в точности score распределения pγp^\gamma, поскольку

logpγ=γlogp\nabla \log p^\gamma = \gamma \nabla\log p

То есть «усилить guidance» математически означает «сэмплировать из более острого распределения», и температура в языковых моделях — та же операция с γ=1/T\gamma = 1/T.

Итог

  • Ланжевен превращает score в сэмплер: подъём плюс шум масштаба 2ϵ\sqrt{2\epsilon}.
  • Без шума это поиск моды, а не генерация; соотношение мод теряется полностью.
  • Три источника ошибки: смещение дискретизации, экспоненциальное время смешивания, недостоверный score вне данных.
  • Отжиг по уровням шума решает две последние — и оказывается диффузией.
  • Умножение score на γ\gamma = сэмплирование из pγp^\gamma. Эта строчка вернётся в уроке 080.

Источники

Проверки

0 из 2
  1. Подъём, шум и отжиг

    Отметьте все верные утверждения о ланжевеновской динамике.

  2. Смещение дискретизации

    Возьмём одномерную гауссиану с нулевым средним и дисперсией σ2\sigma^2. Её score равен x/σ2-x/\sigma^2, поэтому ланжевеновский шаг превращается в

    xk+1=(1ϵσ2)xk+2ϵzkx_{k+1} = \Big(1 - \frac{\epsilon}{\sigma^2}\Big) x_k + \sqrt{2\epsilon}\, z_k

    то есть в обычный процесс AR(1) с коэффициентом a=1ϵ/σ2a = 1 - \epsilon/\sigma^2 и шумом дисперсии 2ϵ2\epsilon. Его стационарная дисперсия равна 2ϵ1a2\dfrac{2\epsilon}{1 - a^2}, что сокращается до замкнутой формы.

    Реализуйте langevin_bias(variance, eps) — верните [stationary_variance, bias, relative_percent, max_stable_eps]:

    • stationary_variance = σ21ϵ/(2σ2)\dfrac{\sigma^2}{1 - \epsilon/(2\sigma^2)};
    • bias — разность со стационарной дисперсией истинного распределения, то есть с σ2\sigma^2;
    • relative_percent — смещение в процентах от σ2\sigma^2;
    • max_stable_eps = 2σ22\sigma^2 — шаг, при котором a=1|a| = 1 и цепь перестаёт сходиться.

    Проверьте по дороге, что 2ϵ1a2\dfrac{2\epsilon}{1-a^2} действительно сокращается до формулы выше: это упражнение на две строки алгебры.

    функция langevin_bias

    Загрузка редактора…

    Ctrl/⌘ + Enter