首页 > 解决方案 > 为什么随机种子会影响我的反向传播算法?

问题描述

在学习了一整节机器学习课程后,我意识到即使我通过了考试,我对如何构建神经网络也一无所知。因此,我尝试按照此视频的建议从头开始编写一个 https://youtu.be/I74ymkoNTnw?t=425

为了测试 NN 代码,我尝试过拟合第一点,并且由于某种原因,我得到了完全相反的结果(输出=(0, 1); 预期=(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

因此,我将问题从“为什么我的反向传播算法最大化误差?” 到“为什么随机种子会影响我的反向传播算法?”

标签: pythonneural-networkbackpropagation

解决方案


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

  1. 当我在做梯度下降时,需要一个减号。(我迷失在数学中)
  2. 校正与重量无关。因此,正确的做法是

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

并不是

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

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

希望我的回答能帮助其他人解决类似的问题。


推荐阅读