Научите нейронку ходить

Изображение для публикации
Изображение предоставлено ChianImage

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


В этой записи мы собираемся научить простой ИИ ходить с помощью обучения с подкреплением. Сначала вкратце разберемся, что такое обучение с подкреплением и что это за ИИ, который мы собираемся тренировать.

RL: Краткое введение

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

Изображение для публикации
Обучение с подкреплением

ПО ДЛЯ ИИ

ИИ, который мы собираемся обучить, представляет собой среду OpenAI Gym, и его имя – BipedalWalker .

OpenAIGym – это набор крутых сред. Чтобы узнать больше о средах обучения с подкреплением и о том, как их использовать следует посетить веб-сайт OpenAIGym.

Теперь давайте подробно рассмотрим среду BipedalWalker.


Двуногий ?

Награда: дается за продвижение вперед: всего 300+ баллов до дальнего конца. Если робот падает, он получает -100. 

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

Состояние состоит из угловой скорости корпуса (hull), угловой скорости, горизонтальной скорости, вертикальной скорости, положения шарниров (joint) и угловой скорости шарниров, касания ног с землей и 10 измерений лидарного дальномера (lidar). В векторе состояния нет координат.

Изображение для публикации

Пространство действий

У BipedalWalker 2 ноги. На каждой ноге по 2 сустава. Вы должны научить двуногого ходить, прилагая крутящий момент к этим суставам. Таким образом, размер нашего рабочего пространства равен 4, что соответствует крутящему моменту, приложенному к 4 суставам. Вы можете применить крутящий момент в диапазоне (-1, 1)

Награда

  • Агент получает положительное вознаграждение, пропорциональное пройденному расстоянию по местности. Он может получить в общей сложности 300+ наград до самого конца.
  • Если агент упадет, он получит награду -100.
  • Существует некоторая отрицательная награда, пропорциональная крутящему моменту, приложенному к шарниру. Так агент учится плавно ходить с минимальным крутящим моментом.

Существует 2 версии среды Bipedal в зависимости от типа местности.

  • Слегка неровная местность.
  • Хардкорная местность – с лестницами, пнями и ловушками.

Решение проблемы окружающей среды

Используется алгоритм DDPG для решения этой проблемы. DDPG подходит, когда есть непрерывное действие и пространство состояний А. В примере используется библиотека Pytorch.

В DDPG есть две разные сети: Актер и Критик. Значение выходного действия актер-сеть при заданных ему состояниях. Критическая сеть выводит значение Q (насколько хороша пара состояние-действие), заданную пару значений состояния и действия (производит актер-сеть). Вы можете подробно прочитать о DDPG из источников, доступных в Интернете. Также в конце прикрепил ссылку.

Давайте сначала посмотрим на обучение BipedalWalker. Позже мы подробно рассмотрим алгоритм.


Визуализация тренировки

Слегка неровная местность

  1. Вначале ИИ ведет себя очень хаотично. Он не умеет держать ноги в равновесии.
Начало
  1. После 300 серий он учится ползать на одном колене и одной ноге. Этот ИИ сейчас играет осторожно, потому что если он упадет, он получит -100 награды.
После 300 серий
  1. После 500 серий он начал балансировать на обеих ногах. Но еще нужно научиться правильно ходить.
После 500 серий
  1. После 600 эпизодов он учится получать максимальные награды. Он уже по другому ходит. В конце концов, это ИИ, а не Человек. Это лишь один из способов пройтись, чтобы получить максимальную награду. Если тренировать его снова, он может научиться другому оптимальному способу ходьбы.
После 600 серий

Хардкорная местность

  1. Я сохранил свой веса после предыдущей тренировки на простой местности и возобновил тренировки на жесткой местности. Я сделал это, потому что агент уже знал, как ходить по простой местности, и теперь ему нужно научиться преодолевать препятствия во время ходьбы.
После еще 1000 серий
  1. После 1000 эпизодов дополнительного обучения агент смог ходить по сложной местности. Но иногда падает. Чтобы иметь возможность полностью ходить по сложной местности, необходимо очень много тренироваться в течение большего количества времени.

Архитектура DDPG сети

Выбраны следующие гиперпараметры.

BUFFER_SIZE = 1000000 # размер буфера воспроизведения BATCH_SIZE = 100 # размер мини-пакета ГАММА = 0,99 # коэффициент скидки TAU = 0.001 # для мягкого обновления целевых параметров LR_ACTOR = 0,0001 # скорость обучения актера LR_CRITIC = 0,001 # скорость обучения критика WEIGHT_DECAY = 0.001 # L2 уменьшение веса

Ниже приведен фрагмент кода сети актеров. Акторная сеть состоит из 2-х скрытых слоев с активацией batch-norm и relu . Размер скрытых слоев – 600 и 300. Использует активацию tanh на последнем слое, потому что действие ограничено диапазоном (-1, 1). Вместо использования весов по умолчанию инициализированы свои веса, что бы улучшило производительность.

Class Actor

class Actor(nn.Module):

    def __init__(self, state_size, action_size, seed, fc_units=600, fc1_units=300):

        super(Actor, self).__init__()
        self.seed = torch.manual_seed(seed)
        self.fc1 = nn.Linear(state_size, fc_units)
        self.fc2 = nn.Linear(fc_units, fc1_units)
        self.fc3 = nn.Linear(fc1_units, action_size)

        self.bn1 = nn.BatchNorm1d(fc_units)
        self.bn2 = nn.BatchNorm1d(fc1_units)
        self.reset_parameters()

    def reset_parameters(self):

        self.fc2.weight.data.uniform_(-1.5e-3, 1.5e-3)
        self.fc3.weight.data.uniform_(-3e-3, 3e-3)

    def forward(self, state):
        """Build an actor (policy) network that maps states -> actions."""
        x = F.relu((self.bn1(self.fc1(state))))
        x = F.relu((self.bn2(self.fc2(x))))
        return F.torch.tanh(self.fc3(x))

Class Critic

Ниже приведен фрагмент кода сети критиков. Есть 2 скрытых слоя для состояния и 1 скрытое состояние для действия. Здесь используется batch-norm и активацию relu . Скрытые слои действия и пространства добавляются вместе с активацией relu на нем.

class Critic(nn.Module):

    def __init__(self, state_size, action_size, seed, fcs1_units=600, fcs2_units=300, fca1_units=300):

        super(Critic, self).__init__()
        self.seed = torch.manual_seed(seed)
        self.fcs1 = nn.Linear(state_size, fcs1_units)
        self.fcs2 = nn.Linear(fcs1_units, fcs2_units)
        self.fca1 = nn.Linear(action_size, fca1_units)
        self.fc1 = nn.Linear(fcs2_units, 1)
        self.bn1 = nn.BatchNorm1d(fcs1_units)
        self.reset_parameters()

    def reset_parameters(self):

        self.fcs2.weight.data.uniform_(-1.5e-3, 1.5e-3)
        self.fc1.weight.data.uniform_(-3e-3, 3e-3)

    def forward(self, state, action):
        """Build a critic (value) network that maps (state, action) pairs -> Q-values."""
        xs = F.relu((self.bn1(self.fcs1(state))))
        xs = self.fcs2(xs)
        xa = self.fca1(action)
        x = F.relu(torch.add(xs, xa))
        return self.fc1(x)

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

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

Оцените

Оцените наш сайт(обязательно)

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.