pytorch Dynamic Computation Graph 中的权重更新是如何工作的?
How Weight update in Dynamic Computation Graph of pytorch works?
当权重被分片(=重复使用多次)时,动态计算图的 Pytorch 代码中的权重更新是如何工作的
import random
import torch
class DynamicNet(torch.nn.Module):
def __init__(self, D_in, H, D_out):
"""
In the constructor we construct three nn.Linear instances that we will use
in the forward pass.
"""
super(DynamicNet, self).__init__()
self.input_linear = torch.nn.Linear(D_in, H)
self.middle_linear = torch.nn.Linear(H, H)
self.output_linear = torch.nn.Linear(H, D_out)
def forward(self, x):
"""
For the forward pass of the model, we randomly choose either 0, 1, 2, or 3
and reuse the middle_linear Module that many times to compute hidden layer
representations.
Since each forward pass builds a dynamic computation graph, we can use normal
Python control-flow operators like loops or conditional statements when
defining the forward pass of the model.
Here we also see that it is perfectly safe to reuse the same Module many
times when defining a computational graph. This is a big improvement from Lua
Torch, where each Module could be used only once.
"""
h_relu = self.input_linear(x).clamp(min=0)
for _ in range(random.randint(0, 3)):
h_relu = self.middle_linear(h_relu).clamp(min=0)
y_pred = self.output_linear(h_relu)
return y_pred
我想知道 middle_linear
每次向后的权重会发生什么,在一个步骤中多次使用
当您调用 backward
(作为张量上的函数或方法)时,将根据您调用 backward
的张量计算具有 requires_grad == True
的操作数的梯度.这些梯度在这些操作数的.grad
属性中累加。如果相同的操作数 A
在表达式中出现多次,您可以在概念上将它们视为单独的实体 A1
、A2
... 对于反向传播算法,并在最后对它们的梯度求和这样 A.grad = A1.grad + A2.grad + ...
.
现在,严格来说,回答你的问题
I want to know what happens to middle_linear weight at each backward
是:没什么。 backward
不改变权重,只计算梯度。要更改权重,您必须执行优化步骤,可能使用 torch.optim
中的优化器之一。然后根据它们的 .grad
属性 更新权重,因此如果您的操作数被多次使用,它将相应地更新为每次使用中的梯度总和。
换句话说,如果您的矩阵元素 x
在第一次应用时具有正梯度,而在第二次使用时具有负梯度,则净效应可能会抵消并保持原样(或者稍微改变一下)。如果两个应用程序都要求 x
更高,它将比只使用一次等提高更多
当权重被分片(=重复使用多次)时,动态计算图的 Pytorch 代码中的权重更新是如何工作的
import random
import torch
class DynamicNet(torch.nn.Module):
def __init__(self, D_in, H, D_out):
"""
In the constructor we construct three nn.Linear instances that we will use
in the forward pass.
"""
super(DynamicNet, self).__init__()
self.input_linear = torch.nn.Linear(D_in, H)
self.middle_linear = torch.nn.Linear(H, H)
self.output_linear = torch.nn.Linear(H, D_out)
def forward(self, x):
"""
For the forward pass of the model, we randomly choose either 0, 1, 2, or 3
and reuse the middle_linear Module that many times to compute hidden layer
representations.
Since each forward pass builds a dynamic computation graph, we can use normal
Python control-flow operators like loops or conditional statements when
defining the forward pass of the model.
Here we also see that it is perfectly safe to reuse the same Module many
times when defining a computational graph. This is a big improvement from Lua
Torch, where each Module could be used only once.
"""
h_relu = self.input_linear(x).clamp(min=0)
for _ in range(random.randint(0, 3)):
h_relu = self.middle_linear(h_relu).clamp(min=0)
y_pred = self.output_linear(h_relu)
return y_pred
我想知道 middle_linear
每次向后的权重会发生什么,在一个步骤中多次使用
当您调用 backward
(作为张量上的函数或方法)时,将根据您调用 backward
的张量计算具有 requires_grad == True
的操作数的梯度.这些梯度在这些操作数的.grad
属性中累加。如果相同的操作数 A
在表达式中出现多次,您可以在概念上将它们视为单独的实体 A1
、A2
... 对于反向传播算法,并在最后对它们的梯度求和这样 A.grad = A1.grad + A2.grad + ...
.
现在,严格来说,回答你的问题
I want to know what happens to middle_linear weight at each backward
是:没什么。 backward
不改变权重,只计算梯度。要更改权重,您必须执行优化步骤,可能使用 torch.optim
中的优化器之一。然后根据它们的 .grad
属性 更新权重,因此如果您的操作数被多次使用,它将相应地更新为每次使用中的梯度总和。
换句话说,如果您的矩阵元素 x
在第一次应用时具有正梯度,而在第二次使用时具有负梯度,则净效应可能会抵消并保持原样(或者稍微改变一下)。如果两个应用程序都要求 x
更高,它将比只使用一次等提高更多