Deep learning pytorch动态计算图中的权重更新是如何工作的?

Deep learning pytorch动态计算图中的权重更新是如何工作的?,deep-learning,pytorch,computation-graph,Deep Learning,Pytorch,Computation Graph,当权重被切分(=重复使用多次)时,动态计算图的Pytorch代码中的权重更新是如何工作的 我想知道当你调用(作为函数或张量上的方法)时,需要的操作数的梯度是相对于你调用的向后张量计算的,中间线性权重在每次向后时会发生什么变化。这些梯度累积在这些操作数的.grad属性中。如果同一操作数A在表达式中多次出现,则可以从概念上将它们视为单独的实体A1,A2。。。对于反向传播算法,仅在最后求和它们的梯度,以便A.grad=A1.grad+A2.grad+… 现在,严格地说,你的问题的答案是 我想知道在每

当权重被切分(=重复使用多次)时,动态计算图的Pytorch代码中的权重更新是如何工作的

我想知道当你调用(作为函数或张量上的方法)时,
需要的操作数的梯度是相对于你调用的
向后
张量计算的,
中间线性
权重在每次向后时会发生什么变化。这些梯度累积在这些操作数的
.grad
属性中。如果同一操作数
A
在表达式中多次出现,则可以从概念上将它们视为单独的实体
A1
A2
。。。对于反向传播算法,仅在最后求和它们的梯度,以便
A.grad=A1.grad+A2.grad+…

现在,严格地说,你的问题的答案是

我想知道在每次后退时,中间的线性重量会发生什么变化

是:没什么<代码>向后
不更改权重,只计算渐变。要更改权重,您必须执行优化步骤,可能需要使用中的一个优化器。然后根据它们的
.grad
属性更新权重,因此如果操作数被多次使用,它将根据每次使用的渐变总和进行相应更新

换句话说,如果矩阵元素
x
在第一次应用时具有正梯度,而在第二次使用时具有负梯度,则可能是净效应将被抵消,并保持不变(或仅发生一点变化)。如果两个应用程序都要求
x
更高,那么它将比只使用一次更高,以此类推。

当您调用(作为函数或张量上的方法)时,
要求的操作数梯度_grad==True
将根据您调用的
向后
张量计算。这些梯度累积在这些操作数的
.grad
属性中。如果同一操作数
A
在表达式中多次出现,则可以从概念上将它们视为单独的实体
A1
A2
。。。对于反向传播算法,仅在最后求和它们的梯度,以便
A.grad=A1.grad+A2.grad+…

现在,严格地说,你的问题的答案是

我想知道在每次后退时,中间的线性重量会发生什么变化

是:没什么<代码>向后不更改权重,只计算渐变。要更改权重,您必须执行优化步骤,可能需要使用中的一个优化器。然后根据它们的
.grad
属性更新权重,因此如果操作数被多次使用,它将根据每次使用的渐变总和进行相应更新


换句话说,如果矩阵元素
x
在第一次应用时具有正梯度,而在第二次使用时具有负梯度,则可能是净效应将被抵消,并保持不变(或仅发生一点变化)。如果两个应用程序都要求
x
更高,那么它将比仅使用一次筹集更多资金,等等。

谢谢!A.grad=A1.grad+A2.grad+。。。是我想知道的部分。谢谢你的帮助谢谢!A.grad=A1.grad+A2.grad+。。。是我想知道的部分。我感谢你的帮助
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