新进展
我最近使用OpenCV的MLP实现来测试它是否能解决相同的问题。OpenCV能够对我的实现能够分类的相同数据集进行分类,但无法解决我的实现无法解决的那些数据集。可能这是由于终止参数(决定何时结束训练)的原因。我在100,000次迭代之前停止了训练,而MLP并未实现泛化。这次的网络架构是400个输入神经元,10个隐藏神经元和2个输出神经元。
我已经实现了多层感知器算法,并验证了它对XOR逻辑门有效。对于光学字符识别,我训练网络正确分类用粗绘图工具(标记笔)绘制的“A”和“B”字母。然而,当我尝试训练网络分类用细绘图工具(铅笔)绘制的字母时,网络似乎陷入了一个低谷,无法在合理的时间内对字母进行分类。对于用GIMP绘制的字母也是如此。
我知道人们说我们必须使用动量来摆脱低谷,但我在阅读的资料中对此描述得不够明确。我尝试在误差变化不显著时增加动量值,在误差变化显著时减少,但似乎没有帮助。
我的网络架构是400个输入神经元(每个像素一个),两个隐藏层各有25个神经元,输出层有2个神经元。图像是灰度图像,输入为黑色像素-0.5,白色像素0.5。
编辑:
目前,网络在每个训练样本的计算误差低于可接受的误差常数之前一直进行训练。我还尝试在10,000个周期后停止训练,但这会导致预测结果不佳。使用的激活函数是S形逻辑函数。我使用的误差函数是误差平方和。
我认为我可能达到了局部最小值而不是低谷,但这不应该反复发生。
回答:
动量并不总是好的,它可以帮助模型跳出坏的低谷,但也可能使模型跳出好的低谷。特别是当之前的权重更新方向不好时。
有几个原因可能导致你的模型表现不佳。参数设置不当,设置MLP的参数始终是一项非平凡的任务。
一个简单的方法是首先将学习率、动量权重和正则化权重设置为较大的数值,但将迭代次数(或周期)设置为非常大的数值。一旦模型发散,就将学习率、动量权重和正则化权重减半。
这种方法可以使模型缓慢收敛到局部最优,同时也给它跳出坏的低谷的机会。
此外,在我看来,对于两类问题,一个输出神经元就足够了。如果没有必要,不需要增加模型的复杂性。同样,如果可能,使用三层MLP而不是四层MLP。