В настоящее время я внедряю глубокое q-learning в многоагентной системе, где каждый агент может рассматриваться как отдельный q-learning агент.
Я могу получить, что мое вознаграждение увеличивается и также сходится, поэтому Очевидно, мое обучение - это своего рода работа. Хотя, глядя на мою среднюю награду (по всем агентам), я могу получить странные вещи, которых я никогда раньше не видел. Я обновляю целевую сеть каждые 10.000 эпизодов, и после каждого обновления целевой сети потеря, кажется, скачет и предотвращает сближение. Я также пытался обновлять целевую сеть каждые 100 или 1000 раз и всегда мог получить то же поведение, что и на скриншоте.
Средняя потеря DQN
Это мой код для обучения:
def train_model(self, batch_size = parameters.BATCH_SIZE):
# Check if replay buffer contains enough data
if self.memory.size < batch_size:
print("Replay Memory: ", self.memory.size)
print("Memory too small")
return 0
else:
# sample batch of data from the replay memory
minibatch = self.memory.sample_batch(batch_size)
states = minibatch['s']
actions = minibatch['a']
rewards = minibatch['r']
next_states = minibatch['s2']
dones = minibatch['d']
dqn_variables = self.q_network.trainable_variables
with tf.GradientTape() as tape:
tape.watch(dqn_variables)
target = self.q_network(tf.convert_to_tensor(np.vstack(states), dtype=tf.float64))
target_val = self.target_network(tf.convert_to_tensor(np.vstack(next_states), dtype=tf.float64))
target = np.array(target)
target_val = np.array(target_val)
for i in range(batch_size):
next_v = np.array(target_val[i]).max()
if dones[i]:
target[i][actions[i]] = rewards[i]
else:
target[i][actions[i]] = rewards[i] + self.gamma * next_v
values = self.q_network(tf.convert_to_tensor(np.vstack(states), dtype=tf.float64))
error = tf.square(values - target) * 0.5
error = tf.reduce_mean(error)
dqn_grads = tape.gradient(error, dqn_variables)
#clipped_grads, _ = tf.clip_by_global_norm(dqn_grads, 5.0)
grads_and_vars = zip(dqn_grads, dqn_variables)
clipped_grads_and_vars = [(tf.clip_by_value(grad, -1, +1), var) for grad, var in grads_and_vars]
self.opt.apply_gradients(clipped_grads_and_vars)
self.update_epsilon()
return error
Сеть цели обновляется следующим образом:
def align_target_model(self):
self.target_network.set_weights(self.q_network.get_weights())
Кто-нибудь из вас сталкивался с подобной проблемой? Я рад любой идее, которую вы можете мне дать, для решения моей проблемы.