简单的 Q 表学习:理解示例代码

数据挖掘 Python 强化学习 q学习
2021-09-21 14:40:00

我正在尝试从该来源学习 Q-Table 的教程,并且难以理解一小段代码。这是整个区块:

import gym
import numpy as np


env = gym.make('FrozenLake-v0')

#Initialize table with all zeros
Q = np.zeros([env.observation_space.n,env.action_space.n])
# Set learning parameters
lr = .8
y = .95
num_episodes = 2000
#create lists to contain total rewards and steps per episode
#jList = []
rList = []
for i in range(num_episodes):
    #Reset environment and get first new observation
    s = env.reset()
    rAll = 0
    d = False
    j = 0
    #The Q-Table learning algorithm
    while j < 99:
        j+=1
        #Choose an action by greedily (with noise) picking from Q table
        a = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))
        #Get new state and reward from environment
        s1,r,d,_ = env.step(a)
        #Update Q-Table with new knowledge
        Q[s,a] = Q[s,a] + lr*(r + y*np.max(Q[s1,:]) - Q[s,a])
        rAll += r
        s = s1
        if d == True:
            break
    #jList.append(j)
    rList.append(rAll)


print "Score over time: " +  str(sum(rList)/num_episodes)

print "Final Q-Table Values"
print Q

代码运行良好,我可以打印我的结果,但这是我遇到困难的地方:

a = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))

我的问题是,为什么我们要乘以 1/(i+1)?这应该是ε退火的实现吗?任何帮助表示赞赏。

1个回答

我的问题是,为什么我们要乘以 1/(i+1)?这应该是ε退火的实现吗?

该代码看起来像是一个相对临时的*调整,以确保早期探索,以及替代ϵ-贪婪的行动选择。1/(i+1)因子类似于衰减ϵ,但不完全相同。

ϵ- 具有相同衰减因子的贪婪可能如下所示:

a = np.argmax(Q[s,:])
if epsilon/(1+math.sqrt(i)) > random.random():
    a = random.randrange(0, env.action_space.n)

math.sqrt(i)只是一个建议,但我觉得这epsilon/(1+i)可能过于激进,并且会过快中断探索。

这不是我在学习 Q-Learning 时见过的东西(例如在 David Silver 的讲座或 Sutton & Barto 的书中)。但是,Q-Learning 并不依赖于使用任何特定的动作选择,它只需要在行为策略上进行足够的探索。对于给定的问题,在贪婪选择中添加一些噪音显然效果很好。从技术上讲,为了保证收敛,表格 Q-Learning 需要在无限时间步上进行无限探索。提供的代码确实做到了这一点,因为噪声不受正态分布的约束。因此,总是有一些有限的机会选择具有相对较低的动作价值估计的动作并在以后细化该估计。

然而,噪声的快速衰减(1/集数)和初始比例因子都是需要针对问题进行调整的超参数。您可能更喜欢文献中更标准的东西,例如ϵ-贪婪,吉布斯采样或上置信度限制动作选择(该示例与 UCB 非常相似,因为它在取最大值之前添加了 Q 值)。


* 示例中使用的方法可能有一个名称(“Noisy Action Selection”的一些变体),但我不知道,也无法通过快速搜索找到它。