Python 在神经网络中,如何通过矩阵乘法计算梯度?为什么?

Python 在神经网络中,如何通过矩阵乘法计算梯度?为什么?,python,numpy,neural-network,Python,Numpy,Neural Network,这不是我试图解决的特定问题的问题。我只是想弄明白为什么梯度是用层(矩阵)相乘的方法计算出来的。我也不知道从预测中减去y也可以得到一种叫做梯度的东西。 grad\u y\u pred=2.0*(y\u pred-y) grad\u w2=h\u relu.T.dot(grad\u y\u pred) 我不知道我以为Pytorch在做什么寻找梯度。我认为这是一种算法,它遵循幂法则,并以某种方式遵循其他派生规则 import numpy as np # N is batch size; D_in i

这不是我试图解决的特定问题的问题。我只是想弄明白为什么梯度是用层(矩阵)相乘的方法计算出来的。我也不知道从预测中减去y也可以得到一种叫做梯度的东西。
grad\u y\u pred=2.0*(y\u pred-y)

grad\u w2=h\u relu.T.dot(grad\u y\u pred)

我不知道我以为Pytorch在做什么寻找梯度。我认为这是一种算法,它遵循幂法则,并以某种方式遵循其他派生规则

import numpy as np

# N is batch size; D_in is input dimension;
# H is hidden dimension; D_out is output dimension.
N, D_in, H, D_out = 64, 1000, 100, 10

# Create random input and output data
x = np.random.randn(N, D_in)
y = np.random.randn(N, D_out)

# Randomly initialize weights
w1 = np.random.randn(D_in, H)
w2 = np.random.randn(H, D_out)

learning_rate = 1e-6
for t in range(500):
    # Forward pass: compute predicted y
    h = x.dot(w1)
    h_relu = np.maximum(h, 0)
    y_pred = h_relu.dot(w2)

    # Compute and print loss
    loss = np.square(y_pred - y).sum()
    print(t, loss)

    # Backprop to compute gradients of w1 and w2 with respect to loss
    grad_y_pred = 2.0 * (y_pred - y)
    grad_w2 = h_relu.T.dot(grad_y_pred)
    grad_h_relu = grad_y_pred.dot(w2.T)
    grad_h = grad_h_relu.copy()
    grad_h[h < 0] = 0
    grad_w1 = x.T.dot(grad_h)

    # Update weights
    w1 -= learning_rate * grad_w1
    w2 -= learning_rate * grad_w2
将numpy导入为np
#N为批量大小;D_in为输入维;
#H为隐维;D_out是输出维度。
N、 D_in,H,D_out=64100010010
#创建随机输入和输出数据
x=np.random.randn(N,D_in)
y=np.random.randn(N,D_out)
#随机初始化权重
w1=np.random.randn(D_in,H)
w2=np.random.randn(H,D_out)
学习率=1e-6
对于范围(500)内的t:
#向前传球:计算预测y
h=x点(w1)
h_relu=np.最大值(h,0)
y_pred=h_relu.dot(w2)
#计算和打印损耗
损失=np.平方(y_pred-y).sum()
打印(t,损耗)
#Backprop计算w1和w2相对于损失的梯度
grad_y_pred=2.0*(y_pred-y)
grad_w2=h_relu.T.dot(grad_y_pred)
grad_h_relu=grad_y_pred.dot(w2.T)
grad_h=grad_h_relu.copy()
梯度h[h<0]=0
梯度w1=x.T.dot(梯度h)
#更新权重
w1-=学习率*年级w1
w2-=学习率*年级w2

不确定您想要的答案是什么,但可能会有帮助。而
2.0*(y\u pred-y)
只是损失函数导数的定义。写下误差的2-范数(均方误差),然后取导数:
| | \hat{y}-y | ^2
变成
2*(\hat{y}-y)
。不确定你想要多少答案,但可能会有帮助。而
2.0*(y\u pred-y)
只是损失函数导数的定义。写下误差的2-范数(均方误差),然后取导数:
| | \hat{y}-y | ^2
变成
2*(\hat{y}-y)