神经网络正在接受部分训练

数据挖掘 神经网络 训练 反向传播
2022-02-14 20:04:27

所以我正在编写自己的神经网络库,使用反向传播作为我的训练算法。一切似乎都很好,每次迭代时错误越来越少,但是当我打印最后一层的输出时,它绝对不是最佳的!让我进一步解释一下...

我的训练数据非常简单

Input: {0,0,1},{0,1,1},{1,0,1},{1,1,1},{1,0,0},{1,1,0}
Expected output: {0},{1},{0},{1},{0},{1}

我尝试了很多变体,甚至是一些逻辑门(AND、OR、XOR 等)!我尝试增加每一层的神经元数量或增加层数。我尝试了 ReLu 作为激活函数和常见的 sigmoid 函数,甚至一些组合!我玩过学习率值,但我仍然得到相同的结果。在上面给出的训练集示例中,我的网络使用 ReLu 的输出是

0.001585 
0.999990 
0.000713 
0.000109 
0.000000 
0.000000 

错误是

Error: 2.02248e-06

使用 sigmoid 函数的输出是

0.098032 
0.840373 
0.046706 
0.036155 
0.036184 
0.059911 

和错误

Error: 0.0289854

如您所见,第四个和第六个元素的预期输出应该是接近 1 的值,就像第二个元素一样。我面临着不同数据集的类似问题。

那么我如何反向传播网络呢?我正在计算这样的输出错误

error = 2.0 * (expected_output - actual_output)

我正在更新这样的权重

w += learning_rate * transposed_layer_output * layer_delta

我错过了什么吗?

1个回答

我可以看到您的错误函数有问题(蓝色)。它同样对待预测不足和过度预测。理想情况下,误差梯度应该引导您走向零误差。

误差面

对于您的错误函数:

E=2(yexpectedypredicted)

预测的导数是:

dEdypredicted=2

请注意,无论您预测不足还是过度预测,误差都是相同的(即误差的符号在梯度中并不重要)。所以权重的更新将是同一个方向(见蓝线箭头)。

但是如果你使用二次误差函数(橙色线),过度和不足预测误差的处理方式不同(即梯度取决于expectedpredicted不同之处)。

E=(yexpectedypredicted)2dEdypredicted=2(yexpectedypredicted)1