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

我正在尝试理解反向传播的数学原理,并希望使用Python和Numpy实现它。我使用了一个带有一个隐藏层的前馈神经网络进行计算,使用Sigmoid作为激活函数,均方误差作为误差函数。这是我的计算结果的截图:截图,问题是有一堆矩阵,我无法完全将它们相乘,因为它们的维度不相同。(在截图中,L是输出层,L-1是隐藏层,L-2是输入层,W是权重,E是误差函数,小写A是激活值)

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

# ho代表隐藏层到输出层# ih代表输入层到隐藏层def train(self, input_, target):    self.input_ = input_    self.output = self.feedforward(self.input_)    # 输出层与隐藏层之间的权重对误差的导数    delta_ho = (self.output - target) * sigmoid(np.dot(self.weights_ho, self.hidden), True)) * self.hidden    # 输入层与隐藏层之间的权重对误差的导数    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_    # 调整权重    self.weights_ho -= delta_ho    self.weights_ih -= delta_ih

delta_ho = ...这一行,矩阵的维度是(10×1 – 10×1) * (10×1) * (1×15),那么我该如何计算这个呢?感谢任何帮助!


回答:

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

对于使用矩阵/向量的反向传播,需要记住的是,关于某个变量(矩阵或向量)的梯度总是与该变量具有相同的形状。

例如,如果损失是l,在计算损失时有一个矩阵乘法操作:C = A.dot(B)。假设A的形状是(m, n)B的形状是(n, p)(因此C的形状是(m, p))。关于C的梯度是dC,它也具有形状(m, p)。为了使用dCB得到一个与A形状相同的矩阵,我们只需要进行dC.dot(B.T),这是形状为(m, p)(p, n)的两个矩阵的乘积,以获得dA,即损失关于A的梯度。同样,损失关于B的梯度是dB = A.T.dot(dC)

对于任何额外的操作,如Sigmoid,你可以像其他地方一样向后进行链式操作。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注