我试着用自己的q-learning实现来解决aigym mountain-car problem
在尝试了不同的方法之后,它开始工作得很好,但是过了一段时间(每集20k集*1000个样本),我注意到存储在Q表中的值变大了,所以它存储了值-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]

我做错什么了?

最佳答案

我认为你的代码有两个问题:
首先,你的学习率可能太高了(从你的评论来看,lr=0.99),你的贴现系数(gamma=0.8)也可能太高了。
Richard S.Sutton是强化学习的奠基人之一,他写的这本书可以在网上找到,我强烈建议你把它作为参考。(我自己在书架上找到了印刷版。)
Q-Learning是Reinforcement Learning: An Introduction的一个特例,Temporal Difference Learning主要使用小于0.15的学习率。
假设entry[0]是x k;,entry[1]是u k;,entry[2]是r k;{k+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])

如果这应该代表公式
subchapter 6.2
你的第一个版本有一个问题,因为你基本上一直在总结那些只稍微打折的奖励。附加-Q[x_k, u_k]的第二个版本应该是正确的。
其他你可能想问的问题:
python - Q学习表收敛到-inf-LMLPHP
Learning rate of a Q learning agent

08-25 05:42