为什么 tanh 作为激活函数几乎总是比 sigmoid 好?

机器算法验证 机器学习 神经网络 反向传播 S形曲线
2022-01-23 03:38:36

在 Andrew Ng在 Coursera 上的神经网络和深度学习课程中,他说使用几乎总是比使用更可取。tanhsigmoid

他给出的原因是使用的输出以0 为中心,而不是的 0.5,这“使下一层的学习更容易一些”。tanhsigmoid

  1. 为什么将激活的输出居中会加速学习?我假设他指的是前一层,因为学习发生在反向传播期间?

  2. 是否还有其他使更受欢迎的功能?更陡峭的梯度会延迟梯度消失吗?tanh

  3. 是否有任何情况下更可取?sigmoid

数学轻,直观的答案首选。

4个回答

Yan LeCun 等人在Efficient BackProp中争论说

如果训练集上每个输入变量的平均值接近于零,收敛速度通常会更快。要看到这一点,请考虑所有输入都是正数的极端情况。第一个权重层中特定节点的权重按与成比例的量更新,其中是该节点的(标量)误差,是输入向量(参见方程(5)和(10))。当输入向量的所有分量都是正数时,输入节点的所有权重更新都将具有相同的符号(即符号())。结果,这些权重只能一起减少或全部增加δxδxδ对于给定的输入模式。因此,如果权重向量必须改变方向,它只能通过低效且非常缓慢的锯齿形来实现。

这就是为什么您应该标准化输入以使平均值为零的原因。

同样的逻辑也适用于中间层:

这种启发式应该应用于所有层,这意味着我们希望节点输出的平均值接近于零,因为这些输出是下一层的输入。

后记@craq 指出,这句话对 ReLU(x)=max(0,x) 没有意义,它已成为一种广泛流行的激活函数。虽然 ReLU 确实避免了 LeCun 提到的第一个 zigzag 问题,但它并没有解决 LeCun 所说的将平均值推到零很重要的第二点。我很想知道 LeCun 对此有何评论。无论如何,有一篇名为Batch Normalization的论文,它建立在 LeCun 的工作之上,并提供了一种解决这个问题的方法:

众所周知(LeCun et al., 1998b; Wiesler & Ney, 2011)如果输入被白化,网络训练收敛速度更快——即线性变换为具有零均值和单位方差,并且去相关。由于每一层都观察下层产生的输入,因此对每一层的输入实现相同的白化将是有利的。


顺便说一句,Siraj 的这个视频在 10 分钟有趣的时间里解释了很多关于激活功能的内容。


@elkout 说“与 sigmoid (...) 相比,tanh 更受欢迎的真正原因是 tanh 的导数大于 sigmoid 的导数。”

我认为这不是问题。我从未在文献中看到这是一个问题。如果一个导数小于另一个导数让您感到困扰,您可以对其进行缩放。

逻辑函数的形状为通常,我们使用的另一个值来使您的导数更宽。σ(x)=11+ekxk=1k


Nitpick:tanh 也是一个sigmoid函数。任何具有 S 形状的函数都是 sigmoid。你们所说的 sigmoid 是逻辑函数。逻辑函数之所以更受欢迎是历史原因。它已被统计学家使用了更长的时间。此外,有些人认为它在生物学上更合理。

并不是说它一定比好。换句话说,不是激活函数的中心使它变得更好。并且这两个功能背后的理念是相同的,它们也有着相似的“趋势”。不用说,函数被称为函数的转换版本。sigmoidtanhsigmoid

相比更受欢迎的真正原因,尤其是当您通常难以快速找到局部(或全局)最小值时,尤其是在涉及大数据时,是大于的导数。换句话说,如果你使用作为激活函数,你可以更快地最小化你的成本函数。tanhsigmoidtanhsigmoidtanh

但是为什么双曲正切有更大的导数呢?只是为了给您一个非常简单的直觉,您可以观察下图:

Sigmoid 与双曲正切

与 0 和 1 相比,范围在 -1 和 1 之间的事实使得函数对神经网络更方便。除此之外,如果我使用一些数学,我可以证明:

tanhx=2σ(2x)1

通常,我们可以证明在大多数情况下 .|tanh(x)x|>|σ(x)x|

这一切本质上取决于激活函数的导数,sigmoid 函数的主要问题是其导数的最大值为 0.25,这意味着 W 和 b 的值的更新将很小。

另一方面,tanh 函数的导数高达 1.0,使得 W 和 b 的更新量大得多。

这使得 tanh 函数作为激活函数(对于隐藏层)几乎总是比 sigmoid 函数更好。

为了自己证明这一点(至少在一个简单的情况下),我编写了一个简单的神经网络并使用 sigmoid、tanh 和 relu 作为激活函数,然后我绘制了误差值如何演变的图,这就是我得到的。

在此处输入图像描述

我写的完整笔记本在这里https://www.kaggle.com/moriano/a-showcase-of-how-relus-can-speed-up-the-learning

如果有帮助,这里是 tanh 函数和 sigmoid 函数的导数图表(注意垂直轴!)

在此处输入图像描述

在此处输入图像描述

回答到目前为止尚未解决的部分问题:

Andrew Ng 说,使用逻辑函数(通常称为 sigmoid)只在二元分类网络的最后一层才有意义。

由于网络的输出预计在之间,因此逻辑是一个完美的选择,因为它的范围正好是不需要缩放和转换01(0,1)tanh