[英]Why does the random seed impact on my back-propagation algorithm?
在學習了機器學習的一整堂課之后,我意識到即使我通過了考試,我對如何構建神經網絡也絲毫不了解。 因此,我嘗試按照此視頻的建議從頭開始編寫一個https://youtu.be/I74ymkoNTnw?t=425
為了測試NN代碼,我試圖在第一點上過度擬合,由於某種原因,我得到了與之完全相反的結果(output =(0,1); Expected =(1,0)),其中輸出是概率。
我試圖在反向傳播中更改校正的符號,但是即使經過數千次迭代,我仍然得到45%的錯誤。 因此,我認為該標志是正確的,問題出在其他地方。
我正在使用Google Collab,因此您可以檢查並運行整個代碼: https : //colab.research.google.com/drive/1j-WMk80t8mbg7vr5HscbTUJxUFxOK1yN
我假設它不起作用的功能如下:
def back_propagation(self, x:np.ndarray, y:np.ndarray, y_exp:np.ndarray):
error = 0.5*np.sum( (y-y_exp)**2 )
Ep = y-y_exp # d(Error) / d(y)
dfrac = np.flip( self.out)/np.sum( self.out)**2 # d( x/sum(x) )/d(x)
dsigm = self.out*(1-self.out) # d( 1/(1+exp(-x)) )/d(x) | out = sig(x)
correction = np.outer(Ep*dfrac*dsigm, x) # Correction matrix
self.NN *= 1-self.lr*correction
return error
y是通過以下方式獲得的:
def forward_propagation(self, x:np.ndarray):
Ax = self.NN.dot(x)
self.out = self.sigmoid(Ax)
y = self.out / np.sum( self.out)
return y
有人可以幫我嗎?
PS:我已經很長時間沒有寫英語了,如果有任何錯誤/難以理解的部分告訴我,我會盡力解釋自己。
編輯:我檢查了更多的錯誤,然后在反向傳播中有+號,我注意到更改種子會在10002迭代后更改最小錯誤:
seed = 1000 --> error = 0.4443457394544875
seed = 1234 --> error = 3.484945305904348e-05
seed = 1 --> error = 2.8741028650796533e-05
seed = 10000 --> error = 0.44434995711021025
seed = 12345 --> error = 3.430037390869015e-05
seed = 100 --> error = 2.851979370926932e-05
因此,我將問題從“為什么我的反向傳播算法最大化錯誤?”更改為? 到“為什么隨機種子會影響我的反向傳播算法?”
我設法修復了我的代碼。 有幾個錯誤:
校正與重量無關。 因此,正確的方法是
self.NN = self.NN-self.lr *更正
並不是
self.NN *= 1-self.lr*correction
種子改變了我的結果的事實可能是由於學習率低(當我寫這個問題時是0.1-0.5),這可能是由於局部最大值(局部最大值,因為我錯誤地嘗試使誤差最大化)
希望我的回答可以幫助其他有類似問題的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.