Я новичок в машинном обучении и пробую один код, написанный на 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