Tanh(双曲正切)是一种激活函数,它能将输入值转换为介于 -1 和 1 之间的数值。
从数学上讲,它的定义如下:
f(x) = \tanh(x) = \frac{e^x – e^{-x}}{e^x + e^{-x}} = \frac{\sinh(x)}{\cosh(x)}
其中:
- e 是欧拉数(约等于 2.718)。
- x 是函数的输入值。
Tanh 激活函数的图像如下所示:
!tanhTanh 激活函数图像
- 随着输入变得越来越正,输出会趋近于 1。
- 随着输入变得越来越负,输出会趋近于 -1。
- 当 x=0 时,输出为 0,这是函数的中心点。
该函数具有以下特性:
- 形状:它呈现 S 形曲线,通常被称为类似 Sigmoid 的曲线。
- 对称性:tanh 函数围绕原点 (0) 对称,这一点与其他激活函数(如输出范围在 0 到 1 之间的 Sigmoid 函数)不同。
为什么要在神经网络中使用 Tanh?
Tanh 函数拥有几个显著的优势,这使其在神经网络中得到了广泛应用:
- 非线性:Tanh 为模型引入了非线性,这使得神经网络能够学习数据中的复杂模式和关系。如果没有非线性激活函数,无论神经网络有多少层,它在本质上都将表现为一个线性模型。
- 零中心化:与输出值介于 0 和 1 之间的 Sigmoid 函数不同,Tanh 函数的输出是围绕 0 对称的。这使得 Tanh 激活函数在许多类型的任务中更为实用,因为其输出均值更接近于零,从而有助于提高训练效率并加快收敛速度。
- 梯度表现:与 Sigmoid 激活函数相比,Tanh 有助于缓解梯度消失问题(在一定程度上)。这是因为 tanh 函数的梯度通常高于 sigmoid 函数的梯度,能够在反向传播过程中实现更好的权重更新。
Tanh 的导数
Tanh 函数的导数在训练神经网络的反向传播步骤中也非常有用:
\frac{d}{dx} \tanh(x) = 1 – \tanh^2(x)
!Derivative-of-Tanh-Tanh 激活函数的导数图像
该导数始终为正,且在 x=0 处达到最大值,这有助于基于梯度的优化。然而,与 Sigmoid 类似,当输入值过大或过小时,tanh 也会受到梯度消失问题的困扰。这会导致梯度变得非常小,从而在深层网络中减缓训练速度。
使用 Tanh 的优势
- 零点对称:由于输出围绕零对称,网络更有可能平衡权重。这有助于确保梯度不会持续增大或减小幅度,从而使训练更快、更稳定。
- 改进的收敛性:Tanh 函数是可微的,使其成为使用随机梯度下降(SGD)等基于梯度的优化算法训练深度网络的理想选择。
- 梯度下降效率:与限制在 0 和 1 之间的 Sigmoid 不同,tanh 函数介于 -1 和 1 之间的输出有助于在训练期间更好地更新权重,从而提高收敛速度。
Tanh 的劣势
- 梯度消失问题:与 Sigmoid 函数类似,当输入值较大(无论是正还是负)时,tanh 会遭受梯度消失问题。当 tanh 函数的输入非常大或非常小时,梯度会趋近于零,这可能会在反向传播期间减慢或停止学习,特别是在深层网络中。
- 并非适用于所有任务:虽然 tanh 在很多情况下效果良好,但对于所有类型的神经网络架构来说,它可能不是最佳选择。例如,ReLU(线性整流单元)由于其在缓解梯度消失问题上的简单性和高效性,在深度网络中越来越受欢迎。
- 对异常值敏感:输入中的极端值可能导致梯度接近零的饱和区域,从而使学习变得缓慢或无效。如果 tanh 函数的输入没有得到适当的缩放,就可能会发生这种情况。
何时使用 Tanh?
在以下情况下,Tanh 函数非常有用:
- 数据已经归一化或围绕零中心化。
- 我们正在构建浅层神经网络(即层数较少的网络)。
- 我们正在处理负值很重要且需要保留的数据。
然而,对于更深层的网络,ReLU 或 Leaky ReLU 等替代方案可能更好,因为它们能更有效地避免梯度消失问题。