当使用贝尔曼方程更新 q-table 或训练 q-network 以拟合贪婪最大值时,q-values 经常会达到局部最优并陷入困境,尽管随机化率 () 从一开始就已经应用了。
所有最开始的步骤(在代理的原始位置的不同动作)的 q 值之和逐渐增加,直到达到局部最优。它被卡住了,这个 q 值的总和开始一点一点地缓慢减少。
如何避免陷入局部最优?以及如何知道局部最优是否已经是全局最优?我可能会想到这一点,但它很混乱:再次打开随机化一段时间,起初可能会出现更差的值,但将来可能会更好。
当使用贝尔曼方程更新 q-table 或训练 q-network 以拟合贪婪最大值时,q-values 经常会达到局部最优并陷入困境,尽管随机化率 () 从一开始就已经应用了。
所有最开始的步骤(在代理的原始位置的不同动作)的 q 值之和逐渐增加,直到达到局部最优。它被卡住了,这个 q 值的总和开始一点一点地缓慢减少。
如何避免陷入局部最优?以及如何知道局部最优是否已经是全局最优?我可能会想到这一点,但它很混乱:再次打开随机化一段时间,起初可能会出现更差的值,但将来可能会更好。
我发现了为什么优化过程会卡住并且从未接近全局最优的问题。这是因为“探索”或“利用”之间的比率。
基本上,在 RL 中,代理通过执行随机动作进行探索并找到新的解决方案,利用现有的所谓的最大未来奖励来执行最大动作。
最初,我把代理探索的时候,探索率下降太快(10次迭代后<10%),而当重播次数(从头开始再次播放的次数)不够时,循环结束时的探索率几乎为零,什么也没有新学到的。
选择的解决方案是允许 'explore' 和 'exploit' 具有相同的速率(或者降低一点探索也可以),伪代码:
# Part 1 in a step: Choose action
if random() < 0.5: # 0.25 is also good, 25% for exploration
action = random_action()
else:
action = choose_best_known_action()
可以通过这种方式正确降低探索率:
if random() < 1-i/NUM_REPLAYS: # i is current train step index
action = random_action()
else:
...
通过上面的半探索/半利用方案,代理将学习到无穷大,因此可以肯定会达到全局最优。当从实践中知道应该使用的迭代次数时,“利用”可以更多地用于更快的收敛。
请注意,'explore' 和 'exploit' 率在上面是相等的,但是 q-table 或 q-network 仍然越来越好,因为在更新 q-table 或拟合 q-network 时有另一种 'exploit'-kind贝尔曼方程,这里还有另一个“利用”,贝尔曼方程中的“最大值”:
伪代码:
# Part 2 in a step: Update q-table or q-network
q[s][a] += learning_rate * (reward + max(q[sNext][aNext]) - q[s][a])
# Q-network
# target = r + max(...
```