我正在尝试从头开始实现反向传播。虽然我的成本在减少,但梯度检查显示出惊人的 0.767399376130221
。我一直在试图找出问题所在,并设法将代码精简到以下几行:
def forward(self,X,y): z2 = self.params_l1.dot(X.T) a2 = self.sigmoid(z2) z3 = self.params_l2.dot(a2) a3 = self.sigmoid(z3) loss = self.cross_entropy(a3,y) return a3,loss,z2,a2,z3def backward(self,X,y): n_examples = len(X) yh,loss,Z2,A2,Z3 = self.forward(X,y) delta3 = np.multiply(-(yh - y),self.dsigmoid(Z3)) delta2 = (np.dot(self.params_l2.T,delta3))*self.dsigmoid(Z2) de3 = np.dot(delta3,A2.T) de2 = np.dot(delta2,X) self.params_l2 = self.params_l2 - self.lr * (de3 /n_examples) self.params_l1 = self.params_l1 - self.lr * (de2 / n_examples) return de3/n_examples ,de2 /n_examples
这是一个简单的(2,2,1)多层感知器。我使用交叉熵作为损失函数。我遵循链式法则进行反向传播。我怀疑问题可能出在乘积的顺序上,但我尝试了各种方法,仍然没有成功。
回答:
通过仅计算 delta3
为 yh - y
且没有进一步的乘法,我设法得到了 1.7250119005319425e-10
的差异。现在我需要找出为什么会这样。