DQN - Q-Loss没有收敛

时间:2017-10-31 13:07:22

标签: tensorflow deep-learning reinforcement-learning q-learning

我正在使用DQN算法在我的环境中训练代理,如下所示:

  • 代理通过选择离散动作(左,右,上,下)控制汽车
  • 目标是以所需的速度行驶而不会撞到其他车辆
  • 状态包含代理人的汽车和周围汽车的速度和位置
  • 奖励:-100用于撞击其他车辆,根据所需速度的绝对差值给予积极奖励(如果以所需速度行驶,则为+50)

我已经调整了一些超参数(网络架构,探索,学习率),这给了我一些下降的结果,但仍然没有它应该/可能的那么好。每个epiode的奖励在训练期间增加。 Q值也在收敛(见图1)。但是,对于超参数的所有不同设置,Q-loss不会收敛(见图2)。我认为,Q缺失的缺乏收敛可能是获得更好结果的限制因素。

Q-value of one discrete action durnig training

Q-loss during training

我正在使用每20k步更新一次的目标网络。 Q-loss计算为MSE。

您是否了解为什么Q-loss没有收敛? Q-Loss是否必须收敛DQN算法?我想知道为什么大多数论文都没有讨论过Q-loss。

2 个答案:

答案 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(更新频率)= 2时,绘制平均损耗: C=2

C = 10

C=10

C = 100

enter image description here

C = 1000

enter image description here

C = 10000

enter image description here

如果损耗值的差异是由梯度爆炸引起的,则可以剪切梯度。在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()