对于我的高级算法和数据结构课程,我的教授要求我们挑选任何感兴趣的主题。他还告诉我们研究它并尝试在其中实施解决方案。我之所以选择神经网络,是因为这是我长期想学的东西。
我已经能够使用神经网络实现AND,OR和XOR,神经网络的神经元使用激活器的阶跃函数。之后,我尝试实现一个反向传播神经网络,学习识别XOR运算符(使用sigmoid函数作为激活器)。通过使用3-3-1网络(输入和隐藏层的1个偏差,随机初始化权重),我能够在90%的时间内使其工作。在其他时候它似乎陷入了我认为是当地的最小值,但我不确定(我之前已经问过这个问题并且人们告诉我不应该有本地最小值)。
90%的工作时间,我始终按此顺序显示输入:[0, 0], [0, 1], [1, 0], [1, 0]
,预期输出设置为[0, 1, 1, 0]
。当我以相同的顺序一致地呈现值时,网络最终会学习该模式。它实际上并不重要我发送它的顺序,只要它是每个纪元的完全相同的顺序。
然后我实施了训练集的随机化,所以这次输入的顺序足够随机化。我现在已经注意到我的神经网络卡住而且错误正在减少,但是速度很慢(每个时期都会变小)。过了一会儿,错误开始在一个值周围振荡(所以错误停止减少)。
我是这个主题的新手,到目前为止我所知道的一切都是自学成才(阅读教程,论文等)。为什么输入的呈现顺序会改变我的网络行为?是因为从一个输入到下一个输入的错误变化是一致的(因为排序是一致的),这使得网络易于学习?
我该怎么做才能解决这个问题?我正在检查我的反向传播算法,以确保我已经正确实现了它;目前,它以学习率和动力实现。我正在考虑其他增强功能,如自适应学习率。但是,XOR网络通常被描绘成一个非常简单的网络,因此我认为我不需要使用复杂的反向传播算法。
答案 0 :(得分:7)
您将包含训练集的观察结果(输入向量)呈现给网络的顺序仅在一个方面 - 根据响应变量的随机排列 / em>与订购安排相比是强烈优先的。
例如,假设您有150个观察值包含您的训练集,并且每个响应变量是三个类别标签之一(I类,II类或III类),因此观察值1-50属于I类,51第二类为-100,第三类为101-50。您不想做的是按顺序将它们呈现给网络。换句话说,你不希望网络看到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]是网络如何在三个时期内呈现训练数据) 。
诊断问题的一些建议:
如上所述,请看非收敛情况下输入向量的排序 - 它们是否按响应变量排序?
在非收敛情况下,查看你的权重矩阵(我假设你有两个)。查找任何非常大的值(例如,100x其他值,或100x初始化的值)。较大的重量会导致溢出。