【问题标题】:Encog: weights keep increasingEncog:权重不断增加
【发布时间】:2014-09-13 06:18:57
【问题描述】:

我正在尝试使用 Encog 库训练神经网络。

数据集(约 7000 个示例)在拆分(分为训练 (60%)、交叉验证 (20%) 和测试 (20%))之前进行了线性归一化,如下所示:

Min=-1.000000; Max=1.000000; Average=-0.077008

目标(理想)数据集(也是线性归一化的)如下所示:

Min=0.201540; Max=0.791528; Average=0.477080

我这样初始化网络:

mNetwork = new BasicNetwork();
mNetwork.addLayer(new BasicLayer(null, false, trainingDataSet.getInputSize()));
mNetwork.addLayer(new BasicLayer(new ActivationSigmoid(), true, numberOfNeurons));
mNetwork.addLayer(new BasicLayer(new ActivationSigmoid(), false, trainingDataSet.getIdealSize()));
mNetwork.getStructure().finalizeStructure();
mNetwork.reset();

我使用ResilientPropagationtrainer(也试过Backpropagation):

ResilientPropagation training = new ResilientPropagation(mNetwork, mTrainingDataSet);
for (int i = 0; i < mNumberOfIterations; ++i) {
    training.iteration();
    result.trainingErrors[i] = mNetwork.calculateError(mTrainingDataSet);
    result.validationErrors[i] = mNetwork.calculateError(mValidationDataSet);
    System.out.println(String.format("Iteration #%d: error=%.8f", i, training.getError()));
}
training.finishTraining();

在训练过程中,训练者报告的错误一般在减少。完成训练后,我放弃了重量:

0.04274211002929323,-0.5481902707068103,0.28978635361541294,-0.203635994176051,22965.18656660482,22964.992410871928,22966.23882308963,22966.355722230965,22965.036733143017,22964.894030965166,22966.002332259202,22965.177650526788,22966.009842504238,22965.971560546248,22966.257180159628,22966.234150681423,-21348.311232865744,-21640.843082085466,-21057.13217475862,-21347.52051343582,-21347.988714647887,-21641.161098510198,-21057.27275747668,-21348.784123049118,-21347.719149090022,-21639.773689115867,-21057.095487328377,-21348.269878600076,22800.304816865206,23090.894751729396,22799.39388588725,22799.72408290791,22800.249806096508,22799.19823789763,22799.85510732227,22799.99965531053,22799.574773588192,22799.57945236908,22799.12542315293,22799.523065957797

它们通常要么非常大,要么非常小。对于 sigmoid,它最终会得到收敛到某个数字的预测,例如上面的权重(经过 500 次迭代后得到)给我:

Min=0.532179; Max=0.532179; Average=0.532179

网络或训练配置似乎有问题。如果我的网络具有低方差,至少它会产生一个在目标范围内的结果。如果它遭受高方差,它将匹配目标。而现在,它完全没有达到目标。

即使预测不准确,为什么错误会减少并变得非常低?有人在我上面的例子中看到明显的错误吗?我对神经网络还不是很熟悉。

【问题讨论】:

  • 权重可以增加,我见过训练过的具有大权重的神经网络。我没有看到您上面的代码有任何问题。您正在正常化到良好的范围。至于为什么训练没有收敛,这通常很难回答。通常的嫌疑人包括:扭曲的数据(太多相似的结果)、嘈杂的数据、矛盾的结果。
  • 正如我所提到的,我对神经网络没有经验。我认为噪音只会降低准确性。我相信噪音可能是问题所在。我会尝试减少它。

标签: java neural-network encog


【解决方案1】:

在我看来,问题在于您在 -1 和 1 之间进行归一化,并使用了适用于 0 和 1 之间数字的激活函数 sigmoid。 我建议您在 0.1 和 0.9 之间进行标准化,或者使用 tanh 激活函数重试。

我也会使用 k 折交叉验证,请参阅此处http://www.heatonresearch.com/node/2000

文森佐

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 2015-10-27
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2020-12-08
    • 1970-01-01
    相关资源
    最近更新 更多