代理在 DQN 中总是采取相同的行动 - 强化学习

数据挖掘 强化学习 dqn 政策梯度 演员评论家
2021-10-12 03:14:35

我已经使用 DQN 算法训练了一个 RL 代理。在 20000 集之后,我的奖励收敛了。现在,当我测试这个代理时,代理总是采取相同的行动,而与状态无关。我觉得这很奇怪。有人可以帮我弄这个吗。有没有原因,任何人都可以想到为什么代理会这样?

奖励情节

在此处输入图像描述

当我测试代理时

state = env.reset()
print('State: ', state)

state_encod = np.reshape(state, [1, state_size])
q_values = model.predict(state_encod)
action_key = np.argmax(q_values)
print(action_key)
print(index_to_action_mapping[action_key])
print(q_values[0][0])
print(q_values[0][action_key])

q_values_plotting = []
for i in range(0,action_size):
    q_values_plotting.append(q_values[0][i])


plt.plot(np.arange(0,action_size),q_values_plotting)

每次它给出相同的 q_values 图,即使每次初始化的状态都不同。下面是 q_Value 图。

在此处输入图像描述

测试:

代码

test_rewards = []
for episode in range(1000):
    terminal_state = False
    state = env.reset()
    episode_reward = 0
    while terminal_state == False:
        print('State: ', state)
        state_encod = np.reshape(state, [1, state_size])
        q_values = model.predict(state_encod)
        action_key = np.argmax(q_values)
        action = index_to_action_mapping[action_key]
        print('Action: ', action)
        next_state, reward, terminal_state = env.step(state, action)
        print('Next_state: ', next_state)
        print('Reward: ', reward)
        print('Terminal_state: ', terminal_state, '\n')
        print('----------------------------')
        episode_reward += reward
        state = deepcopy(next_state)
    print('Episode Reward' + str(episode_reward))
    test_rewards.append(episode_reward)

plt.plot(test_rewards)

在此处输入图像描述

谢谢。

2个回答

这似乎很明显,但是您是否尝试过使用玻尔兹曼分布而不是 argmax 进行动作选择?众所周知,这会鼓励探索,可以通过将操作策略设置为

p(a|s)=exp(βQ(a,s)aexp(βQ(a,s)),

在哪里β是温度参数,控制着勘探开发的权衡。这也称为 softmax 分布。

放入代码中,这将是这样的:

beta = 1.0
p_a_s = np.exp(beta * q_values)/np.sum(np.exp(beta * q_values))
action_key = np.random.choice(a=num_act, p=p_as)

由于指数,这可能导致数值不稳定,但这可以通过首先减去最高 q 值来处理:

q_values = q_values - np.max(q_vaues)
  • 代理采取的行动可能是最优化的行动。
  • 如果输入相同的状态,您可能会获得相同的奖励。可能是状态没有正确更新。由于 next_state 由代理给出,请检查deepcopy函数。
  • 模型可能不会更新它的参数或它的 q 值。检查模型如何更新它的参数和 q 值。