DQN-Loss «скачет» после обновления целевой сети и не сходится - PullRequest
1 голос
/ 25 марта 2020

В настоящее время я внедряю глубокое 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())

Кто-нибудь из вас сталкивался с подобной проблемой? Я рад любой идее, которую вы можете мне дать, для решения моей проблемы.

...