5

对于我的高级算法和数据结构课程,我的教授要求我们选择任何我们感兴趣的主题。他还告诉我们研究它并尝试在其中实施解决方案。我选择了神经网络,因为这是我很久以来就想学习的东西。

我已经能够使用神经网络实现 AND、OR 和 XOR,其神经元使用激活器的阶跃函数。之后,我尝试实现一个反向传播神经网络来学习识别 XOR 运算符(使用 sigmoid 函数作为激活器)。通过使用 3-3-1 网络(输入和隐藏层有 1 个偏差,权重随机初始化),我能够在 90% 的时间里让它工作。在其他时候,它似乎陷入了我认为的局部最小值,但我不确定(我之前已经问过这个问题,人们告诉我不应该有局部最小值)。

在它工作的 90% 的时间里,我始终按以下顺序呈现我的输入:[0, 0], [0, 1], [1, 0], [1, 0]预期输出设置为[0, 1, 1, 0]. 当我以相同的顺序一致地呈现值时,网络最终会学习该模式。实际上,我发送它的顺序并不重要,只要每个时期的顺序完全相同。

然后我实现了训练集的随机化,所以这次输入的顺序是充分随机的。我现在注意到我的神经网络卡住了并且错误正在减少,但速度非常小(每个时期都在变小)。一段时间后,错误开始围绕一个值波动(因此错误停止减少)。

我是这个主题的新手,到目前为止我所知道的一切都是自学的(阅读教程、论文等)。为什么输入的呈现顺序会改变我的网络的行为?是不是因为从一个输入到下一个输入的误差变化是一致的(因为顺序是一致的),这让网络很容易学习?

我能做些什么来解决这个问题?我正在检查我的反向传播算法,以确保我已经正确地实现了它;目前它是通过学习率和动量实现的。我正在考虑查看其他增强功能,例如自适应学习率。然而,XOR 网络通常被描述为一个非常简单的网络,所以我认为我不需要使用复杂的反向传播算法。

4

1 回答 1

7

您将包含训练集的观察(输入向量)呈现给网络的顺序仅在一个方面很重要——根据响应变量随机排列观察比有序排列更可取。

例如,假设您有 150 个观察值组成您的训练集,并且每个响应变量是三个类别标签(I 类、II 类或 III 类)之一,因此观察值 1-50 属于 I 类,51-100 属于II 类和 III 类中的 101-50。您不想做的是按该顺序将它们呈现给网络。换句话说,您不希望网络看到 I 类中的所有 50 个观测值,然后是 II 类中的所有 50 个,然后是 III 类中的所有 50 个。

在训练分类器期间发生了什么?好吧,最初您将四个观察结果呈现给您的网络,无序 [0, 1, 1, 0]。

我想知道在您的网络无法收敛的情况下,输入向量的顺序是什么?如果它是 [1, 1, 0, 0] 或 [0, 1, 1, 1],这与我上面提到的这个有据可查的经验规则是一致的。

另一方面,我不得不怀疑这条规则是否适用于你的情况。原因是你的训练实例太少了,即使顺序是 [1, 1, 0, 0],在多个 epoch 上进行训练(我相信你必须这样做)将意味着这个排序看起来更加“随机”而不是我上面提到的示例(即 [1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0] 是如何在三个时期内向网络呈现训练数据) .

诊断问题的一些建议:

  1. 正如我上面提到的,看看你的输入向量在非收敛情况下的排序——它们是按响应变量排序的吗?

  2. 在非收敛的情况下,看看你的权重矩阵(我假设你有两个)。寻找任何非常大的值(例如,其他值的 100 倍,或初始化值的 100 倍)。大重量会导致溢出。

于 2011-11-12T03:32:39.633 回答