Обучение нейросетей через состязание. GAN

Сегодня хочу рассказать про интересный подход к обучению нейросетей. Он называется Generative Adversarial Networks (GAN; соревнующиеся генеративные нейросети). По меркам развития области ИИ, он появился уже давно – аж в далеком 2014 году – и многое изменил. Рассмотрим, что это такое, как оно работает и какие есть перспективы на сегодняшний день.

Generative Adversarial Nets

Подход предложен в статье Generative Adversarial Nets и заключается в том, что одновременно тренируют две модели: генеративную и дискриминирующую. Генеративная модель, как вы, думаю, догадались, генерирует (в данном случае, изображения). Дискриминирующая модель получает на вход настоящее изображение и сгенерированное и определяет, какое из них где (то есть, решает задачу бинарной классификации). Далее для избежания тавтологии я буду их также называть «генератор» и «дискриминатор».
Цель обеих моделей – победить оппонента: сгененрировать изображение, неотличимое от реального или научиться отличать сгенерированные изображения от реальных по мельчайшим признакам. Авторы статьи приводят такой пример: генеративная модель выполняет роль мошенника, который подделывает деньги, а дискриминирующая – роль полицейского, который должен распознать подлог.
Цель процесса – достичь такого состояния, когда дискриминирующая модель будет ошибаться в половине случаев.
Мотивацией для разработки такого подхода стало неравное соотношение между генеративными и дискриминирующими моделями: в то время как дискриминирующие модели были достаточно успешны на момент исследования, генеративные были слишком дороги с точки зрения необходимых вычислительных мощностей и не могли развиваться столь же успешно. Поэтому разумным оказалось использовать преимущества одних моделей для устранения недостатков других.
В статье обе модели – многослойные перцептроны (multilayer perceptron). Это один из простейших видов нейронных сетей, который относится к линейным (полносвязным) сетями. Мы их как-то упоминали в предыдущих постах, я кратко напомню: данные подаются на входной слой, затем последовательно преобразуются в каждом следующем слое (они называются скрытыми слоями). Преобразование на каждом этапе линейное: полученный результат умножается на определенный весовой коэффициент, потом к нему добавляется свободный коэффициент (bias – смещение). В конце к результату применяется некоторая нелинейная функция (потому что реальные данные имеют более сложное распределение, и его нужно отразить в полученном результате). Затем высчитывается ошибка полученного результата по сравнению с ожидаемым, и весовые коэффициенты в скрытых слоях корректируются так, чтобы ее уменьшить.

<i>(Картинка с сайта <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fwww.datacamp.com%2Ftutorial%2Fmultilayer-perceptrons-in-machine-learning&postId=1380959" rel="nofollow noreferrer noopener" target="_blank">datacamp</a>, там есть понятное и гораздо более подробное объяснение, можете заглянуть)</i>
(Картинка с сайта datacamp, там есть понятное и гораздо более подробное объяснение, можете заглянуть)

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

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

Черная линия из точек на рисунке выше – реальное распределение; зеленая – то, которое строит генеративная сеть; синяя – график функции, с помощью которой дискриминирующая сеть отделяет одно от другого. На последнем рисунке (d) идеальная ситуация: сгенерированные данные идеально повторяют реальные, и дискриминирующая сеть возвращает предсказание «реальное» / «сгенерированное» с вероятностью в 50%.

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

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

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

Как сейчас

GANs стали очень успешны и используются во множестве областей: с их помощью можно генерировать изображения для обучения других моделей, создавать реалистичные фотографии, генерировать картинки по текстовому описанию, редактировать фотографии и много чего еще. Их успехи впечатляют.
Однако они не единственные в своем роде. Несколько позднее появились диффузионные модели (diffusion models), которые тоже направлены на повышение качества генерируемых данных.
Диффузионные модели впервые были описаны в статье «Deep Unsupervised Learning using Nonequilibrium Thermodynamics» («Глубокое обучение без учителя с использованием термодинамики неравновесных процессов»). Я не физик и не буду даже пытаться лезть в термодинамику, чтобы не наговорить тут ерунды. Сконцентрируемся лучше на самих моделях.
Идея, в общих словах, заключается в том, чтобы сначала постепенно, шаг за шагом видоизменить структуру входных данных, а потом ее восстановить. В процессе обучаемая генеративная модель изучает, как выглядит исходная структура и, соответственно, может ее затем воспроизвести и сгенерировать новые объекты, которые будут максимально близки к исходным.
Если говорить об изображениях, то сначала изображение превращается в шум, а затем восстанавливается в исходный вид.

<i>(Схема из упомянутой статьи)</i>
(Схема из упомянутой статьи)

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

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

Заключение

Тут нет какой-то морали. Я надеюсь, вам было хотя бы вполовину так же интересно читать этот пост, как мне его писать. Если вдруг да, то заходите еще в мой телеграм, там тоже интересные посты есть.
А еще можете заглянуть вот сюда и поэкспериментировать с созданием человеческих лиц с помощью GANs. Обязательно прочитайте раздел «How to recognize an image of a fake person» («Как распознать изображение ненастоящего человека»). В наш мир стремительно развивающихся технологий такое стоит знать.

1 комментарий

людей нужно учить а не нейросети...

Ответить