我正在开发一个简单的Q-Learning实现而不是一个简单的应用程序,但有些东西让我感到困惑。
让我们考虑Q-Learning的标准配方
Q(S, A) = Q(S, A) + alpha * [R + MaxQ(S', A') - Q(S, A)]
我们假设这种状态K
有两种可能的行动,包括R
和R'
授予我们的座席奖励A
和A'
。
如果我们遵循几乎完全贪婪的方法(假设我们假设0.1 epsilon),我首先会随机选择其中一个动作,例如A
。下一次,我可能(90%的时间)再次选择A
,这将导致Q(K,A)不断增长和成长,即使我偶然尝试{ {1}},可能它的奖励与A的奖励相同,我们将进入这样一种情况:在剩下的学习过程中,几乎不可能从我们的第一次猜测中“恢复”。
我想这绝对不是这样,否则代理人基本上不会学习 - 只需遵循一个简单的方法:像第一次那样做一切。
我错过了什么吗?我知道我可以调整alpha值(通常,随着时间的推移减少它),但这绝不会改善我们的情况。
答案 0 :(得分:7)
来自this,我们知道:
Q-learning的融合使用任何探索政策,并且只要求每个状态操作对
(s,a)
无限次地执行。
epsilon-greedy policy
是探索和开发之间的平衡,它既能保证收敛,又能保证良好的表现。但在实际问题中,我们经常需要一些启发式方法来改变学习速度alpha
以表示更好的回报。否则,infinite often
要求很难满足。
我在下面列出一个例子。这是一个经典问题,你有一个网格,你可能在每个单元格中有不同的奖励金额。例如,下面显示了一个4x4网格,其中每个单元格都包含1
的奖励,但左上角的单元格除外(您的奖励金额更高,为10
)。机器人在网格中移动。法律行动正在移动LEFT
,RIGHT
,UP
和DOWN
,但机器人无法移出网格。
因此我们的状态空间包含16个不同的状态,对应于16个单元格。对于每个州,由于边界约束,存在不同数量的法律行为。我们的目标是计算最优政策(给定任何州s
,输出最佳行动a
)。
+++++++++++++++++++++
+ 10 + 1 + 1 + 1 +
+++++++++++++++++++++
+ 1 + 1 + 1 + 1 +
+++++++++++++++++++++
+ 1 + 1 + 1 + 1 +
+++++++++++++++++++++
+ 1 + 1 + 1 + 1 +
+++++++++++++++++++++
假设我们使用epsilon-greedy policy
epsilon=0.1
,学习率alpha=0.1
。我们从网格上的随机位置开始。每当我们到达左上角时,我们会再次以随机位置重新开始。
以下是运行200,000次移动模拟的结果。最左边的块在视觉上显示了每个单元格中当前的贪婪策略。
-->
向右移动<--
向左移动^
向上移动v
向下移动所以你看,这远非一个最优政策。显然,在最优政策中,每个单元格应指向左侧或上方,因为我们在位置(0,0)
处获得了更大的奖励。
v v v v | 2 9 5 4
v v v v | 14 98 75 14
--> v v <-- | 258 3430 3312 245
--> --> <-- <-- | 3270 93143 92978 3191
右侧的区块显示我们到目前为止访问每个单元格的次数。您看到我们将大部分访问时间都放在了最底层,但我们访问的排名非常罕见。这就是我们尚未达到最优政策的原因。
如果我们将学习率更改为alpha=1/(number of times you visited (s,a) so far)
,我们就可以在20,000步之内达到最佳政策(如下所示)。此外,我们访问每个单元格的次数分布更均匀,但并不完美。
--> <-- <-- <-- | 34 7997 7697 294
^ ^ ^ <-- | 731 898 524 132
^ ^ ^ ^ | 709 176 88 94
^ ^ ^ ^ | 245 256 96 77
对于更多状态的更大问题,例如10x10网格,我发现使用更大的epsilon
会更好。例如,下面是使用epsilon=0.5
在10x10网格上移动80,000后的模拟结果。除了右下角之外,它几乎是最佳的。关于使用模拟退火来帮助提高Q学习的收敛速度也有idea。
v <-- <-- <-- <-- <-- <-- <-- <-- <-- | 19 2500 1464 716 386 274 216 159 121 71
^ <-- <-- <-- <-- v <-- <-- <-- <-- | 9617 11914 3665 1071 580 410 319 225 207 131
^ ^ ^ <-- <-- <-- <-- v <-- <-- | 5355 5716 2662 1675 1465 611 302 183 162 101
^ ^ ^ ^ ^ <-- <-- <-- <-- <-- | 1604 1887 1192 621 1056 882 693 403 206 100
^ ^ ^ ^ ^ ^ ^ <-- <-- <-- | 639 735 731 333 412 399 480 294 172 114
^ ^ ^ <-- ^ ^ ^ <-- <-- ^ | 373 496 640 454 272 266 415 219 107 98
^ ^ ^ ^ ^ ^ ^ ^ <-- ^ | 251 311 402 428 214 161 343 176 114 99
^ ^ ^ ^ <-- --> ^ <-- <-- <-- | 186 185 271 420 365 209 359 200 113 70
^ ^ ^ ^ ^ ^ ^ ^ v v | 129 204 324 426 434 282 235 131 99 74
^ ^ ^ ^ ^ <-- ^ <-- <-- <-- | 100 356 1020 1233 703 396 301 216 152 78
BTW,我的玩具问题的Python代码(~100行)是here。
答案 1 :(得分:5)
Q(K, A)
一词, minus Q(S, A)
不仅会无限增长。如果您将更新规则重写为:
Q(S, A) <-- Q(S, A)(1 - a) + a(R + maxQ(S', A'))
这表明Q(K, A)
慢慢向R + maxQ(S', A')
的“实际”值移动。 Q(K, A)
只会逐渐接近;不是无限的。当它停止增长(已接近其实际值)时,其他Q(K, A)
的{{1}}可以赶上。
无论如何,epsilon的重点是控制你是否希望学习过程更贪婪(启发式)或探索式(随机),所以如果学习过程太窄,就要增加它。
另请注意,QL收敛的正式条件之一是每对A
被无限次访问(释义)!所以,是的,在培训过程结束时,您希望每一对都被访问了相当多的时间。
答案 2 :(得分:0)
正如其中一条评论中所提到的,伽玛值小于1是保证总和不会漂移到正无穷大(假设奖励本身有界)。
但它确实会在一段时间内陷入糟糕的选择。有些事情可以做:
乐观的初始化:如果你乐观地开始所有的Q值,那么每次你尝试新的东西,你都会得到一个“幻灭”,以便下次你想尝试别的东西。这种情况一直存在,直到你对每个动作的价值有了真实的认识。
使用优势函数:如果每个操作都很好但有些操作比其他操作更好,那么使用优势函数是个好主意(这个操作对这个操作有多好)此状态的预期奖励)更新您的参数。这对政策梯度特别有用。