инвертированный маятник REINFORCE

Вопрос или проблема

Я изучаю обучение с подкреплением, и в качестве практики я пытаюсь стабилизировать инвертированный маятник (gym: Pendulum-v0) в прямом положении, используя градиент политики: REINFORCE.

У меня есть несколько вопросов, пожалуйста, помогите мне, я много пытался, но не мог понять. Ответ на любой вопрос может помочь мне. Заранее спасибо.

1- Почему наблюдения в коде маятника это: cos(theta), sin(theta) и theta_dot? Почему не только theta и theta_dot?

2- Действие, которое я должен отправить в среду (env.step(action)), корректно ли это (на python):

prob=output.eval(arguments={observations: state})[0][0][0]  
# выход нейронной сети 

# Бернуллиевское распределение, либо 1, либо 0 в зависимости от порога (rand.)
action = 1 if np.random.uniform() < prob else 0 

3- Функция вознаграждения в коде маятника определена следующим образом, но я не мог понять, почему! Разве не должно быть так: если маятник в вертикальном положении (с некоторой толерантностью), то вознаграждение высокое, иначе ноль?

costs = angle_normalise((th)**2 +.1*thdot**2 + .001*(action**2))
# нормализация между -pi и pi
reward=-costs

4- Уравнение движения маятника отличается от известного (например, здесь), код среды использует следующее уравнение, откуда оно взялось?

 newthdot = thdot + (-3*g/(2*l) * np.sin(th + np.pi) + 3./(m*l**2)*u) * dt

Я знаю некоторые ваши вопросы.

Прежде всего, я написал код REINFORCE для этой проблемы (гиперпараметры не заданы правильно). Эта ссылка на cartpole (по REINFORCE)

  1. $cos(\theta)$ показывает высоту маятника. $sin(\theta)$ показывает, насколько он отклонен влево или вправо. Но если использовать $\theta$ напрямую, это кодирует эту информацию гораздо более сложно. Возможно, такие входные данные зависят от этого момента.

  2. Вы можете обратиться к ссылке, чтобы убедиться, но я думаю, что диапазон ваших действий неверный: если вы используете env = gym.make("Pendulum-v0"), чтобы создать вашу среду, то ваш диапазон действий находится между -2 и 2. Вы можете найти ваш диапазон действий, набрав print(env.action_space). Этот вывод говорит, что у вас есть один выход, и его диапазон от -2 до 2.

  3. Насколько я понимаю, вознаграждение из этой ссылки минимизирует следующее:

    $(\theta^2 + 0.1*(\frac{d\ \theta}{dt})^2 + 0.001*\text{action}^2)$

У него 3 члена:

  1. $\theta^2$ : минимизация этого является нашей главной целью, потому что приближение $\theta$ к 0 означает, что маятник поднимается вверх.

  2. $(\frac{d\ \theta}{dt})^2$: минимизация этого члена означает, что мы должны оставаться устойчивыми и больше не двигаться.

  3. $\text{action}^2$: я думаю, что этот член предназначен для минимизации энергии или чего-то подобного.

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

Ответ или решение

Конечно! Давайте подробно рассмотрим ваши вопросы относительно задачи стабилизации инвертированного маятника с использованием алгоритма REINFORCE в контексте обучения с подкреплением.

1. Почему наблюдения для маятника — это cos(θ), sin(θ) и θ_dot?

Использование cos(θ) и sin(θ) вместо прямого использования угла θ связано с удобством представления угла в виде единичного радиуса окружности. Это преобразование позволяет более точно восприятий направления, в котором находится маятник.

  • cos(θ) указывает на горизонтальную позицию маятника, а sin(θ) — на вертикальную.
  • Это представление позволяет избежать проблем, связанных с обрезанием угла, поскольку если использовать только θ, то информация будет закодирована не таким образом, как это делает тригонометрическое представление. При переходе через 180 градусов (например, с 350° на 10°) мы столкнемся с "скачком" значения угла, что затрудняет обучение агента.

2. Правильна ли реализация действия env.step(action)?

В вашем коде есть ошибка в интерпретации диапазона действий. В среде Pendulum-v0 действия принимают значения в пределах от -2 до 2.

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

# Вывод нейронной сети
output_prob = output.eval(arguments={observations: state})[0][0][0]  
# Теперь нужно использовать соответствующий диапазон
action = (output_prob * 2) - 1  # Приводим к диапазону от -2 до 2
action = np.clip(action, -2, 2)  # Ограничиваем диапазон

3. Почему функция вознаграждения определена так?

Функция вознаграждения действительно выглядит немного необычно, но она отражает несколько ключевых моментов:

  • θ²: Наказание за угол отклонения от вертикали. Чем ближе значение к нулю, тем выше вознаграждение.
  • *0.1 θ_dot²**: Наказание за угловую скорость. Это предотвращает колебания и делает систему стабильнее.
  • *0.001 action²**: Наказание за использование действия. Это помогает минимизировать количество энергии, затрачиваемой на поддержание маятника в вертикальном положении.

Таким образом, цель наказаний — сбалансировать положение маятника с минимизацией потерь энергии.

4. Уравнения движения маятника

Уравнение, применяемое в среде Pendulum-v0, является результатом аппроксимации уравнений движения с учетом сил, действующих на маятник. Оно может показаться отличающимся от уравнений, приведенных в других источниках, но это обычно связано с различиями в параметрах и нормализацией.

newthdot = thdot + (-3*g/(2*l) * np.sin(th + np.pi) + 3./(m*l**2)*u) * dt
  • Эта формула учитывает динамику системы и силы, действующие на маятник, включая гравитацию и момент силы от действия (u).
  • Эта формализация позволяет достичь более стабильного и реалистичного поведения при моделировании.

Заключение

Использование алгоритма REINFORCE для управления инвертированным маятником предоставляет отличную платформу для изучения основных принципов обучения с подкреплением. Понимание представления состояния, правильной нормализации действий и реализации функции награды поможет вам более эффективно решать задачи, связанные с динамическими системами. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью!

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

Капча загружается...