Часть 3. GAN: генерация через соревнование.
В прошлой статье мы познакомились с вариационным автоэнкодером (VAE) и увидели, как он решает проблему «дырявого» латентного пространства обычного автоэнкодера. Вместо того чтобы кодировать картинку в одну точку, VAE кодирует её в распределение, что делает пространство более гладким и позволяет генерировать новые, никогда не виденные нейросетью данные. Однако мы также заметили его главный недостаток: VAE часто выдаёт размытые изображения.
Почему так происходит? У цифры «7», например, в датасете может быть много вариантов: где-то она наклонена влево, где-то вправо, где-то написана толстой линией, где-то тонкой. Вариационный автоэнкодер пытается охватить все эти варианты сразу и в итоге выдаёт «среднюю семёрку»: что-то похожее на все варианты одновременно, но без чёткости. Из-за этого картинка получается слегка замыленной.
И тут возникает закономерный вопрос: можно ли построить модель, которая будет рисовать чёткие и реалистичные картинки, не скатываясь в усреднённый вариант? Ответом стали генеративно-состязательные сети.
Что такое GAN
Чтобы справиться с проблемой размытых изображений, исследователи придумали совершенно иной подход. Он получил название GAN (Generative Adversarial Network), или по-русски генеративно-состязательная сеть.
Название объясняет идею: GAN состоит из двух частей, которые играют друг против друга.
Генератор — это нейросеть, задача которой создавать новые изображения. Она получает на вход случайный шум, под которым здесь понимается грубо говоря набор случайных пикселей. Просто модель устроена таким образом, что она не может начать генерировать «с чистого листа», ей нужно от чего-то оттолкнуться, набор каких-то признаков, которые можно менять путем математических операций. Эти случайные пиксели и служат той отправной точкой, из которой генератор постепенно строит картинку, стараясь сделать её похожей на настоящую из датасета.
Дискриминатор — вторая нейросеть в паре. Она получает на вход картинки и должна определить, настоящая ли это картинка из тренировочного датасета или подделка, созданная генератором.
Обучение GAN устроено как игра: генератор старается обмануть дискриминатор, делая свои картинки всё более реалистичными, а дискриминатор, в свою очередь, всё лучше отличает подделку от оригинала.
Фальшивомонетчик и полицейский
Для иллюстрации этого процесса можно привести такой пример. Представьте себе фальшивомонетчика и полицейского. Фальшивомонетчик печатает поддельные деньги. Сначала купюры выходят грубыми, их легко разоблачить. Но он упорно совершенствует технику и старается делать подделки всё более похожими на настоящие. Полицейский, в свою очередь, проверяет купюры и ищет признаки подделки. Чем лучше у фальшивомонетчика получается имитация, тем внимательнее и изощрённее должен работаеть полицейский, чтобы распознать подделку. Так продолжается соревнование: один всё лучше подделывает, другой всё лучше распознаёт. В GAN роли распределены так же: генератор играет роль фальшивомонетчика, а дискриминатор полицейского. Благодаря этому соперничеству генератор постепенно учится создавать изображения, которые становятся настолько правдоподобными, что даже «полицейскому» всё труднее отличить их от настоящих.
Именно это соревнование и позволило GAN решить проблему, с которой не справлялись вариационные автоэнкодеры. Вспомним: VAE стремился усреднять варианты и в итоге выдавал слегка размытые изображения. У GAN подход иной: генератор не может ограничиться «средней картинкой», потому что дискриминатор сразу её разоблачит. Чтобы обмануть соперника, генератор вынужден добавлять всё больше деталей и текстур, которые делают изображение правдоподобным. Первые версии GAN уже давали значительно более чёткие результаты, чем VAE, хотя по-настоящему фотореалистичными они стали только позже, с развитием новых архитектур вроде StyleGAN. Тем не менее именно GAN стали переломным моментом: впервые нейросети начали создавать изображения, которые приближались к настоящим и задали направление для будущих генеративных моделей.
Главное отличие GAN в том, что генератор учится не напрямую на данных, а через соперника, дискриминатор. И даже на уровне постановки задачи цель генератора звучит менее математично и гораздо более интуитивно. Если у классического автоэнкодера цель запомнить признаки конкретной «семерки» и в точности её воспроизвести, а у вариационного автоэнкодера задача охватить все возможные вариации «семерок» и сгенерировать новую, максимально похожую на настоящую, то у генератора GAN цель другая. Он никогда не видит исходные картинки, а получает обратную связь только от дискриминатора. Его задача делать изображения всё более убедительными, такими, которые будет всё труднее разоблачить. Именно поэтому GAN не скатывается в усредненные варианты, а шаг за шагом учится воспроизводить детали и текстуры, делая результаты значительно более реалистичными.
Если генератор играет роль фальшивомонетчика, то дискриминатор — это полицейский. Его задача звучит куда прямее. Дискриминатор получает на вход картинки и должен решить, настоящая ли это картинка из датасета или подделка, созданная генератором. Для этой задачи уже есть чёткий правильный ответ: сеть знает, из какого набора какую картинку она взяла, но сообщает об этом дискриминатору только после того как он сделал своё предсказание. Поэтому обучение идёт явно: на настоящих картинках он учится говорить «реальная», а на сгенерированных — «фейк». Чем лучше становится генератор, тем сложнее работа дискриминатора, но именно это соперничество и толкает обе модели вперёд.
Несмотря на то что GAN научились создавать гораздо более реалистичные изображения, у этой технологии есть свои слабые места. Самая заметная проблема — это отсутствие разнообразия. Генератор может «зациклиться» и начинать выдавать почти одинаковые картинки, потому что такие варианты лучше всего обманывают дискриминатор. В результате вроде бы всё выглядит правдоподобно, но изображения начинают повторяться.
Ещё одна проблема в том, что GAN не всегда удаётся обучить стабильно. Иногда сеть начинает путаться, и тогда вместо фотографий появляются странные артефакты или бессмысленные пятна. Поэтому работа с GAN требует много данных и вычислительных ресурсов, а результат не всегда гарантирован.
Тем не менее именно GAN стали первым подходом, который показал: нейросети могут генерировать изображения, выглядящие как настоящие. Именно с них начался настоящий бум генеративных моделей.
Что дальше
Исследователи продолжали искать более надёжный и стабильный метод генерации. И такой подход появился. Это диффузионные модели. В отличие от GAN, они работают по совершенно другому принципу: начинают с полностью зашумленного изображения и учатся постепенно убирать шум, восстанавливая картинку слой за слоем. Именно этот метод сегодня лежит в основе большинства популярных нейросетей для генерации изображений.Как именно работает этот процесс и почему он оказался настолько успешным, мы разберём в следующей статье.
Мы не стали предоставлять доступ к первым поколениям моделей для генерации изображений, но попробовать популярные современные модели можно по ссылке ниже: