为什么随机种子会影响我的反向传播算法?

时间:2019-08-03 17:18:51

标签: python neural-network backpropagation

整个机器学习课程结束后,我意识到即使我通过了考试,我对如何构建神经网络也没有丝毫的想法。因此,我尝试按照此视频的建议从头开始编写一个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 个答案:

答案 0 :(得分:0)

我设法修复了我的代码。有几个错误:

  1. 在进行梯度下降时,需要一个减号。 (我在数学上迷路了)
  2. 校正与重量无关。因此,正确的方法是

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

不是

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

种子改变了我的结果的事实可能是由于较低的学习率(当我写这个问题时,它是0.1-0.5)可能是由于局部最大值(局部最大值,因为我错误地试图最大化误差) )

希望我的回答可以帮助其他有类似问题的人。