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% 的变化,这要多得多类似于忘记而不是记住。
我创建了一个这样的神经网络:
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% 的变化,这要多得多类似于忘记而不是记住。