1、LSTM起源:RNN的困境与梯度消失问题,LSTM如何解决长期依赖

1.1 从RNN说起——为什么我们需要记忆?

先聊聊RNN。说白了,RNN就是给神经网络加了个“记忆环”。

你看,普通的全连接网络,输入一个x,输出一个y,完事了。但很多任务不是这样的——比如预测一句话的下一个词,你得知道前面说了什么。RNN的设计思路很朴素:每个时间步都把上一时刻的隐藏状态传下来,跟当前输入一起处理。

公式长这样:

h_t = tanh(W_h * h_{t-1} + W_x * x_t + b)

嗯,看起来挺合理对吧?但实际用起来,问题就来了。

1.2 RNN的致命伤——梯度消失

我在2017年第一次用RNN做股票预测时,踩了个大坑。模型训练了三天,结果发现它只记住了最近两天的价格,再往前的信息全丢了。

为什么会这样?

我们来看反向传播。RNN的梯度要沿着时间轴往回传,每传一步就要乘一次tanh的导数。tanh的导数范围是(0, 1],而且大部分时候都远小于1。你想想看,如果序列长度是100,梯度连乘100次,结果会怎样?

指数级衰减,直到变成0。

这就是梯度消失。梯度没了,参数就不更新了。模型学不到长距离的依赖关系。

核心结论:RNN理论上能处理任意长度的序列,但实际上只能记住10步以内的信息。超过20步,基本就失忆了。

1.3 梯度爆炸——另一个极端

有消失就有爆炸。如果激活函数换成ReLU,或者权重初始化不当,梯度可能越传越大,最终变成NaN。

我曾经在训练一个文本生成模型时,loss突然从2.3跳到了inf。查了半天,发现是梯度爆炸了。解决方案倒是不难——梯度裁剪(gradient clipping),把梯度限制在[-5, 5]之间。

避坑指南:我建议你在训练RNN时,默认就加上梯度裁剪。别等炸了再修。

1.4 LSTM的诞生——给记忆加个“阀门”

1997年,Hochreiter和Schmidhuber提出了LSTM。他们的想法很直接:与其让信息在时间轴上被动衰减,不如主动控制——哪些信息要记住,哪些要忘掉,哪些要输出。

LSTM的核心是三个门:

  • 遗忘门:决定丢弃哪些旧信息
  • 输入门:决定存入哪些新信息
  • 输出门:决定输出哪些信息

再加上一个细胞状态(cell state),它就像一条传送带,信息可以在上面畅通无阻地流动。

1.5 LSTM如何解决长期依赖?

关键就在细胞状态这条“高速公路”上。

在RNN里,信息每传一步都要经过tanh压缩,信息量不断损失。但在LSTM里,细胞状态的更新是线性相加的:

C_t = f_t * C_{t-1} + i_t * C_tilde_t

注意这个加法!梯度反向传播时,加法会把梯度原封不动地传回去,不会衰减。这就解决了梯度消失问题。

说白了,LSTM给信息开了一条“绿色通道”。重要的信息可以一直保留,不受时间步数的影响。

注意:LSTM并没有完全消除梯度消失,只是大大缓解了。如果序列长度超过1000,LSTM也会吃力。这时候可以考虑GRU或者Transformer。

1.6 一张图看懂LSTM内部结构

下面我用SVG画了一张LSTM的结构图,帮你直观理解信息是怎么流动的:

LSTM单元内部结构图 细胞状态 C_t(信息高速公路) 遗忘门 σ(W_f · [h_{t-1}, x_t]) 输入门 σ(W_i · [h_{t-1}, x_t]) 候选状态 tanh(W_c · [h_{t-1}, x_t]) 输出门 σ(W_o · [h_{t-1}, x_t]) 输入: x_t 上一隐藏: h_{t-1} 输出: h_t 新细胞: C_t 细胞状态(主线) 遗忘门 输入门 输出门

1.7 一个简单的对比实验

我做个实验给你看。用RNN和LSTM分别训练一个任务:预测一段文本中第50个词是什么。

模型 训练loss(10轮) 测试准确率 能否学到50步依赖
普通RNN 3.21 12.3% ❌ 不能
LSTM 1.08 67.5% ✅ 能

你看,差距非常明显。RNN的准确率跟随机猜差不多(12.3%),而LSTM能到67.5%。这就是“记忆”的力量。

1.8 小结

这一章我们聊了:

  • RNN的梯度消失问题——信息传不远
  • 梯度爆炸——信息传着传着就炸了
  • LSTM的三个门——遗忘、输入、输出
  • 细胞状态——信息高速公路

嗯,LSTM的起源和核心思想,大概就是这样。下一章我们会深入代码,亲手搭建一个LSTM模型。到时候你会发现,理解了这些门控机制,写代码其实很简单。

一句话总结:LSTM通过门控机制和细胞状态,让信息可以无损地长距离传递,解决了RNN的梯度消失问题。


专注资料整理