Диффузия и потоки
Расписания шума
Как распределить шум по времени — и почему это выбор про бюджет, а не про эстетику
Расписание — это распределение бюджета
Из урока 010 известно, что состояние процесса описывается одним числом . Значит расписание — это просто функция , монотонно падающая от единицы к нулю. Всё остальное — способ её записать.
Правильная величина для сравнения расписаний — не , а отношение сигнала к шуму, и лучше в логарифме:
Причина в том, что
Линейное против косинусного
Посчитаем, как тысяча шагов распределяется по режимам:
| доля шагов, у которых | линейное | косинусное |
|---|---|---|
| SNR (шум преобладает) | ||
| SNR | ||
| SNR (почти чистый шум) |
Треть бюджета линейного расписания уходит на шаги, где от данных не осталось практически ничего. Там нечему учиться и нечего восстанавливать: сеть предсказывает шум по шуму. Косинусное тратит на это же шесть процентов.
Проверьте по виджету, где сигнал и шум сравниваются:
| расписание | SNR при |
|---|---|
| линейное | |
| косинусное | |
| квадратичное |
данные при t
сигнал/шум, log-шкала
- ᾱ
- 0.0784
- √ᾱ
- 0.28
- √(1−ᾱ)
- 0.96
- сигнал/шум
- 0.085
- равенство при t
- 0.259
Шум преобладает. Шаги в этом режиме дёшевы по информации: восстанавливать почти нечего, и модель на них учится мало.
Здесь стоит быть точным: косинусное расписание не «лучше» само по себе. Оно перераспределяет бюджет туда, где происходит содержательная работа. Если бы данные требовали иного распределения трудности, оптимальным было бы другое расписание — и именно поэтому существуют обучаемые расписания (Variational Diffusion Models), где подбирается вместе с моделью.
Оговорка про сам косинус: он загоняет к на последнем шаге, что бессмысленно и численно опасно. На практике обрезают сверху (обычно ), и в оригинальной работе это сделано именно так.
Дискретизация: сколько шагов на самом деле нужно
Тысяча шагов при обучении — не то же самое, что тысяча при сэмплировании. Обучение выбирает случайно, а сэмплирование обязано пройти путь целиком, и каждый шаг — прогон сети.
DDIM показывает, что подмножество шагов работает: берём каждый -й, и
| каждый -й | прогонов сети |
|---|---|
Почему это законно, если обратное ядро выводилось для соседних шагов? Потому что DDIM переформулирует процесс как детерминированный (probability-flow ОДУ из урока 030), а для ОДУ шаг не обязан быть малым по причине гауссовости — только по причине точности. Требование « мало, иначе обратное ядро негауссово» исчезает вместе с шумом.
Из этого следует практическое разделение, которое стоит держать в голове:
| обучение | сэмплирование | |
|---|---|---|
| случайное | по сетке | |
| число шагов | не важно | равно числу прогонов |
| расписание | задаёт распределение трудности | задаёт узлы сетки |
| можно ли поменять после обучения | нет | да |
Последняя строка объясняет, почему одну и ту же обученную модель гоняют с двадцатью шагами и с двумя сотнями: сетка сэмплирования — свойство сэмплера, а не модели. Модель знает лишь функцию от , и спросить её можно про любое значение.
Сдвиг расписания по разрешению
Тонкость, которая на практике важна и объясняется в одну строку. Изображение при том же менее зашумлено, чем : соседние пиксели коррелированы, и усреднение по большему числу пикселей восстанавливает низкие частоты даже из сильного шума.
Значит расписание, настроенное на малом разрешении, при переносе на большое оказывается слишком мягким — модель никогда не видит по-настоящему разрушенных данных и на генерации не умеет строить крупную структуру. Отсюда приём «сдвига» расписания: при росте разрешения log-SNR сдвигают вниз, обычно на логарифм отношения сторон.
Итог
- Расписание — это функция , и сравнивать расписания нужно в log-SNR.
- Линейное тратит треть шагов на режим SNR , косинусное — шесть процентов. В этом весь эффект, и он про распределение бюджета, а не про форму кривой.
- Число шагов при обучении и при сэмплировании — разные величины; вторая меняется после обучения.
- Пропуск шагов законен, потому что детерминированная формулировка снимает требование малого шага.
- При росте разрешения то же означает меньше разрушения, и расписание приходится сдвигать.
Источники
- Nichol, Dhariwal — Improved Denoising Diffusion Probabilistic Models — Косинусное расписание и разбор того, чем плохо линейное
- Kingma и др. — Variational Diffusion Models — Расписание как функция log-SNR, обучаемые расписания
- Song, Meng, Ermon — Denoising Diffusion Implicit Models — DDIM, пропуск шагов и детерминированное сэмплирование
Проверки
0 из 2Бюджет шагов и его распределение
Отметьте все верные утверждения о расписаниях шума.
Куда уходит бюджет расписания
Реализуйте
schedule_budget(kind, t, total_steps, every). Строкаkindзадаёт расписание:"cosine": , где и ;"quadratic": ;"linear": непрерывный вариант DDPM, с . Интеграл возьмите суммой Римана по средним точкам с двумястами подынтервалами — так эталон и посчитан.
Верните
[alpha_bar, log_snr, hard_fraction, sampler_calls]:alpha_bar— значение в точкеt;log_snr= ;hard_fraction— доля узлов равномерной сетки при , у которых SNR ;sampler_calls= — сколько прогонов сети останется, если брать каждыйevery-й шаг.
Проверить себя можно так: у квадратичного расписания SNR равна единице ровно при , поэтому
log_snrтам обязан быть нулём.Загрузка редактора…
Ctrl/⌘ + Enter