计算神经网络的误差

时间:2015-02-28 17:08:47

标签: java artificial-intelligence neural-network backpropagation

我编写了一个反向传播MLP神经网络,我希望训练在误差小于或等于0.01时停止

我的数据集已分为60%的训练数据,20%的验证数据和20%的测试数据。

我的培训和验证主要循环如下:

while (continueTraining) {
    for (int i = 0; i < trainingDataSet.size(); i++) {
        neuralNetwork.train(trainingDataSet.get(i));
    }

    double error = 0;
    for (int i = 0; i < validationDataSet.size(); i++) {
        error += neuralNetwork.validate(validationDataSet.get(i));
    }
    error = error / validationDataSet.size();

    if (error <= 0.01) {
        continueTraining = false;
    }
}

权重/偏差仅在训练期间更新,然后一旦完成一个训练时期,验证开始(它不会改变权重/偏差 - 只是前向传递),这会返回错误。

validation方法计算错误如下(在Java中):

double error = 0;
for (int i = 0; i < correctOutput.length; i++) {
    error += Math.pow(correctOutput[i] - outputLayer.getNeuron(i).getValue(), 2);
}
error = error / correctOutput.length;

return Math.sqrt(error); 

因此validate方法返回验证数据集中每行数据的错误,然后将其汇总在一起,然后除以验证数据集中的数据行数,得出整个数据的平均误差数据集。

但是,在运行网络时,错误永远不会达到0.01。我得到的最接近的是0.018,并且随着时期的数量达到非常大的数量,那么误差会增加。

我是否错误地计算了错误,或者只是错误永远不会达到0.01?

我认为当验证数据的错误被最小化时停止训练将是最好的事情。

编辑:添加一些与语言无关的伪代码:

while continueTraining is true
do
    for each rowOfData in trainingDataset
        neuralNetwork.train(rowOfData)

    error = 0

    for each rowOfData in validationDataset
        error = error + neuralNetwork.validate(rowOfData)

    error = error / numberOfRowsOfDataInValidationDataset

    if error <= 0.01
        continueTraining = false

来自neuralNetwork.validate(rowOfData)的回复计算如下:

error = 0
for each output
    error = error + (idealOutput - calculatedOutput)^2

error = error / numberOfOutputs

return sqrt(error)

2 个答案:

答案 0 :(得分:0)

是的,实际上错误可能永远不会低于某个水平。神经网络以及其他机器学习算法不能保证结果。

如果可能的话,您可以尝试增加训练集以提高网络性能(如果您有更多数据)。

答案 1 :(得分:0)

交叉验证集的错误通常表现得像那样,因为在某些点NN开始过度拟合之后(NN模型开始学习“噪音” - 训练集中的随机规律,而不是你正在进行的问题)。这就是您首先需要验证数据集的原因。因此,“当验证数据的错误被最小化时停止训练将是最好的事情”是完全正确的事情。存在其他防止过度拟合的方法,例如添加正则化或获得更多训练样本。

关于你的代码,似乎它是正确的,假设你想要计算均方根误差(可以使用其他错误函数,例如MSE或交叉熵错误的分类任务,因此值得指定什么样的在询问代码正确性时,您想要计算的错误。)