Создание воображаемых флагов с помощью искусственного интеллекта

Д-р Эрен Унлу, специалист по анализу данных и инженер по машинному обучению @Datategy, Париж

Не нужно говорить о шумихе генеративных сетей. Гигантские двигатели NLP с трансформаторным питанием, безусловно, являются нынешним центром искусственного интеллекта. И только не для технических ребят, но и для граждан из разных слоев общества. Достаточно взглянуть на повальное увлечение GPT-3 или Глубокую ностальгию в мейнстриме и социальных сетях [1] [2].

Итак, недавно я подумал, было бы неплохо скармливать искусственный интеллект всем флагам мира, чтобы генерировать «глубокие фальшивые флаги» (или, лучше сказать, «глубокие ложные флаги»?). Итак, перейдем непосредственно к техническим этапам. Я использовал два различных (почти разных в некоторых частях) подхода к решению этой проблемы; где я дам краткий обзор каждого из них: вариационных автоэнкодеров (VAE) и глубоких сверточных генерирующих состязательных сетей (DCGAN). Кроме того, я использовал два разных фреймворка для каждого: Keras (Tensorflow) и Pytorch соответственно. GAN - это более новая современная концепция, основанная на простой, но гениальной идее; однако удивительно, что VAE дала гораздо более многообещающие результаты.

Вариационные автоэнкодеры со сверточными слоями

Как следует из названия, в основе этой архитектуры лежит концепция автоэнкодеров. Я рассмотрел автокодеры на основе плотных нейронных сетей и их широкое практическое применение в предыдущем сообщении блога: [3]. Однако вариационные автоэнкодеры имеют небольшие различия в способах обработки данных, что также требует другого типа нейронного хранилища / операций и функций потерь для градиентного спуска.

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

Я не собираюсь утомлять читателя явным математическим содержанием, но в то же время оно в определенной степени важно; поэтому я предлагаю этот простой, хорошо объясненный пост в блоге [4]. Итак, не касаясь его математической основы, давайте рассмотрим общий механизм VAE. Давайте посмотрим на схему в этом посте [4].

Когда данные достигают скрытого вектора в конце слоев кодировщика, мы переключаемся на статистический универсум, а не на детерминированный характер обычных нейронных сетей. Теперь нас интересует моделирование априорного (распределение входных данных с условием экземпляра скрытого вектора) и апостериорного распределения (распределение скрытых векторов с заданным входом). Как было сказано ранее, довольно сложно обобщить все статистические концепции, используемые в этих процедурах, такие как выборка, ELBO или вспомогательное распределение и т. Д. Однако мы можем завершить, заявив, что VAE требуют особого вида потерь, которые направлены на оба максимизируют распределение входных данных и сходство вспомогательного распределения с исходным апостериорным распределением.

Итак, каковы преимущества всех этих модных обновлений до обычного детерминированного автоэнкодера. Ну, это два раза. Во-первых, введением недетерминированного скрытого слоя; мы добавляем дополнительную контрмеру для переоборудования. Вместо того, чтобы изучать соответствие 1 к 1 между входом и его положением в скрытом пространстве, мы стремимся выявить вероятностный процесс. И это то, что дает VAE их способность к генерации. Во-вторых, понимая вероятностное соответствие различных типов входных данных их соответствующим скрытым векторам, мы можем генерировать аналогичные искусственные точки данных, выбирая немного разные значения скрытого вектора исходных точек данных. Например, представьте, что мы тренировали нашу VAE на лицах нескольких человек. Подав немного приблизительные значения скрытых характеристик изображения конкретного парня в декодер, мы можем получить очень похожее искусственное лицо. В общем, для хорошо структурированных наборов данных похожие данные группируются по определенным районам; например светловолосые мужчины в определенном подпространстве для этого примера. Это позволяет нам избирательно создавать искусственные изображения светловолосых мужчин.

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

OK. Я использовал хорошо известный пример Keras [5], немного изменив сетевую архитектуру и параметры для достижения более значимых результатов. Обратите внимание, что наиболее важным отличием является то, что я использую 3 канала для хроматической версии, так как вы понимаете, что цвет очень важен для флагов :). Кроме того, эвристически выбираются количество фильтров, скрытые функции и т. Д. Как для кодировщика, так и для декодера. Обратите внимание на транспонированные сверточные слои в декодере. Транспонированные сверточные слои (или деконволюционные слои) позволяют масштабировать данные в 2D с помощью обучаемых ядер, в значительной степени в обратном порядке по сравнению с обычными сверточными слоями. Таким образом, вы можете восстановить изображение того же размера даже из одномерного вектора.

В первую эпоху у нас будут почти однородные значения RGB, как это ожидается:

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

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

Давайте рассмотрим детали фальшивого флага, созданного с помощью моего VAE. У него нет четкого разрешения, но, по крайней мере, он семантически интерпретируем. Он имеет темно-синий и красный фон (два наиболее часто встречающихся цвета мировых флагов) с белым крестом на нем; еще один частый образец различных северных европейских стран. И мы видим, что VAE попытался построить герб в центре, что является общей чертой среди флагов многих стран.

Состязательные сети с глубоким сверточным генератором

Гуру глубокого обучения Янн ЛеКун говорит: «.. Эта идея была первоначально предложена Яном Гудфеллоу, когда он был студентом Йошуа Бенжио в Монреальском университете (с тех пор он перешел в Google Brain, а недавно в OpenAI). На мой взгляд, это, а также варианты, которые предлагаются сейчас, являются самой интересной идеей в области машинного обучения за последние 10 лет. »[7]. Конечно, мы видели, насколько проста, но изощренна идея включения состязательных схем, и она процветала всего за несколько лет. Именно эта идея поместила Иэна Гудфеллоу в зал марок AI с такими именами, как LeCun или Hinton.

DC-GAN - это особый вариант GAN (Generative Adversarial Network), который использует сверточные слои для создания изображений из скрытых векторов, как мы это сделали с VAE. В GAN есть две отдельные нейронные сети, одна из которых называется «генератором», а другая - «дискриминатором». Основная идея состоит в том, что во время совместного обучения сеть генератора будет генерировать поддельные данные из случайных векторов, а дискриминатор попытается классифицировать, является ли выходной сигнал генератора реальным или поддельным; поскольку мы будем кормить его как нашим набором данных по наземной тренировке, так и результатами генераторов. Таким образом, мы надеемся, что с течением времени генератор научится создавать все больше и больше подлинного контента, в то время как дискриминатор будет лучше классифицировать. Следовательно, это соперничество, продуктивное соревнование. Обратите внимание, что, в конце концов, мы озабочены качеством продукции генератора. Итак, мы действительно хотим, чтобы дискриминатор становился все лучше и лучше, чтобы постепенно сделать наш генератор сильнее.

О дискриминаторе говорить не приходится, это базовый двоичный классификатор. Генератор, с другой стороны, очень похож на наш декодер в VAE. Однако на этот раз вектор скрытых признаков не исходит из закодированных данных, а является чисто случайным. Идея состоит в том, чтобы ограничить это случайное пространство пределами полезности, а также изучить веса нейронной сети, чтобы создать из этого случайного вектора фальшивые данные, похожие на оригинальные. Очевидно, мы используем сложную тренировочную потерю, которая делает генератор и дискриминатор лучше вместе.

Я использовал это известное руководство по PyTorch [9]. Что касается VAE, мне нужно было настроить архитектуру и параметры для моего конкретного случая. Не буду вдаваться в подробности. Вот мой кодировщик и декодер.

Ключевые выводы:

° DC-GAN обеспечивает самые современные результаты в производстве, но со скромным ПК в вашем доме для короткого увлекательного проекта VAE - это ваша сеть. Потому что DC-GAN намного сложнее обучить. В GAN мы пытаемся построить значимые результаты на основе полной случайности. В то же время нам нужно обучить и генератор, и дискриминатор одновременно, убедившись, что один из них не превосходит другой. Это очень хрупкое равновесие, которое необходимо достичь и сохранить во время тренировок. Параметры, указанные для онлайн-руководств, не будут работать только для отдельного набора данных. Следовательно, вам нужно тщательно экспериментировать, чтобы получить разумные результаты.

[1]

Https://www.theguardian.com/commentisfree/2020/sep/08/robot-wrote-this-article-gpt-3

[2]

Https://edition.cnn.com/2021/03/02/business/deep-nostalgia-myhertiage-ai-learning-trnd/index.html

[3]

Https://medium.com/nerd-for-tech/machine-learning-zuihitsu-iii-e36157bc35a

[4]

Https://towardsdatascience.com/variational-autoencoders-explained-6f9456ee030c

[5]

Https://keras.io/examples/generative/vae/

[6]

Https://medium.com/nybles/understanding-machine-learning-through-memes-4580b67527bf

[7]

Https://www.kdnuggets.com/2016/08/yann-lecun-quora-session.html

[8]

Https://www.xenonstack.com/insights/generative-adversarial-networks/

[9]

Https://github.com/pytorch/tutorials/blob/master/beginner_source/dcgan_faces_tutorial.py