簡體   English   中英

為什么隨機種子會影響我的反向傳播算法?

[英]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

因此,我將問題從“為什么我的反向傳播算法最大化錯誤?”更改為? 到“為什么隨機種子會影響我的反向傳播算法?”

我設法修復了我的代碼。 有幾個錯誤:

  1. 在進行梯度下降時,需要一個減號。 (我迷失了數學)
  2. 校正與重量無關。 因此,正確的方法是

    self.NN = self.NN-self.lr *更正

並不是

self.NN *= 1-self.lr*correction

種子改變了我的結果的事實可能是由於學習率低(當我寫這個問題時是0.1-0.5),這可能是由於局部最大值(局部最大值,因為我錯誤地嘗試使誤差最大化)

希望我的回答可以幫助其他有類似問題的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM