Обучать глубокие нейронные сети с нуля — задача не из простых.
Требуется много данных и времени на обучение, но ускорить процесс могут помочь некоторые трюки, о которых я и расскажу под катом.
Демонстрация прохождения простого лабиринта с использованием трюков. Длительность обучения сети: 1 час 06 минут. Запись ускорена в 8 раз.
Под каждую задачу нужно разрабатывать собственный набор трюков для ускорения обучения сети. Я поделюсь несколькими приёмами, которые помогли мне обучить сеть намного быстрее.
За теоретическими знаниями рекомендую перейти на канал sim0nsays.
А я расскажу о своих скромных успехах в обучении нейронных сетей.
Аппроксимировать функцию схождения минимизируя квадратичную функцию потерь обратным распространением ошибки глубокими нейронными сетями.
У меня был выбор стратегии как обучать нейронную сеть.
Поощрять за успешное завершение поставленной задачи или поощрять по мере приближения к завершению поставленной задачи.
Я выбрал второй способ, по двум причинам:
Архитектура разрабатывается экспериментально, основывается на опыте архитектора и удачи.
Архитектура для решения задачи:
sigmoid даёт на выходе 4 вероятности в диапазоне от 0 до 1, выбирая максимальный, получаем сторону для следующего шага: [jumpTop, jumpRight, jumpBottom, jumpLeft].
Переобучение возникает при использовании избыточно сложных моделей.
Это когда сеть запомнила тренировочные данные и для новых данных, которые сеть еще не видела, она будет работать плохо, потому что у сети не было необходимости искать обобщения, так как у нее в достатке было памяти для запоминания.
Недообучение — при недостаточно сложных моделей. Это когда у сети было мало тренировочных данных, чтобы найти обобщения.
Вывод: чем больше слоёв и нейронов в них, тем больше нужно данных для обучения.
0 — Вступив на эту ячейка, агент уничтожается.
1..44 — Ячейки, значения которых увеличиваются с каждый шагом.
Чем дальше агент прошёл, тем большее вознаграждение он получит.
45 — Финиш. Обучения при этом не происходит, оно только когда все агенты уничтожены, а финиш — это исключение, которое просто использует уже обученную сеть для следующего прогнозирования с самого начала лабиринта.
Агент имеет “усики” в четырёх направлениях от него — они играют роль разведки окружающей среды и являются описанием для координат агента и значения ячейки, на которой он стоит.
Описание играет роль прогнозирования следующего направления для движения агента. То есть, агент сканирует наперёд, что там дальше и соответственно со временем сеть обучается двигаться в сторону увеличения значения ячейки и не выходить за пределы допустимого перемещения.
Цель нейронной сети: получать бОльшее вознаграждение.
Цель обучения: поощрять за правильные действия, чем ближе агент к решению поставленной задачи, тем выше будет вознаграждение для нейронной сети.
Первые попытки обучения без трюков, занимали по несколько часов обучения и результат был далёк от завершения. Применив определённые приёмы, результата удалось достичь всего за один час и шесть минут!
В ходе обучения, сеть начинала принимать решения, делать ходы туда-сюда — проблема “использования”. Оба хода дают сети положительное вознаграждение, что останавливало процесс исследования лабиринта и не давало выбраться из локального минимума.
Первой попыткой решения, было ограничение количества ходов агента, но это было не оптимально, так как агент тратил много времени в зацикливании, прежде, чем самоуничтожиться. Лучшим решением стало уничтожать агента, если он пошёл в ячейку с меньшим значением, чем на той, на которой он стоял — запрет идти в обратном направлении.
Чтобы исследовать пути вокруг текущего положения агента, был использован простой трюк: на каждом шагу, 5 агентов будут “добровольными” исследователями. Ход этих агентов будет выбран случайно, а не прогнозом нейронной сети.
Таким образом, мы имеем повышенную вероятность, что один из пяти агентов продвинется дальше остальных и поможет в обучении сети лучшими результатами.
Каждую эпоху на игровом поле участвуют 500 агентов. Прогнозирование для всех агентов выполняются в асинхронном режиме для всех агентов сразу, к тому же вычисления делегируются на gpu. Таким образом мы получаем более эффективное использование вычислительных мощностей компьютера, что приводит к сокращению времени на прогнозирование нейронной сети для 500 агентов одновременно.
Прогнозирование работает быстрее, чем обучение, следовательно сеть имеет больше шансов продвинуться дальше по лабиринту при наименьшем затрате времени и наилучшем результате.
На протяжении эпохи, для 500 агентов сохраняются результаты их продвижения по лабиринту. Когда уничтожен последний агент, выбираются 5 лучших агентов из 500 — кто дошёл по лабиринту дальше всех.
На результатах лучших в эпохе, будет обучаться нейронная сеть.
Таким образом мы сократим объем использованной памяти не сохраняя и не обучая сеть на агентах, которые сеть не продвигают вперёд.
Не являясь специалистом в данной области у меня получилось достичь некоторых успехов в обучении нейронной сети, получится и у Вас — дерзайте!
Стремитесь учиться быстрее компьютеров, пока у нас это получается лучше.
Репозиторий с кодом
Запустить обучение в браузере
Документация по tensorflow.js, где также можно найти дополнительные ресурсы для изучения.
UPD: Reinforcement Learning Snake
Требуется много данных и времени на обучение, но ускорить процесс могут помочь некоторые трюки, о которых я и расскажу под катом.
Демонстрация прохождения простого лабиринта с использованием трюков. Длительность обучения сети: 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