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

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网络通常被描述为非常简单的网络,因此我认为我不需要使用复杂的反向传播算法。
1个回答

7
你呈现训练集中的观测值(输入向量)给网络的顺序只有一个方面很重要——根据响应变量随机排列观测值,而不是按顺序排列。例如,假设你有150个观测值组成的训练集,每个观测值的响应变量是三个类标签之一(I类、II类或III类),其中1-50号观测值属于I类,51-100号属于II类,101-50号属于III类。你不想按照这种顺序呈现它们给网络。换句话说,你不希望网络先看到所有属于I类的50个观测值,然后看到所有属于II类的50个观测值,最后看到所有属于III类的50个观测值。
在训练分类器期间发生了什么?最初你将四个观测值以无序方式[0, 1, 1, 0]呈现给网络。
我想知道在网络无法收敛的情况下,输入向量的排序方式是什么?如果是[1, 1, 0, 0]或[0, 1, 1, 1],那么这与我上面提到的经验规则是一致的。
另一方面,我必须怀疑这个规则是否适用于你的情况。原因是你的训练实例太少了,即使顺序是[1, 1, 0, 0],进行多次训练时(我相信你一定会这样做),这种排序看起来更加“随机化”,而不是上面提到的范例(即[1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0]是网络在三个时期内呈现训练数据的方式)。
诊断问题的一些建议:
1. 正如我上面所提到的,查看非收敛情况下输入向量的排序方式——它们是否按响应变量排序? 2. 在非收敛情况下,查看你的权重矩阵(我假设你有两个)。查找任何非常大的值(例如,比其他值大100倍,或比其初始化值大100倍)。大的权重可能会导致溢出。

1
谢谢信息,道格。由于我是初学者,对所有术语都不太熟悉。你所说的“非收敛情况”是什么意思?就权重而言,我有两个权重向量:一个用于输入到隐藏层,另一个用于输入到输出层。 - Vivin Paliath
1
这是一个愚蠢的错误,让我失败了。输入与输出不对应,导致网络没有学到任何东西!我还修改了我的反向传播算法,只有在计算完整个网络中所有节点的误差后才调整权重。 - Vivin Paliath
2
@VivinPaliath "non-convergence" cases指的是那些网络没有收敛到结果的情况,也就是哪个数据点导致它陷入困境。让我给你提个建议。你知道神经网络comp.ai FAQ吗?在我看来,这是迄今为止最好的神经网络资源——最权威、最全面,而且令人惊讶的是,阅读起来最容易(完全以FAQ格式呈现)。http://www.faqs.org/faqs/ai-faq/neural-nets/part1/preamble.html。它分为7个部分,你可以下载全部7个部分的PDF文件。 - doug
1
@VivinPaliath 很高兴知道你解决了它。所以你重新排列了输入数组,但忘记了同样地重新排列相应的目标——我可能已经做过那个动作一百万次了。如果你使用Python或Matlab,避免这种情况的一个简单方法是将输入和目标作为单个2D(“数据”)矩阵保持在一起,因此不要将每个绑定到单独的变量(输入,目标),只需在组合数据矩阵上使用索引/切片表示任何一个,例如,输入为data[:,:-1],目标为data[:,-1]。 - doug
谢谢你提供的链接,看起来非常有帮助!另外,感谢你对让我的代码更少出错的建议! - Vivin Paliath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接