RNN(循环神经网络)
背景:当传统模型搞不定“顺序”时,RNN站了出来!
早期处理文本、语音、时间序列等数据时,传统方法(比如n-gram模型)就像个“短视鬼”,只看眼前几个词,完全不懂上下文。比如你想让模型预测句子“今天天气很**,适合出去玩”中的“*”是“好”还是“坏”,它可能只看到“天气”就瞎猜,根本不知道前面还有“今天”这个关键信息。
这时候,RNN横空出世,它最大的特点就是: “我记住过去,结合现在,预测未来!” 它的核心思想是:每个时间步的处理结果,都会影响下一步,形成“循环记忆”。比如处理句子时,读到“下雨了”这个词时,它会记住这个信息,等后面看到“带伞”时就能联系起来,而不是孤立地处理每个词。
举例
比如预测天气:“今天晴天,明天****,后天阴天”。如果只靠当前信息,模型可能瞎猜。但RNN会记住“今天晴天”的信息,结合历史天气规律,更可能猜出“明天多云”而不是“明天下雪”。
核心概念和原理:循环、记忆与“状态传递”
- 基本结构:循环的“灵魂”——隐藏状态(Hidden State)
- RNN的核心是隐藏状态
h,它像一个“记忆盒子”,记录历史信息。 - 每个时间步
t,模型会接收当前输入x(t)和上一时刻的隐藏状态h(t-1),然后更新当前隐藏状态h(t),同时输出结果y(t)。 - 公式简化版:
h(t) = f(Wx * x(t) + Wh * h(t-1) + b),其中Wx和Wh是权重矩阵,b是偏置,f是激活函数(比如tanh)。 - 示意图:
- RNN的核心是隐藏状态
[x(1)] → [h(1)] → y(1)
[x(2)] → [h(2)] → y(2)
...
[x(t)] → [h(t)] → y(t)- “时间展开”:把循环摊开看
- RNN的循环结构可以“展开”成多个相同网络层的串联,每个层处理一个时间步。比如处理句子“我爱吃苹果”,展开后就像:
输入"我" → 隐藏状态h1 → 输出y1
输入"爱" → 隐藏状态h2(包含h1的信息) → 输出y2
输入"吃" → 隐藏状态h3(包含h2的信息) → 输出y3
输入"苹果" → 隐藏状态h4(包含h3的信息) → 输出y4- 训练:RNN怎么学?——BPTT(按时间反向传播)
- 训练时,RNN会计算每个时间步的误差,然后从后往前(按时间反向)传播误差,更新所有时间步的权重。这就像“考试后对答案”:先知道最后一道题错了,然后倒回去找前面哪步算错了,逐个纠正。
核心原理通俗解释:
- “记住过去”的本质:隐藏状态
h不断累积历史信息。比如读到“猫”时,h记住了“动物”;读到“抓”时,h更新为“动物+动作”。 - “循环”的代价:所有时间步共用同一套权重参数(
Wx和Wh),模型参数少,但计算效率低(必须按顺序处理,无法并行)。
补充进阶知识点:为啥RNN后来“不够用”了?
- 致命缺陷:梯度消失/爆炸,导致“失忆症”
- 当序列很长时(比如长篇文章),反向传播误差时,梯度(对权重的导数)会指数级衰减(消失)或爆炸,导致模型“学不到”远距离的信息。
- 结果:读到句子结尾时,模型早就忘了开头的内容,比如翻译“我不喜欢吃苹果,但我喜欢喝苹果汁”时,可能把“苹果汁”翻译成“橘子汁”(因为忘了前面的“苹果”)。
- 解决方案:LSTM和GRU登场
- 为了解决梯度问题,研究者发明了LSTM(长短期记忆网络)和GRU(门控循环单元),它们通过“门控机制”(比如遗忘门、输入门)来控制信息流动,让模型能“主动选择”记住或忘记哪些信息,从而处理更长的序列。
- 类比:LSTM就像一个有“记忆开关”的盒子,能决定哪些信息该存、哪些该丢,避免“记忆过载”。
文章知识总结:
- RNN的核心:用隐藏状态
h循环传递信息,解决序列依赖问题。 - 优点:结构简单,参数共享,适合处理短序列任务(如情感分析、短文本生成)。
- 缺点:无法处理长序列(梯度问题),计算依赖顺序(无法并行)。
- 进化:LSTM/GRU改进了记忆能力,但Transformer用自注意力机制彻底解决了并行和长依赖问题,成为新一代王者。
- 现状:虽然被Transformer超越,但RNN的思想(循环记忆)仍是深度学习的重要基石,尤其在资源受限的场景(如嵌入式设备)中仍有应用。