use*_*491 2 deep-learning pytorch computation-graph
当权重分片(=多次重复使用)时,动态计算图的 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
Run Code Online (Sandbox Code Playgroud)
我想知道middle_linear每次向后使用的重量会发生什么情况,一步使用多次
当您调用backward(作为张量上的函数或方法)时,操作数的梯度requires_grad == True是相对于您调用的张量计算的backward。这些梯度在这些操作数的属性中累积.grad。如果相同的操作数A在表达式中出现多次,您可以在概念上将它们视为单独的实体A1,A2...对于反向传播算法,最后将它们的梯度相加,以便A.grad = A1.grad + A2.grad + ...。
现在,严格来说,回答你的问题
我想知道每个向后的middle_linear权重会发生什么
没什么。backward不改变权重,只计算梯度。要更改权重,您必须执行优化步骤,也许使用 中的优化器之一torch.optim。然后,权重根据其.grad属性进行更新,因此,如果您的操作数被多次使用,它将根据每次使用中的梯度总和进行相应更新。
换句话说,如果您的矩阵元素x在第一次应用时具有正梯度,而在第二次使用时具有负梯度,则净效应可能会抵消并且它将保持原样(或仅改变一点)。如果两个应用程序都要求x更高,那么它会比仅使用一次更高,等等。
| 归档时间: |
|
| 查看次数: |
628 次 |
| 最近记录: |