Мой вариант статьи о нейронных сетях и самообучающихся системах. Не всё один-в-однин, но чтобы познать, нужно углубиться. Оригинал статьи автора здесь.
В этой записи мы собираемся научить простой ИИ ходить с помощью обучения с подкреплением. Сначала вкратце разберемся, что такое обучение с подкреплением и что это за ИИ, который мы собираемся тренировать.
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. Позже мы подробно рассмотрим алгоритм.
Визуализация тренировки
Слегка неровная местность
- Вначале ИИ ведет себя очень хаотично. Он не умеет держать ноги в равновесии.
- После 300 серий он учится ползать на одном колене и одной ноге. Этот ИИ сейчас играет осторожно, потому что если он упадет, он получит -100 награды.
- После 500 серий он начал балансировать на обеих ногах. Но еще нужно научиться правильно ходить.
- После 600 эпизодов он учится получать максимальные награды. Он уже по другому ходит. В конце концов, это ИИ, а не Человек. Это лишь один из способов пройтись, чтобы получить максимальную награду. Если тренировать его снова, он может научиться другому оптимальному способу ходьбы.
Хардкорная местность
- Я сохранил свой веса после предыдущей тренировки на простой местности и возобновил тренировки на жесткой местности. Я сделал это, потому что агент уже знал, как ходить по простой местности, и теперь ему нужно научиться преодолевать препятствия во время ходьбы.
- После 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, который содержит все необходимое находится в оригинале статьи.
В комментариях расскажите как это можно применить в теме алготрейдинга.
Оцените