Q Learning中如何实现探索函数和学习率

人工智能 强化学习 q学习 数据科学
2021-10-29 04:08:26

我正在尝试实现 Q 学习(基于状态的表示,没有神经/深层的东西),但我很难让它学习任何东西。

我相信我的问题在于探索功能和/或学习率。问题是,我在我关注的来源中看到了不同的解释,所以我不确定什么是正确的方法了。

到目前为止我所理解的是,Q-learning 是 TD with q-val 迭代。

所以一个限时的 q-val 迭代步骤是:

Q[k+1](s,a) = ∑(s'): t(s,a,s') * [r(s,a,s') + γ * max(a'):Q[k](s',a')]

在哪里:

Q = q-table: state,action -> real
t = MDP transition model
r = MDP reward func
γ = discount factor.

但由于这是一个无模型、基于样本的设置,因此上述更新步骤变为:

Q(s,a) = Q(s,a) + α * (sample - Q(s,a))

在哪里:

sample = r + γ * max(a'):Q(s',a')
r  = reward, also coming from percept after taking action a in step s.
s' = next state coming from percept after taking action a in step s. 

现在例如,假设以下 MDP:

    0    1    2    3    4  
0 [10t][ s ][ ? ][ ? ][ 1t]

Discount: 0.1 | 
Stochasticity: 0 | 
t = terminal (only EXIT action is possible)
s = start

综上所述,我的算法(伪代码)是:

input: mdp, episodes, percept
Q: s,a -> real is initialized to 0 for all a,s
α = .3

for all episodes:
    s = mdp.start

    while s not none:
        a  = argmax(a): Q(s,a) 
        s', r = percept(s,a)
        sample = r + γ * max(a'):Q(s',a')
        Q(s,a) = Q(s,a) + α * [sample - Q(s,a)]
        s = s'

如上所述,算法不会学习。因为它会很快变得贪婪。

它将从 0,1 开始并选择迄今为止的最佳动作。所有 q-val 均为 0,因此它将根据 qval 如何存储在 Q 中的任意顺序进行选择。假设选择了“W”(向西)。它将达到 0,0,奖励为 0,q-val 更新为 0(因为我们还不知道 0,0,EXIT 产生 10)

在下一步中,它将从 0,0 采取唯一可能的操作 EXIT 并获得 10。

此时 q-table 将是:

0,1,W:      0
0,0,Exit:   3 (reward of 10 averaged by learning rate of .3)

这一集已经结束,因为 0,0 是终端。在下一集,它将再次从 0,1 开始,并且由于任意顺序而再次取 W。但现在 0,1,W 将更新为 0.09。然后 0,0,Exit 将再次被采用(并且 0,0,Exit 更新为 5.1)。然后第二集就结束了。

此时 q-table 为:

0,1,W:      0.09
0,0,Exit:   5.1

并且序列 0,1,W->0,0,Exit 将被无限期采用。

所以这把我带到了学习率和探索功能上。

《人工智能:一种现代方法》一书(第 3 版,Russell 著)首先提到(第 839-842 页)探索功能作为放入 val 更新中的东西(因为它正在讨论基于模型的价值迭代方法) .

因此,从书中的 val 更新讨论推断,我假设 q-val 更新变为:

Q(s,a) = ∑(s'): t(s,a,s') * [r(s,a,s') + γ * max(a'):E(s',a')]

其中 E 将是一个探索函数,根据本书,它可能类似于:

E(s,a) = <bigValue> if visitCount(s,a) < <minVisits> else Q(s,a)

这个想法是人为地提高尚未尝试过的动作的 vals,因此现在它们至少会被尝试minVisits几次。

但是,在第 844 页,本书显示了 Q-learning 的伪代码,而不是在 q-val 更新中使用这个 E,而是在动作选择的 argmax 中使用。我想有道理吗?因为探索等于选择一个动作……

我拥有的另一个来源是加州大学伯克利分校 CS188 讲座视频/笔记。在那些(强化学习 2:2016)中,他们展示了 q-val 更新步骤中的探索功能。这与我从书中关于值迭代方法的讨论中推断出的一致,但与书中为 Q-Learning 显示的内容不一致(请记住,这本书在 argmax 中使用了探索函数)。

我尝试在更新步骤、动作选择步骤以及同时在两者中放置探索功能......但事情最终还是变得贪婪并卡住了。

所以不确定应该在哪里以及如何实施。

另一个问题是学习率。解释通常是“你需要随着时间的推移减少它”。好的..但是有一些启发式吗?现在,根据我正在做的书:

learn(s,a) = 0.3 / visitCount(s,a). 但不知道它是太多还是太少或恰到好处。

最后,假设我的探索和学习正确,我怎么知道要训练多少集?

我想我必须保留 2 个版本的 Q-table 并检查 q-vals 在哪一点上与以前的迭代相比没有太大变化(类似于求解已知 MDP 的值迭代)。

1个回答

您的主要问题是您需要从 Q 表中分离出推动行为策略的因素。

Q Learning 是一种离策略算法。它最终学习的 Q-table 是针对最优策略(也称为目标策略)的。为了能够学习该策略,代理需要探索。通常的做法是让代理遵循不同的策略(称为行为策略)。为了高效学习,您通常希望行为策略目标策略相似。所以通常也从 Q 表中驱动行为策略,但不是绝对必要的。

您不需要探索功能,但它是推动探索的一种好​​方法。

最简单的行为策略,也适用于您的情况,是完全随机行为 - 忽略 Q 表并随机选择动作。对于您的简单玩具问题,这应该可以很好地工作。

更常见的方法是表现ε-贪婪地。对于一些概率ε(例如ε=0.1),行为随机。否则取 argmax 超过 a(s,一个).

探索函数方法与您目前所拥有的方法类似,只是缺少将行为策略与 Q 表更新分离。Q 表更新忽略了探索函数,并在估计的下一个值上最大化:

(s,一个)=(s,一个)+α(r+γ最大限度一个'(s',一个')-(s,一个))

选择实际下一步要采取的行动的行为策略可以通过使用探索函数来决定:

一个'=最大参数一个'(s',一个')

请注意,在随机环境中(所选择的操作可能会随机导致多个不同的状态),您可能无需任何单独的行为策略就可以逃脱,并且始终对 Q 表采取贪婪的行动。然而,这不是一个通用的解决方案——这样的学习代理在确定性环境中表现不佳。