对于我的高级算法和数据结构课程,我的教授要求我们选择任何我们感兴趣的主题。他还告诉我们研究它并尝试在其中实施解决方案。我选择了神经网络,因为这是我很久以来就想学习的东西。
我已经能够使用神经网络实现 AND、OR 和 XOR,其神经元使用激活器的阶跃函数。之后,我尝试实现一个反向传播神经网络来学习识别 XOR 运算符(使用 sigmoid 函数作为激活器)。通过使用 3-3-1 网络(输入和隐藏层有 1 个偏差,权重随机初始化),我能够在 90% 的时间里让它工作。在其他时候,它似乎陷入了我认为的局部最小值,但我不确定(我之前已经问过这个问题,人们告诉我不应该有局部最小值)。
在它工作的 90% 的时间里,我始终按以下顺序呈现我的输入:[0, 0], [0, 1], [1, 0], [1, 0]
预期输出设置为[0, 1, 1, 0]
. 当我以相同的顺序一致地呈现值时,网络最终会学习该模式。实际上,我发送它的顺序并不重要,只要每个时期的顺序完全相同。
然后我实现了训练集的随机化,所以这次输入的顺序是充分随机的。我现在注意到我的神经网络卡住了并且错误正在减少,但速度非常小(每个时期都在变小)。一段时间后,错误开始围绕一个值波动(因此错误停止减少)。
我是这个主题的新手,到目前为止我所知道的一切都是自学的(阅读教程、论文等)。为什么输入的呈现顺序会改变我的网络的行为?是不是因为从一个输入到下一个输入的误差变化是一致的(因为顺序是一致的),这让网络很容易学习?
我能做些什么来解决这个问题?我正在检查我的反向传播算法,以确保我已经正确地实现了它;目前它是通过学习率和动量实现的。我正在考虑查看其他增强功能,例如自适应学习率。然而,XOR 网络通常被描述为一个非常简单的网络,所以我认为我不需要使用复杂的反向传播算法。