我正在使用由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).
如何避免此饱和错误?
小智 9
激活函数渐近线的饱和度是神经网络的常见问题.如果你看一下这个函数的图形,就不会感到惊讶:它们几乎是平的,这意味着一阶导数(几乎)为0.网络不能再学习了.
一个简单的解决方案是缩放激活功能以避免此问题.例如,使用tanh()激活函数(我最喜欢的),当所需输出在{-1,1}时,建议使用以下激活函数:
f(x) = 1.7159 * tanh( 2/3 * x)
Run Code Online (Sandbox Code Playgroud)
因此,衍生物是
f'(x) = 1.14393 * (1- tanh( 2/3 * x))
Run Code Online (Sandbox Code Playgroud)
这将迫使梯度进入最非线性值范围并加速学习.对于所有细节,我建议阅读Yann LeCun的优秀论文Efficient Back-Prop.在tanh()激活函数的情况下,误差将计算为
error = 2/3 * (1.7159 - output^2) * (teacher - output)
Run Code Online (Sandbox Code Playgroud)