【问题标题】:Neural Network with tanh wrong saturation with normalized data具有标准化数据的 tanh 错误饱和度的神经网络
【发布时间】:2023-04-04 14:05:01
【问题描述】:

我正在使用一个由 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)

如何避免这种饱和错误?

【问题讨论】:

  • 所以这可能不是我的域,但我完全不知道如何从给定的信息中解决这个问题。我也不知道“tanh”是拼写错误还是双曲正切。
  • tanh 是双曲正切 :)

标签: neural-network


【解决方案1】:

激活函数的渐近线饱和是神经网络的常见问题。如果你看一下函数图,就不会感到惊讶:它们几乎是平的,这意味着一阶导数(几乎)为 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)

【讨论】:

  • 导数错误,应该是:f'(x) = 1.14393 * (1- tanh^2 ( 2/3 * x)) => f'(x) = 0.6667 * 1.7159 * (1 - tanh(2/3 *x)) * (1 + tanh(2/3 * x))) => f'(x) = 0.6667 / 1.7159 * (1.7159 - 1.7159*tanh(2/3 * x)) * (1.7159 + 1.7159*tanh(2/3 * x))' => f'(x) = 0.6667/1.7159 * (1.7159 - f(x))*(1.7159 + f(x))
  • 我用数字检查了导数 github.com/hughperkins/ClConvolve/blob/master/notes/… ,你的公式是正确的 Fukuzawa。
【解决方案2】:

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

您可以添加Momentum factor 以确保根据以前的经验进行一些修正,即使导数为零。

您也可以通过 epoch 对其进行训练,在实际更新之前累积权重的 delta 值(与每次迭代更新相比)。这也缓解了 delta 值在两个值之间波动的情况。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • @danelliotster 您能否编辑您的答案以显示衍生品将如何更明智。我匆忙投了反对票。除非有编辑,否则我现在无法撤消它。
    猜你喜欢
    • 2017-07-25
    • 2019-01-07
    • 2016-07-22
    • 2017-12-21
    • 1970-01-01
    • 2017-03-30
    • 2015-03-05
    • 2013-08-08
    • 2018-04-10
    相关资源
    最近更新 更多