循环神经网络通过隐藏状态处理序列数据:
ht=tanh(Whhht−1+Wxhxt+bh)
ot=Whyht+by
h_{t-1} ──→ [RNN Cell] ──→ h_t ──→ [RNN Cell] ──→ h_{t+1}
↑ ↑
x_t x_{t+1}
| 类型 | 结构 | 适用场景 |
|---|
| one-to-one | 标准NN | 图像分类 |
| one-to-many | 单输入→序列 | 图像描述 |
| many-to-one | 序列→单输出 | 情感分析 |
| many-to-many | 序列→序列 | 机器翻译 |
| 同步many-to-many | 同步序列 | 视频分类 |
∂Whh∂L=∑t=1T∂hT∂L∏k=t+1T∂hk−1∂hk⋅∂Whh∂ht
梯度问题:
∏k=t+1T∂hk−1∂hk=∏k=t+1TWhhT⋅diag(σ′(zk))
当 ∥Whh∥<1 时梯度消失,>1 时梯度爆炸。
LSTM 通过三个门控制信息流动:
遗忘门:决定丢弃哪些信息
ft=σ(Wf⋅[ht−1,xt]+bf)
输入门:决定更新哪些信息
it=σ(Wi⋅[ht−1,xt]+bi)
候选记忆:
c~t=tanh(Wc⋅[ht−1,xt]+bc)
细胞状态更新:
ct=ft⊙ct−1+it⊙c~t
输出门:
ot=σ(Wo⋅[ht−1,xt]+bo)
ht=ot⊙tanh(ct)
ct=ft⊙ct−1+it⊙c~t
∂ct−1∂ct=ft
当 ft≈1 时,梯度可以无损传递,有效缓解梯度消失。
| 变体 | 改进 | 说明 |
|---|
| Peephole LSTM | 门控输入包含细胞状态 | 更精确的门控 |
| Coupled LSTM | 遗忘门和输入门联动 | 减少参数 |
| Layer Normalization | 每层归一化 | 稳定训练 |
GRU 是 LSTM 的简化版本,合并了遗忘门和输入门:
重置门:
rt=σ(Wr⋅[ht−1,xt])
更新门:
zt=σ(Wz⋅[ht−1,xt])
候选隐藏状态:
h~t=tanh(Wh⋅[rt⊙ht−1,xt])
隐藏状态更新:
ht=(1−zt)⊙ht−1+zt⊙h~t
| 维度 | LSTM | GRU |
|---|
| 门数量 | 3个(遗忘、输入、输出) | 2个(重置、更新) |
| 细胞状态 | 有 | 无 |
| 参数量 | 多 | 少(约1/3) |
| 训练速度 | 较慢 | 较快 |
| 表达能力 | 更强 | 足够 |
| 适用场景 | 复杂长程依赖 | 中等序列 |
同时考虑前向和后向信息:
ht=RNNfw(xt,ht−1)
ht=RNNbw(xt,ht+1)
ht=[ht;ht]
堆叠多层RNN:
x_t → [RNN Layer 1] → [RNN Layer 2] → [RNN Layer 3] → o_t
每层提取不同层次的序列特征。
编码器: x_1, x_2, ..., x_T → 上下文向量 c
解码器: c → y_1, y_2, ..., y_{T'}
et,i=score(htd,hie)
αt,i=Softmax(et,i)
ct=∑iαt,ihie
| 评分函数 | 公式 |
|---|
| 加性 | vTtanh(W1hd+W2he) |
| 乘性 | (hd)TWhe |
| 点积 | (hd)The |
| 缩放点积 | dk(hd)The |