单层 ANN 会出现 XOR 错误吗?

数据挖掘 机器学习 神经网络 初学者 数学 在家工作
2021-09-17 07:03:30

我对人工神经网络还是很陌生。虽然我玩过 TensorFlow,但我现在正试图弄清基础知识。由于我偶然发现了一门课程,该课程解释了如何在 Unity 中使用 C# 实现具有反向传播的 ANN,我就是这样做的。

在使用一个包含 2 个神经元的隐藏层来测试运行 ANN 时,我注意到它并不总是能得到正确的 XOR。无论它运行多少个 epoch 或如何设置学习率。对于某些设置,它比其他设置更频繁地发生。

通常我会得到这样的东西:

+---+---+------+
| 0 | 0 | 0.01 |
+---+---+------+
| 0 | 1 | 0.99 |
+---+---+------+
| 1 | 0 | 0.99 |
+---+---+------+
| 1 | 1 | 0.01 |
+---+---+------+

但在其他情况下,它看起来更像这样:

+---+---+------+      +---+---+------+      +---+---+------+
| 0 | 0 | 0.33 |      | 0 | 0 | 0.01 |      | 0 | 0 | 0.33 |
+---+---+------+      +---+---+------+      +---+---+------+
| 0 | 1 | 0.99 |      | 0 | 1 | 0.99 |      | 0 | 1 | 0.33 |
+---+---+------+  or  +---+---+------+  or  +---+---+------+
| 1 | 0 | 0.66 |      | 1 | 0 | 0.50 |      | 1 | 0 | 0.99 |
+---+---+------+      +---+---+------+      +---+---+------+
| 1 | 1 | 0.01 |      | 1 | 1 | 0.50 |      | 1 | 1 | 0.33 |
+---+---+------+      +---+---+------+      +---+---+------+

我注意到在每种情况下,输出的总和都是~2。它也不会在大多数时候发生,但仍然经常发生。根据我使用的设置,它每运行两次或三次,或者仅在运行 10 或 20 次后发生。对我来说,这似乎更像是神经网络随机性的数学怪癖。但是我的数学还不够好,无法自己解决这个问题。

问题是:假设实现尽可能简单,没有高级概念,这样的事情是否可能发生,或者它绝对是实现中的错误?如果这不是实现中的错误,那么这里发生了什么?是因为 XOR 的对称性吗?据我所知,这就是单个神经元无法处理它的原因。

我知道我也可以发布源代码,但我已经两次和三次检查了所有内容,因为我在偏差计算中出现了错误。那时,价值观一直完全关闭。现在我只是想知道这种事情是否真的可以通过正确实施的神经网络发生。

2个回答

假设实现尽可能简单,没有高级概念,这样的事情是否可能发生,或者它绝对是实现中的错误?

以我的经验,使用最简单的网络和最简单的梯度下降算法,是的,这种情况相对频繁地发生。这是起始权重值的意外,从技术上讲是成本函数的局部最小值,这就是为什么它在发生时如此稳定的原因。在基本实现中,您只有 6 个起始权重。如果它们是随机选择的,则“特殊”模式(例如隐藏层的权重全部为正或全部为负)的机会相对较高(输入和第一个隐藏层之间的所有正或所有负权重的 8 分之一) .

这也是为什么值总和为 2 的原因 - 鉴于网络卡在错误表面的错误部分,它仍然会在给定约束的情况下尽可能地最小化成本函数,这通常会以折衷值结束在预测中总体上仍符合统计均值。如果你加倍了一些,但不是所有的输入/输出对(例如 6 个输入的训练集{(0,00),(0,11),(1,01),(1,10),(0,11),(1,01)},那么网络在失败时可能会收敛到不同的错误平均值。

是不是因为 XOR 非常对称的特性,使得单个神经元无法处理?

你这里没有一个神经元。除非你的意思是在输出层?在这种情况下,不,这与在输出层中具有单个神经元无关。

几乎任何更高级的 NN 功能,或者只是更多的随机性,都会阻止这个问题的发生。例如,让中间层有 4 个神经元而不是 2 个,使用动量项,一个更大的数据集,其中随机抽取“小批量”。

一般来说,这种问题似乎不会发生在更大、更复杂的数据集和更大更复杂的网络上。这些可能还有其他问题,但往往不会发生陷入远离全局最小值的局部最小值。此外,对于这些场景,您通常不希望完全收敛到数据集和误差函数的全局最小值,而是正在寻找某种形式的广义模型(可以根据您以前从未见过的输入值进行预测)。


实际上,如果您想添加一个自动化测试来显示您的 NN 实现可以解决 XOR,那么请使用固定的起始权重或您知道有效的 RNG 种子。那么您的测试将是可靠的,即使 NN 并非在所有情况下都是如此。

是不是因为 XOR 非常对称的特性,使得单个神经元无法处理?

的,因为 XOR 问题不是线性可分的。使用单层 MLP,您只能在样本之间绘制线性分离边界。我建议你阅读这篇文章:

https://medium.com/@jayeshbahire/the-xor-problem-in-neural-networks-50006411840b

如果你想用 MLP-ANN 表示非线性决策边界,你应该添加更多的隐藏层;就那么简单!