为什么我的神经网络" unlearning"?

时间:2016-03-12 11:21:08

标签: java machine-learning neural-network artificial-intelligence

我正在尝试训练人工神经网络。经过几百次迭代(或数千次,取决于参数),训练误差随着每次训练迭代而减小。但随后,它开始再次上升并继续这样做,直到网络完全没有学到它所学到的一切,并且与完全未经训练的网络一样糟糕(或者在某些情况下更糟)。

我可以理解,网络可能会进入无法再学习的阶段,但为什么我的网络可能无法学习?

让我再给你一些细节。

详细

任务详情

在给定所有有效位置和正确评估(0,0.5,1)的情况下,了解井字游戏的位置评估函数。董事会国家代表......

  • 9 x"此单元格为空白"
  • 9 x"此单元格上有X"
  • 9 x"此单元格上有一个O"
  • 1 x"在X&#t;"
  • 1 x"在O"

网络详情

MLP网络。所有层之间的完全连接。

  • 1个输入层,29个神经元
  • 1个隐藏层,29个整流线性神经元
  • 1个输出层,1个神经元
  • -0.5和+0.5之间的随机权重初始化
  • 学习率0.005

培训详情

使用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倍之间改变隐藏层并没有帮助。对于较小的隐藏层,每个训练周期都很快,但需要更多周期,并且获得的最佳结果更差。与更大的隐藏层相对。在所有情况下,学习之后都是学习。

隐藏层数

我尝试过使用几个隐藏图层。它没有帮助。

神经元类型

我尝试使用乙状结肠神经元代替矫正的线性神经元(具有适当较小的初始权重和较大的学习率)。这往往会保持稳定一段时间,但最终会出现同样的分歧。

0 个答案:

没有答案