我正在使用一个由4个输入神经元组成的神经网络,一个由20个神经元组成的隐藏层和一个7个神经元的输出层。
我正试着用bcd to 7分段算法来训练它。我的数据是标准化的,0是-1,1是1。
当输出误差评估发生时,神经元饱和错误。如果期望输出为1,而实际输出为-1,则错误为1-(-1)= 2。
当我将它乘以激活函数error*(1-output)*(1+output)的导数时,由于2*(1-(-1)*(1-1),误差几乎变成了0。
如何避免这种饱和度错误?
发布于 2012-12-01 01:13:10
在激活函数的渐近线饱和是神经网络的一个常见问题。如果你看一下函数的图形,就不会感到惊讶:它们几乎是平的,这意味着一阶导数(几乎)为0。网络不能再学习了。
一个简单的解决方案是缩放激活函数以避免此问题。例如,对于tanh()激活函数(my favorite),当期望输出在{-1,1}中时,建议使用以下激活函数:
f(x) = 1.7159 * tanh( 2/3 * x) 因此,导数是
f'(x) = 1.14393 * (1- tanh( 2/3 * x)) 这将迫使梯度进入最非线性的值范围,并加快学习。有关所有细节,我推荐您阅读Yann LeCun的优秀论文Efficient Back-Prop。在tanh()激活函数的情况下,误差将计算为
error = 2/3 * (1.7159 - output^2) * (teacher - output)发布于 2012-11-30 04:00:31
无论你使用什么函数,这种情况都会发生。根据定义,当输出达到两个极端之一时,导数将为零。我使用人工神经网络已经有一段时间了,但如果我没记错的话,这(在其他许多事情中)是使用简单反向传播算法的局限性之一。
您可以添加一个Momentum factor,以确保基于以前的经验进行一些校正,即使导数为零。
你也可以通过epoch来训练它,在进行实际的更新之前,你可以累积权重的增量值(与每次迭代更新相比)。这也缓解了增量值在两个值之间振荡的情况。
可能有更先进的方法,比如反向传播的二阶方法,可以缓解这个特定的问题。
但是,请记住,tanh在无穷大处达到-1或+1,这个问题纯粹是理论上的。
发布于 2012-11-30 12:29:38
我不完全确定我是否正确地理解了这个问题,但如果是这样的话,你应该在0.9到-0.9之间调整你的输入和目标,这将有助于你的导数更合理。
https://stackoverflow.com/questions/13632976
复制相似问题