Их создание - мое настоящее испытание, а обучение их - мое дело.

О чем этот проект?

Эта статья предназначена для читателей, которые не знакомы с машинным обучением или, в частности, с искусственными нейронными сетями (ИНС). Это попытка дружеского знакомства с основами ИНС. Мы начнем с фундаментальных математических предпосылок, прежде чем последовательно углубляться в более абстрактные и более сложные концепции, стремясь к интуитивно понятному объяснению так называемых генеративных состязательных сетей (GAN). Я выбрал GAN в качестве примера для более продвинутого типа ANN из-за их мощной и захватывающей концепции создания приятных на вид цифровых изображений. Целью этого проекта было автоматическое создание совершенно новых изображений спрайтов покемонов (GitHub).

Что такое машинное обучение?

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

Математические основы

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

  1. Векторные пространства. Вектор - это математический объект, состоящий из фиксированного количества компонентов, которые могут принимать различные числовые значения. Число компонентов называется размерностью соответствующего вектора и, очевидно, никогда не бывает отрицательным. Однако в другом, положительном направлении, верхний предел размера такого вектора буквально отсутствует. Следовательно, он может быть одно-, двух-, трехмерным или вообще n-мерным, где n можно свободно выбирать из диапазона всех положительных целых чисел. Если числовые значения компонентов являются либо непрерывными, либо из неограниченного набора целых чисел, существует бесконечное количество комбинаций значений. Это огромное пространство разных векторов одинаковой размерности называется n-мерным векторным пространством. В этом пространстве каждая позиция относится к другому и уникальному n-мерному вектору. Если набор определенных векторов сейчас представляет особый интерес, мы можем проанализировать эти векторы в соответствии с их близостью и структурой в нижележащем векторном пространстве. В дополнение к этому, векторы могут быть преобразованы в другие векторы в том же самом или даже в векторы совершенно нового векторного пространства. Например, если мы посмотрим на двумерное векторное пространство с такими элементами, как (0, 0) или (23, 42), и применим простое преобразование суммирования к его векторам (0 + 0 = 0 и 23 + 42 = 65) , мы фактически нашли отображение двумерного пространства на одномерное.
  2. Математические функции: функция - это абстрактная машина, которая получает некоторый ввод, обрабатывает его и возвращает результирующий вывод. Пространство возможных входов называется областью действия функции, а целевое пространство выходов - областью кодовой области. Таким образом, математическая функция - это отношение между элементами двух множеств или векторных пространств. В одних и тех же наборах могут быть разные функции, различающиеся с точки зрения их внутренней работы. Это невероятно общая концепция. В математической записи функция обычно обозначается одной строчной буквой. Функции можно рассматривать как алгоритмы и наоборот, поскольку оба преобразуют четко определенные входные данные в четко определенные выходные данные. Если это внутреннее преобразование является скрытым или чрезвычайно сложным, так что вы не имеете ни малейшего представления о том, что именно происходит с входами, но можете наблюдать за выходами, функция часто называется черным ящиком. Есть множество функций (или алгоритмов) черного ящика, которые вы используете в повседневной жизни: ваш компьютер или ноутбук, ваша зрительная кора, стиральная машина или даже ваши собратья. Компьютеры получают вводимые пользователем данные, и пользователь ожидает, что компьютеры будут вести себя ожидаемо, но почти никто из них не знает, как компьютер работает на самых глубоких уровнях абстракции.
  3. Дифференциация и градиенты. Представьте, что вам предоставлена ​​математическая функция, которая принимает значение и выводит другое отдельное значение и, таким образом, представляет собой отображение векторов в одномерном векторном пространстве. Теперь вас просят выяснить, при каком входном значении выходное значение является наименьшим. Вы вынуждены выбирать векторы (в данном случае отдельные числа) из домена, чтобы понять, какие входы ведут к каким выходам. Однако без необходимого предположения, что одинаковые входные значения приводят к аналогичным выходным значениям, у вас буквально нет шанса найти минимум. Но даже при таком предположении этот наивный подход к выборке в определенной степени полагается на чистую случайность. То, что мы в основном хотим достичь с помощью выборки, - это определить, где математическая функция растет, а где падает. К счастью, мы можем получить эту информацию непосредственно из аналитического выражения в определении нашей функции с помощью процесса, называемого дифференцированием. Все читатели, которые ходили в среднюю школу или колледж, наверняка будут знакомы с процедурами исчисления, такими как цепочка или правило произведения. После применения этих правил к целевой функции для получения первой производной мы можем выбрать одно входное значение из области. Эта начальная точка затем передается через производную, которая сообщает нам, насколько сильно функция растет или падает по отношению к входу в соответствующем месте в пространстве. Если он растет, мы уменьшаем входное значение. Если падает, увеличиваем. Если он растет сильнее, мы еще больше уменьшаем входное значение. Если резко падает, увеличиваем сильнее. И еще, если функция не растет и не падает, мы достигли точки, близкой к минимуму. Эта интуитивно понятная, но мощная процедура оптимизации называется градиентным спуском, поскольку значение производной в определенном месте называется градиентом функции в этой соответствующей точке пространства. Эта концепция не ограничивается одномерными функциями. Его можно успешно применить к любой функции, более или менее удовлетворяющей сделанному предположению.

Что такое искусственная нейронная сеть?

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

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

Набор данных: Почему Покемон?

Покемон формировал все мое детство и был первым, что пришло мне в голову, когда я искал интересный набор данных из небольших изображений. В основном я открывал и исследовал этот мир, играя в различные традиционные видеоигры про покемонов, сначала начиная с Pokémon Blue (поколение 1) и заканчивая Pokémon Black (поколение 5). В то время как в первом поколении покемонов существовал 151 покемон, в пятом поколении это число быстро выросло до 649. Для этого проекта я собрал собственный набор данных из изображений спрайтов покемонов первых пяти поколений. Я отказался от изображений первых двух и последних поколений из-за их отличных стилей по сравнению с большей частью изображений. Тем не менее, поскольку обычно все покемоны из предыдущих выпусков Pokémon появляются в традиционной видеоигре Pokémon, я получил несколько разных изображений для каждого из 649 покемонов из первых пяти поколений. Эти изображения от одного и того же вида покемонов различаются по полу, блеску и позам.

Очевидно, что животные разных видов дополнительно различаются по цвету, форме и размеру. В общей сложности набор данных состоит из 11,779 изображений спрайтов покемонов, размер которых был изменен до стандартного размера 96x96 пикселей RGBA. Следовательно, каждый пиксель изображения имеет значение прозрачности: красный (R), зеленый (G), синий (B) и альфа-канал (A), что в сумме дает 96x96x4 = 36864 целочисленных значения для описания одного из изображений в целиком. Другими словами, каждое из изображений можно понимать как вектор из 35864-мерного векторного пространства, где каждый компонент может принимать значения в диапазоне от 0 до 255. Чем больше пространство, тем больше точек данных нам нужно для дать хорошую оценку параметров ИНС. Однако количество требуемых точек данных растет экспоненциально с увеличением размерности лежащего в основе векторного пространства (проклятие размерности). Чтобы позволить ИНС справляться с данными цифрового изображения большой размерности, были разработаны так называемые сверточные нейронные сети (CNN) в качестве специальных представителей ИНС. Мы кратко рассмотрим CNN после следующего короткого раздела.

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

Увеличение данных

Несмотря на то, что примерно 12 тысяч маленьких изображений покемонов кажутся большим количеством данных, я решил использовать два дополнительных метода, чтобы еще больше увеличить разнообразие непосредственно перед тем, как изображение будет представлено в ИНС. Это делается «на лету» без промежуточного сохранения в файле. Эти две техники представлены:

  1. Случайное горизонтальное переворачивание: несмотря на то, что большая часть оригинальных покемонов направлена ​​влево (из-за их использования в традиционной видеоигре Pokémon), я случайным образом переворачивал каждое изображение по горизонтали с вероятностью пятидесяти процентов.
  2. Случайное дрожание. В дополнение к этому я экспериментировал с некоторыми случайными перемещениями изображений с дрожанием, слегка изменив их размер до размера 100x100 пикселей и последующим случайным обрезанием до размера 96x96 пикселей.

Что такое сверточная нейронная сеть?

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

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

Что такое порождающая состязательная сеть?

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

Великолепная концепция GAN была предложена Гудфеллоу и др. в 2014 году и представляет собой мощный фреймворк, который позволяет нам применять ИНС к нашей проблеме, даже несмотря на то, что у нас нет каких-либо конкретных пар примеров ввода-вывода. Обучение нейронной сети для получения определенного результата при наличии определенного входного сигнала называется обучением с учителем. Если подходящие метки в качестве целевого вывода отсутствуют, соответствующая проблема обучения называется неконтролируемой. Первый тип GAN, представленный Goodfellow et al. является примером неконтролируемого метода и, следовательно, не требует дополнительной информации на этикетке об изображениях, которые мы стремимся подделать.

В GAN две сети, обученные противником, работают друг против друга для достижения общей цели: генератор и дискриминатор. Вместо того, чтобы напрямую разрабатывать идеальный генератор или идеальный дискриминатор вручную, мы позволяем двум ИНС итеративно играть друг против друга в игре с нулевой суммой, в которой одна из них обучается создавать реалистичные поддельные изображения, а другая - отличать подделки от поддельных. реальные изображения. Таким образом, нам не нужно предоставлять какую-либо конкретную меру реалистичности сгенерированных изображений, а также нам не нужно самостоятельно определять закономерности и закономерности в реальном наборе данных. Когда генератор работает хорошо, производительность дискриминатора оставляет желать лучшего, а в моменты, когда у дискриминатора нет проблем с различением двух типов изображений, генератору трудно его обмануть. Первоначально параметры обеих ИНС инициализируются случайным образом, что приводит к снижению производительности генератора и дискриминатора. Дискриминатор не имеет представления о том, как обычно выглядят изображения покемонов, а генератор пока производит только случайный мусор. Во время обучения дискриминатору предоставляются двоичные метки, сообщающие ему, какое из входных изображений является подделкой, ранее сгенерированной генератором, или образцом реального набора данных. Генератор учится на обратной связи, полученной от дискриминатора. Эта тренировочная процедура часто страдает нестабильностью. Если один из двух противников слишком силен для противника, у более слабого не будет шансов соперничать с могущественным. Этой нестабильности следует избегать путем тщательного выбора ИНС генератора и дискриминатора и нескольких различных методов стабилизации. Таким образом, мы надеемся, что в ходе итераций генератор управляется дискриминатором для создания точек в пространстве изображений, которые лежат на том же многообразии, что и настоящие. Если читатель хочет взглянуть на потрясающие результаты передовых архитектур GAN, я настоятельно рекомендую взглянуть на гиперреалистичный генератор изображений лица на основе стиля, который был разработан исследователями NVIDIA с 2019 года.

Базовая сетевая архитектура

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

Стабильность и коллапс режима: методы исправления

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

  1. Одностороннее сглаживание меток: вместо того, чтобы приказать дискриминатору произвести чрезмерно уверенную оценку вероятности, близкую к 1,0 для реальных изображений, мы наказываем излишнюю самоуверенность, сглаживая истинную метку на определенную величину. В нашем случае я выбрал сглаживание 0,1, так что метка для реальных изображений была уменьшена до 1,0 - 0,1 = 0,9. Это не позволяет дискриминатору основывать свои прогнозы исключительно на нескольких очевидных характеристиках.
  2. Затухающий шум экземпляра: вместо того, чтобы передавать (расширенные) изображения покемонов или сгенерированные изображения непосредственно в дискриминатор, мы добавляем некоторый гауссовский случайный шум к каждому из входных данных, чтобы увеличить сложность для дискриминатора и расширить совпадение истинного и синтетического распределений данных. Стандартное отклонение этого экземпляра шума уменьшилось в течение итераций на определенный коэффициент затухания. Для получения дополнительной информации и теории ознакомьтесь с этим отличным сообщением в блоге.
  3. Спектральная нормализация: этот метод показал наибольшее влияние на сгенерированные изображения. Спектральная нормализация весов слоя ИНС гарантирует, что вся функция, на которую похожа сеть дискриминатора, удовлетворяет даже более сильному предположению, чем то, которое мы сделали в параграфе о дифференциации и градиентах. Спектрально нормализованная дискриминаторная сеть обеспечивает более плавное и стабильное решение о реалистичности. Для получения дополнительной информации об этой меняющей правила игре, но все же простой концепции, я обращаюсь к этой хорошо написанной и визуализированной статье.

Результаты

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

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

Чтобы увидеть разнообразие синтетических изображений покемонов, сгенерированных каждой из этих четырех моделей после 250 итераций, ниже для всех из них представлены 64 случайно выбранных изображения. Модель без спектральной нормализации, но с дополнительным случайным дрожанием, похоже, свернулась в единую моду. Применение спектральной нормализации к этой конкретной модели помогло решить эту проблему. Решение о том, улучшает ли случайное дрожание качество результатов, остается за читателем.

Скрытый обход пространства

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

Сферический обход путем вращения

Линейный обход путем масштабирования

Вывод

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

Что я узнал?

  1. GPU против CPU: во время работы над этим проектом я провел бесчисленное количество часов, тестируя различные гиперпараметры и архитектуры на одном процессоре. Это свело меня с ума и побудило инвестировать в недорогой графический процессор, который полностью изменил игру. Теперь я могу тестировать модели за гораздо меньшее время, чем раньше. Например, обучение простой модели, подобной DCGAN, занимало у меня не менее 40 минут в эпоху на моем процессоре. Помните, что я тренировал каждую из моделей по 250 эпох. Это было возможно только с моим новым графическим процессором, который мог выполнять эту работу за одну ночь.
  2. Демистификация GAN. До этого проекта GAN всегда были для меня концепцией черного ящика в целом. Они казались намного более сложными, чем другие типы ИНС, и их значительно труднее обучать. В ходе этого проекта я накопил некоторый опыт и понял, как ведут себя GAN. Это побуждает меня продолжить этот путь в будущем к более продвинутым типам и методам генеративных моделей: условные GAN, ACGAN, блоки самовнимания, условная пакетная нормализация, Style-GAN, блоки самомодуляции, ...

использованная литература