PyBrain: square 遇到溢出,multiply 遇到无效值

PyBrain: overflow encountered in square, invalid value encountered in multiply

我创建了一个这样的神经网络:

n = FeedForwardNetwork()

inLayer = LinearLayer(43)
bias = BiasUnit()
hiddenLayer = SigmoidLayer(100)
outLayer = LinearLayer(1)

n.addInputModule(inLayer)
n.addModule(bias)
n.addModule(hiddenLayer)
n.addOutputModule(outLayer)

in_to_hidden = FullConnection(inLayer, hiddenLayer)
bias_to_hidden = FullConnection(bias, hiddenLayer)
hidden_to_out = FullConnection(hiddenLayer, outLayer)

n.addConnection(in_to_hidden)
n.addConnection(bias_to_hidden)
n.addConnection(hidden_to_out)

n.sortModules()

我按以下方式训练它(我正在简化,它正在多次迭代中训练):

self.trainer = BackpropTrainer(self.neural_net, learningrate=0.8)
(...)
ds = SupervisedDataSet(self.net_input_size, 1)
ds.addSample([...], np.float64(learned_value))
(...)
self.trainer.trainOnDataset(ds)

有时我会收到以下警告:

(...)/lib/python3.5/site-packages/PyBrain-0.3.1-py3.5.egg/pybrain/supervised/trainers/backprop.py:99: RuntimeWarning: overflow encountered in square error += 0.5 * sum(outerr ** 2)

(...)/lib/python3.5/site-packages/PyBrain-0.3.1-py3.5.egg/pybrain/structure/modules/sigmoidlayer.py:14: RuntimeWarning: invalid value encountered in multiply inerr[:] = outbuf * (1 - outbuf) * outerr

然后当我检查保存的网络文件时,我看到 all 权重是 nan:

(...)
<FullConnection class="pybrain.structure.connections.full.FullConnection" name="FullConnection-8">
    <inmod val="BiasUnit-5"/>
    <outmod val="SigmoidLayer-11"/>
    <Parameters>[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]</Parameters>
</FullConnection>
(...)

按照提示,答案来了:

学习率为 0.8 是无效的,因为它可能 导致像您这样的错误并妨碍网络的有效学习。

在如此高的学习率下,根据您的成本函数,网络很容易将您的权重更改得非常大,因此权重可能会溢出到 NaN 值。

通常(即使您的权重没有溢出到 NaN 值)高学习率在学习方面也不是一个好主意。 You're network 通过从大型训练数据集中学习来解决特定问题。如果您的学习率非常高,例如 0.8,则网络会非常 很难适应当前时期的数据。 前一个时期的大部分信息/学习特征将完全丢失,因为网络会根据当前时期的错误率进行强烈调整。

对于大多数问题,典型的学习率大约为 0.01 或 0.001 甚至更低,因为您想从一个时期得出小结论,而不是学习多个时期的不变特征。

不用乱猜!在前馈网络中,如果学习率超过 1/n,您将浪费时间,其中 n 是网络中神经元的数量。如果你建立一个减少训练步骤的学习率,你会更容易解决微妙的关系,但每度(如果你愿意的话)微妙需要相当长的时间,因为只有整个网络状态的一些递减部分每个训练步骤都会受到影响。

如果您的学习率超过 1/n,则整个网络允许的变化自由度 超过 每个节点 100% 的变化,这要多得多类似于忘记而不是记住。