反向传播错误
Backpropagation bug
我正在尝试从头开始实施反向传播。在我的成本下降的同时,梯度检查产生了惊人的结果 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,z3
def 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) MLP。我使用交叉熵作为损失函数。我遵循反向传播的链式规则。
我怀疑问题可能出在我拿产品的顺序上,但我已经尝试了各种方法,仍然没有运气。
我通过 yh - y
计算 delta3
而没有进一步乘法,设法得到 1.7250119005319425e-10
的差值。现在我需要弄清楚这是为什么。
我正在尝试从头开始实施反向传播。在我的成本下降的同时,梯度检查产生了惊人的结果 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,z3
def 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) MLP。我使用交叉熵作为损失函数。我遵循反向传播的链式规则。 我怀疑问题可能出在我拿产品的顺序上,但我已经尝试了各种方法,仍然没有运气。
我通过 yh - y
计算 delta3
而没有进一步乘法,设法得到 1.7250119005319425e-10
的差值。现在我需要弄清楚这是为什么。