УДК 004.93; 004.85

ГЕНЕРАТИВНО-СОСТЯЗАТЕЛЬНЫЕ СЕТИ КАК ПРИМЕР ДАЛЬНЕЙШЕГО РАЗВИТИЯ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА

№19,

Технические науки

Гринин Игорь Леонидович
Кравченко Сергей Вячеславович


Ключевые слова: ГЕНЕРАТИВНО-СОСТЯЗАТЕЛЬНЫЕ СЕТИ; МАШИННОЕ ОБУЧЕНИЕ; ПРОГРАММИРОВАНИЕ; ОБУЧЕНИЕ НЕЙРОННЫХ СЕТЕЙ; GENERATIVE ADVERSARIAL NETWORKS; MACHINE LEARNING; PROGRAMMING; LEARNING NEURAL NETWORKS.


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

«Ты же просто робот, имитация жизни. Разве может робот написать симфонию, сделать шедевр?» — задавался вопрос во всем известном фильме. Это было фантастикой, что-то, за гранью понимания людей. Ну как может машина, неживое устройство, подчиненное лишь набору команд, создать что-то уникальное и прекрасное? И тогда, в далёком 2004 году, никто и думал, что спустя всего 10 лет робот сможет положительно ответить на этот вопрос.

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

Именно о них сегодня и пойдет речь. Генеративно-состязательные сети, впервые появившиеся в работе молодого ученого Яна Гудфеллоу в 2014 году, быстро обрели популярность и признание среди мастодонтов направления. Так, например, директор Facebook по исследованиям искусственного интеллекта Ян ЛеКан назвал состязательную тренировку сетей “самой интересной идеей в машинном обучении за последние 10 лет” [1].

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

Не так давно в интернете начала набирать популярность нейросеть, с помощью которой в видео можно заменить лицо одного человека на лицо совершенно другого. Автор назвал свое творение DeepFake и выложил в открытый доступ. Результаты, показанные на рисунке 1, поражают и ужасают одновременно.


Рисунок 1 — Результат нейросети, которая заменяет лицо одного человека на лицо другого

Здесь показаны стоп-кадры из видео “Nic Cage | Mega Mix One”, где в знаменитых фильмах теперь все роли отыгрывает Николас Кейдж. Впечатляет, не правда ли? Будто бы и не было замен.

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

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

И все-таки, теперь к основному. Генеративно-состязательные сети (англ. Generative Adversarial Networks), далее ГСС, как видно из названия состоят из двух частей — генеративной и состязательной. И если с первой частью все более или менее понятно — она что-то создает, то что со второй?

В основе этих сетей лежит достаточно простая идея — ГСС состоит из двух подсетей, одна из которых создает собственное произведение, выдавая второй его за настоящее, а вторая пытается догадаться, что ее обманывают. Таким образом они соревнуются между собой, отсюда и вторая часть названия — состязательные сети.

Каждая из частей имеет свое название — генератор и дискриминатор. Давайте чуть более подробно рассмотрим их работу.

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

Дискриминатор – это обычный бинарный классификатор, который выдаёт [2]:
— 1 — для реальных данных;
— 0 — для поддельных данных.

Но мы ведь не любим, когда просто?

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

Так работает довольно большое количество моделей, которые мы называем дискриминативными. Если вы немного ориентируетесь в машинном обучении, то в дискриминативную модель можно попасть, ткнув пальцем наугад куда угодно — многослойные перцептроны, решающие деревья и леса, SVM, you name it. Их задача — присваивать наблюдаемым данным правильную метку, и все они отвечают на вопрос «на что похоже то, что я вижу?»

Другой подход, слегка совершенно отличающийся, состоит в том, что понять — значит повторить. То есть если вы пронаблюдали за миром какое-то время, а потом оказались в состоянии реконструировать его часть (сложить бумажный самолетик, например), то вы кое-что поняли о том, как он устроен. Модели, которые так делают, обычно не нуждаются в указаниях учителя, и мы называем их порождающими — это всевозможные скрытые Марковские, наивные (и не наивные) Байесовские, а модный мир глубоких нейросетей с недавних пор добавил туда restricted Boltzmann machines и автоэнкодеры [3].

Фундаментальная разница в этих двух вещах вот в чем: для того, чтобы воссоздать вещь, ты должен знать о ней более-менее все, а для того, чтобы научиться отличать одну от другой — совершенно необязательно.

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


Рисунок 2 — Взгляд на мир порождающей и дискриминативной модели

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

Естественно, без примеров реализации, мы не обойдемся. Одним из основных инструментов реализации ГСС является Keras, который включил себя как Theano, так и TensorFlow. Поэтому пример простейшей сети мы покажем именно в нем [2]:

def make_trainable(net, val):
net.trainable = val
for l in net.layers:
l.trainable = val

def create_gan(channels, height, width):

input_img = Input(shape=(channels, height, width))

m_height, m_width = int(height/8), int(width/8)

# generator
z = Input(shape=(latent_dim, ))
x = Dense(256*m_height*m_width)(z)
#x = BatchNormalization()(x)
x = Activation(‘relu’)(x)
#x = Dropout(0.3)(x)

x = Reshape((256, m_height, m_width))(x)

x = Conv2DTranspose(256, kernel_size=(5, 5), strides=(2, 2), padding=’same’, activation=’relu’)(x)

x = Conv2DTranspose(128, kernel_size=(5, 5), strides=(2, 2), padding=’same’, activation=’relu’)(x)

x = Conv2DTranspose(64, kernel_size=(5, 5), strides=(2, 2), padding=’same’, activation=’relu’)(x)

x = Conv2D(channels, (5, 5), padding=’same’)(x)
g = Activation(‘tanh’)(x)

generator = Model(z, g, name=’Generator’)

# discriminator
x = Conv2D(128, (5, 5), padding=’same’)(input_img)
#x = BatchNormalization()(x)
x = LeakyReLU()(x)
#x = Dropout(0.3)(x)
x = MaxPooling2D(pool_size=(2, 2), padding=’same’)(x)
x = Conv2D(256, (5, 5), padding=’same’)(x)
x = LeakyReLU()(x)
x = MaxPooling2D(pool_size=(2, 2), padding=’same’)(x)
x = Conv2D(512, (5, 5), padding=’same’)(x)
x = LeakyReLU()(x)
x = MaxPooling2D(pool_size=(2, 2), padding=’same’)(x)
x = Flatten()(x)
x = Dense(2048)(x)
x = LeakyReLU()(x)
x = Dense(1)(x)
d = Activation(‘sigmoid’)(x)

discriminator = Model(input_img, d, name=’Discriminator’)

gan = Sequential()
gan.add(generator)
make_trainable(discriminator, False) #discriminator.trainable = False
gan.add(discriminator)

return generator, discriminator, gan

gan_gen, gan_ds, gan = create_gan(channels, height, width)

gan_gen.summary()
gan_ds.summary()
gan.summary()

opt = Adam(lr=1e-3)
gopt = Adam(lr=1e-4)
dopt = Adam(lr=1e-4)

gan_gen.compile(loss=’binary_crossentropy’, optimizer=gopt)
gan.compile(loss=’binary_crossentropy’, optimizer=opt)

make_trainable(gan_ds, True)
gan_ds.compile(loss=’binary_crossentropy’, optimizer=dopt)

Процедура обучения ГСС:
— получаем порцию реальных картинок;
— генерируем шум, на базе которого генератор генерирует произведение;
— формируем батч для обучения дискриминатора, который состоит из реальных примеров (им присваивается метка 1) и подделок от генератора (метка 0);
— обучаем дискриминатор;
— обучаем ГСС(в нём обучается генератор, т.к. обучение дискриминатора отключено), подавая на вход шум и ожидая на выходе метку 1.

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

Каждая часть ГСС может одолеть другую. Если дискриминатор слишком хорош, он будет возвращать значения очень близкие к 0 или к 1, так что генератор будет испытывать трудности в чтении градиента. Если генератор слишком хорош, он будет постоянно использовать недостатки дискриминатора, приводящие к неправильным негативам.

Поскольку GAN – довольно молодой метод (он появился только в 2014 году, а первые “приличные” результаты появились в 2016-2017 годах), еще никто не знает достоверно, что можно, а чего нельзя сделать с помощью GAN. Обзорам новых вариаций GAN и способам их применения посвящено много статей, и с каждым годом число статей растёт. Потенциал развития большой, и, можно сказать, за этим методом будущее.


Список литературы

  1. Генеративно-состязательная нейросеть (GAN). Руководство для новичков [Электронный ресурс] // NeuroHive: сайт. — URL: https://neurohive.io/ru/osnovy-data-science/gan-rukovodstvo-dlja-novichkov/ (дата обращения 10.06.2019).
  2. GAN — генеративные состязательные сети [Электронный ресурс] // RoboCraft: сайт. — URL: http://robocraft.ru/blog/machinelearning/3693.html (дата обращения 10.06.2019).
  3. Фальшивомонетчики против банкиров: стравливаем adversarial networks в Theano [Электронный ресурс] // Хабр: сайт. — URL: https://habr.com/ru/post/275429/ (дата обращения 10.06.2019).