Мой четырёхлетний племянник Яли сильно увлёкся покемонами. У него множество этих игрушек и несколько карт из коллекционной карточной игры (TGG). Вчера он обнаружил у меня большую коллекцию TGG-карт, и теперь у него карт так много, что он с ними просто не справляется.

Проблема в том, что Яли слишком мал, чтобы разобраться в том, как играют в игру, и он изобрёл свою версию игры. Цель игры – разобрать карточки по категориям (покемон, энергия и тренировочная карта).

Он не спрашивал, откуда я знаю, какого типа карта. Он просто взял несколько карт и спросил, какого они типа. Получив несколько ответов, он сумел разделить несколько карт по типу (совершив при этом несколько ошибок). В этот момент я понял, что мой племянник – это, по сути, алгоритм машинного обучения, а моя задача в качестве дяди состоит в маркировке данных для него. Так как я дядя-гик, и энтузиаст машинного обучения, я начал писать программу, которая сможет посоревноваться с Яли.

Так выглядит типичная карта покемона:

image

Для умеющего читать взрослого человека легко понять, какого типа эта карта — на ней написано. Но Яли 4 года, и читать он не умеет. Простой OCR-модуль быстро решил бы мою задачу, но я не хотел делать лишних предположений. Я просто взял эту карту и предоставил её для изучения MLP-нейросети. Благодаря сайту pkmncards я мог скачивать картинки, уже рассортированные по категориям, поэтому с данными проблем не возникло.

Алгоритму машинного обучения нужны признаки, и моими признаками были пиксели изображений. Я преобразовывал 3 цвета RGB в одно целое число. Поскольку мне попадались картинки разных размеров, их нужно было нормализовывать. Найдя максимальные высоту и ширину картинок, я добавлял нули к картинкам меньшего размера.

image

Быстрый прогон QA перед работой самой программы. Я случайным образом брал две карты каждого типа и запускал предсказание. При использовании 100 карт из каждой категории подгонка шла очень быстро, а предсказания были ужасными. Затем я взял по 500 карт из каждой категории (исключая типы энергии, которых было всего 130), и запустил подгонку.

Память закончилась. Можно было запустить код подгонки в облаке, но я хотел придумать способ экономии памяти. Самая крупная картинка была размером 800x635, это было слишком много, и изменение размера картинок решило мою проблему.

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

Я использовал 1533 модели. Разные размеры картинок, несколько скрытых слоёв (до 3), длина слоя (до 100), цвета изображений, методы чтения изображений (всё целиком, верхняя часть, каждый второй пиксель, и т.п.). После многих часов подгонки лучшим результатом стало 2 ошибки из 25 карт (мало у каких моделей был такой результат, и каждая из них ошибалась на разных картах). 9 моделей из 1533 сработали с результатом в 2 ошибки.

image

Комбинация моделей давала мне результат с 1 ошибкой, если я поднимал порог выше 44%. Для теста я использовал порог в 50%. Я подождал месяц, пока Яли игрался с картами, и провёл тестирование.





Ошибки происходят при распознавании энергетических карт. На pkmncards таких карт было всего 130, в отличие от тысяч карт других типов. Меньше примеров для обучения.

Я поспрашивал Яли по поводу того, как он распознавал карты, и он рассказал, что видел некоторых покемонов в телешоу или книгах. Именно так он распознал уши Райчу или узнал, что Вапореон – это водный Иви. У моей программы таких данных не было, только карты.

Победив Яли в игре с покемонами и получив награду, наш машинный интеллект отправляется навстречу новым приключениям.

Поделиться с друзьями
-->

Комментарии (7)


  1. sophist
    08.04.2017 09:38
    +4

    > Алгоритму машинного обучения нужны особенности

    Признаки. В контексте машинного обучения features – это признаки.


  1. Alex_ME
    08.04.2017 13:11

    Я использовал 1533 модели. Разные размеры картинок, несколько скрытых слоёв (до 3), длина слоя (до 100), цвета изображений, методы чтения изображений (всё целиком, верхняя часть, каждый второй пиксель, и т.п.)

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


    1. alex4321
      08.04.2017 17:28

      Да, разные.
      Можно перебираться возможные комбинации гиперпараметров (но, как минимум — нужно определиться с границами и тем, какие параметры перебираться).
      И да — обучаются отдельно.


    1. cepera_ang
      10.04.2017 13:01

      Написано как-то сложно. В данном случае нужно было следовать заветам «Don't be a hero», а просто взять предобученную на ImageNet'e сеть, например, VGG-16 или Resnet-50 (обе есть встроенные во все основные фреймворки DL и даже с готовыми весами), добавить слой классификатора, отмасштабировать картинки в один (небольшой) размер и прогнать обучение пару эпох и готово.

      Там ещё не понятно, обучал ли он на всём наборе карт и как проверял точность на новых (тех, которые модель не видела). Если обучал на всех, то по сути добился, чтобы модель выучила их все и давала правильные ответы, при этом непонятно может ли она новые распознать.


      1. Alex_ME
        12.04.2017 01:53

        Спасибо за разъяснение.


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


        например, VGG-16 или Resnet-50

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


        1. cepera_ang
          12.04.2017 13:18

          Просто на русском очень мало всего или вообще нет, сейчас на хабре идёт открытый курс по МЛ от ребят из opendatascience, в очереди посты как раз про сети и всё такое.

          Если английский не проблема, то есть великолепные открытые источники:
          — Видео-лекции введение от топовых чуваков в области про всё подряд (запись двухдневной школы в Стэнфорде): https://www.youtube.com/playlist?list=PLrAXtmErZgOfMuxkACrYnD2fTgbzk2THW
          — онлайн книга начального/среднего уровня http://neuralnetworksanddeeplearning.com/
          — более продвинутая (начинает с азов, но довольно резко усложняется, есть готовая пдф-версия где-то на гитхабе): http://www.deeplearningbook.org/
          — великолепный курс по сетям в основном в приложении к картинкам (видео ищется на ютубе, скоро обещают версию 2017 официально выложить): https://cs231n.github.io
          — подробный гайд как пользоваться вышеперечисленным для самостоятельного обучения: https://yerevann.com/a-guide-to-deep-learning/

          Если останутся силы и станет скучно:
          — топ-100 лучших статей по сетям за последние годы (все статьи огонь): https://github.com/terryum/awesome-deep-learning-papers
          — другой похожий популярный список: https://github.com/songrotek/Deep-Learning-Papers-Reading-Roadmap


  1. ivansmith
    08.04.2017 20:13

    Мне показалось, что это просто сортировка по цвуту, но как-то очень сложно сделано…