VAE

variational autoencoder — мост между пикселями и латентом

Раздел
Генеративные модели
Сокращ.
Variational Autoencoder
Обновлено
11.08.26

VAE переводит изображение в компактный латентный тензор и декодирует его обратно в пиксели. В txt2img обычно работает decoder, а в img2img и inpainting нужны обе половины. Латент остаётся сжатием с потерями, поэтому совместимость VAE с моделью влияет не только на цвет, но и на фактуру, мелкие детали и саму возможность получить осмысленное изображение.

Коротко

VAE — двусторонний переход между изображением и латентным представлением. Encoder сжимает пиксели в латент, decoder восстанавливает из него изображение. В latent diffusion основная генеративная модель работает с латентом: так пространственная сетка получается заметно меньше исходной картинки.

Это сжатие с потерями. Decoder не достаёт спрятанный оригинал, а строит правдоподобную реконструкцию. Поэтому VAE способен изменить оттенки, границы, мелкую фактуру и лица, даже если сам латент остался прежним.

Зачем нужен отдельный автоэнкодер

Диффузия требует много последовательных вычислений. Делать каждый шаг на полном RGB-изображении дорого, особенно при большом разрешении. Авторы Latent Diffusion Models вынесли визуальное сжатие в заранее обученный автоэнкодер, а denoising перенесли в более компактное пространство.

У этого разделения две задачи:

  • VAE учится сохранять визуально важную информацию и восстанавливать пиксели;
  • denoising-модель учится превращать шумный латент в латент нужного изображения.

Текстовый энкодер стоит в другой ветке: он превращает prompt в conditioning. VAE не читает промпт и не решает, какой объект рисовать. Его работа начинается с пикселей или заканчивается ими.

Что означает «вариационный»

Обычный autoencoder может выдавать для изображения одну фиксированную точку. Variational autoencoder описывает распределение возможных латентов — например, через среднее и разброс — и использует выборку, которую можно обучать методом reparameterization.

Регуляризация помогает сделать латентное пространство более гладким и пригодным для генеративной модели. Одновременно VAE учится реконструкции: decoded-изображение должно быть похоже на вход. В image generation к пиксельной ошибке часто добавляют perceptual-компоненты, потому что математически близкая картинка не всегда выглядит близкой человеку.

Название VAE в интерфейсах стало удобным общим ярлыком для image encoder/decoder. Но семейства моделей могут использовать разные классы автоэнкодеров, число каналов и способы регуляризации. Совместимость определяет конфигурация, а не одна надпись на файле.

Где VAE участвует в генерации

В txt2img изображение на входе отсутствует. Pipeline создаёт латентный шум нужной формы, denoising-модель превращает его в итоговый латент, а VAE Decoder переводит результат в пиксели. Encoder в этом маршруте обычно не нужен.

В img2img путь длиннее:

  1. VAE Encoder переводит исходное изображение в латент.
  2. Pipeline добавляет к нему шум в соответствии с strength или denoise.
  3. Denoising-модель меняет латент под conditioning.
  4. VAE Decoder возвращает результат в пространство пикселей.

В inpainting encoder тоже нужен: он кодирует исходное изображение и область, с которой работает конкретный pipeline. Точная схема маски зависит от модели и реализации.

Размер латента: пример, а не закон

Для классических Stable Diffusion 1.x и SDXL характерно восьмикратное уменьшение ширины и высоты и четыре latent-канала. Отсюда знакомые формы:

Пример Пиксельный тензор Латент VAE Элементов меньше
SD 1.x, 512×512 512×512×3 64×64×4 в 48 раз
SDXL, 1024×1024 1024×1024×3 128×128×4 в 48 раз
FLUX.1, 1024×1024 1024×1024×3 128×128×16 в 12 раз

Последний столбец сравнивает только число элементов. Он не обещает такое же уменьшение файла, VRAM или времени: pixel tensor и latent могут храниться в разных типах данных, а pipeline держит дополнительные activations и временные буферы.

У FLUX.1 официальный VAE использует 16 latent-каналов. У других архитектур их может быть 4, 16, 32 или гораздо больше; видеоавтоэнкодеры дополнительно сжимают время. Некоторые pipelines ещё и упаковывают латент перед transformer. Поэтому форму лучше брать из конфигурации модели, а не из универсальной памятки.

Латентные каналы не имеют простых подписей «цвет», «форма» и «текстура». Информация распределена между ними. Показывать первые три канала как RGB можно для отладки, но такая картинка не раскрывает буквальный смысл каждого канала.

Почему VAE должен подходить модели

Совпадения числа каналов недостаточно. Важны:

  • класс и архитектура autoencoder;
  • пространственный коэффициент сжатия;
  • число и порядок latent-каналов;
  • scaling factor, а в некоторых pipelines ещё shift и normalization;
  • распределение латентов, на котором обучалась denoising-модель;
  • правила подготовки изображения и диапазон пикселей.

Грубое несовпадение обычно заканчивается ошибкой формы или шумом. Более тихое несовпадение может декодироваться, но давать сдвиг цвета, грубые границы, странный контраст или слабую фактуру.

VAE бывает упакован в единый checkpoint либо хранится отдельным компонентом. Это свойство формата поставки, а не жёсткое правило семейства. Надёжнее читать model card и использовать комплект, с которым публиковалась модель или workflow.

VAE в ComfyUI

Стандартный CheckpointLoaderSimple возвращает три выхода: основную модель, text encoder и VAE. Для обычного txt2img его выход VAE подключается к VAEDecode, а latent после sampling — ко входу samples этой ноды.

Для img2img одно и то же совместимое значение VAE идёт в VAEEncode и VAEDecode. Первая нода принимает IMAGE и выдаёт LATENT, вторая делает обратный переход.

Отдельный loader VAE нужен не по умолчанию, а когда:

  • модель распространяется раздельными компонентами;
  • автор workflow явно указал внешний VAE;
  • вы сравниваете два совместимых decoder;
  • checkpoint не содержит нужного компонента.

Подменять VAE наугад из-за одного неудачного кадра не стоит. Сначала полезно проверить, какой компонент выходит из loader и для какого семейства собран latent workflow.

Быстрая диагностика

Симптом Возможная причина Что проверить
Ошибка формы тензора другое число каналов или scale factor model card, VAE и тип latent
Цветной шум вместо изображения несовместимый decoder или неправильный latent семейство модели и соединения
Сдвинутые цвета, грубые края совместимый по форме, но чужой decoder результат со штатным VAE
Чёрный кадр или NaN precision, overflow, runtime или decoder dtype, upcast, логи; не винить VAE автоматически
Швы на больших изображениях tiled encode/decode размер плитки, overlap и blending
Out of memory при decode VAE обрабатывает большой тензор целиком tiled decode, batch и разрешение
img2img слишком далеко ушёл denoise, encoder и preprocessing strength, размер входа и штатный VAE

Серая или блеклая картинка сама по себе не доказывает VAE mismatch. Причина может находиться в цветовой обработке, preview, checkpoint, prompt, precision или postprocessing.

Проверка без догадок

Самый наглядный тест — round trip:

  1. Взять обычную фотографию с кожей, небом, градиентами и мелкой фактурой.
  2. Пропустить её через VAEEncode и сразу через VAEDecode, без sampler.
  3. Сравнить геометрию, цвет, текстуры и тонкие линии.
  4. Повторить с кандидатом на замену при тех же настройках.

Так видна именно реконструкция autoencoder, без влияния prompt и denoising. Небольшая потеря микродеталей ожидаема: VAE сжимает с потерями. Если меняется общая палитра, рушатся лица или появляются блоки, замена не подходит этому pipeline.

Для txt2img можно отдельно декодировать один сохранённый latent двумя совместимыми decoder. Это честнее, чем сравнивать две полные генерации с разными seed.

Что VAE меняет, а что нет

VAE влияет на то, как latent превращается в пиксели: цветовые переходы, локальный контраст, края, мелкую текстуру, лица и тонкие линии. Официальный ft-MSE для раннего Stable Diffusion, например, дообучал decoder с большим акцентом на reconstruction MSE и описывался как дающий более гладкие результаты — не просто «больше насыщенности».

При замене только decoder он не переписывает семантическую композицию, уже заключённую в latent. Но из-за потерь реконструкции мелкий объект может выглядеть иначе или исчезнуть. В img2img влияние шире, потому что участвует encoder.

VAE также не является самостоятельным смысловым апскейлером. Он может декодировать более крупную пространственную сетку latent, если архитектура это допускает, но не добавляет новые детали так, как отдельная generative или super-resolution модель.

Память и tiled decode

Фраза «VAE почти не занимает VRAM» обманчива. Веса autoencoder могут быть меньше основной модели, но высокое разрешение создаёт большие промежуточные activations. Именно на decode или encode иногда возникает пик памяти.

Tiling делит изображение на перекрывающиеся участки и снижает peak memory. Цена — больше операций и риск различий тона или швов между плитками. Slicing делит batch и помогает, когда одновременно обрабатывается несколько изображений. Это способы выполнить тот же переход экономнее, а не отдельные «улучшенные VAE».

С чем часто путают

  • VAE и denoising-модель. Denoiser формирует latent; VAE переводит между latent и пикселями.
  • VAE и text encoder. Первый кодирует изображение, второй — текст.
  • VAE и latent upscaler. Upscaler меняет пространственную сетку или добавляет детали, decoder только реконструирует пиксели из полученного latent.
  • VAE и формат checkpoint. Один файл может содержать несколько компонентов, но упаковка не делает их одной нейросетью.
  • VAE и preview latent. Быстрый preview может использовать приближённое преобразование, а не полноценный decoder, поэтому его цвет не всегда совпадает с финалом.

Частые ошибки и заблуждения

«Любой VAE с четырьмя каналами подойдёт»

Нет. Должны совпасть масштабирование, распределение латентов, архитектура и другие соглашения pipeline.

«Лучший VAE делает цвета насыщеннее»

Универсально лучшего decoder нет. Более насыщенная картинка может быть менее точной реконструкцией и хуже подходить конкретной модели.

«VAE хранит картинку в 48 раз меньше»

Для некоторых конфигураций это отношение числа элементов двух тензоров. Размер памяти и степень сохранённой информации так не измеряются.

«Если кадр чёрный, сломан VAE»

VAE — один из кандидатов. Чёрный результат также появляется из-за NaN, неподходящей precision, ошибок normalization и несовместимого runtime.

«Encoder нужен в каждом txt2img workflow»

Нет. Когда исходных пикселей нет, pipeline начинает с latent noise и использует decoder в конце.

Связанные термины

  • Latent Space — пространство, в которое VAE переводит изображение.
  • Stable Diffusion и SDXL — семейства latent diffusion с собственными соглашениями VAE.
  • FLUX — семейство с другим числом latent-каналов и масштабированием.
  • img2img — маршрут, где работают encoder и decoder.
  • Denoising Strength — определяет, насколько меняется закодированный вход.
  • KSampler — обрабатывает latent, который затем декодирует VAE.
  • CLIP — text encoder; к кодированию пикселей не относится.

Частые вопросы

Нужно ли скачивать VAE отдельно?

Только если так устроена поставка модели или это прямо указано в workflow и model card. Checkpoint может уже содержать совместимый VAE.

Можно ли заменить VAE и сохранить тот же seed?

Да, но сравнивать лучше один и тот же сохранённый latent. Так decoder остаётся единственной изменяемой частью.

Почему внешний VAE меняет лицо?

Лицо содержит много высокочастотных деталей. Сжатие с потерями и другая reconstruction-настройка decoder могут изменить глаза, кожу и тонкие границы.

Почему VAE разных семейств несовместимы?

Они могут различаться каналами, spatial compression, scaling, shift и распределением latent. Denoiser обучался на конкретном представлении.

Поможет ли VAE от нехватки VRAM?

Замена модели — не первый инструмент. Для больших изображений обычно используют tiled encode/decode, уменьшают batch или переносят компонент между CPU и GPU, если pipeline это поддерживает.

Можно ли использовать разные VAE для encode и decode?

Технически некоторые совместимые по форме компоненты соединятся, но round trip окажется несогласованным. Для обычного workflow безопаснее одна согласованная пара, если автор метода не описал другое.

Главное

VAE — не фильтр насыщенности, а обученный мост между пикселями и латентом. Он сжимает изображение с потерями, поэтому отвечает за качество реконструкции и должен совпадать с соглашениями denoising-модели.

В txt2img обычно нужен decoder, в img2img и inpainting — encoder и decoder. При проблемах полезнее проверить форму latent, scaling, штатный компонент и чистый round trip, чем перебирать случайные VAE по названию.

Источники