我正在使用DQN算法在我的环境中训练代理,如下所示:
我已经调整了一些超参数(网络架构,探索,学习率),这给了我一些下降的结果,但仍然没有它应该/可能的那么好。每个epiode的奖励在训练期间增加。 Q值也在收敛(见图1)。但是,对于超参数的所有不同设置,Q-loss不会收敛(见图2)。我认为,Q缺失的缺乏收敛可能是获得更好结果的限制因素。
Q-value of one discrete action durnig training
我正在使用每20k步更新一次的目标网络。 Q-loss计算为MSE。
您是否了解为什么Q-loss没有收敛? Q-Loss是否必须收敛DQN算法?我想知道为什么大多数论文都没有讨论过Q-loss。
答案 0 :(得分:2)
我认为正常的情况是Q丢失没有收敛,因为在更新策略时数据不断变化。这与监督学习不同,在监督学习中,数据永远不会改变,您可以对数据进行多次传递,以确保权重与该数据完全匹配。
我发现另一件事是,与在每个X时步(硬更新)进行更新相比,在每个时步上对目标网络进行轻微更新(软更新)对我来说效果更好。
答案 1 :(得分:1)
是的,损失必须覆盖,因为损失值意味着预期Q值与当前Q值之差。仅当损耗值收敛时,电流才接近最佳Q值。如果它发散,则意味着您的近似值越来越小。
也许您可以尝试调整目标网络的更新频率或检查每次更新的梯度(添加梯度剪切)。目标网络的添加提高了Q学习的稳定性。
在Deepmind的2015年Nature论文中,它指出:
在线Q学习的第二种修改旨在进一步改善我们的神经网络方法的稳定性,是使用单独的网络在Q学习更新中生成traget yj。更准确地说,每个C更新我们都克隆网络Q以获得目标网络Q',并使用Q'生成Q学习目标y j ,以用于随后的对Q的C更新。 与标准的在线Q学习相比,此修改使算法更稳定,在在线学习中,增加Q(s t ,a t )的更新通常还会增加Q(s t + 1 ,a)表示所有a,因此也增加了目标y j ,可能会导致政策出现振荡或背离。使用较旧的参数集生成目标会增加对Q进行更新的时间与更新影响目标y j 的时间之间的延迟,从而使发散或振荡更加不可能。
Human-level control through deep reinforcement learning, Mnih et al., 2015
我已经做了一个实验,让另一个人在Cartpole环境中问类似的问题,更新频率为100可以解决此问题(最多可以执行200个步骤)。
C = 10
C = 100
C = 1000
C = 10000
如果损耗值的差异是由梯度爆炸引起的,则可以剪切梯度。在Deepmind的2015 DQN中,作者通过将值限制在[-1,1]之内来裁剪渐变。在另一种情况下,Prioritized Experience Replay的作者通过将范数限制在10以内来裁剪渐变。以下是示例:
DQN梯度裁剪:
optimizer.zero_grad()
loss.backward()
for param in model.parameters():
param.grad.data.clamp_(-1, 1)
optimizer.step()
PER渐变裁剪:
optimizer.zero_grad()
loss.backward()
if self.grad_norm_clipping:
torch.nn.utils.clip_grad.clip_grad_norm_(self.model.parameters(), 10)
optimizer.step()