Pull to refresh

Машинное обучение глубокой нейронной сети с подкреплением на tensorflow.js: Трюки

Reading time 4 min
Views 12K
Обучать глубокие нейронные сети с нуля — задача не из простых.

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

Демонстрация прохождения простого лабиринта с использованием трюков. Длительность обучения сети: 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
    Н. Шакла
  • Самообучающиеся системы
    С. И. Николенко, А. Л. Тулупьев
  • Обучение с подкреплением
    Р. С. Саттон, Э. Г. Барто
  • Самоорганизующиеся карты
    Т. Кохонен

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



UPD: Reinforcement Learning Snake
Tags:
Hubs:
+5
Comments 7
Comments Comments 7

Articles