Проблема с кодом градиента политики для pong-v0 в Keras - PullRequest
0 голосов
/ 24 мая 2019

Я новичок в машинном обучении и пробую один код, написанный на pong-v0.Я использую метод градиента политики и вычисляю функцию преимущества, вычитая оценщик стоимости (базовый уровень) с дисконтированным вознаграждением.Затем умножаем функцию преимущества на вероятность действия логарифма.Обновление модели отнимает много времени, а не сближается.

В основном я пытаюсь сделать

up_probability = model.predict(state_delta)
new_state, reward, done, _ = env.step(up_probability)
action_prob = 1- up_probability
reward = discounted_mean_reward(reward)
gradient = action_prob * reward

model.fit(state_delta, gradient)

Я создал одну модель для оценки политики и прогнозирования и обновления модели

class PolicyEstimator():
    """Policy Function approximator"""

    def __init__(self, observation_space, hidden_layer_size, action_space):
        self.observation_space = observation_space
        self.hidden_layer_size = hidden_layer_size
        self.action_space = action_space
        self.model = self.build_model()

    def build_model(self):
        model = Sequential()
        model.add(Dense(units=self.hidden_layer_size, input_dim= self.observation_space, activation='relu', kernel_initializer='RandomNormal'))
        # output layer
        model.add(Dense(units=self.action_space, activation='sigmoid', kernel_initializer='RandomNormal'))
        # compile the model using traditional Machine learning losses and optimizers
        model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
        return model

    def predict(self, state):
        state = np.expand_dims(state, axis=1).T
        return self.model.predict(state)

    def update(self, state, logpg):
        self.model.fit(x=state,y=logpg, epochs=1, verbose=1)

Здесь я импортирую среду тренажерного зала и обновляю модель, основываясь на обновленном градиенте политики с модулем Advantge
Большая часть кода взята отсюда (http://karpathy.github.io/2016/05/31/rl/)

while True:
        print("Starting episode %d " % episode_n)
        episode_done = False
        episode_reward_sum = 0
        episode_tuples = []
        last_state = env.reset()
        last_state = prepro(last_state)
        action = env.action_space.sample()
        state, _, _, _ = env.step(action)
        state = prepro(state)

        while not episode_done:

            state_delta = state - last_state
            last_state = state
            action_prob = estimator_policy.predict(state_delta)

            if np.random.uniform() < action_prob:
                action = UP_ACTION
            else:
                action = DOWN_ACTION

            y = 1 if action == UP_ACTION else 0  # a "fake label"
            eplogp = (y - action_prob)  # grad that encourages the action that was taken to be taken 
            print("action prob: %.3f" % action_prob)
            state, reward, episode_done, _ = env.step(action)
            state = prepro(state)

            episode_reward_sum += reward
            episode_tuples.append((state_delta,eplogp, reward))

        # Go through the policy and make policy updates
        states, dlogps, rewards = zip(*episode_tuples)
        rewards = discount_rewards(rewards, args.discount_factor)
        rewards -= np.mean(rewards)
        rewards /= np.std(rewards)
        rewards = np.vstack(rewards)
        dlogps = np.vstack(dlogps)
        states = np.vstack(states)
        logpg = dlogps * rewards
        estimator_policy.update(states, logpg)
        episode_tuples = []
        if episode_n == 2: break
        episode_n += 1

После 50эпизоды награда -21

...