Q学习表收敛到-inf

gre*_*e57 2 python machine-learning reinforcement-learning q-learning

我尝试通过自己的q学习实现来解决aigym山地车问题

在尝试了不同的方法之后,它开始确实很好地工作,但是过了一会儿(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)
Run Code Online (Sandbox Code Playgroud)

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

#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]
Run Code Online (Sandbox Code Playgroud)

使用该算法我获得了很好的结果,但是问题是-如上文所述-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]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Sen*_*try 5

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

  1. 首先,您的学习率可能太高(根据评论,lr = 0.99),而折扣系数(gamma= 0.8)也可能很高。

    理查德·萨顿(Richard S. Sutton)是强化学习的奠基人之一,《强化学习:入门》一书可在线获得,我强烈建议您使用它们作为参考。(我自己在书架上有印刷版。)

    Q学习是时间差异学习的一种特例,第6.2节主要使用小于0.15的学习率。

  2. 假设entry[0]x_k,entry[1]u_k和entry[2]r_ {k + 1},则此行

    Q[entry[0],entry[1]] = Q[entry[0],entry[1]] + lr * (entry[2] + latest_best * gamma - Q[entry[0],entry[1]])
    
    Run Code Online (Sandbox Code Playgroud)

    相当于

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

    如果这应该代表公式 在此处输入图片说明 您的第一个版本存在问题,因为您基本上一直在总结仅略有折扣的奖励。带有附加内容的第二个版本-Q[x_k, u_k]应该是正确的。

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