为什么 pytorch 不允许对叶变量进行就地操作?

Bah*_*ani 9 python pytorch

所以如果我在 Pytorch 中运行这段代码:

x = torch.ones(2,2, requires_grad=True)
x.add_(1)
Run Code Online (Sandbox Code Playgroud)

我会得到错误:

RuntimeError:需要 grad 的叶变量正在就地操作中使用。

我知道 Pytorch 不允许对叶变量进行就地操作,而且我也知道有一些方法可以绕过这个限制。我不明白的是这个规则背后的哲学。为什么使用就地操作更改叶变量是错误的?

Jac*_*ern 13

据我了解,每当您对使用 初始化的张量执行非传统操作时requires_grad=True,Pytorch 都会抛出错误以确保这是故意的。例如,您通常只会使用 更新权重张量optimizer.step()

再举一个例子,我在网络初始化期间尝试更新可反向传播张量中的值时遇到了这个问题。

self.weight_layer = nn.Parameter(data=torch.zeros(seq_length), requires_grad=True)
self.weight_layer[true_ids == 1] = -1.2
Run Code Online (Sandbox Code Playgroud)
RuntimeError: a leaf Variable that requires grad is being used in an in-place operation.
Run Code Online (Sandbox Code Playgroud)

问题是,因为requires_grad=True,网络不知道我仍在初始化这些值。如果这是您想要做的,将更新包装在一个torch.no_grad块中是一种解决方案:

with torch.no_grad()
    self.weight_layer = nn.Parameter(data=torch.zeros(seq_length), requires_grad=True)
    self.weight_layer[true_ids == 1] = -1.2
Run Code Online (Sandbox Code Playgroud)

否则,您可以requires_grad=True在初始化张量后进行设置:

self.weight_layer = nn.Parameter(data=torch.zeros(seq_length))
self.weight_layer[true_ids == 1] = -1.2
self.weight_layer.requires_grad = True
Run Code Online (Sandbox Code Playgroud)