Модель скрытой диффузии ( LDM ) [1] представляет собой архитектуру модели диффузии, разработанную группой CompVis (Computer Vision & Learning) [2] в Университете Людвига-Максимилиана в Мюнхене . [3]
Представленные в 2015 году модели диффузии (DM) обучаются с целью удаления последовательных применений шума (обычно гауссовского ) на обучающих изображениях. LDM является улучшением стандартной DM за счет выполнения моделирования диффузии в скрытом пространстве и допуская кондиционирование собственного внимания и перекрестного внимания.
LDM широко используются в практических моделях диффузии. Например, версии Stable Diffusion 1.1–2.1 были основаны на архитектуре LDM. [4]
Модели диффузии были введены в 2015 году как метод обучения модели, которая может делать выборки из очень сложного распределения вероятностей. Они использовали методы из неравновесной термодинамики , особенно диффузии . [5] Это сопровождалось программной реализацией в Theano . [6]
В статье 2019 года была предложена сеть условной оценки шума (NCSN) или сопоставление оценок с динамикой Ланжевена (SMLD). [7] Статья сопровождалась программным пакетом, написанным на PyTorch , который был выпущен на GitHub. [8]
В статье 2020 года [9] была предложена вероятностная модель диффузии шумов (DDPM) , которая улучшает предыдущий метод с помощью вариационного вывода . Статья сопровождалась программным пакетом, написанным в TensorFlow, выпущенном на GitHub. [10] Она была повторно реализована в PyTorch компанией lucidrains. [11] [12]
20 декабря 2021 года статья LDM была опубликована на arXiv, [13] а репозитории Stable Diffusion [14] и LDM [15] были опубликованы на GitHub. Однако они остались примерно такими же. Существенная информация о Stable Diffusion v1 была добавлена на GitHub только 10 августа 2022 года. [16]
Все версии Stable Diffusion (SD) от 1.1 до XL представляли собой частные реализации архитектуры LDM.
SD 1.1–1.4 были выпущены CompVis в августе 2022 года. «Версии 1.0» не существует. SD 1.1 была LDM, обученной на наборе данных laion2B-en. SD 1.1 была доработана до 1.2 для более эстетичных изображений. SD 1.2 была доработана до 1.3, 1.4 и 1.5, при этом 10% текстовой обработки было удалено для улучшения руководства без классификатора. [17] [18] SD 1.5 была выпущена RunwayML в октябре 2022 года. [18]
Хотя LDM может работать для генерации произвольных данных, зависящих от произвольных данных, для конкретности мы опишем его работу в условной генерации текста в изображение.
LDM состоит из вариационного автокодировщика (VAE), модифицированной U-Net и текстового кодировщика.
Кодер VAE сжимает изображение из пиксельного пространства в менее размерное скрытое пространство , захватывая более фундаментальное семантическое значение изображения. Гауссовский шум итеративно применяется к сжатому скрытому представлению во время прямой диффузии. Блок U-Net, состоящий из каркаса ResNet , удаляет шум с выходных данных прямой диффузии в обратном направлении для получения скрытого представления. Наконец, декодер VAE генерирует окончательное изображение, преобразуя представление обратно в пиксельное пространство. [4]
Шаг шумоподавления может быть обусловлен строкой текста, изображением или другой модальностью. Закодированные данные обусловливания подвергаются шумоподавляющим U-сетям через механизм перекрестного внимания . [4] Для обусловливания текста используется фиксированный, предварительно обученный текстовый кодер CLIP ViT-L/14 для преобразования текстовых подсказок в пространство внедрения. [3]
Для сжатия данных изображения вариационный автоэнкодер (VAE) сначала обучается на наборе данных изображений. Часть кодировщика VAE принимает изображение в качестве входных данных и выводит скрытое представление изображения меньшей размерности. Затем это скрытое представление используется в качестве входных данных для U-Net. После обучения модели кодировщик используется для кодирования изображений в скрытые представления, а декодер используется для декодирования скрытых представлений обратно в изображения.
Пусть кодер и декодер VAE будут .
Для кодирования изображения RGB его три канала делятся на максимальное значение, что приводит к тензору формы со всеми записями в диапазоне . Закодированный вектор равен , с формой , где 0,18215 — гиперпараметр, который первоначальные авторы выбрали для грубого отбеливания закодированного вектора до дисперсии, приблизительно равной единице. И наоборот, если задан скрытый тензор , декодированное изображение равно , затем обрезается до диапазона . [19] [20]
В реализованной версии [3] : ldm/models/autoencoder.py кодер представляет собой сверточную нейронную сеть (CNN) с одним механизмом самовнимания в конце. Он берет тензор формы и выводит тензор формы , являющийся конкатенацией предсказанного среднего значения и дисперсии скрытого вектора. Дисперсия используется при обучении, но после обучения обычно берется только среднее значение, а дисперсия отбрасывается.
Декодер — это CNN также с одним механизмом самовнимания в конце. Он берет тензор формы и выдает тензор формы .
Магистраль U-Net принимает следующие типы входных данных:
Каждый прогон через магистраль UNet создает прогнозируемый вектор шума. Этот вектор шума уменьшается и вычитается из массива скрытого изображения, что приводит к немного менее шумному скрытому изображению. Шумоподавление повторяется в соответствии с графиком шумоподавления («графиком шума»), а выход последнего шага обрабатывается декодером VAE в готовое изображение.
Подобно стандартной U-Net , магистраль U-Net, используемая в SD 1.5, по сути, состоит из слоев масштабирования вниз, за которыми следуют слои масштабирования вверх. Однако магистраль UNet имеет дополнительные модули, позволяющие ей обрабатывать встраивание. В качестве иллюстрации мы описываем один слой масштабирования вниз в магистрали:
ResBlock
:SpatialTransformer
, который по сути является стандартным декодером pre-LN Transformer без причинной маскировки.В псевдокоде,
def ResBlock ( x , time , residual_channels ): x_in = x time_embedding = feedforward_network ( time ) x = concatenate ( x , residual_channels ) x = conv_layer_1 ( activate ( normalize_1 ( x ))) + time_embedding x = conv_layer_2 ( dropout ( activate ( normalize_2 ( x )))) return x_in + xdef SpatialTransformer ( x , cond ): x_in = x x = normalize ( x ) x = proj_in ( x ) x = cross_attention ( x , cond ) x = proj_out ( x ) return x_in + x def unet ( x , time , cond ) : residual_channels = [ ] для resblock , spatialtransformer в downscaling_layers : x = resblock ( x , time ) residual_channels.append ( x ) x = spatialtransformer ( x , cond ) x = средний_слой.resblock_1 ( x , время ) x = средний_слой.spacetransformer ( x , время ) x = средний_слой.resblock_2 ( x , время ) для resblock , spatialtransformer в upscaling_layers : residual = residual_channels.pop ( ) x = resblock ( concatenate ( x , residual ) , time ) x = spatialtransformer ( x , cond ) вернуть х
Подробную архитектуру можно найти в [22] [23]
LDM обучается с использованием цепи Маркова для постепенного добавления шума к обучающим изображениям. Затем модель обучается для обратного процесса, начиная с шумного изображения и постепенно удаляя шум, пока не восстановит исходное изображение. Более конкретно, процесс обучения можно описать следующим образом:
Модель обучается минимизировать разницу между прогнозируемым шумом и фактическим шумом, добавляемым на каждом шаге. Обычно это делается с использованием функции потерь среднеквадратической ошибки (MSE).
После обучения модели ее можно использовать для генерации новых изображений, просто запустив процесс обратной диффузии, начиная со случайного образца шума. Модель постепенно удаляет шум из образца, руководствуясь изученным распределением шума, пока не сгенерирует окончательное изображение.
Подробную информацию см . на странице модели диффузии .