Обучать глубокие нейронные сети с нуля — задача не из простых.

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

Демонстрация прохождения простого лабиринта с использованием трюков. Длительность обучения сети: 1 час 06 минут. Запись ускорена в 8 раз.


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

За теоретическими знаниями рекомендую перейти на канал sim0nsays.
А я расскажу о своих скромных успехах в обучении нейронных сетей.

Постановка задачи


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

У меня был выбор стратегии как обучать нейронную сеть.
Поощрять за успешное завершение поставленной задачи или поощрять по мере приближения к завершению поставленной задачи.

Я выбрал второй способ, по двум причинам:

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

Архитектура нейронной сети


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

Архитектура для решения задачи:

  • 3 входных нейрона — координаты агента и значение пройденной ячейки (нормализуем в диапазоне от 0 до 1).
  • 2 скрытых слоя по 256 и 128 нейронов (уменьшаем размерность слоёв в сторону выхода сети).
  • 1 слой сброса случайных нейронов для устойчивости обучения сети.
  • 4 выходных нейрона — вероятности принятия решения выбора стороны для следующего шага.
  • Функция активации нейронов: sigmoid. Оптимизатор: adam.

sigmoid даёт на выходе 4 вероятности в диапазоне от 0 до 1, выбирая максимальный, получаем сторону для следующего шага: [jumpTop, jumpRight, jumpBottom, jumpLeft].

Разработка архитектуры


Переобучение возникает при использовании избыточно сложных моделей.

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

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

Вывод: чем больше слоёв и нейронов в них, тем больше нужно данных для обучения.

Игровое поле




Правила игры


0 — Вступив на эту ячейка, агент уничтожается.
1..44 — Ячейки, значения которых увеличиваются с каждый шагом.
Чем дальше агент прошёл, тем большее вознаграждение он получит.
45 — Финиш. Обучения при этом не происходит, оно только когда все агенты уничтожены, а финиш — это исключение, которое просто использует уже обученную сеть для следующего прогнозирования с самого начала лабиринта.

Описание параметров


Агент имеет “усики” в четырёх направлениях от него — они играют роль разведки окружающей среды и являются описанием для координат агента и значения ячейки, на которой он стоит.

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

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

Трюки


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

Зацикливание агентов


В ходе обучения, сеть начинала принимать решения, делать ходы туда-сюда — проблема “использования”. Оба хода дают сети положительное вознаграждение, что останавливало процесс исследования лабиринта и не давало выбраться из локального минимума.

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

Исследовать или использовать


Чтобы исследовать пути вокруг текущего положения агента, был использован простой трюк: на каждом шагу, 5 агентов будут “добровольными” исследователями. Ход этих агентов будет выбран случайно, а не прогнозом нейронной сети.

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

Генетический алгоритм


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

Прогнозирование работает быстрее, чем обучение, следовательно сеть имеет больше шансов продвинуться дальше по лабиринту при наименьшем затрате времени и наилучшем результате.

Обучение на лучших в поколении


На протяжении эпохи, для 500 агентов сохраняются результаты их продвижения по лабиринту. Когда уничтожен последний агент, выбираются 5 лучших агентов из 500 — кто дошёл по лабиринту дальше всех.

На результатах лучших в эпохе, будет обучаться нейронная сеть.

Таким образом мы сократим объем использованной памяти не сохраняя и не обучая сеть на агентах, которые сеть не продвигают вперёд.

Завершение


Не являясь специалистом в данной области у меня получилось достичь некоторых успехов в обучении нейронной сети, получится и у Вас — дерзайте!

Стремитесь учиться быстрее компьютеров, пока у нас это получается лучше.

Материалы


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

Книги


  • Глубокое обучение. Погружение в мир нейронных сетей
    С. Николенко, А. Кадурин, Е. Архангельская
  • Машинное обучение и TensorFlow
    Н. Шакла
  • Самообучающиеся системы
    С. И. Николенко, А. Л. Тулупьев
  • Обучение с подкреплением
    Р. С. Саттон, Э. Г. Барто
  • Самоорганизующиеся карты
    Т. Кохонен

Спасибо за внимание!

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


  1. dim2r
    22.05.2019 08:25

    попробуйте еще технику Policy Gradient, она должна быстрее учить нейросеть
    habr.com/ru/post/439674


  1. daiver19
    22.05.2019 08:53

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


    1. dim2r
      22.05.2019 10:00

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


      1. daiver19
        22.05.2019 19:50

        И зачем тут RL? В реальных задачах никто осознанно не прячет данные. Любой лабиринт легко обходится с помощью DFS, достаточно только знать свое текущее положение.


        1. dim2r
          23.05.2019 19:42

          ну тогда обойдите лабиринт, который в реальности является месторождением нефти в пористой породе


          1. daiver19
            23.05.2019 19:47

            Не очень понял в чем вопрос. Здесь проблема в постановке задачи в первую очередь.


  1. eee
    22.05.2019 12:00
    +1

    Отличная статья!

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

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

    P.S. Хороший пример обучения нейросети с подкреплением:
    www.youtube.com/watch?v=wL7tSgUpy8w