这是Maxim Lapan 编写的代码。我正在读他的书(Deep Reinforcement Learning Hands-on)。我在他的代码中看到了很奇怪的一行。在政策梯度的积累中我们必须计算优势. 在第 138 行,maxim 使用adv_v = vals_ref_v - value_v.detach(). 从视觉上看,它看起来不错,但看看每个术语的形状。
ipdb> adv_v.shape
torch.Size([128, 128])
ipdb> vals_ref_v.shape
torch.Size([128])
ipdb> values_v.detach().shape
torch.Size([128, 1])
在更简单的代码中,它相当于
In [1]: import torch
In [2]: t1 = torch.tensor([1, 2, 3])
In [3]: t2 = torch.tensor([[4], [5], [6]])
In [4]: t1 - t2
Out[4]:
tensor([[-3, -2, -1],
[-4, -3, -2],
[-5, -4, -3]])
In [5]: t1 - t2.detach()
Out[5]:
tensor([[-3, -2, -1],
[-4, -3, -2],
[-5, -4, -3]])
我已经用他的代码训练了代理,它工作得很好。我很困惑为什么这是好的做法以及它在做什么。有人可以在线启发我adv_v = vals_ref_v - value_v.detach()吗?对我来说,正确的做法是adv_v = vals_ref_v - value_v.squeeze(-1)。
这是他书中使用的完整算法:
更新
正如您从图像中看到的那样,即使adv_v = vals_ref_v - value_v.detach()看起来执行错误,它也在收敛。它还没有完成,但我稍后会更新这个问题。
