Какие технологии использовались в старой версии Seedream 2

Генеративные модели для создания изображений за последние пару лет совершили такой рывок, что даже профессионалы индустрии порой не поспевают за новинками. Ещё вчера нейросеть выдавала размытые лица с шестью пальцами, а сегодня от фотореалистичного результата буквально захватывает дух. Среди десятков решений, которые появились на рынке, проект Seedream от ByteDance занимает довольно заметное место — и не только благодаря громкому имени материнской компании. Но чтобы по-настоящему оценить второе поколение этой модели, стоит разобраться в технологическом фундаменте, на котором она изначально стояла.

Все топовые нейросети в одном месте

Диффузионная архитектура: с чего всё начиналось

Сердцем старой версии Seedream 2 была диффузионная модель, построенная на принципе последовательного шумоподавления. Дело в том, что подобный подход к генерации изображений тяготеет к двухстадийной логике: сначала нейросеть учится превращать чистую картинку в «белый шум», а потом — разворачивать процесс в обратную сторону. Вся суть в том, что при обучении модель пропускала через себя миллионы пар «изображение — текстовое описание», постепенно усваивая связь между словами и визуальными паттернами. На каждом шаге обратного процесса сеть снимала один слой шума, приближая результат к осмысленной картинке. Звучит довольно просто, однако дьявол, как водится, прятался в деталях.

Архитектура U-Net, лежавшая в основе шумоподавляющего блока, напоминала песочные часы — входное изображение сжималось до компактного латентного представления, а затем разворачивалось обратно до полного разрешения. Между «сжимающей» и «расширяющей» частями протягивались так называемые skip-connections — мостики, которые переносили мелкие детали из ранних слоёв напрямую в поздние. И это было критически важно. Ведь без таких перемычек модель теряла текстуры, мелкие элементы вроде ресниц или прожилок на листе, да и вообще выдавала «мыльную» картинку. К слову, именно эта особенность U-Net стала одновременно и сильной стороной, и подводным камнем ранней версии Seedream 2.

Латентное пространство и кодировщик

Работа в пиксельном пространстве — удовольствие не из дешёвых с точки зрения вычислений. Генерировать изображение разрешением 1024 на 1024 пикселя «в лоб» требовало бы колоссальных ресурсов GPU. Поэтому разработчики ByteDance пошли проверенным путём и перенесли весь диффузионный процесс в латентное пространство, предварительно сжимая картинку специальным автокодировщиком (VAE). Этот добротный компактный кодировщик уменьшал пространственное разрешение в восемь раз, сохраняя при этом львиную долю визуальной информации. А уже в этом сжатом пространстве модель и «шумела», и «расшумливала».

Ваш личный ИИ-отдел маркетинга, который работает 24/7 📈

Ускорьте создание контента в 10 раз! Этот мульти-ИИ сервис позволяет писать безупречные продающие посты, генерировать уникальные фото для соцсетей, создавать рекламные промо-ролики с нуля и писать для них музыку в пару кликов. Идеальное решение для предпринимателей, маркетологов и SMM-специалистов. Всё в едином удобном интерфейсе — больше не нужно переключаться между десятком вкладок.

Делегируйте рутину искусственному интеллекту и увеличивайте продажи. Начните работу здесь 👉 https://clck.ru/3RNCRL

Нужно отметить, что VAE в Seedream 2 отличался от стандартных реализаций. Инженеры команды уделили особое внимание реконструкции высокочастотных деталей — тех самых микротекстур, из-за потери которых многие ранние диффузионные модели выглядели «пластиковыми». Коэффициент KL-дивергенции, контролирующий «гладкость» латентного распределения, был подобран довольно щепетильно: слишком маленькое значение превращало латентное пространство в хаос, а слишком большое — убивало разнообразие генераций. Баланс этот команда нащупывала экспериментально, итеративно, на протяжении нескольких месяцев.

Как текст превращался в изображение?

Текстовый энкодер — вот что связывало слова пользователя с визуальным миром модели. В старой версии Seedream 2 за эту задачу отвечал трансформерный блок, обученный на масштабной многоязычной корпусной базе. Особый интерес вызывает тот факт, что модель поддерживала не только английский, но и китайский язык на довольно приличном уровне — что неудивительно, учитывая корни ByteDance.

Механизм cross-attention соединял текстовые эмбеддинги с промежуточными слоями U-Net. На каждом уровне «песочных часов» модель буквально сверялась с текстом: «А что там пользователь просил? Закат? Океан? Девушку с зонтом?». Это внимание к текстовому запросу распределялось неравномерно — на ранних (грубых) уровнях модель «считывала» общий смысл композиции, а на поздних (детализированных) подтягивала стилистику и нюансы. Многие считают, что cross-attention — штука простая. Но на самом деле именно от качества этого механизма зависело, получит ли пользователь точное соответствие промпту или красивую, но совершенно не по теме картинку.

Отдельно стоит упомянуть технологию classifier-free guidance (CFG), без которой ранний Seedream 2 немыслим. Работала она так: при каждом шаге денойзинга модель генерировала два варианта — один с учётом текста, другой без. Разница между ними масштабировалась коэффициентом (обычно в диапазоне от семи до двенадцати), и этот усиленный «вектор направления» подталкивал генерацию ближе к описанию. Чем выше коэффициент — тем точнее следование промпту, но и тем жёстче, «перенасыщеннее» результат. Золотую середину каждый искал сам.

Обучение на масштабных данных

Нейросеть без данных — как художник без красок. В случае со старой версией Seedream 2 обучающий корпус составлял сотни миллионов пар «текст — изображение», собранных из открытых и проприетарных источников. Однако само по себе количество ещё ничего не гарантирует. Куда важнее оказалась скрупулёзная фильтрация: команда выстроила многоступенчатый пайплайн очистки, отсеивавший дубликаты, низкокачественные снимки, изображения с водяными знаками и контент, нарушающий этические нормы.

На первом этапе работал перцептивный хеш — алгоритм, вычислявший «отпечаток» каждой картинки и сравнивавший его с остальными. Далее следовала оценка эстетического качества через отдельную лёгкую нейросеть, натренированную на человеческих оценках привлекательности. И только после этого пара попадала в финальный обучающий набор. Да и сами текстовые описания проходили переработку: короткие и невнятные подписи (а таких в интернете — львиная доля) автоматически дополнялись с помощью модели captioning, которая генерировала более развёрнутое описание на основе содержимого снимка.

Контроль стиля и управление генерацией

Грубая сила диффузии — это ещё полдела. Обывателю хочется не просто картинку по описанию, а картинку в определённом стиле, с нужной композицией и настроением. В старой версии Seedream 2 за это отвечали несколько механизмов, тесно переплетённых между собой.

Во-первых, на этапе файн-тюнинга модель дообучалась на курированных подмножествах — коллекциях изображений определённой стилистики (фотореализм, аниме, цифровая живопись, акварель). Во-вторых, система негативных промптов позволяла «отталкивать» генерацию от нежелательных паттернов. Написал пользователь «no blur, no watermark» — и модель через тот же CFG-механизм активно уводила результат прочь от размытия и водяных знаков. Ну и, наконец, шедулер — алгоритм, управляющий расписанием шумоподавления. В ранней версии применялся DDPM-подобный шедулер с вариативным шагом: на первых итерациях модель делала крупные «мазки», а ближе к финалу переходила к ювелирным движениям. Это связано с тем, что большая часть семантической информации «проявляется» на ранних шагах, тогда как текстуры и мелочи — удел последних двадцати-тридцати итераций.

Можно ли было ускорить генерацию?

Задача не из лёгких. Стандартный диффузионный пайплайн требовал от пятидесяти до ста шагов денойзинга — а это, мягко говоря, не мгновенный процесс. Каждый шаг означал полный проход через U-Net, а это миллиарды операций с плавающей запятой. Для серверов ByteDance, обрабатывающих тысячи запросов в минуту, такое бьёт по бюджету инфраструктуры весьма ощутимо.

Инженеры применили несколько приёмов. Первый — дистилляция модели, при которой «большая» сеть обучала «маленькую» воспроизводить свои результаты за меньшее число шагов. Второй — переход на более агрессивные расписания шума (вроде DPM-Solver), позволявшие сократить количество итераций до двадцати-тридцати без катастрофической потери качества. И третий — квантизация весов из FP32 в FP16, а местами даже в INT8, что ускоряло вычисления на специализированных тензорных ядрах GPU примерно вдвое. Конечно, каждый из этих приёмов нёс свои издержки: дистиллированная модель чуть хуже справлялась с редкими промптами, агрессивный шедулер иногда порождал артефакты, а квантизация слегка «огрубляла» цветовые переходы. Но совокупный эффект всё-таки оправдывал компромиссы.

Безопасность и фильтрация контента

Ложка дёгтя в любой генеративной модели — это вопрос безопасности. ByteDance, работающая на глобальном рынке, не могла позволить себе скандалов с генерацией запрещённого контента. В старой версии Seedream 2 защитный слой состоял из двух компонентов, работавших последовательно. Сначала входной текст проходил через классификатор, обученный на размеченных примерах вредоносных запросов. Если промпт содержал подозрительные формулировки, генерация блокировалась ещё до первого шага диффузии. А уже готовое изображение прогонялось через визуальный NSFW-детектор, построенный на свёрточной нейросети, который оценивал результат по шкале от нуля до единицы. Порог отсечения выставлялся довольно строго — около 0,85.

Все топовые нейросети в одном месте

Впрочем, система была далека от совершенства. Хитрые формулировки (так называемые jailbreak-промпты) иногда проскакивали мимо текстового фильтра, а визуальный детектор периодически давал ложные срабатывания на вполне невинных изображениях с обнажённой скульптурой или медицинскими иллюстрациями. Это неоднозначная проблема, и решалась она в каждом следующем обновлении постепенно, через расширение обучающей выборки классификаторов.

Чем эта база отличалась от конкурентов?

Буквально пару лет назад генеративный бомонд делился на два лагеря: тех, кто строил всё на открытой архитектуре Stable Diffusion, и тех, кто создавал закрытые экосистемы вроде DALL·E или Midjourney. Seedream 2 тяготел ко второму подходу, но с оговорками. Модель заимствовала общие принципы латентной диффузии, однако внутренняя реализация — от архитектуры автокодировщика до способа внедрения текстовых эмбеддингов — была авторской разработкой.

Нельзя не упомянуть и подход к мультимодальности. Уже в ранней версии закладывались зачатки понимания не только текста, но и визуальных подсказок (image-to-image). Пользователь мог загрузить референсное изображение, и модель, пропустив его через VAE, использовала полученное латентное представление как отправную точку для диффузии. Это позволяло генерировать вариации, стилизации или дополнения к существующей картинке. Функция довольно часто применялась дизайнерами для быстрого прототипирования, хотя точность следования референсу оставляла желать лучшего — модель скорее «вдохновлялась» исходником, чем копировала его.

Технологический фундамент старой версии Seedream 2, при всех своих шероховатостях, заложил прочную базу для дальнейшего развития. Именно на этих решениях — латентной диффузии, cross-attention, CFG, многоступенчатой фильтрации данных — выросла следующая итерация модели, которая уже заметно прибавила и в скорости, и в качестве. А для тех, кто интересуется генеративным ИИ не поверхностно, понимание этих «кирпичиков» станет отличным подспорьем в осмыслении того, куда движется вся индустрия. Удачи в этом увлекательном путешествии по миру нейросетей — оно точно запомнится надолго.