Python 如何在反向传播算法中使用链式规则的结果中进行矩阵乘法

Python 如何在反向传播算法中使用链式规则的结果中进行矩阵乘法,python,machine-learning,backpropagation,Python,Machine Learning,Backpropagation,我试图理解反向传播在数学上是如何工作的,并希望使用numpy在python中实现它。我使用一个带有一个隐藏层的前馈神经网络进行计算,sigmoid作为激活函数,均方误差作为误差函数。这是我计算结果的屏幕截图,问题是有一堆矩阵,我不能把它们完全相乘,因为它们的维数不同。 (截图中L为输出层,L-1为隐藏层,L-2为输入层,W为权重,E为误差函数,小写A为激活) (在代码中,第一层有28*28个节点,[因为我使用0-9位的MNIST数据库作为训练数据],隐藏层是15个节点,输出层是10个节点) 在d

我试图理解反向传播在数学上是如何工作的,并希望使用numpy在python中实现它。我使用一个带有一个隐藏层的前馈神经网络进行计算,sigmoid作为激活函数,均方误差作为误差函数。这是我计算结果的屏幕截图,问题是有一堆矩阵,我不能把它们完全相乘,因为它们的维数不同。 (截图中L为输出层,L-1为隐藏层,L-2为输入层,W为权重,E为误差函数,小写A为激活)

(在代码中,第一层有28*28个节点,[因为我使用0-9位的MNIST数据库作为训练数据],隐藏层是15个节点,输出层是10个节点)


delta_ho=…
行,矩阵的维数是(10x1-10x1)*(10x1)*(1x15),那么我如何计算呢?谢谢你的帮助

以下是斯坦福大学CS231的一条注释:

对于矩阵/向量的反向传播,需要记住的一点是,梯度w.r.t.(相对于)变量(矩阵或向量)始终与变量具有相同的形状

例如,如果损耗为
l
,则在损耗计算中存在矩阵乘法运算:
C=a.dot(B)
。让我们假设
A
具有形状
(m,n)
B
具有形状
(n,p)
(因此
C
具有形状
(m,p)
)。梯度w.r.t.
C
dC
,它也有形状
(m,p)
。要使用
dC
B
获得形状为
a
的矩阵,我们只能对
dC.dot(B.T)
进行运算,这是形状
(m,p)
(p,n)
的两个矩阵的乘积,以获得
dA
,损失梯度w.r.T.
a
。类似地,损耗w.r.t.B的梯度为
dB=A.t.dot(dC)

对于任何添加的操作,例如sigmoid,您可以像在其他地方一样将它们向后链接

# ho stands for hidden_output
# ih stands for input_hidden

def train(self, input_, target):
    self.input_ = input_
    self.output = self.feedforward(self.input_)

    # Derivative of error with respect to weight between output layer and hidden layer
    delta_ho = (self.output - target) * sigmoid(np.dot(self.weights_ho, self.hidden), True)) * self.hidden

    # Derivative of error with respect to weight between input layer and hidden layer
    delta_ih = (self.output - target) * sigmoid(np.dot(self.weights_ho, self.hidden), True)) * self.weights_ho * sigmoid(np.dot(self.weights_ih, self.input_), True) * self.input_

    # Adjust weights
    self.weights_ho -= delta_ho
    self.weights_ih -= delta_ih