1 回答
TA贡献1856条经验 获得超11个赞
我花了两天时间来分析这个问题,我用偏导数计算填满了几页笔记本......我可以确认:
问题中用 LaTeX 写的数学是正确的
的代码(1)是正确的,并且将其与数学运算同意:
delta = a - y
for k in [2, 1, 0]:
tmp = delta * sigmoid_prime(A[k+1])
delta = np.dot(self.weights[k].T, tmp)
self.weights[k] -= self.learning_rate * np.dot(tmp, A[k].T)
代码(2)是错误的:
delta = a - y
for k in [2, 1, 0]:
tmp = delta * sigmoid_prime(A[k+1])
delta = np.dot(self.weights[k].T, delta) # WRONG HERE
self.weights[k] -= self.learning_rate * np.dot(tmp, A[k].T)
使用 Python进行机器学习时有一个小错误:使用 MNIST 数据集训练和测试神经网络:
output_errors = np.dot(self.weights_matrices[layer_index-1].T, output_errors)
应该
output_errors = np.dot(self.weights_matrices[layer_index-1].T, output_errors * out_vector * (1.0 - out_vector))
现在是我花了几天才意识到的困难部分:
显然代码 (2) 比代码 (1) 具有更好的收敛性,这就是为什么我误认为代码 (2) 是正确的而代码 (1) 是错误的
……但实际上这只是巧合,因为learning_rate设置得太低了。原因如下:当使用代码 (2) 时,参数delta的增长速度print np.linalg.norm(delta)比代码 (1)快得多(有助于看到这一点)。
因此,“不正确的代码(2)”只是通过具有更大的delta参数来补偿“过慢的学习率” ,并且在某些情况下导致明显更快的收敛。
现在解决了!
添加回答
举报