我在维基百科上读过 https://en.wikipedia.org/wiki/Q-learning
Q学习可能会遇到收敛速度慢的问题,尤其是当折扣系数{\ displaystyle \ gamma} \ gamma接近1时。[16]快速Q学习是Q学习算法的一种新变体,可以解决这个问题,并且比基于模型的方法(例如值迭代)实现更好的收敛速度
所以我想尝试快速的q-learning,看看它有多好。
我能在互联网上找到它的唯一来源是: https://papers.nips.cc/paper/4251-speedy-q-learning.pdf
这就是他们建议的算法。
现在,我对此并不了解。什么是TkQk,我应该有另一个q值列表吗?有没有比这更明确的解释?
Q[previousState][action] = ((Q[previousState][action]+(learningRate * ( reward + discountFactor * maxNextExpectedReward - Q[previousState][action]) )));
这是我目前的QLearning算法,我希望将其替换为快速的Q-learning。
答案 0 :(得分:1)
第一个考虑因素:如果你想加快实际问题的Q学习,我会在Speedy Q-learning之前选择其他选项,比如着名的Q(lambda),即Q-learning结合具有良性痕迹。为什么?因为有大量的信息和实验(好)结果与资格痕迹。事实上,正如Speedy Q-learning作者所说,这两种方法的工作原理是相似的:
使用先前对行动价值的估计的想法已经存在 被用来提高Q学习的表现。很受欢迎 这种算法是
值Q(lambda)
[14,20],其中包含了 Q学习中的资格跟踪概念,并且是经验性的 被证明具有比Q学习更好的性能,即Q(0),用于 适当的lambda
。
你可以在Sutton and Barto RL book找到一个很好的介绍。如果您只是想研究Speedy Q-learning和标准版本之间的差异,请继续。
现在是你的问题。是的,您必须维护两个单独的Q值列表,一个用于当前时间k
,另一个用于上一个k-1
,即分别为Q_{k}
和Q_{k-1}
。
在常见情况下(包括您的情况),TQ_{k} = r(x,a) + discountFactor * max_{b in A} Q_{k}(y,b)
,其中y
是下一个状态,b
是针对给定状态最大化Q_{k}
的操作。请注意,您在标准Q-learning中使用该运算符,该Q-learning具有以下更新规则:
对于Speedy Q-learning(SQL),如前所述,您维护两个Q函数并将操作TQ
应用于TQ_{k}
和TQ_{k-1}
。然后,在SQL更新规则中使用先前操作的结果:
在您的问题中发布的伪代码中要强调的另一点是,它与SQL的同步版本相对应。这意味着,在每个时间步k
中,您需要为所有现有的状态 - 操作对y
生成下一个状态Q_{k+1}(x,a)
并更新(x,a)
。