我正在尝试实现 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 的值迭代)。