QLearning表收敛到

2024-04-25 13:13:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用自己的q-learning实现来解决aigym mountain-car problem。你知道吗

在尝试了不同的东西之后,它开始工作得非常好,但是过了一段时间(每集20k集*1000个样本),我注意到我的Q表中存储的值变大了,所以它存储了value-inf

在模拟过程中,我使用了以下代码:

for t in range(SAMPLE_PER_EPISODE):

    observation, reward, done, info = env.step(action)
    R[state, action] = reward

    history.append((state,action,reward))

    max_indexes = np.argwhere(Q[state,] == np.amax(Q[state,])).flatten()
    action = np.random.choice(max_indexes)

为了学习,我在每集之后都使用了以下代码:

#train
latest_best = 0
total_reward = 0
for entry in reversed(history):
    Q[entry[0],entry[1]] = Q[entry[0],entry[1]] + lr * (entry[2] + latest_best * gamma)

    latest_best = np.max(Q[entry[0],:])
    total_reward += entry[2]

我用这个算法得到了很好的结果,但问题是——正如上面解释的那样——Q值很快变成了-inf

我认为我实现的Q算法是错误的,但是在将其更改为以下实现之后,它就不再工作了(几乎和以前一样好):

#train
latest_best = 0
total_reward = 0
for entry in reversed(history):
    # Here I changed the code
    Q[entry[0],entry[1]] = Q[entry[0],entry[1]] + lr * (entry[2] + latest_best * gamma - Q[entry[0],entry[1]])

    latest_best = np.max(Q[entry[0],:])
    total_reward += entry[2]

我做错什么了?你知道吗


Tags: 代码infornpactionlatesthistorymax
1条回答
网友
1楼 · 发布于 2024-04-25 13:13:41

我认为你的代码有两个问题:

  1. 首先,你的学习率可能太高了(从你的评论来看lr=0.99),你的折扣系数(gamma=0.8)也可能太高了。你知道吗

    强化学习的创始人之一Richard S.Sutton的书Reinforcement Learning: An Introduction可以在网上找到,我强烈建议您将其作为参考。(我自己把印刷版放在书架上。)

    Q-Learning是Temporal Difference Learningsubchapter 6.2的一个特例,主要使用小于0.15的学习率。

  2. 假设entry[0]是xuk,entry[1]是uk,entry[2]是ruk+1},那么这条线

    Q[entry[0],entry[1]] = Q[entry[0],entry[1]] + lr * (entry[2] + latest_best * gamma - Q[entry[0],entry[1]])
    

    相当于

    Q[x_k, u_k] = Q[x_k, u_k] + lr * (r_{k+1} + latest_best * gamma - Q[x_k, u_k])
    

    如果这代表公式 enter image description here 你的第一个版本有一个问题,因为你基本上一直在总结奖励,只是略有折扣。带有附加-Q[x_k, u_k]的第二个版本应该是正确的。

其他您可能想查看的问题:

相关问题 更多 >