整个机器学习课程结束后,我意识到即使我通过了考试,我对如何构建神经网络也没有丝毫的想法。因此,我尝试按照此视频的建议从头开始编写一个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
因此,我将问题从“为什么反向传播算法最大化误差为什么?”更改为?到“为什么随机种子会影响我的反向传播算法?”
答案 0 :(得分:0)
我设法修复了我的代码。有几个错误:
校正与重量无关。因此,正确的方法是
self.NN = self.NN-self.lr *更正
不是
self.NN *= 1-self.lr*correction
种子改变了我的结果的事实可能是由于较低的学习率(当我写这个问题时,它是0.1-0.5)可能是由于局部最大值(局部最大值,因为我错误地试图最大化误差) )
希望我的回答可以帮助其他有类似问题的人。