$$\text{tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}也可以等价写成:\text{tanh}(x) = 2\text{sigmoid}(2x) - 1$$
能看出它和 sigmoid 函数(映射到 [0,1])是近亲。
一、 RNN 中 tanh 的核心作用
传统 RNN 的核心计算公式是: $$h_t = \tanh(W_h \cdot [h_{t-1}, x_t] + b_h)$$ 这里的 tanh 承担两个关键角色:
- 非线性变换:如果没有 tanh,RNN 就退化成了“线性循环模型”,无法捕捉序列中的复杂依赖关系(比如“喜欢”和“吃”的动作关联);
- 数值规范化:把隐藏状态 $h_t$ 的值限制在 [-1, 1] 区间内,避免随着序列步数增加,数值越来越大(梯度爆炸)或越来越小(梯度消失)。
举个例子(还是“我 喜欢 吃 苹果”):
- t=1:输入“我” → 计算 $W_h \cdot [h_0, x_1] + b_h$ 可能得到任意大小的数值 → 经过 tanh 后,$h_1$ 被缩到 [-1, 1];
- t=2:输入“喜欢”+ $h_1$ → 同样先计算加权和,再用 tanh 规范化,得到 $h_2$;
- 全程靠 tanh 保证 $h_t$ 的值稳定,这是 RNN 能正常训练的基础。
二、 RNN 用 tanh 而非 sigmoid 的原因
和 LSTM 门控用 sigmoid 不同,RNN 的隐藏状态更新必须用 tanh,核心原因是:
| 特性 | tanh 函数 | sigmoid 函数 | RNN 选择逻辑 |
|---|---|---|---|
| 输出区间 | [-1, 1](零均值) | [0, 1](非零均值) | 零均值输出能让梯度传递更顺畅,避免 “梯度偏移”(所有值都偏向 0 或 1); |
| 梯度范围 | 0 ~ 1(x=0 时梯度 = 1) | 0 ~ 0.25(x=0 时梯度 = 0.25) | tanh 梯度更大,能缓解 RNN 本身就严重的梯度消失问题; |
简单说:RNN 本身梯度消失问题就突出,用 tanh 能尽可能让梯度 “传得远一点”,而 sigmoid 梯度太小,会让 RNN 完全无法学习长依赖。
三、 RNN 与 LSTM 中 tanh 的用法对比
| 位置 | RNN 中的 tanh | LSTM 中的 tanh |
|---|---|---|
| 作用 | 生成隐藏状态 (h_t)(核心) | 生成候选记忆 (\tilde{C}_t) + 缩放细胞状态 (C_t)(辅助) |
| 唯一性 | 唯一激活函数 | 与 sigmoid 配合使用(门控用 sigmoid) |
| 必要性 | 必须用,否则退化成线性模型 | 可替换(比如用 ReLU),但 tanh 是默认选择 |
总结
- RNN 不仅用 tanh,还是核心且唯一的激活函数,没有它 RNN 就失去了非线性能力;
- RNN 选 tanh 是为了零均值输出 + 更大梯度,缓解自身的梯度消失问题;
- LSTM 里 tanh 是 “辅助角色”(规范化信息),而 sigmoid 负责门控开关,两者分工明确。
简单记:RNN 靠 tanh 撑起来非线性和数值稳定,LSTM 靠 tanh 规范信息、sigmoid 控制门开关。