【发布时间】:2023-02-04 05:42:59
【问题描述】:
我正在尝试实施一些策略梯度训练,类似于this。但是,我想在进行反向传播之前操纵奖励(如折扣未来总和和其他可微分操作)。
考虑定义为计算 reward to go 的 manipulate 函数:
def manipulate(reward_pool):
n = len(reward_pool)
R = np.zeros_like(reward_pool)
for i in reversed(range(n)):
R[i] = reward_pool[i] + (R[i+1] if i+1 < n else 0)
return T.as_tensor(R)
我试图将奖励存储在列表中:
#pseudocode
reward_pool = [0 for i in range(batch_size)]
for k in batch_size:
act = net(state)
state, reward = env.step(act)
reward_pool[k] = reward
R = manipulate(reward_pool)
R.backward()
optimizer.step()
似乎就地操作破坏了梯度计算,代码给我一个错误:one of the variables needed for gradient computation has been modified by an inplace operation。
我也尝试先初始化一个空张量,并将其存储在张量中,但就地操作仍然是问题 - a view of a leaf Variable that requires grad is being used in an in-place operation.
我是 PyTorch 的新手。有谁知道在这种情况下记录奖励的正确方法是什么?
【问题讨论】:
-
请提供您的操纵功能。
-
@joe32140 我添加了一个示例操作函数来计算奖励。
标签: machine-learning pytorch reinforcement-learning gradient-descent reward