共计 1862 个字符,预计需要花费 5 分钟才能阅读完成。
背景:RNN 的梯度消失问题
传统 RNN 在时间步 $t$ 的隐状态计算为:
$$h_t = \sigma(W_h h_{t-1} + W_x x_t + b)$$
通过链式法则计算梯度时会出现权重矩阵 $W_h$ 的连乘,当 $W_h$ 的特征值小于 1 时,梯度呈指数级衰减。这种现象导致:

- 长距离依赖难以学习
- 参数更新停滞不前
- 模型只能记住短期模式
LSTM 的核心结构设计
1. 门控机制的三重奏
LSTM 通过三个门控制信息流:
-
遗忘门:决定丢弃多少旧记忆
$$f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)$$ -
输入门:决定存储多少新信息
$$i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)$$ -
输出门:决定输出多少当前状态
$$o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)$$
2. Sigmoid 函数的门控优势
三个门均采用 Sigmoid 函数的深层原因:
- 数学特性:
- 输出范围 [0,1] 天然适合做门控权重
-
导数 $\sigma'(x)=\sigma(x)(1-\sigma(x))$ 在反向传播时保持梯度稳定
-
工程实践:
- 比 ReLU 等函数更容易控制信息流动强度
- 实验表明对门控任务表现最优(参考[Gers et al., 2000])
3. 候选状态的 tanh 设计
候选记忆单元采用 tanh 激活:
$$\tilde{C}t = \tanh(W_C \cdot [h, x_t] + b_C)$$
- tanh 的 [-1,1] 输出范围:
- 与 Sigmoid 门控相乘时能保持数值稳定性
- 对称性有利于中心化数据分布
梯度流动分析
LSTM 的细胞状态更新公式:
$$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t$$
关键设计带来的梯度通路:
- 加法取代乘法:细胞状态的更新是加性操作,避免了梯度连乘
- 门控的调节作用:遗忘门可学习保持梯度幅度的常数(接近 1)
- 直连通路:细胞状态 $C_t$ 到 $C_{t-1}$ 存在无衰减路径
PyTorch 实现示例
import torch
import torch.nn as nn
class LSTMCell(nn.Module):
def __init__(self, input_size, hidden_size):
super().__init__()
# 合并所有门的权重计算
self.gates = nn.Linear(input_size + hidden_size, 4*hidden_size)
def forward(self, x, hc):
h_prev, c_prev = hc
# 拼接输入和隐状态
combined = torch.cat([x, h_prev], dim=1)
# 同时计算所有门和候选状态
gates = self.gates(combined)
i, f, o, g = gates.chunk(4, 1)
# 应用激活函数
i = torch.sigmoid(i)
f = torch.sigmoid(f)
o = torch.sigmoid(o)
g = torch.tanh(g)
# 更新细胞状态
c_next = f * c_prev + i * g
# 计算输出
h_next = o * torch.tanh(c_next)
return h_next, c_next
调参建议:
- 初始化遗忘门偏置为 1(促进长期记忆)
- 隐藏层尺寸通常取 256-1024
- 搭配 LayerNorm 效果更佳
生产环境最佳实践
初始化技巧
def init_lstm(lstm_layer):
for name, param in lstm_layer.named_parameters():
if 'bias' in name:
# 遗忘门偏置初始化
n = param.size(0)
param.data[n//4:n//2].fill_(1.0)
梯度裁剪
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=5.0)
架构选择指南
| 特性 | LSTM | GRU |
|---|---|---|
| 参数量 | 4*(in+h)h | 3*(in+h)h |
| 训练速度 | 较慢 | 较快 |
| 长程依赖 | 更强 | 稍弱 |
| 适用场景 | 语音 / 文本 | 视频 / 传感器 |
延伸思考
开放性问题
- 能否用 ReLU 等非线性单元替代 Sigmoid 门控?
- 如何设计动态调整门控数量的变体?
- 注意力机制能否与 LSTM 门控结合?
验证实验
- 可视化不同时间步的遗忘门数值分布
- 对比 LSTM 和普通 RNN 在长序列分类任务的表现
- 尝试修改候选状态的激活函数观察影响
总结
LSTM 通过精妙设计的门控机制,将梯度流动从乘法路径转为加法路径,配合 Sigmoid 的饱和特性,有效缓解了梯度消失问题。理解其数学本质后,在实践中还需注意初始化、正则化等工程细节,才能充分发挥模型潜力。
正文完
发表至: 未分类
近两天内
