随机化输入顺序对神经网络的影响

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

我已经能够使用神经网络实现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 答案

您将包含训练集的观察(输入向量)呈现给网络的顺序仅在一个方面 - 根据响应变量随机排列观察 与有序安排相比,是强烈优先的

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

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

我想知道在你的网络无法收敛的情况下输入向量的排序是什么?如果它是[1,1,0,0]或[0,1,1,1],这与我上面提到的这个充分记录的经验规则是一致的。

On the other hand, i have to wonder whether this rule even applies in your case. The reason is that you have so few training instances that even if the order is [1, 1, 0, 0], training over multiple epochs (which i am sure you must be doing) will mean that this ordering looks more "randomized" rather than the exemplar i mentioned above (i.e., [1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0] is how the network would be presented with the training data over three epochs).

Some suggestions to diagnose the problem:

  1. 如上所述,请查看非收敛情况下输入向量的顺序 - 它们是否按响应变量排序?

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

7
额外
感谢doug的信息。再说一遍,由于我是新手,我对所有术语都不是很熟悉。 “非收敛案例”是什么意思?就权重而言,我有两个权重向量:一个用于隐藏层的输入,另一个用于输出到输出层。
额外 作者 Vivin Paliath,
这让我陷入了一个愚蠢的错误。输入并不对应于确保网络没有学到任何东西的输出!我还修改了我的反向传播算法,只有在为网络中的所有节点计算出错误之后才调整权重。
额外 作者 Vivin Paliath,
谢谢你的链接;它看起来非常有用!另外,感谢您提出的使我的代码不易出错的建议!
额外 作者 Vivin Paliath,
@VivinPaliath“非收敛”情况只是指那些网络没有收敛于结果的情况 - 即哪个数据点导致它被卡住。我建议吧。你知道神经网络comp.ai常见问题吗? IMO,迄今为止最好的NN资源 - 最权威,最全面,最令人惊讶,最容易阅读(完全以FAQ格式)。 faqs.org/faqs/ai-faq/neural-网/第一部分/ preamble.html 。共有7个部分,您可以下载pdf格式的全部7个。
额外 作者 doug,
@VivinPaliath很高兴知道你解决了它。所以你重新排序了你的输入数组,但忘记了同样重新排序相应的目标 - 我已经做了一百万次。如果您使用python或matlab,一种简单的方法来避免它,只需将输入+目标保持在一起作为单个2D('数据')矩阵,因此不要将每个绑定到单独的变量(输入,目标),而只需使用索引/切片关于组合数据矩阵的表示法,例如,输入是数据[:,: - 1],目标是数据[:, - 1]
额外 作者 doug,