我已经构建了一个简单的递归神经网络,可以预测来自15个输入的非常嘈杂的信号(信号的统计故障)。
从我在pybrain源(pybrain \ supervised \ trainers \ backprop.py)中可以看出,错误函数在_calcDerivs
函数中被硬编码为平方误差除以总目标的总和( MSE)。除法发生在train
函数中。
在我的情况下,最重要的是网络预测信号变化的方向超过确切的变化量,因此我想在预测向下但信号向上移动时惩罚NN,反之亦然。我一直在尝试传递_calcDerivs
不仅是当前目标,而且还传递先前的目标和输出,我根据目标是否正确猜测方向来计算权重,但网络未能使用rprop和backprop进行收敛。这件事对我来说非常黑客。
我的问题是:是否有最佳方法来修改默认的性能功能?所有的性能函数代码都保存在_calcDerivs
中还是我遗漏了什么?
答案 0 :(得分:2)
好的,所以我找到了问题的根源和一个可能的解决方案,在PyBrain中没有一个。
我的问题的根源在于我的自定义成本(a.k.a性能等)功能的衍生物......或缺乏。使用的成本函数似乎是:
0.5 * (error ** 2) # 1/2 the average square error
这个的衍生物只是:
error
由于我使用更复杂的衍生物实现了更复杂的误差函数,并且我没有更改硬编码导数(无论它应该去哪里),因此梯度下降无法合理地降低误差梯度。
我找到的解决方案是使用neurolab,这使得以模块化方式实现自定义错误功能变得更加容易。虽然核心文件中需要一些黑客攻击,但我只需要更改大约三到四行核心代码。 (具体来说,我修改了tool.py中的ff_grad_step
和core.py中Train
类的最后一行。我通过在error.py中创建一个新函数来实现我的自定义成本函数,并使我的网络在net.py中挂钩。)
我希望对于类似情况下的其他人来说,这对我自己的问题并不太具体,但对于在学习神经网络时非常重要的事情来说,这是一个巨大的痛苦!