我正在尝试训练人工神经网络。经过几百次迭代(或数千次,取决于参数),训练误差随着每次训练迭代而减小。但随后,它开始再次上升并继续这样做,直到网络完全没有学到它所学到的一切,并且与完全未经训练的网络一样糟糕(或者在某些情况下更糟)。
我可以理解,网络可能会进入无法再学习的阶段,但为什么我的网络可能无法学习?
让我再给你一些细节。
在给定所有有效位置和正确评估(0,0.5,1)的情况下,了解井字游戏的位置评估函数。董事会国家代表......
MLP网络。所有层之间的完全连接。
使用L2丢失函数进行反向传播。
使用完整数据集进行训练(即我没有将任何背部作为测试集)。每次迭代都会批量训练整套位置,然后应用权重更新。
每次迭代后报告的错误是网络输出与每个位置的正确输出之间差异的平均值。
使用Neuroph库,网络就像这样创建......
if (USE_RELU)
{
lTransferFunction = TransferFunctionType.RECTIFIED_LINEAR;
INITIAL_LEARNING_RATE = 0.005;
lInitialWeightMin = -0.5;
lInitialWeightMax = 0.5;
}
else
{
lTransferFunction = TransferFunctionType.SIGMOID;
INITIAL_LEARNING_RATE = 0.05;
lInitialWeightMax = 1 / Math.sqrt(mInputSize);
lInitialWeightMin = -lInitialWeightMax;
}
mNetwork = new MultiLayerPerceptron(lTransferFunction,
mInputSize, // Input layer, 1 neuron per base proposition
mInputSize, // Hidden layer(s)
mOutputSize); // Output layer, 1 neuron per role (except for fixed sum,
// where we only need 1).
mNetwork.randomizeWeights(lInitialWeightMin, lInitialWeightMax);
// Create a learning rule.
mLearningRule = createLearningRule();
<...>
}
private BackPropagation createLearningRule()
{
BackPropagation lLearningRule = new BackPropagation();
lLearningRule.setMaxIterations(1);
lLearningRule.setLearningRate(INITIAL_LEARNING_RATE);
lLearningRule.setNeuralNetwork(mNetwork);
return lLearningRule;
}
......并接受过这样的训练......
double lTotalErr = 0;
int lNumIterations = 0;
for (int lii = 0; lii < lNumIterations; lii++)
{
if (lii % 10 == 0)
{
LOGGER.info("Iteration " + lii + ", err " + ((lTotalErr * 100.0) / 10.0));
lTotalErr = 0;
}
mLearningRule.doOneLearningIteration(mTrainingSet);
lTotalErr += mLearningRule.getErrorFunction().getTotalError();
}
在尝试调试时,我尝试修改各种参数(没有成功)。
更高的学习率可以更快地初始收敛,但报告的最低错误率更高(如预期的那样)。 &#34;取消学习&#34;阶段达到更快。学习率很高,会立即出现差异。
较低的学习速度会导致学习速度变慢,但学习仍然会发生 - 但它仍然完全没有学到完全未受过训练。
在输入大小的1/3和输入大小的3倍之间改变隐藏层并没有帮助。对于较小的隐藏层,每个训练周期都很快,但需要更多周期,并且获得的最佳结果更差。与更大的隐藏层相对。在所有情况下,学习之后都是学习。
我尝试过使用几个隐藏图层。它没有帮助。