[英]Python Neural Network Backpropagation
我正在學習神經網絡,特別是通過反向傳播實現來查看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]
我很可能完全錯了,但有人可以幫我解決我的困惑。 謝謝
這一切都取決於您使用的錯誤措施。 僅舉幾個錯誤測量的例子(為簡潔起見,我將使用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
處於開放范圍(0, 1)
時,MLE給出非常好的結果。
話雖如此,我還沒有看到之前使用的錯誤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)
編輯:根據阿爾法的評論 ,在書中, y - t
實際上是MSE的衍生物。 在那種情況下, t - y
是不正確的。 但請注意,MSE的實際導數為2 * (y - t) / n
,而不僅僅是y - t
。
如果你沒有除以n
(所以你實際上有一個求和平方誤差(SSE),而不是均方誤差),那么導數就是2 * (y - t)
。 此外,如果您使用SSE / 2
作為誤差測量,則導數中的1 / 2
和2
抵消,並且您將留下y - t
。
你必須反向傳播。的衍生物
相對於y,0.5 *(yt)^ 2或0.5 *(ty)^ 2
這總是如此
yt =(yt) (+1)=(ty) ( - 1)
在實際代碼中,我們經常計算NEGATIVE grad(關於w的損失),並使用w + = eta * grad來更新權重。 實際上它是一個畢業上升。
在一些教科書中,計算POSITIVE grad並且w - = eta * grad來更新權重。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.