Как работает обновление веса в динамическом графе вычислений pytorch? - PullRequest
0 голосов
/ 18 января 2019

Как работает обновление веса в коде Pytorch графика динамических вычислений, когда веса осколки (= многократно используется повторно)

https://pytorch.org/tutorials/beginner/examples_nn/dynamic_net.html#sphx-glr-beginner-examples-nn-dynamic-net-py

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 весом на каждом задом наперед, который используется несколько раз на шаге

1 Ответ

0 голосов
/ 18 января 2019

Когда вы вызываете backward (в качестве функции или метода для тензора), градиенты операндов с requires_grad == True вычисляются относительно тензора, который вы назвали backward. Эти градиенты накапливаются в свойстве .grad этих операндов. Если один и тот же операнд A появляется в выражении несколько раз, вы можете концептуально обрабатывать их как отдельные сущности A1, A2 ... для алгоритма обратного распространения и просто в конце суммировать их градиенты так, чтобы A.grad = A1.grad + A2.grad + ....

Теперь, собственно говоря, ответ на ваш вопрос

Я хочу знать, что происходит с middle_linear весом при каждом обратном

это: ничего. backward не меняет веса, только вычисляет градиент. Для изменения весов вы должны выполнить шаг оптимизации, возможно, используя один из оптимизаторов в torch.optim. Затем веса обновляются в соответствии с их свойством .grad, поэтому, если ваш операнд использовался несколько раз, он будет обновляться в соответствии с суммой градиентов при каждом использовании.

Другими словами, если ваш матричный элемент x имеет положительный градиент при первом применении и отрицательный при использовании во второй раз, может случиться так, что чистые эффекты отменится и останется как есть (или изменится только немного). Если оба приложения требуют, чтобы x было выше, оно повысится больше, чем если бы оно использовалось только один раз и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...