11

我正在使用一个由 4 个输入神经元组成的神经网络,一个由 20 个神经元组成的隐藏层和一个 7 个神经元输出层。

我正在尝试为 bcd 到 7 段算法训练它。我的数据已标准化 0 为 -1,1 为 1。

当输出错误评估发生时,神经元饱和错误。如果期望的输出是1并且实际输出是-1,则错误是1-(-1)= 2

当我将它乘以激活函数的导数时error*(1-output)*(1+output),误差几乎变成了0因为2*(1-(-1)*(1-1)

如何避免这种饱和错误?

4

3 回答 3

12

激活函数的渐近线饱和是神经网络的一个常见问题。如果你看一下函数图,就不会感到惊讶:它们几乎是平的,这意味着一阶导数(几乎)为 0。网络无法再学习。

一个简单的解决方案是缩放激活函数来避免这个问题。例如,使用 tanh() 激活函数(我最喜欢),当期望的输出在 {-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-30T17:13:10.007 回答
1

无论您使用什么功能,这都一定会发生。根据定义,当输出达到两个极端之一时,导数将为零。自从我使用人工神经网络以来已经有一段时间了,但如果我没记错的话,这(在许多其他事情中)是使用简单反向传播算法的限制之一。

您可以添加一个动量因子,以确保根据以前的经验进行一些修正,即使导数为零。

您也可以通过 epoch 来训练它,在实际更新之前累积权重的 delta 值(与每次迭代更新它相比)。这也减轻了增量值在两个值之间波动的情况。

可能有更高级的方法,例如反向传播的二阶方法,可以缓解这个特定问题。

但是,请记住,tanh 在无穷大处达到 -1 或 +1,这个问题纯粹是理论上的。

于 2012-11-29T20:00:31.440 回答
0

不完全确定我是否正确阅读了这个问题,但如果是这样,您应该在 0.9 和 -0.9 之间调整您的输入和目标,这将有助于您的衍生产品更加理智。

于 2012-11-30T04:29:37.837 回答