python - 为什么随机种子会影响我的反向传播算法?
问题描述
在学习了一整节机器学习课程后,我意识到即使我通过了考试,我对如何构建神经网络也一无所知。因此,我尝试按照此视频的建议从头开始编写一个 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
因此,我将问题从“为什么我的反向传播算法最大化误差?” 到“为什么随机种子会影响我的反向传播算法?”
解决方案
我设法修复了我的代码。有几个错误:
- 当我在做梯度下降时,需要一个减号。(我迷失在数学中)
校正与重量无关。因此,正确的做法是
self.NN = self.NN - self.lr*修正
并不是
self.NN *= 1-self.lr*correction
种子改变了我的结果的事实可能是由于学习率低(当我写问题时它是 0.1-0.5),这可能是由于局部最大值(局部最大值,因为我错误地试图最大化错误)
希望我的回答能帮助其他人解决类似的问题。
推荐阅读
- vba - 识别范围内的唯一/不同值
- html - Bootstrap 与 Angular 的斗争
- java - 在 Spring Application 中将 REST Web Service 与 Activemq 集成是正确的方法吗
- angularjs - 是否可以在不向浏览器全局历史记录中添加条目的情况下更改 url 查询字符串?
- c++ - 未在标头范围内声明(链表)
- python-3.x - 如何使用 Python 中的 tabula 库从 pdf 中提取所有表格?
- hyperledger-fabric - Composer 网络启动超时
- angular - qz-tray sha-256 未定义
- python - 在 Lark 语法中正确设置规则和终端之间的优先级
- r - R 的传单:在弹出窗口中显示多个数据行