Как перейти от пошаговой функции к плоскому сигналу с помощью Gym Open AI с помощью обучения с подкреплением - PullRequest
0 голосов
/ 01 июля 2019

Узнав об обучении подкреплению самостоятельно, в эти дни я пытаюсь взять себя в руки в Тренажерном зале, чтобы вычислить глупую задачу, но для меня образовательную;).Я хочу, чтобы агент узнал, как сгладить пошаговую функцию (область действия будет на самом деле больше, когда я стану более осведомленным и знакомым с 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 с указанным (ключ, значение)) кортежи (достигнутая цель и наблюдение).Я тоже очень запутался там ...

Итак, здесь есть два основных вопроса:

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

Спасибо!

...