Узнав об обучении подкреплению самостоятельно, в эти дни я пытаюсь взять себя в руки в Тренажерном зале, чтобы вычислить глупую задачу, но для меня образовательную;).Я хочу, чтобы агент узнал, как сгладить пошаговую функцию (область действия будет на самом деле больше, когда я стану более осведомленным и знакомым с RL / Gym).
Как я понимаю, мой случай должен легко решатьсяс GoalEnv из Gym, так как я знаю целевую функцию, мне нужен агент для достижения.Из-за того, что мы все еще немного незнакомы с RL, трудно справиться с этой задачей, в то время как все примеры касаются робототехники (перенос проблем не является простым).
Я пытался определить параметры RL, как определено в https://github.com/openai/gym/blob/master/gym/envs/robotics/robot_env.py:
- наблюдение = значение для каждого кадра сигнала
- вознаграждение будет нормой между желаемым флетом и достигнутым сигналом на данном шаге
- действие представляет собой свертку сигнала с фильтром. Есть моя проблема, я совершенно не уверен, правильно ли определено действие .Если это так, я борюсь с формой фильтра, который нужно применить (не так уж и глупо).Пока мой код:
# Generation of heaviside signal
N = 50
x = np.linspace(-20,20, N)
y = np.zeros(N)
heaviside = 0.5*(np.sign(x)+1)
def compute_reward(goal_achieved, goal_desired):
return np.linalg.norm(goal_desired-goal_achieved)
class StepSignal(gym.GoalEnv):
metadata = {'render.modes': ['human']}
def __init__(self, goal, n_frames):
super(StepSignal, self).__init__()
self.goal = goal
self.frames = n_frames
self.action_space = spaces.Box(low=-np.inf, high=np.inf, shape=(1,), dtype=np.float16)
obs = self._get_obs()
self.observation_space = spaces.Dict(dict(
desired_goal=spaces.Box(-np.inf, np.inf, shape=obs['achieved_goal'].shape, dtype='float32'),
achieved_goal=spaces.Box(-np.inf, np.inf, shape=obs['achieved_goal'].shape, dtype='float32'),
observation=spaces.Box(0, 1, shape=obs['observation'].shape, dtype='float32'),
))
def step(action):
obs = np.convolve(heaviside, action)
done = False
info = {
'is_success': self._is_success(obs['achieved_goal'], self.goal),
}
reward = compute_reward(obs['achieved_goal'],self.goal)
return obs, reward, done, info
def _get_obs(self):
return {
'observation': obs.copy(),
'achieved_goal': achieved_goal.copy(),
'desired_goal': self.goal.copy(),
}
def _is_success(self, achieved_goal, desired_goal):
d = compute_reward(achieved_goal, desired_goal)
return (d < self.distance_threshold).astype(np.float32)
Как видите, функция _get_obs () пуста, но GoalEnv требует передать self.observation_space как словарь Gym с указанным (ключ, значение)) кортежи (достигнутая цель и наблюдение).Я тоже очень запутался там ...
Итак, здесь есть два основных вопроса:
- определение действия для перехода от сигнала шага к плоскому
- как обработать наблюдение, чтобы передать его в качестве словарного значения.
Спасибо!