29 / 33 · Диффузионные модели
Латентная диффузия и Stable Diffusion
Диффузия в латентном пространстве автоэнкодера вместо пикселей: перцептивное и семантическое сжатие, автоэнкодер, обусловливание на текст через перекрёстное внимание, classifier-free guidance, более быстрые сэмплеры и инструменты редактирования на той же модели (image-to-image, инпейнтинг, LoRA, textual inversion).
Score matching и динамика Ланжевена · Варианты VAE: β-VAE и VQ-VAE
На этой странице 12
Заметки о DDPM и score matching описывают одну модель, которая шаг за шагом очищает изображение от шума. Каждый шаг прогоняет сеть по каждому пикселю, а сэмплу нужны десятки и сотни шагов. Большая часть этой работы уходит на детали, которых никто не видит: точную текстуру травы или шум матрицы камеры. Латентная диффузия (latent diffusion, Rombach et al., 2022) делит задачу надвое. Автоэнкодер один раз убирает незаметные детали; диффузионная модель работает только с оставшимся маленьким латентом и тратит свою ёмкость на то, что изображение показывает. Stable Diffusion — это такая схема с присоединённым текстовым энкодером.
Какая Stable Diffusion. Константы ниже относятся к конкретным чекпойнтам, а не к латентной диффузии вообще. Числа для , масштаб латента 0.18215 и текстовые энкодеры на 77 токенов — это Stable Diffusion 1.x и 2.x, а масштаб guidance 7.5 — значение по умолчанию в их конвейере Diffusers. У SDXL, более поздней модели, U-Net больше и два текстовых энкодера (Podell et al., 2023); её опубликованный автоэнкодер использует масштаб латента 0.13025, а её конвейер Diffusers — guidance 5.0 по умолчанию.
Обозначения. Изображение , энкодер и декодер с , коэффициент уменьшения . Условие (запрос) и его энкодер . Величины диффузии , , — те же, что в заметках о DDPM, только применённые к вместо .
Два вида сжатия#
Обученная модель изображений сжимает в двух смыслах. Перцептивное сжатие выбрасывает высокочастотные детали, которые меняют много битов изображения и почти ничего из того, что воспринимает человек. Семантическое сжатие схватывает компоновку и содержание изображения: какие объекты, где, в каком стиле. Модель правдоподобия в пространстве пикселей платит за каждый бит, а статья показывает, что большинство этих битов относится к перцептивной части. Латентная диффузия отдаёт каждую часть подходящей ей модели: первую — автоэнкодеру, обученному с перцептивной и состязательной функциями потерь, вторую — диффузионной модели.
Выигрыш велик. Stable Diffusion при использует и : в изображении числа, а в латенте — в 48 раз меньше. Внимание растёт ещё быстрее. Самовнимание по сетке сравнивает пар; по пикселям оно сравнивало бы — в 4096 раз больше, поэтому модели в пространстве пикселей применяют внимание только на грубых разрешениях. Память важна не меньше времени: одна карта внимания уже содержит элементов — 67 МБ в 32-битных числах с плавающей точкой — для каждой головы и каждого изображения батча. Библиотеки умеют вычислять внимание по частям (slicing), по нескольку голов или изображений за раз: результат тот же, пиковое потребление памяти ниже, а скорость немного меньше.
Автоэнкодер#
Первая ступень обучается один раз и затем замораживается. Её функция потерь объединяет слагаемое восстановления, перцептивную функцию потерь (perceptual loss), сравнивающую глубокие признаки восстановления и изображения, как это делает LPIPS, и состязательную функцию потерь по фрагментам (patch-based adversarial loss), чей дискриминатор судит маленькие фрагменты, чтобы восстановления оставались чёткими, а не усреднялись до размытости. Латент держится близко к простому распределению одним из двух способов: слабым штрафом KL к , как в VAE с очень маленьким весом слагаемого KL, или слоем векторного квантования, как в VQ-VAE. В отличие от VAE, используемого как генератор, от этого автоэнкодера не требуют, чтобы сэмплы из априорного распределения выглядели хорошо: априорное распределение даёт диффузионная модель.
Коэффициент уменьшения задаёт разделение труда. При диффузионная модель по-прежнему делает всю перцептивную работу и обучается медленно; при автоэнкодер теряет информацию, которую декодер не может восстановить, и качество перестаёт расти. Статья находит, что от 4 до 16 даёт хороший баланс, а лучшие — и . Поскольку штраф KL слаб, у латентов Stable Diffusion дисперсия не равна 1; код умножает их на фиксированный масштаб, 0.18215 для версий 1.x и 2.x, чтобы диффузия начиналась с данных примерно единичной дисперсии.
Диффузия в латенте#
Обучение — это целевая функция DDPM с вместо :
Генерация берёт , проходит обратную цепочку в латентном пространстве и один раз в конце декодирует, . Сеть — U-Net, свёрточная, со слоями внимания на низких разрешениях.
Латентная диффузия: Stable Diffusion при 512×512
Обусловливание через перекрёстное внимание#
Условие входит через перекрёстное внимание (cross-attention, заметка о внимании): запросы берутся из признаков U-Net для , ключи и значения — из закодированного условия,
где — вытянутые в вектор промежуточные признаки. Каждая пространственная позиция латента смотрит на токены запроса, так что разные области могут следовать разным словам. В Stable Diffusion — замороженный текстовый энкодер, превращающий запрос в 77 векторов токенов: CLIP ViT-L/14 размерности 768 в версиях 1.x, OpenCLIP ViT-H/14 размерности 1024 в версиях 2.x. Тот же механизм принимает и другие условия — метки классов, карты сегментации, изображения низкого разрешения.
Взвешивание запроса (prompt weighting). Каждый токен попадает в U-Net своим вектором , поэтому понятие можно усилить или ослабить уже после кодирования, без переобучения. Распространённое правило сдвигает вектор токена дальше от вектора на той же позиции для пустого запроса или ближе к нему,
с , чтобы усилить понятие, и , чтобы ослабить. Изменение действует через перекрёстное внимание: ключ токена меняет то, насколько латент обращает на него внимание, а значение — то, что латент из него считывает. Библиотека Compel записывает веса суффиксами, каждый + — множитель , каждый - — множитель : у ball++ вес , у ball-- — , у forest--- — . Для весов меньше она ещё и смешивает результат с кодировкой запроса, в котором эти токены замаскированы.
Classifier-free guidance#
Условная модель, сэмплируемая как есть, следует запросу лишь приблизительно. Classifier-free guidance (Ho and Salimans, 2022) усиливает это без отдельного классификатора. При обучении условие в части шагов заменяется пустым — в статье в 10 или 20%, — так что одна сеть учит и , и . При сэмплировании два предсказания экстраполируются:
— безусловная модель, — обычная условная, а уходит дальше неё; конвейер Diffusers для Stable Diffusion 1.x и 2.x по умолчанию использует . Поскольку предсказание шума — это отмасштабированный score, (заметка о score matching), направленное предсказание — это score
а по формуле Байеса это : безусловный score плюс градиентов неявного классификатора.
Score на каждом уровне шума, а не целевое распределение. Тождество выполняется на каждом шаге отдельно, с зашумлёнными маргинальными распределениями вместо : направленное предсказание — это score плотности . При и семейство — зашумление одного распределения. При других в общем случае нет: зашумление не даёт , и никакое другое отдельное распределение тоже. В разобранном ниже примере каждое — гауссиана, и чистое распределение, из которого оно должно было бы получиться, имеет среднее на последнем шаге, но при , если время идёт от (данные) до (шум). Поэтому сэмплер, которым управляет направленный score, в общем случае не приходит к , а стохастический сэмплер DDPM и детерминированный сэмплер DDIM из следующего раздела с одной и той же сетью приходят к разным распределениям (Bradley and Nakkiran, 2024). Тождество задаёт направление каждого шага: к областям, которые предпочитает неявный классификатор на данном уровне шума.
Разобранный пример. Возьмём безусловное и условное . На последнем шаге направленный score — это score плотности , гауссианы с точностью и средним, равным , делённому на эту точность. При точность , так что стандартное отклонение , а среднее ; при точность , стандартное отклонение , среднее . Сэмплеры приходят в другое место. С точными гауссовскими score, чтобы ошибка сети не участвовала, и непрерывной версией линейного расписания DDPM ( от до ) сэмплирование с guidance при заканчивается средним и стандартным отклонением у стохастического сэмплера и средним и стандартным отклонением у детерминированного; при — и , а также и . Направление совпадает с наклонённой плотностью, но выражено сильнее: guidance сужает распределение и уводит его от безусловного среднего дальше условного. Сэмплы становятся типичнее для запроса и менее разнообразны — это сторона точности в компромиссе из заметки о точности и полноте. Каждый шаг стоит двух вычислений сети — с запросом и без.
Направленный score на последнем шаге указывает на более узкую и сдвинутую плотность
Меньше шагов#
DDPM сэмплирует за столько шагов, сколько использовалось при обучении, — 1000, потому что каждый шаг отменяет один малый гауссовский шаг. Быстрые сэмплеры исходят из детерминированного описания той же модели. В непрерывном времени прямой процесс — стохастическое дифференциальное уравнение, и Song et al. (2021) показывают, что ОДУ потока вероятности (probability flow ODE)
в каждый момент времени имеет то же маргинальное распределение , что и процесс зашумления. Здесь — интенсивность шума в непрерывном времени, причём для одного дискретного шага и , а score заменён отмасштабированным предсказателем шума (заметка о score matching). Интегрирование ОДУ от до отображает каждый латент шума в один сэмпл, и решателю, который делает большие шаги, нужно немного вычислений сети.
DDIM — это метод Эйлера в подходящих координатах. Разделим латент на его коэффициент сигнала и будем измерять время отношением шум/сигнал,
так что . Если продифференцировать с учётом , члены с сокращаются, а и содержат один и тот же множитель . ОДУ превращается в (Song, Meng and Ermon, 2021, §4.3, формула 14) с точным решением от к более раннему, меньшему
Метод Эйлера держит на всём шаге равным значению в . Умножение обратно на даёт обновление DDIM (их формула 12 без добавленного шума):
Предсказываем чистый латент, затем снова зашумляем его до уровня шага тем же предсказанным шумом. Шагом может быть любой более ранний шаг, поэтому расписание из 50 шагов просто проходит каждый двадцатый . Сэмплер Эйлера в диффузионных библиотеках, построенный по Karras et al. (2022), делает то же обновление со своим выбором уровней шума; его вариант «ancestral» добавляет новый шум после каждого шага. DDIM детерминирован и отображает каждый латент шума в одно изображение. Если выполнять его обновление в обратную сторону, от изображения к шуму, получается приближённое обращение (inversion): идеальное ОДУ можно интегрировать в обе стороны, но каждый шаг Эйлера вычисляет в начале шага, поэтому обратный проход не отменяет прямой в точности. Ошибка уменьшается с числом шагов и растёт с ошибкой модели и с guidance.
Разобранный пример. Одномерные данные , точный предсказатель шума, линейное расписание DDPM, из его точного распределения и шаги DDIM, равномерно расставленные по . У сэмплов должно быть стандартное отклонение . С 1 шагом оно равно , с 10 шагами — , с 50 — , с 1000 — . Один шаг из чистого шума возвращает — апостериорное среднее , близкое к среднему всех данных; слишком малое число шагов первого порядка стягивает сэмплы к этому среднему. Та же постановка показывает, что обращение приближённое даже с точным предсказателем шума: если обратить точку шагами DDIM и сгенерировать обратно, получится при 10 шагах, при 50 и при 1000.
DPM-Solver: точно проинтегрировать известную часть. В переменной , равной половине логарифма отношения сигнал/шум, то же точное решение записывается как (Lu et al., 2022a, формула 3.4). DPM-Solver раскладывает в ряд Тейлора по в начале каждого шага и интегрирует экспоненциальный вес точно. Его версия первого порядка — DDIM (их §4.1); версии второго и третьего порядка тратят два или три вычисления сети на шаг, но им нужно гораздо меньше шагов. DPM-Solver++ (Lu et al., 2022b) применяет ту же идею к предсказанному чистому латенту вместо шума и использует многошаговое обновление второго порядка, которое повторно использует вычисление сети с предыдущего шага. Более ранние решатели высокого порядка теряли устойчивость при больших масштабах guidance, типичных для моделей «текст в изображение», и работали даже медленнее DDIM; многошаговая форма уменьшает эффективный размер шага и сохраняет устойчивость.
Сколько шагов. Числа зависят от guidance. Без guidance DPM-Solver даёт качественные сэмплы за 10–20 вычислений сети, с FID 4.70 при 10 и 2.87 при 20 на CIFAR-10 (Lu et al., 2022a). С guidance, как обнаружили Lu et al. (2022b), DDIM обычно нужно 100–250 шагов, чтобы сойтись, а DPM-Solver++ даёт качественные сэмплы за 15–20 шагов — как для моделей в пространстве пикселей, так и для латентных. На Stable Diffusion с масштабом guidance 7.5 DPM-Solver++ за 15–20 шагов достигает той ошибки в латентном пространстве, которую имеет стандартный 50-шаговый сэмплер (PNDM); в том же тесте все решатели уже при 10 шагах давали FID около 15–16, потому что декодер превращает не вполне сошедшийся латент в хорошее изображение (их §7.2). Сеть не меняется; меняется только правило обновления между её вычислениями, поэтому диффузионные библиотеки позволяют заменить сэмплер (шедулер, scheduler) после обучения.
Редактирование той же моделью#
- Image-to-image (SDEdit, Meng et al., 2022). Закодировать существующее изображение, зашумить его до промежуточного шага, , и пройти оставшиеся шаги очистки с новым запросом. Сила (strength) выбирает шаг: при 40 шагах сэмплирования и проходятся последние 24. Малая сила сохраняет композицию; сила 1 игнорирует вход.
- Инпейнтинг (inpainting). Чтобы изменить только область под маской, на каждом шаге латент вне маски заменяется исходным латентом, зашумлённым до того же шага, и модели следует только часть под маской: , где — маска, уменьшенная до сетки латента (1 там, где изображение может меняться), , а — обновление сэмплера. При маска применяется к блокам пикселей, поэтому её граница не воспроизводится точно, а сглаживается декодером. Специальные модели инпейнтинга вместо этого получают маску и замаскированное изображение как дополнительные входные каналы и обучены под эту задачу.
- LoRA. Дообучить слои внимания низкоранговыми обновлениями (заметка о PEFT), чтобы научить стилю или объекту по небольшому набору данных; обновление можно влить в веса для инференса. Для матрицы весов обучается чисел вместо : при это слоя для и для .
- Textual inversion (Gal et al., 2023). Заморозить всё и учить только эмбеддинг нового токена, например
<S*>, минимизируя функцию потерь диффузии на трёх–пяти изображениях понятия, (их формула 2), где — шаблонный запрос вроде «a photo of<S*>», в котором вместо эмбеддинга токена стоит . Затем токен можно использовать в любом запросе.
Что изменилось#
| Диффузия в пикселях | Латентная диффузия | |
|---|---|---|
| Пространство диффузии | пиксели, | латент, |
| Кто убирает незаметные детали | диффузионная модель, медленно | автоэнкодер, один раз |
| Внимание | только на грубых разрешениях | посильно по всей сетке латента |
| Обусловливание | возможно, но дорого | перекрёстное внимание к текстовому энкодеру |
| Число шагов (задаёт сэмплер, а не пространство) | те же сэмплеры: около 1000 у DDPM, около 50 с DDIM на практике (100–250 до сходимости с guidance), 15–20 с DPM-Solver++ | так же |
| Цена одного шага | проход U-Net по числам, дважды с guidance | проход по числам, дважды с guidance, плюс один проход декодера на изображение |
| Предел детализации | сеть | декодер автоэнкодера |
Ограничения#
- Декодер ограничивает детали. Мелкий текст, лица в малом масштабе и точные текстуры зависят от того, что может восстановить автоэнкодер; диффузионная модель не может добавить то, чего не выражает .
- Guidance — компромисс. Большое улучшает следование запросу и типичность ценой разнообразия, а начиная с какого-то значения — и качества изображения.
- Текстовый энкодер ограничивает понимание. Замороженный энкодер типа CLIP на 77 токенов плохо справляется с подсчётом, пространственными отношениями и длинными запросами.
- По-прежнему итеративно. Остаются десятки вычислений сети на изображение, вдвое больше с guidance, а слишком малое число шагов сэмплера первого порядка стягивает сэмплы к их среднему.
- Память. Внимание по сетке латента требует памяти, квадратичной по числу позиций; вычисление по частям меняет скорость на память.
- Данные. Модели обучаются на больших собранных из интернета наборах пар изображение–текст, со всеми вопросами согласия, авторских прав и смещений, которые к ним прилагаются.
Итоги#
- Автоэнкодер один раз убирает перцептивные детали; диффузия идёт в его латенте, который для Stable Diffusion при в 48 раз меньше изображения.
- Автоэнкодер обучается с функциями потерь восстановления, перцептивной и состязательной по фрагментам и слабой регуляризацией KL или VQ; от 4 до 16 балансирует скорость и точность.
- Текст входит в U-Net через перекрёстное внимание: запросы — из латента, ключи и значения — из текстового энкодера. Веса отдельных токенов сдвигают их векторы дальше от векторов пустого запроса или ближе к ним.
- Classifier-free guidance экстраполирует от безусловного предсказания к условному. На каждом уровне шума это score плотности , но сэмплы в общем случае не следуют , а сэмплирование DDPM и DDIM приходит к разным распределениям; оба сужают распределение к запросу.
- Сэмплеры интегрируют ОДУ потока вероятности той же модели: DDIM — метод Эйлера в координатах , DPM-Solver точно интегрирует линейную часть и раскладывает сеть по ; с guidance DPM-Solver++ нужно 15–20 шагов. Image-to-image, инпейнтинг, LoRA и textual inversion используют модель для редактирования.
Ноутбук#
Ноутбук о продвинутой диффузии из репозитория HSE-LAMBDA Deep Generative Models использует библиотеку Hugging Face Diffusers (номера ячеек считают все ячейки, включая текстовые, начиная с 1). Сохранённых выходов ячеек в нём нет, поэтому он описывает процедуру, а не результаты.
- Ячейки 5–9: напоминание о DDPM и конвейере Stable Diffusion, затем генерация по тексту моделью
stabilityai/stable-diffusion-2-1-baseво float32, 25 шагов и масштаб guidance 7.5.enable_attention_slicing()вычисляет внимание по частям, чтобы снизить пиковое потребление памяти, как описано выше. Текст ячейки 6 даёт размер текстового эмбеддинга — размер для Stable Diffusion 1.x; у используемой здесь версии 2.1 энкодер OpenCLIP размерности 1024. - Ячейки 10–12: шедулеры. ОДУ в тексте оставляет только слагаемое с шумом: у ОДУ потока вероятности для процесса, сохраняющего дисперсию, есть ещё слагаемое, пропорциональное , и множитель . Шаг Эйлера записан с добавленным шумом, тогда как
EulerDiscreteSchedulerпо умолчанию детерминирован (стохастический вариант —EulerAncestralDiscreteScheduler), а про DDIM сказано, что он позволяет параллельное сэмплирование, чего он не делает; он позволяет меньше шагов и приближённое обращение. Текст и README называют 10–15 шагов для DPM-Solver++ и 20–30 для сэмплера Эйлера. Статья о DPM-Solver++ сообщает о 15–20 шагах для сэмплирования с guidance, а именно так работает Stable Diffusion; около 10 шагов — это цифра для DPM-Solver без guidance; для сэмплера Эйлера статьи числа шагов не дают. README ссылается на статью о DPM-Solver, процитированную выше. В ячейке 11swap_schedulerзаменяет шедулер у того же объекта конвейера и возвращает его, так чтоpipe_eulerиpipe_dpm— один конвейер: оба изображения в сравнении получены с DPM-Solver++. - Ячейки 13–16: пакетная генерация трёх запросов и взвешивание запроса с Compel:
ball--(вес ),ball++() иball++вместе сforest---(). Текст описывает синтаксис(token:weight)другого инструмента и нормированную взвешенную сумму эмбеддингов токенов; синтаксис Compel — тот, что используется в коде, а его взвешивание действует на выход текстового энкодера. - Ячейки 17–20: image-to-image для картинки с силой 0.6 (24 из 40 шагов) и 1.0.
- Ячейки 21–22: инпейнтинг тем же базовым чекпоинтом, 50 шагов. У его U-Net 4 входных канала, поэтому конвейер использует замену латента, записанную выше, а не модели инпейнтинга, получающие маску на вход.
- Ячейки 23–24: LoRA в стиле пиксель-арта, загруженная в Stable Diffusion XL и влитая с масштабом 0.8. В тексте сказано, что LoRA обучает около 0.2% параметров SD-XL. У загружаемого здесь адаптера ранг 32 и 85.1 млн параметров, все в U-Net (по заголовку файла весов), — около 3.3% от 2.6 млрд параметров U-Net SD-XL (Podell et al., 2023); 0.2% соответствовали бы рангу 2. Доля зависит от ранга и от того, какие слои адаптируются.
- Ячейки 25–26: textual inversion с токеном понятия из
sd-concepts-library, загруженным вrunwayml/stable-diffusion-v1-5. Под этим именем репозиторий больше не публикуется; те же веса лежат вstable-diffusion-v1-5/stable-diffusion-v1-5, и API Hub перенаправляет туда старый идентификатор. Текст даёт целевую функцию textual inversion, записанную выше.
Дальше#
Текст, маски и сила image-to-image — грубые средства управления: они говорят, что должно появиться и примерно где, но не то, куда именно должна попасть данная точка изображения. Следующая заметка, Редактирование изображений по точкам: DragGAN и DragDiffusion, ставит задачу точных геометрических правок вида «перемести эту точку туда»: сначала через оптимизацию латентного кода GAN (DragGAN), затем через оптимизацию зашумлённого латента диффузионной модели (DragDiffusion).
Литература#
- R. Rombach, A. Blattmann, D. Lorenz, P. Esser, B. Ommer. High-Resolution Image Synthesis with Latent Diffusion Models. CVPR, 2022.
- J. Ho, T. Salimans. Classifier-Free Diffusion Guidance. NeurIPS Workshop on Deep Generative Models, 2021.
- A. Bradley, P. Nakkiran. Classifier-Free Guidance is a Predictor-Corrector. arXiv:2408.09000, 2024.
- J. Song, C. Meng, S. Ermon. Denoising Diffusion Implicit Models. ICLR, 2021.
- C. Lu, Y. Zhou, F. Bao, J. Chen, C. Li, J. Zhu. DPM-Solver: A Fast ODE Solver for Diffusion Probabilistic Model Sampling in Around 10 Steps. NeurIPS, 2022 (цитируется как Lu et al., 2022a). Формула 3.4 (точное решение), §4.1 (DDIM как DPM-Solver-1).
- C. Lu, Y. Zhou, F. Bao, J. Chen, C. Li, J. Zhu. DPM-Solver++: Fast Solver for Guided Sampling of Diffusion Probabilistic Models. arXiv:2211.01095, 2022 (цитируется как Lu et al., 2022b). §1 и §7.2 (число шагов с guidance, Stable Diffusion).
- T. Karras, M. Aittala, T. Aila, S. Laine. Elucidating the Design Space of Diffusion-Based Generative Models. NeurIPS, 2022.
- Y. Song, J. Sohl-Dickstein, D. P. Kingma, A. Kumar, S. Ermon, B. Poole. Score-Based Generative Modeling through Stochastic Differential Equations. ICLR, 2021.
- C. Meng, Y. He, Y. Song, J. Song, J. Wu, J.-Y. Zhu, S. Ermon. SDEdit: Guided Image Synthesis and Editing with Stochastic Differential Equations. ICLR, 2022.
- R. Gal, Y. Alaluf, Y. Atzmon, O. Patashnik, A. H. Bermano, G. Chechik, D. Cohen-Or. An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion. ICLR, 2023.
- E. J. Hu, Y. Shen, P. Wallis, Z. Allen-Zhu, Y. Li, S. Wang, L. Wang, W. Chen. LoRA: Low-Rank Adaptation of Large Language Models. ICLR, 2022.
- D. Podell, Z. English, K. Lacey, A. Blattmann, T. Dockhorn, J. Müller, J. Penna, R. Rombach. SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis. arXiv:2307.01952, 2023. §2.1 (2.6 млрд параметров в U-Net).
- D. Stewart. Compel: взвешивание запросов для Diffusers. Программная библиотека; синтаксис — в
doc/syntax.md, взвешивание — вsrc/compel/embeddings_provider.py.