Главная/ Блог / Нейросети Часть 4

Генеративно-состязательные модели, или как сделать из нейросети художника

[ Нейросети Часть 4 ]

Генеративно-состязательные модели, или как сделать из нейросети художника

Smartiqa Article
  • Дата: 7 ноября 2020
  • Автор: Калинин Даниил

Этот материал относится к циклу статей о нейронных сетях


Как нейронные сети получили свое название, из каких компонентов они состоят, как они обучаются и главное - являются ли они полноценным искусственным интеллектом, способным заменить человека?

Статья рассказывает читателю о методе, на котором основано обучение абсолютно всех нейронных сетей ‒ методе градиентного спуска.

В статье рассказывается о принципе работы сверточных нейронных сетей

В статье рассказывается о принципе работы GAN-моделей и методах их обучения.

Рассмотрим основы фреймворка PyTorch, на примерах научимся создавать тензоры, обращаться к ним по индексам, делать срезы, работать с осями, считать разные метрики и находить ошибку. Все это позволит нам написать свою нейронную сеть в следующем уроке.

Из предыдущих статей мы узнали о полносвязных и сверточных нейросетях, принципах их работы и обучения. А теперь представьте, что мы хотим научить нейросеть не только понимать, что изображено на картинке, но и самой рисовать (генерировать) эту картинку. Возможно ли такое? Спойлер: возможно, но для этого потребуется целых две нейросети, и сейчас я расскажу почему.

Фальшивомонетчик и казначей

Для начала давайте абстрагируемся от нейросетей и представим себе следующее. В маленьком государстве на работу наняли нового казначея, задача которого - брать в казну только настоящие монеты, а фальшивые отсеивать. Узнав об этом, вы решаетесь стать фальшивомонетчиком, но вот беда: вы понятия не имеете, как выглядят настоящие монеты.

Полагаясь на свою удачу, вы изготавливаете первую партию монет. Все они разные: треугольные, овальные, квадратные, фиолетовые, золотые, зеленые, и так далее.
С этой партией вы идете к казначею и отдаете ему все монеты. И тут вам повезло: казначей напрочь забыл те инструкции, которые давал ему заведующий казны, и взял все ваши монеты.

Радуясь своей удаче, вы уходите домой и изготавливаете еще одну такую же партию. А вот казначею достается от заведующего: ему повторяют, что монеты должны быть только золотыми и круглыми, а других пропускать нельзя. Когда вы приходите к казначею во второй раз, вам везет уже меньше: казначей запомнил часть инструкций и взял только те монеты, которые оказались золотого цвета (но при этом разных форм).

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

Четвертая ваша партия состоит только из золотых и круглых монет, но с разными рисунками: где-то лицо изображено президента, где-то -- лица популярных актеров, где-то -- пейзажи. А в это время заведующий проводит инструктаж, на котором говорит казначею, что на настоящих монетах изображены лица политических деятелей. В четвертый раз принося партию монет казначею, вы видите, что взял он только монетки со всевозможными лицами, а пейзажи оставил. Вы приходите домой и делаете только монетки с лицами. И так далее.

Суть, я надеюсь, вам ясна. Есть казначей и фальшивомонетчик, и они учат друг друга: казначей учится, когда берет неправильные монеты, а фальшивомонетчик учится, когда не все его монеты берут.

Читайте также

Включаем нейронные сети

Архитектура нейронной сети, которую мы будем использовать, называется генеративно-состязательная сеть. Или по-английски GAN - Generative Adversarial Network.

На самом деле, пример выше полностью отражает то, как работают современные генеративно-состязательные модели. Даже само название архитектуры "генеративно-состязательная" говорит о том, что две нейросети будут состязаться: одна генерировать монетки, а другая определять, где настоящие монеты, а где сгенерированные.

Первую принято называть генератор, потому что она генерирует. А вторую -- дискриминатор (от англ. discrimination - распознавание), потому что она распознает, где подделка, а где нет.

Обучение

Чтобы подробно разобрать обучение, давайте перейдем от примера с монетками к примеру с цифрами: теперь мы хотим научить нейросеть правдоподобно генерировать рукописные цифры. Для того, чтобы обучить такую сеть, нам потребуется датасет (большой набор подготовленных данных) картинок рукописных цифр. Мы будем использовать популярный датасет MNIST - в нем содержится больше 70000 изображений, для каждого из которых известно, что за цифра на нем запечатлена.
Пример данных из датасета MNIST
Пример данных из датасета MNIST
Обучение будет происходить именно так, как описано в примере: мы создадим две сверточные нейросети: генератор и дискриминатор. Изначально ни одна нейросеть не будет понимать, как выглядят цифры, и как их генерировать.

На вход генератору мы будем подавать случайные числа, то есть просто некоторый шум, а он будет пытаться сделать из этого шума цифру, меняя цвета пикселей. После того, как генератор сгенерирует, скажем, 16 картинок (это число опционально, и может меняться), мы возьмем его картинки и столько же "настоящих" картинок из датасета. Затем перемешаем их и подадим на вход дискриминатору.

Мы знали, какие картинки настоящие, а какие -- нет, поэтому мы можем понять, когда дискриминатор ошибся. Соответственно, мы можем посчитать ошибку, вычислить градиент и изменить веса дискриминатора так, чтобы он меньше ошибался.

После того, как мы посчитали, где ошибся дискриминатор, мы можем посчитать ошибку генератора: чем больше "фальшивых" картинок определил дискриминатор, тем больше будет ошибка генератора, вычислить градиент и поменять веса генератора так, чтобы он создавал более правдоподобные картинки.

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

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

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

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

Где еще применяются GAN?

С практической точки зрения, не очень интересно генерировать рукописные цифры. Хорошо, что это лишь малая часть того, на что способны GAN. Современные генеративные модели применяются, например, для:
1. создания deepfake -- фотографий-подделок со знаменитостями,
2. deephd -- улучшения качества фильмов и фото до hd и 4k,
3. восстановления обрезанных изображений,
4. раскрашивания рисунков,
5. и, наконец, передовой край науки в настоящее время -- генерация картинок по текстовому описанию.
Визуализация обучения генератора на примере лиц

Вместо заключения

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


7 НОЯБРЯ / 2020
Как вам материал?

Читайте также