Как автокодировать вашего покемона

На этой неделе опыты с глубоким обучением привели меня к понятию автоэнкодеров. И вместе с моими покемонами вы тоже можете узнать об этом больше!

Автоэнкодеры для чайников

Автоэнкодер — это особая нейросеть, которая принимает на входе объект и учится представлять его в уменьшенном размере.

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

Поздравляю, вы автоэнкодер! На самом деле, всё не ограничивается кругами. Вы можете делать кубики. Да Винчи может создать Мона Лизу. По сути, мы автоматически кодируем наши мысли в двухмерные слова, когда пишем — ну, вы поняли идею.

Автокодировщик состоит из двух частей: кодер, который учится преобразовывать вход (X) в низкоразмерные данные (Z), и декодер, который учится преобразовывать низкоразмерные данные обратно (Y).

Если ваш кодировщик действительно хорош, на входе и выходе будет одно и то же. Это — идеальный автоэнкодер.

К сожалению, на практике это редко достигается.

DS
Специализация Data Science
Идет набор в группу 12 500₽ в месяц

И почему мы всё равно применяем автокодировку?

Очевидная причина — сжатие. Вы уменьшаете размерность и можете передавать низкоразмерные данные. Но подумайте: да, мы сжали данные, но нам всё равно придётся передавать ещё и декодер каждому, кто захочет понять, что было закодировано.

Представьте, что вы раздаёте флаеры на китайском.

Если вы решите закодировать слово «дерево», оно сократится с 6 русских символов до одного китайского. Но чтобы понять, что вы имеете в виду, другой человек тоже должен знать китайский. Теперь, чтобы можно было расшифровать иероглиф 木 (mù) и отличить его от похожих, вам придётся раздавать ещё и словари китайского языка.

Не так эффективно, как можно было подумать. Хорошо, если не для сжатия, для чего ещё?

Как мы уже говорили, автоэнкодеры не идеальны, и выход декодера часто отличается от того, что было на входе. Но что если вместо идеального декодирования мы будем использовать его для получения выходных данных, похожих на входные?

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

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

Ладно, пора отправляться в мир покемонов!

Курс по Machine Learning
Идет набор в группу 3 800₽ в месяц

Покемоны в деталях

Покемоны, с которыми мы будем работать, — растровые изображения Nintendo DS Style. Вы можете скачать их здесь.

Разрешение каждого изображения составляет 64 х 64 пикселя. Я подумал, что это лучше, чем стандартный набор MNIST, с которым все любят работать, — к тому же, ещё и цветной, для разнообразия.

Каждый пиксель описывается тремя значениями RGB. Значит, каждое изображение описывается 64 х 64 х 3 = 12 228 значениями.

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

Первые 150 покемонов. И я знаю имя каждого!

Ну и ну. Много вариаций, да?

Но наш набор данных содержит ПЯТЬ таких поколений. И не только вид спереди, но и сзади тоже. И каждого ракурса — по два варианта. Итого у каждого покемона — по четыре изображения. Разнообразие!

Позвольте вам представить Пичу, Пичу, Пичу и Пичу.

Ладно, хватит о данных. Приступим к автокодированию.

Механика автоэнкодера

Сначала кодер берет все изображения размером 64 x 64 x 3 и представляет их в виде одномерного вектора из 12 288 элементов. Затем он шаг за шагом понижает разрешение, пока не достигает заданного. По сути, это серия операций умножения матриц. Декодер выполняет обратный процесс и пытается восстановить исходное изображение из закодированного посредством аналогичной серии операций умножения матриц.

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

Размышления в дýше: а ведь покебол является идеальным автоэнкодером! Ведь он, по сути, кодирует покемона (уменьшая занимаемое им пространство и массу), во что-то, что может находиться внутри шара до тех пор, пока не будет вызвано тренером и декодировано обратно? :O

Кодировка до четырех значений

Я использовал кодировщик, который понижал разрешение изображений с 12288 до 1024, с 1024 до 64 и, наконец, с 64 до 4 значений. Таким образом, каждый покемон закодирован всего ЧЕТЫРЬМЯ символами. Все 150 — и не только они! Разве не круто?

Итак, давайте посмотрим, что на входе:

Здесь датасет из 100 покемонов. Как и предполагалось, наблюдаются заметные отличия в фоне, ракурсах и особенностях покемонов. Я обучал свой автоэнкодер около 250 эпох (напомним, что эпоха — это один проход алгоритма по всем примерам для обучения — прим. пер.), и вот результат:

Очень даже неплохо, да? Удивительно, но многих покемонов даже можно идентифицировать. Напомню, что для раскодировки мы использовали всего 4 символа.

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

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

Но это всё равно потрясающе! Думаю, я должен когда-нибудь попытаться создать нового покемона, используя VAE.

А пока мне нужно поймать их всех!

Оригинал: https://hackernoon.com/how-to-autoencode-your-pok%C3%A9mon-6b0f5c7b7d97

Перевод: Астафьева Наталья

Поделиться: