Или как правильно закоптиться в нейросети


image
Курочка снесла яичко. Сам процесс выглядит ужасно. Результат — съедобно. Массовый геноцид кур.

В этой статье будет описано:

  1. Где, как и почему можно получить небольшое качественное самообразование в сфере работы с нейросетями БЕСПЛАТНО, СЕЙЧАС и СОВСЕМ НЕ БЫСТРО;
  2. Будет описана логика рекурсии и будут порекомендованы книги по теме;
  3. Будет описан список основных терминов, которые нужно разобрать на 2-3 уровня абстракции вниз;
  4. Будет приведен ipynb-notebook, который содержит необходимые ссылки и базовые подходы;
  5. Будет немного своеобразного саркастичного юмора;
  6. Будут описаны некоторые простые закономерности, с которыми вы столкнетесь при работе с нейросетями;

Статьи про нейрокурятник

Заголовок спойлера
  1. Вступление про обучение себя нейросетям
  2. Железо, софт и конфиг для наблюдения за курами
  3. Бот, который постит события из жизни кур — без нейросети
  4. Разметка датасетов
  5. Параллельное участие в соревнованиях, визуализации внутренностей нейросетей, развитие архитектур моделей
  6. Работающая модель для распознавания кур в курятнике


Философское вступление начинается тут


С чего начать?

Заголовок спойлера
Можно начать с того, что моя девушка написала прекрасную статью про свое путешествие и установку системы наблюдения за курами в курятник. Зачем? Потому что прикладная задача мотивирует гораздо больше, чем задачи на Kaggle, где все тоже далеко не идеально (лики в 1/2 задач, побеждающие архитектуры — это стеки из 15 моделей, оверфиттинг для поиска немасштабируемых закономерностей итд итп). Моя задача — написать нейросети и код на питоне, который будет отличать кур, и, возможно, логировать события в жизни кур в нашу любимую СУБД. В процессе можно научиться много чему интересному и, возможно, даже изменить свою жизнь, поделившись своими мини-наработками. И приятно, и полезно и весело.

Можно также начать с того, что в принципе сейчас наблюдается новая ветка «пузыря» на рынке технологий — все резко побежали «в AI». Раньше все бежали в IT, в онлайн, в «бигдату», в «сколково», в AR/VR. Если посидеть в тематических российских чатах, то там люди как правило или пишут все с нуля на {вставить свой экзотический язык} или делают одноразовых чат-ботов, осваивая средства пиарящихся корпораций. Но ведь если следовать таким принципам в своем само-образовании, то учиться надо у ярых фанатов своего дела, которые делают то, что они делают, не ради наживы, а ради прекрасного.

И тут мне на помощь пришел неизвестный человек, который вставил строчку в мой файл, куда я собирал образовательные полезности в сфере работы с данными. Что удивительно, эти люди (fast.ai — ссылка, которую кто-то вставил) проделали просто гигантскую работу по популяризации и обучению даже с нуля, следуя принципу инклюзивности и целостности образования против эксклюзивности и принципа «башни из слоновой кости». Но обо все по порядку.
image
Подход к образованию in a nutshell.


Сами авторы расскажут лучше меня.

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

Поэтому все нижеописанное сделано для нейрокурятника и только для него.

На всякий случай уточню, что в мои задачи НЕ входит:
Очень толстый слой сарказма
  • Написать курс, чтобы потом продать лиды его молодых выпускников в Mail.ru xD;
  • Писать про то, как мне нравится Caffe против Theano или Tensorflow — это все не имеет разницы до промышленного профессионального уровня, если вы не исследователь в этой сфере со стажем и не пишете научные статьи;
  • Писать нейросети с нуля на {ваш экзотический язык};
  • Продавать вам что-то за деньги (только идеи и бесплатно);



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


Философское вступление заканчивается тут


Описание того, как научиться тренировать нейросети


TLDR (в порядке установки / изучения от простого к сложному)

Если вы хотите эффективно и современно тренировать нейросети для прикладной цели (а не переписать все на {X} или собрать ПК с 10 видеокартами), то вот краткий и очень рекурсивный гайд:

Список тут
  • 1. Изучите хотя бы основные понятия:
    1. Линейной алгебры. Цикл вводных видео. Начните хотя бы с них;
    2. Математического анализа. Цикл вводных видео;
    3. Почитайте про градиентный спуск. Вот обзор методов и вот визуализация. Остальное найдете сами в курсах;
  • 2. Если вы вообще не знаете ни про что из списка, будьте готовы вложить 200-300 часов своего времени. Если только нейросети и / или питон — то 50-100 часов;
  • 3. Заимейте себе Ubuntu или ее аналог (да здравствуют комменты в стиле «не труЪ»). Мой краткий обзорный гайд (интернет поможет найти более подробные технические гайды). Конечно, также можно извратиться через виртуалки, докеры, мак итд итп;
  • 4. Поставьте себе третий питон (как правило уже стоит из коробки, 2017 год). Именно третий. Но лучше лишний раз сказать. Не пытайтесь менять системный питон в Линуксе — все сломается;
  • 5.Если вы не очень знакомы с питоном, то (все, опять же гуглится):
    1. Самый простой и бесплатный источник уровня «база» и бесплатный (никаких курсов за 30-50к рублей, чтобы потом пойти работать инструктором на эти же курсы за 30к рублей, когда заявлена средняя зп якобы в 100к рублей);
    2. Идеальная входная точка рекурсии по использованию питона для работы с данными;
  • 6. Поставьте себе jupyter notebook и это расширение (вам нужно code folding). Очень сокращает время работы. Правда;
  • 7. Купите себе видеокарту (сейчас выгоднее купить, чем арендовать — начало 2017):
    1. Что собрал в 1 посте на канале;
    2. Лучший пост про железо;
    3. Лучший тред про настройку софта и сборку;
    4. Мой пост со ссылками и конфигами;
  • 8. Лучшие образовательные (БЕСПЛАТНЫЕ) ресурсы:
    1. www.fast.ai — входная точка рекурсии. Там безумного много информации в блоге, в видео, на форуме, в вики и notes;
    2. Великолепная книга про нейросети и первый код из нее на третьем питоне (гуглите, может кто-то задебажил весь код, я заленился после первых двух глав);
    3. Великолепный курс Andrew Ng и его интерпретация на питоне;
  • 9. Jupyter notebook (html ipynb), который:
    1. Содержит иерархическую структуру ячеек, в каждой из которых описано что делается и зачем;
    2. Основные инклюды, утилиты и библиотеки разбиты по типам;
    3. Приведены ссылки на основные источники, нужные, чтобы понять, что происходит;
    4. Приведен сахар для работы с Keras (подробнее без продаванства тут, сами люди из fast.ai рекомендуют именно ее);
    5. Для датасета машин проезжающих за окном получена точность предсказания класса в ~80% (рандом дает 50%, но картинки говенные и мелкие);
    6. Для датасета с соревнования distracted driving полученная точность предсказания 10 классов в ~50% и ошибкой, которая точно входит в топ 15-20% решений в мире;


To-do list для достижения лучших результатов (на distracted driving, к примеру, можно получить ~60-75% точности):

Список улучшений на будущее
  1. Использование визуализаций для понимания того, чему учится сеть;
  2. Использование тренировочного сета в 300-500 картинок, чтобы быстро понять какие параметры искажения картинок лучше всего подходят;
  3. Использование test датасета (или cross-validation) для увеличения точности. Нужно добавлять не более 25-30% таких картинок (semi-supervised learning);
  4. Использование тонкой настройки imagenet как как дополнительной опции для модели;



image
Если вы дочитали до сюда — то вот вам курочка, с которой сняли подозрения, что она не несется. В суп она пойдет гораздо позже за счет этого.

Опишу теперь то, что показалось занятным из процесса непосредственно обучения нейросетей (не тех, которые в голове, а тех, которые в питоне):

Список тут
  1. Датасет с машинами показал, что если картинки маленькие и выборка из классов смещенная (один класс больше чем другой), то модель будет хорошо определять только один класс;
  2. Начинайте с маленького сета, чтобы модель тренировалась за несколько десятков секунд и настройте мета-параметры изменения изображений;
  3. Если у вас есть некой приложение из распознавания движения + нейросети, то лучше сразу обрезайте картинки в open-cv, не оставляйте на потом;
  4. У нейросетей есть так называемый эффект «easy way out», когда кост-функция может относительно долго находиться в локальном минимуме, потому что предсказать 50% вероятность попадания постоянно в 1 класс проще, чем учиться;
  5. Пробуйте сначала простые архитектуры, усложняйте постепенно. Если тренируется медленно — возьмите маленькую выборку или проверьте свою модель;
  6. Простая архитектура + пробуйте разные мета-параметры (learning rate);
  7. Если кост-функция не уменьшается совсем, то где-то в модели если досадная опечатка. Проще все ее найти можно сравнив свою модель с моделью другого человека;
  8. Сейчас на уровне программного сахара (keras) есть уже огромное количество state-of-the-art фич, таких как:
    1. Нормализация изображений;
    2. Искажение изображений;
    3. Dropout;
    4. Convolutions;
    5. Итераторы для последовательного чтения файлов;
  9. Из интересного (не из области стакания 15 моделей) в соревнованиях Kaggle я бы отметил использование комбинаций таких вещей как:
  10. Предобработка изображений, поиск контуров и фигур с помощью open-cv;
  11. Сверточные нейросети для основной классификации;
  12. Нейросети для создания мета-данных про картинки — например тут сначала они ищут у китов головы, и только потом определяют кита;
  13. Собрал тут интересное про последние архитектуры на Kaggle


А вот набор картиночек


Заголовок спойлера
image
Первые 285 автомобилей имеют скромные размеры в пикселях + там все смазано...

image
Когда хочется побыстрее обрезать картинки, а думать не хочется рождаются вот такие уродливые решения

image
Разница в точности на тренировке и валидации намекает, что датасет перекошен, маленький и вообще. Зато красивый прогресс-индикатор.

image
Не куры, но виновники торжества. Очень смазанные — в движении

image
Радости нет границ, когда быдлокод, написание которого растянулось на час, начал работать и обрезать машину.

image
На практике места в памяти видео-карты хватает или с запасом, или его сразу не хватает. Тяжело подобрать размер картинки и размер batch'а, чтобы и рыбку съесть и…

Правило пальца — сверточные слои требуют много памяти, а dense слои — много времени.


image
Сравните полезную площадь на этой картинке...

image
И сколько тут полезных пикселей =) Да у курицы голова больше машины (в пикселях) — моя видеокарта будет страдать

image
Не расчитал — память кончилась и все упало. А функции очистки, кроме как перезапуска я не нашел пока
Поделиться с друзьями
-->

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


  1. madfly
    08.05.2017 11:24
    +2

    Спасибо за статью! Вдохновляет!


    1. snakers4
      08.05.2017 11:49

      ))


  1. madkite
    08.05.2017 21:05

    А NFC-тэги курам внедрять не думали? Понимаю, что дороже, но всё же надёжнее — на кону же жизнь курицы!


    1. snakers4
      09.05.2017 05:06

      Тут есть ряд ограничений:
      — нет опыта работы с таким железом совсем
      — куры пойдут в суп рано или поздно
      — у нас был только один визит в курятник на все про все
      — такое решение неприменимо, например, к людям

      Так что честно говоря мы даже не смотрели в этом направлении.


      1. saluev
        09.05.2017 11:22

        такое решение неприменимо, например, к людям

        Отнюдь, отличный способ дать фанатикам с фобией чипирования повод начать переживать!


  1. vvzvlad
    08.05.2017 21:25
    +2

    Каша в тексте, читать очень затруднительно.


  1. AndreWin
    09.05.2017 21:51

    Ну зачем вы код в виде картинок? А так отличная статья. Я теперь хоть знаю, что мне повторить надо по математике...


    1. snakers4
      09.05.2017 22:03

      Ну как сказать… там именно в этом месте такой код из разряда на коленке написанный.
      Какой код такая и презентация)

      А вообще там есть jp notebook со всей информацией ссылками и кодом.


  1. ulu
    13.05.2017 12:18

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


    И тут внезапно появляются машины, проезжающие за окном. Это, конечно, уникальный авторский прием. А то мы тут засыпать уже начали, слишком все понятно. Местами встречаются искусно разбросанные то там, то сям намеки на происходящее ("не куры, но виновники торжества" — хочется, чтобы это стало мемом), и вот уже быдлокод зачем-то обрезает машину, но голова у курочки в пикселях больше, поэтому все упало, не знаю, что теперь делать. Занавес.


    Резюме:


    1. Непонятно, для кого написана статья. Если для тех, кто "с нуля", то можно ограничиться списком того, что нужно прочесть. Если для тех, кто уже разбирается в сверточных слоях и кост-функциях, то нафига нужен этот список? В любом случае, читателю неплохо бы понимать, стоит ли тратить драгоценное время на прочтение, или это написано не для нее. Похоже, была попытка написать статью "для всех".
    2. Непонятно, какова задача, и кто какую пользу получит от ее решения. Там дальше упоминается "снесла яичко" и "не попадет в суп", но в начале про это ни слова.
    3. Совершенно непонятно, зачем для этого обрезать машины.
    4. Совершенно непонятно, зачем нам какая-то логика рекурсии (и почему сайт fast.ai назван входной точкой рекурсии).
    5. Обещанного объяснения основных терминов мы так и не дождались. Вообще, автор рассчитывает не только на то, что термины все известны (см п.1), но и на то, что всевозможные названия параметров в "наборе картиночек" тоже всем как-то очевидны.
    6. Если написать вступление была, хотя бы, какая-то попытка, то под конец автору не свезло с головой курицы в пикселях, и сил/настроения написать хотя бы заключительную фразу уже не осталось. Так мы и будем гадать, что же это было.


    1. ulu
      13.05.2017 12:25

      Да, и видео совершенно отвратное — там что-то с качеством звука, прямо режет по ушам. Если что, на Udacity есть приятный курс про machine learning — https://classroom.udacity.com/courses/ud120 — там, правда, про deep learning не говорят, но в качестве базового курса, не требующего 100 часов матана и алгебры, идет отлично.