Pybrain:自定义错误/性能函数?

时间:2013-06-07 23:13:13

标签: python neural-network pybrain

我已经构建了一个简单的递归神经网络,可以预测来自15个输入的非常嘈杂的信号(信号的统计故障)。

从我在pybrain源(pybrain \ supervised \ trainers \ backprop.py)中可以看出,错误函数在_calcDerivs函数中被硬编码为平方误差除以总目标的总和( MSE)。除法发生在train函数中。

在我的情况下,最重要的是网络预测信号变化的方向超过确切的变化量,因此我想在预测向下但信号向上移动时惩罚NN,反之亦然。我一直在尝试传递_calcDerivs不仅是当前目标,而且还传递先前的目标和输出,我根据目标是否正确猜测方向来计算权重,但网络未能使用rprop和backprop进行收敛。这件事对我来说非常黑客。

我的问题是:是否有最佳方法来修改默认的性能功能?所有的性能函数代码都保存在_calcDerivs中还是我遗漏了什么?

1 个答案:

答案 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中挂钩。)

我希望对于类似情况下的其他人来说,这对我自己的问题并不太具体,但对于在学习神经网络时非常重要的事情来说,这是一个巨大的痛苦!