众所周知,1 层网络无法预测 xor 函数,因为它不是线性可分的。我尝试创建一个 2 层网络,使用逻辑 sigmoid 函数和反向传播来预测异或。我的网络在输入层有 2 个神经元(和一个偏置),在隐藏层有 2 个神经元和 1 个偏置,以及 1 个输出神经元。令我惊讶的是,这不会收敛。如果我添加一个新层,所以我有一个 3 层网络,输入 (2+1)、hidden1 (2+1)、hidden2 (2+1) 和输出,它可以工作。此外,如果我保留一个 2 层网络,但我将隐藏层大小增加到 4 个神经元 + 1 个偏差,它也会收敛。为什么具有 3 个或更少隐藏神经元的 2 层网络无法对 xor 函数建模?
为 xor 函数创建神经网络
数据挖掘
神经网络
反向传播
2021-09-29 04:01:31
3个回答
一个包含两个神经元的隐藏层的网络应该足以分离 XOR 问题。第一个神经元充当或门,第二个神经元充当非与门。添加两个神经元,如果它们通过阈值,则为阳性。您可以为此使用线性决策神经元,并调整阈值的偏差。NOT AND 门的输入对于 0/1 输入应为负。这张图片应该更清楚,连接上的值是权重,神经元中的值是偏差,决策函数充当 0/1 决策(或者在这种情况下也只有符号函数起作用)。
图片感谢“Abhranil 博客”
如果您使用的是基本梯度下降(没有其他优化,例如动量),以及一个最小网络 2 个输入、2 个隐藏神经元、1 个输出神经元,那么绝对可以训练它来学习 XOR,但它可以相当棘手且不可靠。
您可能需要调整学习率。最常见的错误是将其设置得太高,因此网络会振荡或发散而不是学习。
使用批量或在线梯度下降来训练最小网络可能需要大量的 epoch。可能需要几千个 epoch。
由于权重数量如此之少(只有 6 个),有时随机初始化会创建一个很容易卡住的组合。所以你可能需要尝试,检查结果,然后重新开始。我建议您使用种子随机数生成器进行初始化,如果错误值卡住并且没有改善,请调整种子值。
其它你可能感兴趣的问题