12,048
社区成员
发帖
与我相关
我的任务
分享 好吧,我承认我是个标题党!(不这样你会点进来享受这篇 ' 通俗易懂 ' 的好文章吗?) ![]()
正经标题:彻底搞懂 RNN 执行流程!从原理解析到面试高分回答
(屏幕前的你,帅气低调有内涵,美丽大方很优雅…所以,求个点赞、收藏、关注呗~)
书接上回——>>文本预处理:NLP 版 “给数据洗澡” 指南-CSDN博客
我们依旧用伊索寓言中 “群鸟储食” 的故事来类比:
深秋时节,一群麻雀为过冬储存麦粒。它们约定按 “时间顺序” 接力搬运 ——
但当冬天临近,第 20 只麻雀查看便签时,发现最早那只麻雀记录的 “第一处麦田位置” 已模糊不清(梯度消失)—— 因为每只麻雀更新便签时,都会弱化远期信息的权重。后来,乌鸦们改进了方法:在便签上用红笔标注 “重要信息”(类似 LSTM 的 “记忆门”),才让早期关键位置得以保留。
这个故事里,每只麻雀的 “便签更新” 对应 RNN 的时间步计算,而 “便签内容的传递与衰减”,恰好映射了隐藏状态的接力特性与传统 RNN 的梯度消失痛点~
一、为什么需要 RNN?—— 打破序列 “孤立困境” 的智慧
1. 结构总览(按时间步 t-1 → t → t+1 展开 )
传统神经网络(如 CNN、MLP )面对 文本、时间序列 等数据时,会陷入一个 “盲区”:它们把每个时间步的输入(比如句子里的词、股票的每日价格 )当作独立个体,完全忽略了「“苹果” 在 “吃” 后是水果,在 “科技” 后是公司」这类时序依赖 。
为了让模型 **“记住历史、理解当下”** ,RNN 被赋予了 “循环结构 + 隐藏状态接力” 的灵魂:
t-1 → t → t+1 展开 )
内部结构分析:
我们把目光集中在中间的方块部分, 它的输入有两部分, 分别是h(t-1)以及x(t), 代表上一时间步的隐层输出, 以及此时间步的输入, 它们进入RNN结构体后, 会"融合"到一起, 这种融合我们根据结构解释可知, 是将二者进行拼接, 形成新的张量[x(t), h(t-1)], 之后这个新的张量将通过一个全连接层(线性层), 该层使用tanh作为激活函数, 最终得到该时间步的输出h(t), 它将作为下一个时间步的输入和x(t+1)一起进入结构体. 以此类推.


t 时刻为例,核心步骤加粗 )(1)输入:当前信息 + 历史记忆
xₜ :当前时间步的原始输入(如句子第 t 个词的向量 );hₜ₋₁ :前一时间步的隐藏状态(蕴含历史序列的 “记忆总结” )。(2)模块 A:记忆整合的 “智慧中枢”
模块 A 是 RNN 的核心,执行三步关键操作:
hₜ₋₁(历史 )和 xₜ(当前 )“拼成长向量” ,让模型同时 “看过去、看现在”;tanh(压缩到 -1~+1 )做 非线性激活 ,让模型学复杂关系;hₜ :既是 t 时刻的 “结果”,又是 t+1 时刻的 “历史”,实现记忆接力 。(3)痛点:梯度消失的 “阿克琉斯之踵”
传统 RNN 虽实现了记忆传递,但训练时会梯度消失 :长序列中,远期 h₀ 对 h_T 的影响会被 “指数级削弱” ,导致模型难记长序列的远期信息(比如长文本里的早期关键信息会 “被忘掉” )。这也催生了 LSTM/GRU(用门控机制优化记忆传递 ),但核心逻辑仍基于 RNN 的循环结构 + 隐藏状态接力 。
面试官问这个问题,核心想考察:
1. 基础版(清晰讲流程 )
RNN 的执行流程,本质是 “用循环结构让隐藏状态接力传递序列信息” ,分三步:
h₀ 赋全 0 向量(代表 “序列开始前的空记忆” )。t(从 1 到 T ):
xₜ(如第 t 个词的向量 )。hₜ₋₁(历史记忆)” 和 “当前输入 xₜ(当下信息)”,经神经网络层 + 激活函数(如 tanh ),生成新隐藏状态 hₜ。hₜ 一方面用于当前步预测(可选 ),另一方面传给下一时间步 t+1 当 “历史记忆”。h_T 包含完整序列信息,用于整体任务(如文本分类 )或逐步预测(如文本生成 )。2. 进阶版(加痛点与改进 )
如果想更出彩,可以补 “为什么 RNN 这么设计 + 它的缺点” :
RNN 的设计,核心是 “让记忆在时间维度流动” ,解决传统网络 “序列信息孤立” 的问题。但传统 RNN 有个致命痛点 —— 梯度消失 :
h₀ 对 h_T 的影响会被 “指数级削弱”,导致模型 难记住长序列的远期信息(比如处理 100 个词的句子,第 1 个词的信息会被 “忘掉” )。这也是后来 LSTM、GRU 出现的原因 —— 它们在 RNN 基础上,用 “门控机制” 优化隐藏状态的传递(比如 LSTM 的遗忘门、输入门 ),本质还是延续 “循环结构 + 记忆传递” 的逻辑,只是给 “记忆” 加了 “开关”,控制哪些历史该保留 / 遗忘。
3. 通俗类比版(让面试官秒懂 )
怕抽象的话,最后补个生活化例子:可以这样说:“把 RNN 想象成 ‘写日记的人’ :
xₜ = 当天发生的事(当前输入 )。hₜ₋₁ = 之前几天日记里的‘生活总结’(历史记忆 )。hₜ。h_T = 一整本日记的‘最终感悟’(序列整体信息 )。每一步的‘日记总结’hₜ,既记录‘当天的事’,又传承‘之前的总结’,让模型能‘顺着时间理解上下文’。但传统 RNN 写第 30 天总结时,第 1 天的事对‘最终感悟’的影响会被‘指数级削弱’(梯度消失 ),导致远期记忆难保留。后来 LSTM 给记忆加了‘开关’,像给日记加‘重要事件标记’,决定哪些事该记住、哪些该忘掉,优化了这个问题。”
通过实践,证明经典RNN表现很差, 原因是在进行反向传播的时候, 过长的序列导致梯度的计算异常, 发生梯度消失或爆炸.
梯度消失或爆炸
根据反向传播算法和链式法则, 梯度的计算可以简化为以下公式

其中sigmoid的导数值域是固定的, 在[0, 0.25]之间, 而一旦公式中的w也小于1, 那么通过这样的公式连乘后, 最终的梯度就会变得非常非常小, 这种现象称作梯度消失. 反之, 如果我们人为的增大w的值, 使其大于1, 那么连乘够就可能造成梯度过大, 称作梯度爆炸.
梯度消失或爆炸的危害:
首先,感谢您看到了这里,感谢支持!不知道,您对 RNN 模型的流程和面试回答思路是否有了更清晰的印象呢?
我一直认为,巩固知识、学习知识的最好办法就是获取→输出→再获取→再输出……
这既是毛教员的《实践论》,也是循环神经网络的思维。落地来说,了解了某个知识点,最终我们要以语言的形式输出出来,让别人能听懂,最终目的是提高个人的语言表达能力、面试能力
我是诗人啊_程序员,致力于分享人工智能方面的知识,近期 NLP 自然语言处理系列文章发布中,如果感兴趣,来个关注呗~
RNN的API使用已发, 详情见: !!简单实用: 循环神经网络-RNN模型API使用!!(附完整可运行代码,手残党狂喜!包会的,兄弟!)-CSDN博客