如何避免在 q-learning 和 q-network 中陷入局部最优

人工智能 机器学习 强化学习 q学习 优化 贝尔曼方程
2021-11-04 09:51:14

当使用贝尔曼方程更新 q-table 或训练 q-network 以拟合贪婪最大值时,q-values 经常会达到局部最优并陷入困境,尽管随机化率 (ϵ) 从一开始就已经应用了。

所有最开始的步骤(在代理的原始位置的不同动作)的 q 值之和逐渐增加,直到达到局部最优。它被卡住了,这个 q 值的总和开始一点一点地缓慢减少。

如何避免陷入局部最优?以及如何知道局部最优是否已经是全局最优?我可能会想到这一点,但它很混乱:再次打开随机化一段时间,起初可能会出现更差的值,但将来可能会更好。

1个回答

我发现了为什么优化过程会卡住并且从未接近全局最优的问题。这是因为“探索”或“利用”之间的比率。

基本上,在 RL 中,代理通过执行随机动作进行探索并找到新的解决方案,利用现有的所谓的最大未来奖励来执行最大动作。

最初,我把代理探索的时候random()<1/(replay_index+1),探索率下降太快(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(...
```