我正在学习神经网络,特别是通过反向传播实现查看MLP。我正在尝试在python中实现我自己的网络,我想在开始之前我会查看其他一些库。经过一番搜索,我发现了Neil Schemenauer的python实现bpnn.py. (http://arctrix.com/nas/python/bpnn.py)
完成了代码并阅读了Christopher M. Bishops书中标题为“神经网络模式识别”的第一部分,我在backPropagate函数中发现了一个问题:
# calculate error terms for output
output_deltas = [0.0] * self.no
for k in range(self.no):
error = targets[k]-self.ao[k]
output_deltas[k] = dsigmoid(self.ao[k]) * error
计算错误的代码行在Bishops书中是不同的。在页145,方程4.41他将输出单位错误定义为:
d_k = y_k - t_k
其中y_k是输出,t_k是目标。 (我用_代表下标) 所以我的问题应该是这行代码:
error = targets[k]-self.ao[k]
事实上:
error = self.ao[k] - targets[k]
我很可能完全错了,但有人可以帮我解决我的困惑。感谢
答案 0 :(得分:2)
这一切都取决于您使用的错误措施。仅举几个错误度量示例(为简洁起见,我将ys
表示n
输出的向量,ts
表示n
个目标的向量):
mean squared error (MSE):
sum((y - t) ** 2 for (y, t) in zip(ys, ts)) / n
mean absolute error (MAE):
sum(abs(y - t) for (y, t) in zip(ys, ts)) / n
mean logistic error (MLE):
sum(-log(y) * t - log(1 - y) * (1 - t) for (y, t) in zip(ys, ts)) / n
您使用哪一个完全取决于上下文。当目标输出可以采用任何值时,MSE和MAE可用于,当目标输出为0
或1
且y
位于<{1}}时,MLE会给出非常好的结果em> open 范围(0, 1)
。
话虽如此,我还没有看到之前使用的错误y - t
或t - y
(我自己在机器学习方面经验不足)。据我所知,你提供的源代码没有区分差异或使用绝对值,你确定这本书也没有吗?我看待y - t
或t - y
的方式不是很好的错误措施,原因如下:
n = 2 # We only have two output neurons
ts = [ 0, 1 ] # Our target outputs
ys = [ 0.999, 0.001 ] # Our sigmoid outputs
# Notice that your outputs are the exact opposite of what you want them to be.
# Yet, if you use (y - t) or (t - y) to measure your error for each neuron and
# then sum up to get the total error of the network, you get 0.
t_minus_y = (0 - 0.999) + (1 - 0.001)
y_minus_t = (0.999 - 0) + (0.001 - 1)
修改:每alfa's comment,书中y - t
实际上是MSE的衍生物。在这种情况下,t - y
不正确。但请注意,MSE的实际衍生工具为2 * (y - t) / n
,而不仅仅是y - t
。
如果你没有除以n
(所以你实际上有一个求和平方误差(SSE),而不是均方误差),那么导数就是2 * (y - t)
。此外,如果您使用SSE / 2
作为错误衡量标准,那么导数中的1 / 2
和2
会被取消,您将留下y - t
。
答案 1 :(得分:0)
你必须反向传播
的衍生物0.5 *(y-t)^ 2或0.5 *(t-y)^ 2相对于y
总是
y-t =(y-t)(+ 1)=(t-y)( - 1)
答案 2 :(得分:0)
您可以从Padasip图书馆学习this implementation of MLP。
文档为here
答案 3 :(得分:0)
在实际代码中,我们经常计算NEGATIVE grad(关于w的损失),并使用w + = eta * grad来更新权重。实际上它是一个渐变的上升。
在一些教科书中,计算了正面毕业,w - = eta * grad来更新权重。