Я не уверен, что именно вы пытаетесь достичь, потому что обычно вы работаете только с суммой градиентов (d output) / (параметр d), а не с любыми другими градиентами между ними, поскольку autograd позаботится об этом, но пустья пытаюсь ответить.
Вопрос 1
Пример, который я включил ниже, возвращает веса как размер (1,5).Что именно здесь рассчитывается?Это d self.output / d weight1 для 1 ввода x или среднее значение для всех входов?
Вы получаете размер (1,5), потому что обучение выполняется в мини-пакетах, то есть градиентахдля каждой точки данных относительно (5) весовые коэффициенты рассчитываются и суммируются по мини-партии.Согласно документам:
Этот атрибут по умолчанию имеет значение None и становится тензором при первом обращении к backward () для вычисления градиентов для себя.Атрибут затем будет содержать вычисленные градиенты, и будущие вызовы backward () будут накапливать (добавлять) градиенты в него.
Если вы явно хотите градиент для каждой точки данных, тогда сделайте размер мини-пакетаодин.Обычно мы тренируемся в мини-пакетах, потому что обновление после каждой точки данных может быть нестабильным, изображение каждый раз перемещается в другом направлении, где с пакетом это усредняется.С другой стороны, многие наборы данных просто слишком велики, чтобы рассчитать градиент за один раз.
Вопрос 2
Пример может дать более глубокое понимание:
import torch
x = torch.tensor([1.5], requires_grad=True)
a = torch.nn.Parameter(torch.tensor([2.]))
b = torch.nn.Parameter(torch.tensor([10.]))
y = x*a
z = y+0.5*b
temp = z.backward()
print('gradients of a: %0.2f and b: %0.2f' % (a.grad.item(), b.grad.item()))
Я начинаю с двух параметров, a
и b
, и вычисляю z=a*x+0.5*b
.Градиенты еще не рассчитаны, pytorch отслеживает только историю операций, поэтому все атрибуты .grad
пусты.Когда вызывается z.backward()
, вычисляются градиенты выходных данных относительно параметров, которые вы можете просмотреть, вызвав grad для параметров.
Обновление параметров может быть затем выполнено, как вы уже делаете a -= alpha*a.grad
.