5

我正在学习神经网络,特别是研究具有反向传播实现的 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]

我很可能完全错了,但请有人帮忙解决我的困惑。谢谢

4

4 回答 4

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 可用于目标输出可以取任何值的情况,当您的目标输出为01y开放范围内时,MLE 会提供非常好的结果(0, 1)

话虽如此,我还没有看到错误y - tt - y以前使用过(我自己在机器学习方面不是很有经验)。据我所知,您提供的源代码没有平方差或使用绝对值,您确定这本书也没有吗?我看到它的方式y - tt - 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在书中的评论,y - t实际上是 MSE 的派生词。在这种情况下,t - y是不正确的。但是请注意,MSE 的实际导数2 * (y - t) / n不仅仅是y - t

如果你不除以n(所以你实际上有一个平方和误差(SSE),而不是一个均方误差),那么导数就是2 * (y - t). 此外,如果您使用SSE / 2作为您的误差度量,那么导数中的1 / 22抵消了,剩下的是y - t

于 2013-05-02T16:28:28.303 回答
0

您必须反向传播

0.5*(yt)^2 或 0.5*(ty)^2 相对于 y

这总是

yt = (yt) (+1) = (ty) (-1)

于 2013-05-02T16:48:47.073 回答
0

在实际代码中,我们经常会计算 NEGATIVE grad(of loss 关于 w),并使用 w += eta*grad 来更新权重。实际上它是一个梯度上升。

在某些教科书中,计算了 POSITIVE grad 并 w -= eta*grad 更新权重。

于 2017-03-20T08:17:16.703 回答
0

您可以从 Padasip 库中研究MLP 的实现。

文档在这里

于 2016-10-18T18:09:04.040 回答