用于回归的Pybrain循环网络 - 如何正确地启动经过训练的网络进行预测

时间:2015-03-04 12:52:25

标签: machine-learning neural-network pybrain

我正在尝试使用递归神经网络来解决回归任务(我使用pybrain来构建它)。在我的网络适合后,我想用它来做出预测。但是对复发网络的预测受到其先前预测的影响(反过来又受到之前预测的影响等)。

问题是 - 一旦网络被训练并且我想在数据集上对其进行预测,如何正确地启动预测过程。如果我只是在数据集的第一个例子中调用.activate()来进行预测,这意味着循环连接将0传递给网络,并且它将以不希望的方式影响后续预测。是否有办法强制完全训练有素的复发网络认为以前的激活结果具有某种特殊价值?如果是,那么哪个值最好(可能是激活输出值的平均值或类似的smth?)

更新。好吧,因为在一天之内没有人对如何使用pybrain中的循环网络做任何想法,让我可能有点改变一个忘记pybrain的公式。考虑一下我为回归构建了一个pybrain网络(例如,预测股票的价格)。网络将与具有10个功能的数据集一起使用。我在数据集中添加了一个附加功能,并使用数据集的先前价格填充它。因此,我复制了一个循环网络(aditional input neuron复制了循环连接)。问题是:

1)在培训数据集中,我使用之前的价格填写此附加功能。但是如何处理训练数据集中的FIRST记录(我不知道之前的价格)。应该留0吗?这应该是一个坏主意,以前的价格不是零。我应该在训练数据集中使用价格均值吗?还有其他建议吗? 2)同样,问题与#1相同,但是针对测试数据集运行完全训练的网络。在针对测试数据集运行我的网络时,我应该总是选择其预测,并在进行下一次预测之前将结果放入这个新的第11个输入神经元。但是,当我需要在数据集中运行第一个预测时,该怎么办(因为我不知道以前的价格)?

1 个答案:

答案 0 :(得分:2)

这根本不是我对复发网络的理解。

当您最初创建一个循环网络时,循环连接(比如中间层到中间层)将被随机化,就像任何其他连接一样。这是他们的起始价值。每次激活经常性网络时,您都会更改这些连接,从而改变您的输出。

如果您编写了一些代码来训练一个经常性的网络并将其保存到一个文件中,那么你可以使用这个逻辑,你可以在该文件中找到一个可以随时使用真实数据的循环网络,尽管第一次调用将会包含您在培训期间上次激活的反复反馈。

您要做的事情是确保在您希望保持其状态的任何时候重新保存您的经常性网络。对于一个简单的FFN,这不是一个问题,因为你只是在训练期间改变状态,但是对于一个经常性的网络,你会想要在任何激活后保持状态,因为经常性的权重会更新。

我不认为由于经常性连接的初始值,经常性网络会中毒;当然我不会相信第一次调用,但鉴于它们是为那些在任何一种情况下都不成问题的序列而设计的。

关于您更新的问题,我完全不相信任意添加单个输入节点会模拟这个问题。事实上,我怀疑你绝对打破了网络的预测能力。在您的示例中,从10个输入节点开始,并假设您有20个中间节点,只需添加一个额外的输入节点,您将生成另外20个连接到网络,最初将被随机化。每增加一个点就会使这一变化更加复杂,并且在10个额外的输入节点之后,你将拥有与训练有关的随机连接数。

我认为这不起作用,我当然不相信它能以你的思维方式模拟反复学习。