【问题标题】:How to Record Variables in Pytorch Without Breaking Gradient Computation?如何在不中断梯度计算的情况下在 Pytorch 中记录变量?
【发布时间】:2023-02-04 05:42:59
【问题描述】:

我正在尝试实施一些策略梯度训练,类似于this。但是,我想在进行反向传播之前操纵奖励(如折扣未来总和和其他可微分操作)。

考虑定义为计算 reward to gomanipulate 函数:

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


【解决方案1】:

问题是由于分配给现有对象。 只需为每次迭代初始化空池(列表),并在计算新奖励时追加到池中,即

reward_pool = []

for k in batch_size:
  act = net(state)
  state, reward = env.step(act)
  reward_pool.append(reward)

R = manipulate(reward_pool)
R.backward()
optimizer.step()

【讨论】:

    猜你喜欢
    • 2019-04-02
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2018-06-16
    相关资源
    最近更新 更多