Вопрос или проблема
Я изучаю обучение с подкреплением, и в качестве практики я пытаюсь стабилизировать инвертированный маятник (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)
-
$cos(\theta)$ показывает высоту маятника. $sin(\theta)$ показывает, насколько он отклонен влево или вправо. Но если использовать $\theta$ напрямую, это кодирует эту информацию гораздо более сложно. Возможно, такие входные данные зависят от этого момента.
-
Вы можете обратиться к ссылке, чтобы убедиться, но я думаю, что диапазон ваших действий неверный: если вы используете
env = gym.make("Pendulum-v0")
, чтобы создать вашу среду, то ваш диапазон действий находится между -2 и 2. Вы можете найти ваш диапазон действий, набравprint(env.action_space)
. Этот вывод говорит, что у вас есть один выход, и его диапазон от -2 до 2. -
Насколько я понимаю, вознаграждение из этой ссылки минимизирует следующее:
$(\theta^2 + 0.1*(\frac{d\ \theta}{dt})^2 + 0.001*\text{action}^2)$
У него 3 члена:
-
$\theta^2$ : минимизация этого является нашей главной целью, потому что приближение $\theta$ к 0 означает, что маятник поднимается вверх.
-
$(\frac{d\ \theta}{dt})^2$: минимизация этого члена означает, что мы должны оставаться устойчивыми и больше не двигаться.
-
$\text{action}^2$: я думаю, что этот член предназначен для минимизации энергии или чего-то подобного.
-
Я точно не знаю, но похоже, что они моделируют это с помощью моделирования пространства состояний.
Ответ или решение
Конечно! Давайте подробно рассмотрим ваши вопросы относительно задачи стабилизации инвертированного маятника с использованием алгоритма 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 для управления инвертированным маятником предоставляет отличную платформу для изучения основных принципов обучения с подкреплением. Понимание представления состояния, правильной нормализации действий и реализации функции награды поможет вам более эффективно решать задачи, связанные с динамическими системами. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью!