Диффузия и потоки
Classifier-free guidance
Одна линейная комбинация, которая управляет соответствием условию — и чем за неё платят
Задача
Условная модель обучается так же, как безусловная, — просто с на входе. Проблема в том, что получается: сэмплы соответствуют условию слабее, чем хотелось бы. Модель честно воспроизводит , а хочется чего-то более выраженного.
Formально это признание в том, что мы хотим сэмплировать не из того распределения, которое выучили. Стоит сказать это прямо, потому что дальше вся техника — про то, из какого именно.
Формула
Обучение — один трюк: во время обучения условие с вероятностью около заменяется пустым. Одна и та же сеть выучивает обе функции, и на генерации её вызывают дважды. Отсюда и цена: два прогона на шаг вместо одного.
Почему разность в скобках — это направление условия? В score-виде
по правилу Байеса, поскольку от не зависит. То есть
Из какого распределения мы сэмплируем
Подставим и соберём:
То есть guidance сэмплирует из распределения, где правдоподобие условия возведено в степень . При это ровно ; при — что-то более сосредоточенное.
Оценивать это стоит трезво: это не более точная выборка из , а точная выборка из другого распределения. Метрики соответствия условию растут, метрики разнообразия падают, и компромисс здесь не артефакт реализации, а определение метода.
Что именно происходит с распределением
Здесь стоит поправить популярное «guidance делает распределение острее». Проверим два случая.
Случай гауссиан. Пусть и . Тогда
то есть направляемое распределение — это . Среднее уехало в раз дальше, дисперсия не изменилась вовсе. Никакого «острее» здесь нет.
Случай смеси. Возьмём безусловную смесь двух мод с весами и условную с (обе с ). Численно:
| среднее | ст. откл. | масса на левой моде | |
|---|---|---|---|
Вот теперь разнообразие действительно падает — но конкретным образом: guidance выбирает моду, а не сжимает её. Стандартное отклонение падает с до и дальше не идёт: — это почти ширина одной компоненты (). Всё, что guidance убрал, — это разнообразие между модами.
Точная формулировка, которую стоит унести: guidance перераспределяет массу к тем областям, где условие выполняется лучше. Выглядит это как «резкость», если моды соответствуют разным вариантам ответа, и не выглядит никак, если распределение унимодально.
Покрутите в виджете — там та же операция, применённая к смеси трёх гауссиан.
- макс. |score|
- 17.82
- длина пути
- 98.2
- доля времени у мод
- 25.3%
Практика
| что получается | |
|---|---|
| безусловная генерация | |
| честная условная модель, соответствие слабое | |
| рабочий диапазон для изображений | |
| пересыщенные цвета, артефакты, потеря разнообразия |
Верхняя строка объясняет типичный артефакт. Сдвиг среднего (гауссов случай выше) в раз означает выход за пределы области, где модель обучалась: при больших значения пикселей вылезают за допустимый диапазон, и результат приходится обрезать. Отсюда и приёмы вроде динамического ограничения, и вариант с изменением по ходу сэмплирования — большой на ранних шагах, где решается композиция, и малый на поздних, где решаются детали.
Итог
- Guidance — одна линейная комбинация двух предсказаний, обучаемая случайным обнулением условия.
- Разность предсказаний равна — классификатор без классификатора.
- Сэмплирование идёт из , то есть из другого распределения, а не более точно из условного.
- Гауссианы равной ширины при guidance сдвигаются, но не сужаются; сужение возникает из выбора моды в мультимодальном распределении.
- Цена: два прогона сети на шаг и потеря разнообразия, растущая с .
Источники
- Ho, Salimans — Classifier-Free Diffusion Guidance — Исходная работа, вывод и рецепт обучения
- Dhariwal, Nichol — Diffusion Models Beat GANs on Image Synthesis — Classifier guidance, предшественник
Проверки
0 из 2Что делает guidance
Отметьте все верные утверждения о classifier-free guidance.
Направляемое предсказание
Реализуйте
guided(eps_uncond, eps_cond, w, alpha_bar)— верните[eps_guided, score_guided, overshoot, amplification]:eps_guided= ;score_guided= — то же предсказание в виде score (урок 060);overshoot= — насколько направляемое предсказание ушло дальше честного условного;amplification= — во сколько раз усилено направление условия. Если знаменатель равен нулю, верните ноль.
Проверить себя можно так: при второй аргумент возвращается без изменений, а
overshootобязан быть нулевым.Загрузка редактора…
Ctrl/⌘ + Enter