为什么在这个深度 Q 学习模型的开发阶段得分(累积奖励)会下降?

Why does the score (accumulated reward) goes down during the exploitation phase in this Deep Q-Learning model?

我很难尝试让深度 Q 学习代理找到最优策略。这是我当前模型在 TensorFlow 中的样子:

model = Sequential()

model.add(Dense(units=32, activation="relu", input_dim=self.env.state.size)),
model.add(Dense(units=self.env.allActionsKeys.size, activation="softmax"))

model.compile(loss="mse", optimizer=Adam(lr=0.00075), metrics=['accuracy'])

对于我目前正在处理的问题'self.env.state.size'等于6,可能的操作数('self.env.allActionsKeys.size')是30。

输入向量由位组成,每个位都有不同的范围(虽然在这个问题上差别不大)。 2位的范围为[0,3],其他2位为[0,2],其余为[0,1]。请注意,这应该是一个简单的问题,我的目标是更复杂的问题,例如输入大小为 15,并且范围可能比这大一些 ([0,15], [0 ,3],...).

这是我的训练方法的样子:

def train(self, terminal_state):
    if len(self.replay_memory) < MIN_REPLAY_MEMORY_SIZE:
        return

    # Get MINIBATCH_SIZE random samples from replay_memory
    minibatch = random.sample(self.replay_memory, MINIBATCH_SIZE)

    # Transition: (current_state, action, reward, normalized_next_state, next_state, done)

    current_states = np.array([transition[0] for transition in minibatch])
    current_qs_minibatch = self.model.predict(current_states, batch_size=MINIBATCH_SIZE, use_multiprocessing=True)

    next_states = np.array([transition[3] for transition in minibatch])
    next_qs_minibatch = self.model.predict(next_states, batch_size=MINIBATCH_SIZE, use_multiprocessing=True)

    env_get_legal_actions = self.env.get_legal_actions
    np_max = np.max

    X = []
    y = []

    for index, (current_state, action, reward, normalized_next_state, next_state, done) in enumerate(minibatch):
        if not done:
            legalActionsIds = env_get_legal_actions(next_state)
            max_next_q = np_max(next_qs_minibatch[index][legalActionsIds])

            new_q = reward + DISCOUNT * max_next_q
        else:
            new_q = reward

        current_qs = current_qs_minibatch[index].copy()
        current_qs[action] = new_q

        X.append(current_state)
        y.append(current_qs)

    self.model.fit(np.array(X), np.array(y), batch_size=MINIBATCH_SIZE, verbose=0, shuffle=False)

其中折扣 = 0.99 且 MINIBATCH_SIZE = 64

我读到建议对输入向量进行归一化,所以我测试了 2 种不同的属性归一化方法:最小-最大范数。和 z-score 范数。而且,由于值范围相差不大,我也在没有标准化的情况下进行了测试。 None 这些方法被证明比其他方法更好。

发生的情况是,在开始阶段,在探索阶段,分数会随着时间的推移变得更好,这意味着模型正在学习一些东西,但随后在开发阶段,当 epsilon 值很低并且代理采取大多数动作都是贪婪的,分数急剧下降意味着它实际上没有学到任何好东西。

这是我的深度 Q 学习算法:

epsilon = 1

for episode in range(1, EPISODES+1):
    episode_reward = 0
    step = 0
    done = False
    current_state = env_reset()

    while not done:
        normalized_current_state = env_normalize(current_state)

        if np_random_number() > epsilon:  # Take legal action greedily
            actionsQValues = agent_get_qs(normalized_current_state)
            legalActionsIds = env_get_legal_actions(current_state)
            # Make the argmax selection among the legal actions
            action = legalActionsIds[np_argmax(actionsQValues[legalActionsIds])]
        else:  # Take random legal action
            action = env_sample()

        new_state, reward, done = env_step(action)

        episode_reward += reward

        agent_update_replay_memory((normalized_current_state, action, reward, env_normalize(new_state), new_state, done))
        agent_train(done)

        current_state = new_state
        step += 1

    # Decay epsilon
    if epsilon > MIN_EPSILON:
        epsilon *= EPSILON_DECAY

其中 EPISODES = 4000 且 EPSILON_DECAY = 0.9995。

我尝试了所有这些超参数,但结果非常相似。我不知道还能尝试什么。我在规范化方面做错了什么吗?还有其他更推荐的归一化方法吗?会不会是我的神经网络模型不够好?

我认为对于像这个输入大小为 6、输出层为 30 节点和隐藏层为 32 的简单问题来说应该不难。

请注意,对于相同的问题,我使用大小为 14 的二进制数组使用了不同的状态表示,并且它在相同的超参数下工作正常。那么当我使用其他表示时可能会出现什么问题?

我发现模型实现有问题。激活函数不应该是softmax而是linear。至少,就我而言,这种方式效果更好。