首页 > 解决方案 > Tensor 类中的梯度在哪里以及如何计算?

问题描述

我从书中复制了一个张量类,唯一我不知道的是如何在反向传播中计算权重梯度,我知道梯度是自动计算的(autograd),但我不能弄清楚如何。对我来说,梯度(假设最简单的网络的权重为 1_2,其中输入为 2 位数字,隐藏层是 1 个神经元,它采用由两个权重调节的 2 个值,输出层的答案是 1 或 0 (这是一个简单的例子))被认为如下:

grads_1_2 = layer1.T.dot(pred – target) (layer1 - 隐藏层的输出)

weights _1_2 -= grads_1_2 * 0.1,或权重 0_1 的梯度:

grads_0_1 = data.T.dot((pred – target).weights _1_2.T),但在 Tensor 类中,我没有看到如此明确的梯度计算。你能用下面的例子告诉我它们是如何计算的吗?

示例:

import numpy as np
np.random.seed(0)
data = Tensor(np.array([[1, 0]]), autograd=True)
target = Tensor(np.array(np.array([[0]])), autograd=True)
w = list()
print(np.random.rand(2,3))
w.append(Tensor(np.array([[0.54881351], [0.71518937]]), autograd=True))
w.append(Tensor(np.array([[0.43758721]]), autograd=True))

for i in range(10):
    # Predict
    layer1 = data.mm(w[0])
    print('layer1', layer1)
    pred = layer1.mm(w[1])
    print('pred', pred)
    # Compare
    loss = (pred - target)
    loss = loss.sum(0)
    print('Loss', loss, '\n')
    # Learn
    loss.backward(Tensor(np.ones_like(loss.data)))

    for w_ in w:
        print('Grad_w', w_.grad.data[0])
        w_.data -= w_.grad.data * 0.1
        w_.grad.data *= 0
    print('New weights', w)
    break

在此处输入图像描述

标签: pythonmachine-learningneural-networkgradientautograd

解决方案


推荐阅读