优势计算方式错误?

人工智能 Python 政策梯度 火炬 演员批评方法
2021-11-10 04:43:24

这是Maxim Lapan 编写的代码。我正在读他的书(Deep Reinforcement Learning Hands-on)。我在他的代码中看到了很奇怪的一行。在政策梯度的积累中

θπθπ+θ日志πθ(一个一世|s一世)(R-θ(s一世))
我们必须计算优势R-θ(s一世). 在第 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()看起来执行错误,它也在收敛。它还没有完成,但我稍后会更新这个问题。

2个回答

是的,这似乎是一个错误的实现。vals_ref_v 是一个 1 行 128 列的矩阵。value_v.detach() 是一个 128 行的矩阵

我将线路更改adv_v = vals_ref_v - value_v.detach()adv_v = vals_ref_v - value_v.squeeze(-1).detach(). 似乎收敛速度要快得多。根据A2C算法,申请只是逻辑(一个,s)-(s), 在哪里(一个,s)(s)具有相同的形状。

这里的调用detach()很重要,因为我们不想将 PG 传播到我们的值近似头中。