在反向传播算法中如何使用链规则将矩阵相乘

时间:2018-09-20 20:53:10

标签: python machine-learning backpropagation

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

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

# 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

delta_ho = ...行,矩阵的尺寸为(10x1-10x1)*(10x1)*(1x15),那么我该如何计算呢?感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这是斯坦福大学CS231的笔记:http://cs231n.github.io/optimization-2/

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

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

对于诸如Sigmoid之类的任何附加操作,您都可以像其他地方一样将它们向后链接。