python - 如何在反向传播算法中使用链式法则的结果中的矩阵相乘

标签 python machine-learning backpropagation

我想了解反向传播在数学上是如何工作的,并想用 numpy 在 python 中实现它。我使用带有一个隐藏层的前馈神经网络进行计算,sigmoid 作为激活函数,均方误差作为误差函数。这是我计算结果的截图:Screenshot ,问题是有一堆矩阵,我不能将它们完全相乘,因为它们的维度不同。 (截图中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) 那么我该如何计算这?感谢您的帮助!

最佳答案

这是来自斯坦福大学 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. CdC,它的形状也是 (m, p)。要使用 dCB 获得形状为 A 的矩阵,我们只能 dC.dot(B.T)(m, p)(p, n)两个形状矩阵相乘得到dA,梯度损失 w.r.t. A。类似地,损失 w.r.t. 的梯度。 B 是 dB = A.T.dot(dC)

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

关于python - 如何在反向传播算法中使用链式法则的结果中的矩阵相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52433145/

相关文章:

python - Sklearn fit vs predict,列的顺序很重要吗?

machine-learning - caffe 中旧的 prototxt 语法

python - 矢量化 softmax 梯度

c++ - 我不确定如何引用此神经网络训练方法中的权重

python - 如何使用 "pytest"中另一个文件中的函数和类?

python - 使用 cKDTree 在一定距离内寻找最近的邻居并取这些邻居的平均值

用于解析空格分隔文件的 Python 库

r - 如何在R中对大型数据库进行采样并实现K-means和K-nn?

python - 修正线性单元的反向传播

Python 在 sudo 下运行时无法识别 cv2