为 xor 函数创建神经网络

数据挖掘 神经网络 反向传播
2021-09-29 04:01:31

众所周知,1 层网络无法预测 xor 函数,因为它不是线性可分的。我尝试创建一个 2 层网络,使用逻辑 sigmoid 函数和反向传播来预测异或。我的网络在输入层有 2 个神经元(和一个偏置),在隐藏层有 2 个神经元和 1 个偏置,以及 1 个输出神经元。令我惊讶的是,这不会收敛。如果我添加一个新层,所以我有一个 3 层网络,输入 (2+1)、hidden1 (2+1)、hidden2 (2+1) 和输出,它可以工作。此外,如果我保留一个 2 层网络,但我将隐藏层大小增加到 4 个神经元 + 1 个偏差,它也会收敛。为什么具有 3 个或更少隐藏神经元的 2 层网络无法对 xor 函数建模?

3个回答

是的,这是有原因的。它与您如何初始化权重有关。

有 16 个局部最小值在 0.5 - 1 之间收敛的概率最高。

在此处输入图像描述

这是一篇分析异或问题的论文。

一个包含两个神经元的隐藏层的网络应该足以分离 XOR 问题。第一个神经元充当或门,第二个神经元充当非与门。添加两个神经元,如果它们通过阈值,则为阳性。您可以为此使用线性决策神经元,并调整阈值的偏差。NOT AND 门的输入对于 0/1 输入应为负。这张图片应该更清楚,连接上的值是权重,神经元中的值是偏差,决策函数充当 0/1 决策(或者在这种情况下也只有符号函数起作用)。

异或神经网络

图片感谢“Abhranil 博客”

如果您使用的是基本梯度下降(没有其他优化,例如动量),以及一个最小网络 2 个输入、2 个隐藏神经元、1 个输出神经元,那么绝对可以训练它来学习 XOR,但它可以相当棘手且不可靠。

  • 您可能需要调整学习率。最常见的错误是将其设置得太高,因此网络会振荡或发散而不是学习。

  • 使用批量或在线梯度下降来训练最小网络可能需要大量的 epoch。可能需要几千个 epoch。

  • 由于权重数量如此之少(只有 6 个),有时随机初始化会创建一个很容易卡住的组合。所以你可能需要尝试,检查结果,然后重新开始。我建议您使用种子随机数生成器进行初始化,如果错误值卡住并且没有改善,请调整种子值。