我正在使用由4个输入神经元组成的神经网络,1个由20个神经元组成的隐藏层和7个神经元输出层。
我正在尝试将其训练为bcd到7段算法。我的数据被归一化0是-1而1是1。
当输出错误评估发生时,神经元饱和错误。如果所需输出为1
且实际输出为-1
,则错误为1-(-1)= 2
。
当我将其乘以激活函数error*(1-output)*(1+output)
的导数时,由于0
,错误几乎变为2*(1-(-1)*(1-1)
。
如何避免此饱和错误?
答案 0 :(得分:9)
激活函数渐近线的饱和度是神经网络的常见问题。如果你看一下这个函数的图形,就不会感到惊讶:它们几乎是平的,这意味着一阶导数是(几乎)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)
答案 1 :(得分:1)
无论您使用什么功能,都必然会发生这种情况。根据定义,当输出达到两个极值中的一个时,导数将为零。自从我使用人工神经网络以来已经有一段时间了,但如果我没记错的话,这(以及许多其他事情)是使用简单反向传播算法的局限之一。
您可以添加Momentum factor以确保根据之前的经验进行一些更正,即使衍生工具为零。
您还可以按时期训练它,在执行实际更新之前,您会累积权重的增量值(与每次迭代更新时相比)。这也减轻了delta值在两个值之间振荡的条件。
可能有更多高级方法,例如用于反向传播的二阶方法,可以缓解这一特定问题。
然而,请记住,tanh在无穷大处达到-1或+1,问题纯粹是理论上的。
答案 2 :(得分:0)
不完全确定我是否正确地阅读了这个问题,但如果是这样,你应该将你的输入和目标扩展到0.9和-0.9之间,这将有助于你的衍生品更加理智。