Pytorch, каковы градиентные аргументы

Я читаю документацию PyTorch и нашел пример, где они пишут

gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)

где x - начальная переменная, из которой был построен y (3-вектор). Вопрос в том, каковы аргументы тензора градиентов 0,1, 1,0 и 0,0001? В документации не очень ясно об этом.

77 голосов | спросил Qubix 17 PMpMon, 17 Apr 2017 15:04:14 +030004Monday 2017, 15:04:14

3 ответа


0

Объяснение

Для нейронных сетей мы обычно используем loss, чтобы оценить, насколько хорошо сеть научилась классифицировать входное изображение (или другие задачи) , Термин loss обычно является скалярным значением. Чтобы обновить параметры сети, нам нужно вычислить градиент loss относительно параметров, который фактически равен leaf node в графе вычислений (кстати, эти параметры в основном представляют собой вес и смещение различных слоев, таких как Convolution, Linear и т. Д.).

В соответствии с правилом цепочки, чтобы вычислить градиент loss по отношению к листовому узлу, мы можем вычислить производную от loss по некоторой промежуточной переменной и градиенту промежуточной переменной по отношению к листовой переменной, получим скалярное произведение и суммируем все это.

gradient аргументы Variable backward() используется для расчета взвешенной суммы каждого элемента переменной по переменная листа . Этот вес является производным от окончательного ---- +: = 9 =: + ---- по каждому элементу промежуточной переменной.

Конкретный пример

Давайте рассмотрим конкретный и простой пример, чтобы понять это.

 loss

В приведенном выше примере результатом первого from torch.autograd import Variable import torch x = Variable(torch.FloatTensor([[1, 2, 3, 4]]), requires_grad=True) z = 2*x loss = z.sum(dim=1) # do backward for first element of z z.backward(torch.FloatTensor([[1, 0, 0, 0]])) print(x.grad.data) x.grad.data.zero_() #remove gradient in x.grad, or it will be accumulated # do backward for second element of z z.backward(torch.FloatTensor([[0, 1, 0, 0]])) print(x.grad.data) x.grad.data.zero_() # do backward for all elements of z, with weight equal to the derivative of # loss w.r.t z_1, z_2, z_3 and z_4 z.backward(torch.FloatTensor([[1, 1, 1, 1]])) print(x.grad.data) x.grad.data.zero_() # or we can directly backprop using loss loss.backward() # equivalent to loss.backward(torch.FloatTensor([1.0])) print(x.grad.data) является

  

2 0 0 0
  [torch.FloatTensor размера 1x4]

которая является в точности производной от z_1 w.r.t до x.

Результат второго print:

  

0 2 0 0
  [torch.FloatTensor размера 1x4]

которая является производной от z_2 w.r.t до x.

Теперь, если использовать вес [1, 1, 1, 1] для вычисления производной от z по x, результат будет print

  

2 2 2 2
  [torch.FloatTensor размера 1x4]

Следует отметить, что вектор весов [1, 1, 1, 1] точно является производной от print по отношению к z_1, z_2 , z_3 и z_4. Производная от loss по отношению к loss равна рассчитывается как:

x

Таким образом, вывод 4-го d(loss)/dx = d(loss)/dz_1 * dz_1/dx + d(loss)/dz_2 * dz_2/dx + d(loss)/dz_3 * dz_3/dx + d(loss)/dz_4 * dz_4/dx такой же, как и 3-го print:

  

2 2 2 2
  [torch.FloatTensor размера 1x4]

ответил jdhao 31 +03002017-10-31T05:03:02+03:00312017bEurope/MoscowTue, 31 Oct 2017 05:03:02 +0300 2017, 05:03:02
0

Как правило, ваш вычислительный граф имеет один скалярный вывод: loss. Затем вы можете вычислить градиент loss w.r.t. веса (w) на loss.backward(). Где аргумент по умолчанию backward() равен 1.0 .

Если ваш вывод имеет несколько значений (например, loss=[loss1, loss2, loss3]), вы можете вычислить градиенты потерь w.r.t. веса на loss.backward(torch.FloatTensor([1.0, 1.0, 1.0])).

Кроме того, если вы хотите добавить веса или значения к различным потерям, вы можете использовать loss.backward(torch.FloatTensor([-0.1, 1.0, 0.0001])).

Это означает, что нужно вычислять -0.1*d(loss1)/dw, d(loss2)/dw, 0.0001*d(loss3)/dw одновременно.

ответил Gu Wang 19 PMpWed, 19 Apr 2017 12:26:13 +030026Wednesday 2017, 12:26:13
0

Здесь выходные данные forward (), т. е. y, представляют собой 3-вектор.

Три значения являются градиентами на выходе сети. Обычно они устанавливаются на 1,0, если y является конечным выходом, но могут иметь и другие значения, особенно если y является частью большой сети.

Например, если x - вход, y = [y1, y2, y3] - промежуточный выход, который используется для вычисления конечного выхода z,

Затем

dz/dx = dz/dy1 * dy1/dx + dz/dy2 * dy2/dx + dz/dy3 * dy3/dx

Итак, здесь три значения в обратном направлении являются

[dz/dy1, dz/dy2, dz/dy3]

и затем backward () вычисляет dz /dx

ответил greenberet123 18 AMpTue, 18 Apr 2017 02:22:29 +030022Tuesday 2017, 02:22:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132