常见激活函数之tanh激活函数

激活函数的作用:为神经网络引入非线性,使模型能拟合复杂的非线性关系。

激活函数的必要性:若激活函数为线性,多层网络会退化为单层线性模型,无法学习复杂模式。

上期介绍了sigmoid激活函数,今天介绍另一个常见的激活函数------tanh激活函数

tanh激活函数

**tanh(双曲正切函数)**是神经网络中非常经典且常用的一种激活函数。它主要用于引入非线性,使神经网络能够学习复杂的模式。

1. 它的数学公式

tanh 函数的数学表达式为:

tanh⁡(x)=ex−e−xex+e−x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x

它也可以用 Sigmoid 函数 σ(x)\sigma(x)σ(x) 来表示:

tanh⁡(x)=2σ(2x)−1 \tanh(x) = 2\sigma(2x) - 1 tanh(x)=2σ(2x)−1

2. 几何特征与性质

  • 输出范围 :(−1,1)(-1, 1)(−1,1)。这意味着它的输出是零中心化的。

  • 形状:呈现"S"型曲线。

  • 对称性 :它是奇函数,关于原点对称,即 tanh⁡(−x)=−tanh⁡(x)\tanh(-x) = -\tanh(x)tanh(−x)=−tanh(x)。

  • 关键点

    • 当 x=0x = 0x=0 时,tanh⁡(0)=0\tanh(0) = 0tanh(0)=0。
    • 当 x→+∞x \to +\inftyx→+∞ 时,tanh⁡(x)→1\tanh(x) \to 1tanh(x)→1。
    • 当 x→−∞x \to -\inftyx→−∞ 时,tanh⁡(x)→−1\tanh(x) \to -1tanh(x)→−1。

    Tanh 的函数图像、导数图像如下:

3. 导数(梯度)

在反向传播中需要用到激活函数的导数,tanh 的导数非常简洁:

tanh⁡′(x)=1−tanh⁡2(x) \tanh'(x) = 1 - \tanh^2(x) tanh′(x)=1−tanh2(x)

  • 导数的范围是 (0,1](0, 1](0,1]。
  • 当 x=0x = 0x=0 时,导数取得最大值 111。
  • 当 ∣x∣|x|∣x∣ 很大时(即进入曲线的饱和区),导数趋近于 000。

4. 优点

  • 零中心化输出:这是 tanh 相比于 Sigmoid 函数最大的优势。因为输出均值为 0,这使得下一层的输入均值也接近于 0。在梯度下降中,权重更新的方向不会出现"Z字型"震荡,从而使收敛速度更快(最后会有详细解释)。
  • 梯度更强:在原点附近,tanh 的最大导数为 1,而 Sigmoid 的最大导数仅为 0.25。这意味着在未饱和区域,tanh 传递梯度的效率比 Sigmoid 更高。

5. 缺点

  • 梯度消失问题 :虽然比 Sigmoid 好一点,但当输入 xxx 的绝对值较大时(例如 ∣x∣>3|x| > 3∣x∣>3),函数进入饱和区,导数趋近于 0。在深层网络中,这会导致梯度在反向传播时层层衰减,最终导致前面的网络层无法更新权重。
  • 计算开销 :包含指数运算(exe^xex),在庞大的神经网络中计算成本略高于 ReLU 等线性分段的激活函数。

6. tanh vs. Sigmoid 对比

特性 Sigmoid tanh
公式 11+e−x\frac{1}{1 + e^{-x}}1+e−x1 ex−e−xex+e−x\frac{e^x - e^{-x}}{e^x + e^{-x}}ex+e−xex−e−x
输出范围 (0,1)(0, 1)(0,1) (−1,1)(-1, 1)(−1,1)
零中心化 否(输出全正)
最大梯度 0.250.250.25 111
主要用途 二分类输出层(输出概率) 隐藏层激活

7. 常见应用场景

  1. RNN/LSTM/GRU 中的隐藏状态:在循环神经网络(RNN)及其变体中,tanh 是默认的激活函数,用于控制状态信息的流动和更新。因为它的零中心化特性有助于保持动态稳定性。
  2. 一般隐藏层:在早期的浅层神经网络中,隐藏层通常首选 tanh 而不是 Sigmoid。
  3. 回归任务的输出层 :如果目标数据的范围经过预处理缩放到了 −1,1-1, 1−1,1,可以使用 tanh 作为输出层激活函数。

8. 现代视角

在现代深度学习中,对于前馈神经网络(如 CNN、MLP)的隐藏层ReLU 及其变体(Leaky ReLU, GELU 等)已经基本取代了 tanh,因为 ReLU 在正区间没有梯度消失问题,且计算极快。但在循环神经网络(RNN) 架构中,tanh 依然扮演着不可替代的重要角色。


对优点那里零中心化的解释说明:

为什么"零中心化"就是"输出均值为0"?

"零中心化" 的字面意思是:数据分布的中心(即对称中心)在坐标轴的 000 处。

  • 对于 tanh 函数 :它的输出范围是 (−1,1)(-1, 1)(−1,1),且关于原点 (0,0)(0,0)(0,0) 对称。如果你向 tanh 输入一组均值为 0 的数据,它输出的数据会正负均匀分布,所有输出值加起来求平均,结果趋近于 000。所以它的输出是零中心化的,均值为 0
  • 对比 Sigmoid 函数 :它的输出范围是 (0,1)(0, 1)(0,1),所有的输出值都是正数。无论你怎么输入,它输出的数据全部分布在 000 到 111 之间。把这些正数加起来求平均,均值一定是一个大于 000 的数(通常在 0.50.50.5 左右)。所以 Sigmoid 不是 零中心化的,均值不为 0

在神经网络中,上一层的激活值(输出),就是下一层的输入。所以如果上一层用 tanh,下一层的输入均值就接近 0;如果用 Sigmoid,下一层的输入均值就全为正数。


为什么输入均值为 0,能避免"Z字型震荡"?

这就涉及到神经网络是怎么更新权重的了(即反向传播和梯度下降)。

假设我们有一个简单的神经元,计算公式为:

z=w1x1+w2x2+b z = w_1 x_1 + w_2 x_2 + b z=w1x1+w2x2+b

然后经过激活函数得到输出。

在反向传播时,我们需要计算损失函数对权重 w1w_1w1 和 w2w_2w2 的梯度(也就是它们需要更新的方向和幅度)。根据链式法则,梯度的计算公式中包含一个公共项,即上一层的输出 xxx(也就是当前层的输入):

∂L∂w1=∂L∂z⋅x1 \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial z} \cdot x_1 ∂w1∂L=∂z∂L⋅x1

∂L∂w2=∂L∂z⋅x2 \frac{\partial L}{\partial w_2} = \frac{\partial L}{\partial z} \cdot x_2 ∂w2∂L=∂z∂L⋅x2

注意这里的 x1x_1x1 和 x2x_2x2。由于我们在一个 Batch(批次)中训练,实际计算的是梯度的平均值

1. 如果使用 Sigmoid(输入 x1,x2x_1, x_2x1,x2 全是正数)

因为 x1>0x_1 > 0x1>0 且 x2>0x_2 > 0x2>0,所以 ∂L∂w1\frac{\partial L}{\partial w_1}∂w1∂L 和 ∂L∂w2\frac{\partial L}{\partial w_2}∂w2∂L 的符号(正负号)完全由 ∂L∂z\frac{\partial L}{\partial z}∂z∂L 决定

这就导致了一个致命问题:w1w_1w1 和 w2w_2w2 的梯度符号总是相同的!

  • 要么 ∂L∂z>0\frac{\partial L}{\partial z} > 0∂z∂L>0,导致 w1w_1w1 和 w2w_2w2 同时减小(往负方向走)。
  • 要么 ∂L∂z<0\frac{\partial L}{\partial z} < 0∂z∂L<0,导致 w1w_1w1 和 w2w_2w2 同时增大(往正方向走)。

想象一下你要去一个最优解(山谷最低点),它在你的右下方。

理想情况下,你应该往右走(w1w_1w1 增大),往下走(w2w_2w2 减小)。

但由于 Sigmoid 的特性,你的腿被绑在一起了,你只能往"右上"(同时增大)或"左下"(同时减小)走。

为了到达右下方,你只能先往"右上"走一点,再往"左下"走一点,再往"右上"走一点......这就形成了一个**"Z字型"的震荡路径**,极其低效。

2. 如果使用 tanh(输入 x1,x2x_1, x_2x1,x2 均值为 0,有正有负)

因为 x1x_1x1 和 x2x_2x2 有正有负,所以 ∂L∂w1\frac{\partial L}{\partial w_1}∂w1∂L 和 ∂L∂w2\frac{\partial L}{\partial w_2}∂w2∂L 的符号不再被强制绑定。

  • 如果 ∂L∂z>0\frac{\partial L}{\partial z} > 0∂z∂L>0:
    • 若 x1>0x_1 > 0x1>0,则 ∂L∂w1>0\frac{\partial L}{\partial w_1} > 0∂w1∂L>0(w1w_1w1 减小)。
    • 若 x2<0x_2 < 0x2<0,则 ∂L∂w2<0\frac{\partial L}{\partial w_2} < 0∂w2∂L<0(w2w_2w2 增大)。
    • 权重可以独立地变大或变小!

这就解开了你的束缚。如果最优解在右下方,你可以直接朝着"右下"的方向走(让对应的 w1w_1w1 增大,w2w_2w2 减小),路径几乎是直线,收敛速度自然就快得多,也不会有Z字型震荡了

总结

  • 零中心化 = 数据有正有负,对称分布在 000 两侧 = 均值为 0
  • 下一层输入均值为 0 = 梯度更新时各个权重的更新方向(正负号)可以互相独立
  • 权重更新独立 = 可以直接朝着最优解走 = 没有 Z 字型震荡,收敛快