Диффузия и потоки
Score-функция
Градиент логарифма плотности — почему именно он, и как обучить его без знания плотности
Определение и одно свойство, из которого всё
Градиент берётся по аргументу, а не по параметрам, — в статистике словом score обычно называют другое, и путать их не стоит.
Всё остальное следует из одного наблюдения. Пусть плотность известна только с точностью до множителя: , где неизвестно. Тогда
потому что — константа по . Проверено численно: для гауссианы, умноженной на , score в точке равен — те же цифры, что и без множителя.
Вот в чём ценность. Нормировочная константа — главная техническая трудность вероятностного моделирования: она равна интегралу по всему пространству, и в высокой размерности не считается. Score её не видит. Это и есть причина, по которой генерация формулируется через score, а не через плотность.
Как выглядит score
Для гауссианы всё считается в одну строку:
Проверено конечными разностями: при , и обе стороны дают .
Читается это так: score указывает в сторону среднего, а его величина растёт с удалением. Плюс структурное наблюдение: score гауссианы — линейная функция, и ровно поэтому диффузия на первых шагах (где ядро почти гауссово) — задача несложная, а на последних, где плотность данных проступает, — трудная.
Для смеси score равен средневзвешенному по компонентам, с весами-ответственностями:
Проверено на смеси двух гауссиан в пяти точках — совпадение с конечными разностями до . Это ровно та формула, по которой виджет считает поле.
- макс. |score|
- 17.72
- длина пути
- 98.5
- доля времени у мод
- 32.4%
Три наблюдения из виджета:
- Score растёт вдали от данных. У гауссианы он линеен по расстоянию, и в областях низкой плотности его величина велика. Значит именно там его труднее всего оценить — данных нет.
- В нулях плотности score не определён. Логарифма нуля не существует, и никакой сети это не исправить. Это фундаментальная проблема, а не численная.
- Между модами поле почти нулевое. Там ответственности сравниваются, и вклады компонент гасят друг друга. Сэмплер, попавший в эту область, не знает, куда идти — и без шума не выберется.
Пункты 1 и 3 объясняют, почему score-based модели не работают без зашумления данных: шум «раздувает» носитель распределения, убирает нули и наполняет пустоты информацией. Урок 060 покажет, что зашумление и есть то, что делает диффузия.
Как обучить score, не зная плотности
Естественная цель — приблизить score сетью :
Проблема очевидна: справа стоит то, чего мы не знаем. Тождество Хювяринена показывает, что цель эквивалентна другой, где неизвестной величины нет:
Выводится интегрированием по частям; константа не зависит от и потому неважна. Проверено численно на гауссиане с , и линейным семейством :
| прямая цель | Хювяринен const | ||
|---|---|---|---|
Совпадение с точностью Монте-Карло, и минимум обеих целей — в одном месте: , .
Но эта цель непрактична.
Итог
- Score не зависит от нормировочной константы, и это делает его правильным объектом для моделирования.
- Для гауссианы он линеен и указывает к среднему; для смеси — средневзвешенный по ответственностям.
- Он не определён в нулях плотности и плохо оцениваем там, где мало данных. Зашумление лечит и то, и другое.
- Обучать его можно без знания плотности (тождество Хювяринена), но цена — след якобиана, то есть проходов. Диффузия обходит эту цену полностью.
Источники
- Hyvärinen — Estimation of Non-Normalized Statistical Models by Score Matching — Score matching и тождество, убирающее неизвестную плотность из цели
- Song, Ermon — Generative Modeling by Estimating Gradients of the Data Distribution — Score-based генерация и почему нужен шум разных масштабов
Проверки
0 из 2Свойства score
Отметьте все верные утверждения о score-функции.
Score смеси гауссиан
Реализуйте
mixture_score(components, x), гдеcomponents— список троек (веса в сумме дают единицу). Верните[density, score, first_responsibility, log_density]:density= ;score= , посчитанный как средневзвешенное по компонентам: , где — доля -й компоненты в плотности в точке ;first_responsibility= ;log_density= .
Проверить себя можно на одной компоненте: там , и
scoreобязан равняться ровно.Загрузка редактора…
Ctrl/⌘ + Enter