深夜山谷里有一场五十棒的山地接力赛,火种是唯一的信物。总指挥站在终点线旁,对着对讲机喊了一句新口令:“第1棒改成蛙跳起跑!”可这句话要靠队员们一棒一棒往回传——每位队员都是复读机,但每传一棒音量就打一个八折。等声音终于传到第1棒队员耳边时,只剩比蚊子还细的呜咽,他什么都没听清,依然用十年前的姿势冲出起点。总指挥喊了十遍,毫无效果。 这就是循环神经网络(RNN)训练中最著名的“梯度消失”(Vanishing Gradient)。RNN 把一句话按词展开成时间链:第1个词是第1棒,第50个词是第50棒。训练时,模型要根据“最终预测错了多少”去修正每一棒的姿势——这个修正信号就是梯度。可梯度从后往前传播时,每一步都要乘以一个小于1的系数,传不了几步就衰减到趋近于零。前几棒收不到任何修正,自然学不会远距离照应:“我出生在北京,后来去了上海,但我始终深爱着这座城市”——“这座城市”本该指向“北京”,可梯度传不到那里,模型只能把“城市”愚蠢地指认成“上海”。 幸好,工程师发明了 LSTM 和 GRU 两套“随身燃料罐”,让信号不必一棒一棒手递手,而是沿着一条损耗极低的管道直送终点。再配上梯度裁剪、合理初始化等实战锦囊,长序列训练才真正成为可能。这篇文章会从现象、数学根源、影响、解决方案到实战策略,把这场“火把接力赛”的秘密全部拆给你看。

岗位关联

梯度消失是序列建模的“检修总开关”:RNN 不收敛、长句翻译丢主语、语音识别断片,大多数问题都能回溯到这个源头。理解它,你就拿到了长序列模型的调试钥匙。

目录
  1. 可视化演示
  2. 现象直击:梯度消失长什么样
  3. 数学解剖:连乘如何“掐灭”梯度
  4. 连锁反应:远距离依赖之痛
  5. 救星登场:LSTM 的燃料罐
  6. 轻装简行:GRU 的两门方案
  7. 实战锦囊:训练策略工具箱
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示RNN反向传播时梯度随时间步指数衰减的过程,对比LSTM门控机制如何保持梯度流动,理解长序列训练的核心挑战。

本节配有交互动效(进入视口后自动加载,约 3KB)。

梯度消失可视化 RNN梯度(衰减) LSTM梯度(稳定) dL/dh = prod(Whh) 权重小于1时梯度指数衰减

现象直击:梯度消失长什么样

五十名接力队员排成一线,总指挥站在终点扯着嗓子喊“第1棒改成蛙跳起跑”,喊了十遍,山道那头毫无反应。他以为是队员偷懒,其实声音一棒一棒传回去,到第30棒就彻底没声了。RNN 训练里的梯度,就是这位总指挥的口令——损失函数在最后一个词上算出偏差,带着“该往哪个方向修正”的信息,沿着时间链反向回传。可每传一个时间步,信号都要衰减一次。

为什么必然衰减?因为 RNN 在每个时间步复用了同一组权重,展开后就是一条共享参数的链。误差沿链反向传播时,每一步的“折扣率”等于当前激活函数导数与权重的共同作用。只要这个折扣率小于 1,信号强度就会随距离指数衰减。短序列里衰减不了几步,长序列里传不到 20 步就归零了。

实际训练中,梯度消失有几个典型“现场”:一是打印各层梯度范数,发现越靠近输入的时间步梯度越小,从 1 掉到 1e-12 是常态;二是 loss 曲线在高位长时间不下降,像陷入了一堵隐形的高原墙;三是同一个模型,序列长度从 20 拉到 100,效果断崖式下跌。工程上常用 p.grad.norm() 逐个参数核对,很快就能看到“后层学、前层躺”的分化。

总指挥换个大喇叭也没用——只要传话链条的固有衰减不变,第1棒就永远听不到新指令。看清现象之后,得钻进链条内部找数学原因。

数学解剖:连乘如何“掐灭”梯度

接力赛里每位队员接过火把时都会“手抖漏火”:火焰经一双手只剩原来的 80%。十棒之后是 0.8¹⁰ ≈ 10.7%,五十棒之后是 0.8⁵⁰ ≈ 1.4e-5%,连火苗都看不见了。RNN 的“漏火率”就是权重矩阵的谱半径。RNN 在时间方向展开后,本质上是同一个权重矩阵 $W_h$ 反复作用 $T$ 次;反向传播时,链式法则把从第 $T$ 步到第 $k$ 步的每一个雅可比矩阵全部乘在一起。

具体来看,设 $h_t = f(W_h h_{t-1} + W_x x_t + b)$,其中 $f$ 是 tanh 或 sigmoid。损失 $L$ 对第 $k$ 步隐状态的梯度,等于末端梯度乘上沿途每一步雅可比的连乘积:

火焰每经一双手只剩八成,五十棒后自然见不到光。值得注意的是:$\gamma > 1$ 时同一枚硬币翻面变成梯度爆炸,训练直接震荡发散;$\gamma = 1$ 是理想平衡点,但现实中几乎不可能精确成立。所以普通 RNN 总是被两种梯度问题夹击。

gk=∂L∂hT∏t=kT−1(diag(f′(ht)) Wh)\displaystyle g_k = \frac{\partial L}{\partial h_T} \prod_{t=k}^{T-1} \left( \mathrm{diag}\left(f'(h_t)\right)\, W_h \right)
这个连乘式就是整场接力赛的“逐棒损耗清单”:每向前回传一步,都要乘一次对角阵(激活导数)和权重矩阵;损耗率恒定,距离越长,火焰越弱。
  1. 单步雅可比求 $h_{t+1}$ 对 $h_t$ 的偏导,得到对角矩阵与权重矩阵的乘积,它刻画了“火把过一次手损耗多少”。
    ∂ht+1∂ht=diag(f′(ht))Wh\displaystyle \frac{\partial h_{t+1}}{\partial h_t} = \mathrm{diag}\left(f'(h_t)\right) W_h
  2. 链式法则串联从第 $T$ 步回退到第 $k$ 步,把所有单步雅可比依次相乘,形成一条完整的回传链条。
    ∂L∂hk=∂L∂hT∏t=kT−1∂ht+1∂ht\displaystyle \frac{\partial L}{\partial h_k} = \frac{\partial L}{\partial h_T} \prod_{t=k}^{T-1} \frac{\partial h_{t+1}}{\partial h_t}
  3. 谱半径上界把乘积的范数用每步最大特征值 $\gamma$(谱半径)的连乘来界定,相当于把几十次的“手抖漏火”统一为一个损耗率。
    ∥diag(f′(ht))Wh∥≤γ\displaystyle \left\| \mathrm{diag}\left(f'(h_t)\right) W_h \right\| \le \gamma
  4. 指数化连乘退化为 $\gamma$ 的幂运算,回传距离 $d = T-k$ 恰好充当指数。
    ∥gk∥≤γ d ∥gT∥,d=T−k\displaystyle \|g_k\| \le \gamma^{\,d}\, \|g_T\|, \quad d = T-k
  5. 极限式当 $0 < \gamma < 1$ 时,距离越大梯度越趋近于零——这就是“熄火”的数学定义。
    lim⁡d→∞γ d=0( 0<γ<1 )\displaystyle \lim_{d \to \infty} \gamma^{\,d} = 0 \quad (\,0<\gamma<1\,)

连锁反应:远距离依赖之痛

火把只能照亮眼前两三步,第1棒和第30棒之间就成了黑灯区。接力队员互相看不清,配合只能靠运气;RNN 里相隔太远的词也是一样——信号传不到,照应就建立不起来。自然语言偏偏处处是远距离依赖:指代(“我出生在北京……我爱这座城市”)、主谓一致(“The keys on the table …… is/are“)、语义转折(”虽然……但是”),被依赖的线索往往在句首,揭晓在句尾。

数学上,这个“黑灯区”的距离可以用梯度上界来定量刻画:

如果 $\gamma=0.5$、$\varepsilon=10^{-6}$,有效半径只有约 20 步。也就是说,普通 RNN 的“记忆”最长只有一二十个词,再远的依赖在训练时根本收不到修正信号。山道太长、火焰太弱,“北京”和“这座城市”之间隔着一片黑灯区,模型只能就近取材——这就是远距离依赖失效的本质。

∥gk∥≤γ T−k ∥gT∥=e (T−k)ln⁡γ\displaystyle \|g_k\| \le \gamma^{\,T-k}\, \|g_T\| = e^{\,(T-k)\ln\gamma}
对数改写就像是给接力赛装了一个“里程表”:损耗率固定时,能跑多远一目了然;只要距离超过有效期,信息必然在途中熄灭。
  1. 依赖距离被依赖词与目标词之间相隔的时间步数,也就是火把需要回传的距离。
    d=T−k\displaystyle d = T-k
  2. 对数改写把幂运算写成指数形式,方便求出“还能跑多远”。
    γ d=e dln⁡γ\displaystyle \gamma^{\,d} = e^{\,d\ln\gamma}
  3. 有效半径当 $0<\gamma<1$ 时 $\ln\gamma < 0$,梯度随距离指数下降;设学习下限为 $\varepsilon$,反解出可学习的最大依赖距离。
    d∗=ln⁡εln⁡γ\displaystyle d^{*} = \frac{\ln\varepsilon}{\ln\gamma}

救星登场:LSTM 的燃料罐

补给队想了个办法:给每位队员腰间挂一个密封燃料罐,火种在第1棒加注进罐子,然后沿着一根输油管直接送到第50棒,完全不必一棒一棒手递手。队员手里的火把再小也不怕,因为火焰的“真身”存在罐子里。罐子配了三个阀门:遗忘阀决定旧燃料倒掉多少,输入阀决定新燃料加注多少,输出阀决定从罐里取多少火焰举到火把上。

LSTM 把这个设计搬进了网络:新增一条横穿所有时间步的“细胞状态”管道 $c_t$,而原来的隐状态 $h_t$ 变成从管道中汲取能量的火把。三个门控制信息的写入、保留与读出,核心更新式如下:

有了燃料罐,第1棒的火种能一路通向第50棒,总指挥的口令也能从终点传回起点。RNN 原本必经的 tanh 导数压缩和权重矩阵连乘,在这里被绕过——梯度不再走“手递手”的损耗路线,而走近乎无损的管道。

ct=ft⊙ct−1+it⊙c~t\displaystyle c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t
这条式子就是“燃料罐的记账本”:旧燃料乘以遗忘门,新燃料乘以输入门,两者相加得到新的罐存量。关键是 $c_t$ 的更新对 $c_{t-1}$ 求导后 $= f_t$——当遗忘门接近 1 时,梯度几乎无损地沿管道直传。
  1. 遗忘门由当前输入和上一隐状态联合计算一个 0 到 1 的系数,决定旧燃料倒掉多少。
    ft=σ(Wf[ht−1,xt]+bf)\displaystyle f_t = \sigma\left(W_f [h_{t-1}, x_t] + b_f\right)
  2. 候选新燃料用 tanh 生成一份全新的候选内容 $\tilde{c}_t$,它代表“此刻值得记住的新信息”。
    c~t=tanh⁡(Wc[ht−1,xt]+bc)\displaystyle \tilde{c}_t = \tanh\left(W_c [h_{t-1}, x_t] + b_c\right)
  3. 输入门另一个 0 到 1 的门控,决定候选内容写进罐子的比例。
    it=σ(Wi[ht−1,xt]+bi)\displaystyle i_t = \sigma\left(W_i [h_{t-1}, x_t] + b_i\right)
  4. 状态更新旧燃料乘以遗忘门,加上新燃料乘以输入门,完成一次“倒旧添新”。
    ct=ft⊙ct−1+it⊙c~t\displaystyle c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t
  5. 无损直传对 $c_{t-1}$ 求偏导恰好等于遗忘门,$f_t \approx 1$ 时梯度几乎不衰减,这就是著名的“常数误差传送带”。
    ∂ct∂ct−1=ft≈1\displaystyle \frac{\partial c_t}{\partial c_{t-1}} = f_t \approx 1

轻装简行:GRU 的两门方案

有些队伍嫌弃 LSTM 的装备太重:一个罐子、两个注油口、再加一个阀门,光是记这四组权重就让人头大。GRU 把装备合并成一条“智能背带”:更新门告诉你旧火焰保留多少、新燃料补充多少,重置门则决定新燃料要不要和旧火焰彻底混匀。少一个阀门,跑起来更轻快,续航却不打折。

GRU 没有独立的细胞状态,直接把隐状态 $h_t$ 当成“罐子+火把”二合一。更新门 $z_t$ 和重置门 $r_t$ 由当前输入与上一状态共同决定,状态合并式如下:

GRU 比 LSTM 少了约 25% 的参数,在小数据集上收敛更快,还更省显存。与其背着沉重的弹药罐,不如让每条腿都“自带记忆”——智能背带一拉,旧火新火按需混合,这就是 GRU 的轻量哲学。

ht=zt⊙ht−1+(1−zt)⊙h~t\displaystyle h_t = z_t \odot h_{t-1} + (1 - z_t) \odot \tilde{h}_t
这是“背带魔术”的记账本:$z_t$ 份旧状态加 $1-z_t$ 份新状态。当 $z_t \to 1$ 时 $h_t \approx h_{t-1}$,梯度几乎照原样流回,同样实现了远距离直传,但只用了三组权重——比 LSTM 少一组。
  1. 更新门整体权衡“保留旧状态 vs 写入新状态”的比例,相当于背带的松紧旋钮。
    zt=σ(Wz[ht−1,xt]+bz)\displaystyle z_t = \sigma\left(W_z [h_{t-1}, x_t] + b_z\right)
  2. 重置门决定用多少旧状态来渲染候选新状态,相当于“要不要把旧火焰打散重混”。
    rt=σ(Wr[ht−1,xt]+br)\displaystyle r_t = \sigma\left(W_r [h_{t-1}, x_t] + b_r\right)
  3. 候选状态由重置后的旧状态与当前输入生成一份新内容,用 tanh 压缩到 $(-1, 1)$。
    h~t=tanh⁡(Wh[rt⊙ht−1, xt])\displaystyle \tilde{h}_t = \tanh\left(W_h [r_t \odot h_{t-1},\, x_t]\right)
  4. 状态合并$z_t$ 份旧状态加上 $1-z_t$ 份新状态;$z_t$ 接近 1 时全盘保留旧状态,梯度直传。
    ht=zt⊙ht−1+(1−zt)⊙h~t\displaystyle h_t = z_t \odot h_{t-1} + (1 - z_t) \odot \tilde{h}_t

实战锦囊:训练策略工具箱

不是所有队伍都换得起新装备。旧队在传火时也有补救技巧:给火把加防风罩防止被大风吹灭(其实防的是爆炸)、调整起跑姿势让双手更稳(初始化)、在山道中途每隔一段设一个补给点(截断反向传播)。这些招数不改变衰减本质,却能让训练在恶劣条件下站稳脚跟。

第一招是梯度裁剪,专门对付爆炸:当这一轮所有参数梯度的 L2 范数超过阈值 $\theta$ 时,把整个梯度向量等比缩小;没超就不动。它只改大小、不改方向:

第二招是参数初始化:把循环权重初始化为正交矩阵,让谱半径贴近 1,从一开始就别让“漏火率”太低。第三招是残差连接:在时间或层方向加一条恒等捷径,给梯度多开一条“近路”,绕过损耗链。第四招是截断 BPTT:每 $k$ 步(如 20)截断一次反向传播,牺牲一点远距离精度,换取整个训练过程不崩坏。

防风罩保住火把、补给点缩短链条、正交起跑稳住损耗率——即便没有 LSTM 的新装备,普通 RNN 也能在长序列上挣扎着跑起来。理解了这些“土办法”,你再去看 LSTM/GRU 的设计,会发现它们只是把管道直传做到了极致。

g^=min⁡(1,θ∥g∥2)g\displaystyle \hat{g} = \min\left(1, \frac{\theta}{\|g\|_2}\right) g
这相当于给火把加了一个“风速保险”:风再大,火苗也被压回安全尺寸,但火焰往哪个方向飘完全保留。
  1. 梯度范数把所有参数的梯度拼成一个向量,求 L2 范数,衡量“这轮修正的总力气有多大”。
    ∥g∥2=∑igi2\displaystyle \|g\|_2 = \sqrt{\sum_i g_i^2}
  2. 裁剪系数范数超过 $\theta$ 时系数小于 1,未超过时保持 1,连续可微不产生跳变。
    α=min⁡(1,θ∥g∥2)\displaystyle \alpha = \min\left(1, \frac{\theta}{\|g\|_2}\right)
  3. 等比缩放用系数乘回原梯度,只改变幅度不改变方向。
    g^=α g\displaystyle \hat{g} = \alpha\, g

AI 应用场景

神经机器翻译:长句不丢主语

阶段:模型训练与优化

解决的问题:传统统计机器翻译只考虑相邻几个词,遇到 30 词以上的长句经常丢主语、串宾语。RNN 把整句语义逐步压缩进隐状态,但梯度消失让句首信息传不到句尾。改用 LSTM/GRU 后,“这座城市”才能稳指 20 个词之前的“北京”,编码器的细胞状态真正充当了跨句的“燃料罐”。

具体案例:某电商平台的商品描述翻译管线,将平均句长 50 词的中文详情页翻译成英文。使用双向 LSTM 编码加注意力机制后,长句人工评分提升 23%;训练初期配合梯度裁剪,避免损失在几个 epoch 内震荡发散。

语音识别:长音频不“断片”

阶段:数据处理与声学建模

解决的问题:语音是一串动辄几千帧的长序列,一个音素的发音受几百帧之外的语境影响。普通 RNN 的梯度传不到远处,模型听几句就“失忆”。采用 GRU 降低参数量,同时配合截断 BPTT(每 64 帧截断一次)控制回传深度,让声学模型在长音频上保持连贯。

具体案例:某会议录音转写系统的声学模型,将三层前馈网络替换为双向 GRU 后,在 60 秒长音频上的字错误率下降 18%;训练显存占用同步减少约 20%。

长文本情感分析:转折句不误判

阶段:推理与决策

解决的问题:电商评论常出现“虽然发货慢,但质检很严、品质超好”这类转折句——句首的负面信息与句尾的正面结论相距十几词,梯度消失会让模型只看到句尾。LSTM 的细胞状态把句首立场一路保留到句尾,模型才能正确输出“推荐”。

具体案例:一家 SaaS 服务商做评论自动分级,用 Bi-LSTM 读取前 200 词并对整条评论分类,长评论(>100 词)的准确率从 71% 提升到 84%,其中转折句的误判率降低近一半。

Python 演示

python37 行
"""线性RNN反向传播梯度跟踪: 从火把接力看梯度消失"""import numpy as np  def rnn_grads(T, w):    """线性RNN: h_t = w * h_{t-1}, 输出误差在末时刻, 逐时刻回传"""    grads = np.zeros(T)    g = 1.0    for t in range(T - 1, -1, -1):        grads[t] = g        g = g * w    return grads  def lstm_grads(T, forget=0.95):    """LSTM理想直传: 每传一步乘遗忘门 forget"""    return forget ** (T - 1 - np.arange(T))  def clip_grad(g, theta=1.0):    """梯度裁剪: 范数超阈值时等比缩放, 方向不变"""    norm = np.linalg.norm(g)    return g * min(1.0, theta / norm)  if __name__ == "__main__":    T = 20    print("=== RNN: gradient decays through the chain ===")    for w in (0.9, 0.5, 0.1):        g = rnn_grads(T, w)        print(f"w={w}: t0={g[0]:.2e}  t19={g[-1]:.2e}  t19/t0={g[-1] / g[0]:.2e}x")    print("=== LSTM: gradient keeps alive (forget=0.95) ===")    g = lstm_grads(T)    print(f"t0={g[0]:.4f}  t19={g[-1]:.2f}  t19/t0={g[-1] / g[0]:.2f}x")    print("=== clip: prevent explosion ===")    g = np.array([1000.0, -2000.0, 500.0])    print(f"before: norm={np.linalg.norm(g):.1f}  after: norm={np.linalg.norm(clip_grad(g)):.2f}")
目的:用 20 步线性 RNN 定量演示梯度随回传距离指数衰减,并对比 LSTM 遗忘门直传与梯度裁剪的效果。
  1. grads[t] = g记录梯度回传到第 t 步时的强度;循环从末时刻向前走,所以 t 越小值越小。
  2. g = g * w每往前一个时间步就乘一次共享权重 w,这就是“连乘衰减”的字面实现。
  3. forget ** (T - 1 - np.arange(T))模拟 LSTM 细胞状态直传时每步只乘遗忘门,0.95 传 20 步仍有约 0.38 的强度。
  4. norm = np.linalg.norm(g)计算整组梯度的 L2 范数,作为“这轮修正的总力气”。
  5. g * min(1.0, theta / norm)范数超过阈值 θ 时等比缩回,未超过则原样返回——裁剪只治爆炸不治消失。

常见误区

误区我打印梯度时看到一堆 0.000000,梯度消失是不是把参数完全冻住了?那模型岂不是彻底不训练了?

正解梯度消失往往不是精确的零,而是极小值(如 1e-12),在浮点精度下更新量趋近于零。它让靠近输入的时间步几乎不动,而靠近输出的时间步正常更新,形成“后层学、前层躺”的分化。真正的零梯度更可能是陷入局部极小点或神经元死亡,属于另一个问题。

为何常见:张量打印只显示有限位小数,初学者看到 0.000000 就以为是零,忽略了它其实是“趋近零”而非“等于零”。

误区我的 RNN 只有两层,不算深,所以不会遇到梯度消失,不用上 LSTM。

正解RNN 的“深度”不只来自网络层数,更来自时间展开——输入序列有 100 个词,时间方向就展开成 100 层。判断消失看的是连乘次数而非层数:同一个两层 RNN,处理 10 词序列安然无恙,处理 200 词序列立刻熄火。

为何常见:人们习惯用“层数”定义深度,忽略了 RNN 在时间轴上共享权重、反复复合这一独特结构。

误区CNN 里用 ReLU 解决了梯度消失,RNN 也把激活函数换成 ReLU 不就行了?

正解ReLU 在激活环节让导数恒为 1,确实减小了对角阵的压缩,但循环权重 W 的连乘衰减依旧存在:若谱半径小于 1,照样指数消失;若大于 1,反而把问题推向梯度爆炸。LSTM/GRU 的解决思路不是换激活,而是给梯度修一条“正交直通管道”,绕开连乘损耗。

为何常见:把 CNN 的经验直接搬到 RNN,忽略了 RNN 梯度问题的核心是循环权重的反复连乘,而非激活函数单点导数。

误区LSTM 门更多、结构更复杂,能力肯定更强,序列任务一律无脑上 LSTM 准没错。

正解GRU 参数约少 25%,收敛更快、更省显存,在中等偏小数据量任务上效果与 LSTM 持平甚至更好。门多不等于能力强,模型容量大而数据少时,多余参数反而招来过拟合。选型要看数据规模、硬件预算和调参成本。

为何常见:把“更复杂”误认为“更强”,忽视了参数效率与正则化在真实任务中的作用。

误区既然爆炸和消失都是梯度问题,那我把梯度范围裁剪一下,消失总该缓解一点吧?

正解裁剪只把超过阈值的梯度等比缩小,方向不变,防的是爆炸;对低于阈值的极小梯度,裁剪系数为 1,原封不动,并不会放大信号。真正缓解消失要靠结构(LSTM/GRU)、初始化(谱半径约 1)或训练策略(截断 BPTT、辅助损失)。

为何常见:把“梯度问题”当成一个统一的筐,没分清爆炸与消失这两个方向相反的机制。

面试题

Q1. 下列哪一项是 RNN 梯度消失最直接的表现?

单选题 · easy

  • A.损失函数变为负数
  • B.前层参数几乎不更新← 正确答案
  • C.模型严重过拟合训练集
  • D.模型推理速度明显变慢

答案:B。梯度消失意味着回传信号沿途衰减,到达靠近输入的时间步时趋近于零,前层参数收不到有效更新,形成“后层学、前层躺”的分化。损失变负不可能出现,过拟合与容量/数据有关,推理速度与梯度无关。

Q2. RNN 梯度消失的数学本质是什么?

单选题 · easy

  • A.损失函数计算公式出错
  • B.共享权重连乘导致指数衰减← 正确答案
  • C.训练数据中含有大量噪声
  • D.学习率设置得过于保守

答案:B。RNN 按时间展开后共享同一权重矩阵,反向传播时链式法则把每步雅可比相乘,形成“时间轴上的连乘”。谱半径小于 1 时连乘结果指数趋零。A 是代码错误,C 是数据问题,D 是超参问题,都不触及本质。

Q3. sigmoid 函数导数的最大值是多少?

单选题 · mid

  • A.1.00
  • B.0.50
  • C.0.25← 正确答案
  • D.0.05

答案:C。sigmoid 的导数公式为 σ'(x)=σ(x)(1−σ(x)),在 x=0 处 σ(0)=0.5,故最大导数为 0.5×0.5=0.25。tanh 的最大导数为 1。这一属性使普通 RNN 的循环雅可比额外被 0.25 封顶,加剧消失。

Q4. LSTM 中哪项设计直接缓解了梯度消失?

单选题 · mid

  • A.输出门的非线性变换
  • B.细胞状态沿时间直传← 正确答案
  • C.输入门的多层感知机
  • D.遗忘门的快速收敛

答案:B。误差沿细胞状态 c_t 直接传递,∂c_t/∂c_{t-1}=f_t,遗忘门接近 1 时该路径近似无损,这就是“常数误差传送带”。相比 RNN 必须穿过激活导数与权重连乘,这条管道绕开了所有损耗因子。

Q5. GRU 相比 LSTM 的主要特点是什么?

单选题 · mid

  • A.只有两个门且参数更少← 正确答案
  • B.完全不使用门控机制
  • C.只能处理定长序列输入
  • D.必须搭配注意力机制

答案:A。GRU 只有更新门和重置门,没有独立细胞状态,共 3 组权重;LSTM 有遗忘、输入、候选、输出共 4 组权重。GRU 参数约少 25%,训练更快更省显存,并不是定长限定,也非必须搭配注意力。

Q6. 下列哪些方式可以缓解 RNN 的梯度消失?

多选题 · mid

  • A.改用 LSTM 或 GRU 结构← 正确答案
  • B.对梯度做裁剪处理
  • C.使用合理的参数初始化← 正确答案
  • D.把学习率调大十倍

答案:AC。LSTM/GRU 提供直通误差管道,合理初始化让谱半径贴近 1,都能缓解消失。梯度裁剪只对付爆炸,对极小梯度系数为 1 不产生放大;调大学习率只会放大爆炸风险,与消失无关。

Q7. 关于 LSTM 三个门的作用,下列说法正确的有?

多选题 · hard

  • A.遗忘门控制旧状态保留量← 正确答案
  • B.输入门决定新信息写入量← 正确答案
  • C.输出门控制状态输出比例← 正确答案
  • D.三个门直接决定输出词概率

答案:ABC。遗忘门对旧细胞状态 c_{t-1} 加权,输入门控制候选新内容写入量,输出门决定细胞状态映射到隐状态的分量。三个门共同维护“直通管道”,但输出词的概率由损失层/输出层计算,不是门控直接给出。

Q8. 当梯度范数超过阈值 θ 时,梯度裁剪的正确做法是?

单选题 · hard

  • A.整体等比缩放回阈值半径← 正确答案
  • B.清空梯度并重新反向传播
  • C.把学习率降为零重新开始
  • D.丢弃小梯度只保留大梯度

答案:A。当 ‖g‖>θ 时,裁剪系数 θ/‖g‖ 小于 1,把整个梯度向量等比缩回阈值半径,一步更新不会被超大梯度带偏。清空梯度、置零学习率、丢弃小梯度都会破坏方向信息或训练进度。

Q9. RNN 梯度消失对长序列任务有哪些影响?

多选题 · mid

  • A.模型只记得近处的信息← 正确答案
  • B.远距离依赖无法被学习← 正确答案
  • C.长文本指代消解变差← 正确答案
  • D.训练速度必然显著加快

答案:ABC。梯度传不到远处,模型只能利用局部窗口信息,近处字词权重高、远距离照应学不到,因此指代、转折、主谓一致等长程关系都会恶化。训练速度与梯度消失没有必然关系,前层长期不更新反而可能让 loss 陷入“假收敛”。

Q10. tanh 激活函数导数的最大值是多少?

单选题 · easy

  • A.1.00← 正确答案
  • B.0.25
  • C.0.50
  • D.0.20

答案:A。tanh'(x)=1−tanh²(x),在 x=0 处 tanh(0)=0,导数最大为 1,输出范围 (−1,1) 比 sigmoid 更宽,因此 tanh 是普通 RNN 默认激活的常见选择。0.25 是 sigmoid 导数最大值,0.5 与 0.20 均无对应。