【问题标题】:How to multiply matrices in the result of using chain rule in the backpropagation algorithm如何在反向传播算法中使用链式法则的结果中乘以矩阵
【发布时间】:2019-02-25 05:44:07
【问题描述】:

我试图了解反向传播在数学上是如何工作的,并希望在 python 中使用 numpy 实现它。我使用带有一个隐藏层的前馈神经网络进行计算,sigmoid 作为激活函数,均方误差作为误差函数。 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) 那么我该如何计算呢?感谢您的帮助!

【问题讨论】:

    标签: python machine-learning backpropagation


    【解决方案1】:

    这是来自斯坦福 CS231 的笔记:http://cs231n.github.io/optimization-2/。

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

    比如loss​​为l,在loss的计算中有一个矩阵乘法运算: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,损失的梯度wrt A。类似地,损失 w.r.t 的梯度。 B 是dB = A.T.dot(dC)。

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

    【讨论】:

    • 如何初始化dC?它是单位矩阵还是零?那些?
    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2023-03-14
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多