想象一次古代驿站传信:从京城到边关,一封信要路过十几个驿站。为了轻便,每个驿站的掌柜都不复述全文,而是把信的内容“压缩”成一张小卡片交给下一站。卡片越传越轻,细节越丢越多。等信终于抵达边关,将军手里只剩一张巴掌大的卡片,他却要凭它还原整封军情。这就是 Seq2Seq(序列到序列)模型的真实处境:它先把输入序列编码成一张固定大小的“上下文向量”(小卡片),再让解码器靠这张卡片生成输出。句子越长,卡片装不下的信息就越多——前半句的主语、定语、转折,都在赶路途中被挤掉了,这就是“信息瓶颈”与“长序列困境”。 本文会用这个故事带你认识 Seq2Seq 的四大局限——信息瓶颈、长序列信息丢失、顺序计算低效、梯度传播困难,再看注意力机制如何“派快马回原站取信”,以及 Transformer 如何用“公共黑板”的方式彻底改写规则。你会发现:现代大模型的每一次突破,本质上都是在解决“小卡片”的尺寸焦虑。

岗位关联

对 AI 从业者而言,理解这组局限等于拿到一份“架构体检清单”:你能快速判断传统 Seq2Seq 何时会失效,也能说清注意力机制与 Transformer 为什么成为现代大模型的基石。

目录
  1. 可视化演示
  2. 信息瓶颈:小卡片装不下长信
  3. 长序列丢失:传得越远越走样
  4. 顺序计算:一棒接一棒,不能同时开工
  5. 梯度传播:命令传着传着就没了
  6. 注意力机制:派快马回原站取信
  7. Transformer变革:把信写在公共黑板上
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示固定上下文瓶颈、长序列信息丢失、顺序计算困境及注意力机制的突破路径,理解架构演进动因。

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

固定上下文向量信息瓶颈 编码器将整个输入序列压缩为单一固定长度上下文向量CTX 无论源序列长度5词还是500词,所有信息都压缩到同一维度向量 序列较长时信息严重丢失,解码器只能从瓶颈中获取有限信息

信息瓶颈:小卡片装不下长信

在驿站传信的比喻里,最核心的矛盾不是马跑得慢,而是“卡片太小”。不管一封信是三百字还是三千字,掌柜最后都只能留下一张固定尺寸的卡片。Seq2Seq 模型也是如此:编码器(encoder,负责读懂输入的那部分网络)把输入序列 x₁ 到 x_T 一个一个读进去,最后无论句子多长,都只输出一个固定维度的上下文向量 c,通常就是最后一个隐藏状态 h_T。这个“固定大小”,就是信息瓶颈的根源。

举个例子,翻译“欧盟在布鲁塞尔召开气候会议”时,模型必须把“欧盟”“布鲁塞尔”“气候”全部挤进同一个向量;当句子膨胀到一百个词时,向量维度还是那么大,词与词之间的关系只能互相挤压、互相覆盖。2014 年 Sutskever 等人把 Seq2Seq 用于机器翻译,短句表现惊艳,但长句翻译质量明显下滑——原因正是最后一张“卡片”承载不了全部信息。后续研究表明,句子一旦超过二三十个词,固定上下文向量的性能就会急剧衰退。

所以说,Seq2Seq 的“小卡片”不是被设计得太小,而是它的结构决定了卡片大小永远不变。句子越长,每句话被压缩得越狠,开头信息被挤掉的概率就越高。这正是后来所有改进方案的出发点:要么让卡片变大,要么干脆别用卡片。

ht=f(ht−1,xt),c=hT\displaystyle \mathbf{h}_t = f(\mathbf{h}_{t-1}, \mathbf{x}_t), \qquad \mathbf{c} = \mathbf{h}_T
这个公式说:编码器一步步更新状态,最后一步的状态被直接当成整句话的“小卡片”送给解码器。
  1. 逐步读取编码器按顺序读入每个词,用上一步的状态 h_{t-1} 和当前词 x_t 更新出新的状态,相当于每一站掌柜读完一段话后改写一次小结:
    ht=f(ht−1,xt)\mathbf{h}_t = f(\mathbf{h}_{t-1}, \mathbf{x}_t)
  2. 取出小卡片读完最后一个词后,直接取最终隐藏状态当作上下文向量,送给解码器:
    c=hT\mathbf{c} = \mathbf{h}_T
  3. 固定维度无论句子多长,c 的维度始终等于隐藏层维度 d,与句子长度 T 完全无关:
    c∈Rd\mathbf{c} \in \mathbb{R}^d

长序列丢失:传得越远越走样

还记得传声筒游戏吗?一群人排成一排,第一个人对第二个人耳语一句话,第二个人再传给第三个人……传到最后,原话早就面目全非。Seq2Seq 编码器内部发生的,正是这种“逐站耳语”:每一步都要把“上一站的小结 + 新来的词”压缩进固定维度的状态向量里。由于状态维度有限,新信息进来就必然覆盖旧信息——这就是遗忘问题。

我们把状态更新的数学形式写出来看。每一步的压缩公式里有一个 tanh 函数,它把所有信息“压扁”到 -1 到 1 之间。压扁的过程看似无害,实则每次都会丢掉一部分细节:tanh 的饱和区对微小变化不敏感,早期输入的细微差别经过若干步后几乎无法区分。对长序列来说,第 1 个词对最终状态的影响力随距离指数衰减,形成“距离衰减”效应;越早出现的词,在最终决策中越像“空气”。

这就是“语义漂移”的由来:模型编码到后半句时,对前半句的记忆已经不是原话,而是被反复压缩过的“二手小结”。LSTM 和 GRU 用门控机制给旧信息开了一条“慢车道”,能明显缓解遗忘,但治标不治本——只要最终必须依赖一个固定状态,长程信息就永远有被覆盖的风险。

ht=tanh⁡(Whht−1+Wxxt+b)\displaystyle \mathbf{h}_t = \tanh(\mathbf{W}_h \mathbf{h}_{t-1} + \mathbf{W}_x \mathbf{x}_t + \mathbf{b})
这是编码器每一步的“压缩公式”:旧小结、新输入、一个偏置,三者一起塞进 tanh 挤压成新状态。
  1. 重写上站小结W_h h_{t-1} 是对上一站小结的线性变换,相当于掌柜把上一站的话“按自己的理解重新组织”:
    Whht−1\mathbf{W}_h \mathbf{h}_{t-1}
  2. 塞入新信息W_x x_t 把当前位置的词嵌入同一向量空间,准备与旧小结合并:
    Wxxt\mathbf{W}_x \mathbf{x}_t
  3. 挤压合并tanh 把所有值压到 (-1, 1) 区间,超出分辨能力的细节在这一步被永久丢弃:
    tanh⁡(⋅)\tanh(\cdot)

顺序计算:一棒接一棒,不能同时开工

驿站传信还有一个天然的效率瓶颈:马只能沿着驿道一站一站跑,不可能让所有驿站同时开工、把一百封信同时送到。Seq2Seq 编码器的递推结构决定了第 t 步的输入包含第 t-1 步的输出,因此时间步之间形成了严格的“依赖链”——第 3 步必须等第 2 步算完,第 2 步必须等第 1 步算完。

这种串行依赖带来的后果是双重的。训练时,整条序列的耗时是 T 步串行耗时之和,GPU 上明明有几千个计算核心,却只能“排队干活”,长序列训练极其缓慢;推理时,解码器还要一个词一个词地生成(自回归),每一步都依赖上一步的输出,延迟进一步放大。对比卷积网络可以整张图并行计算,RNN 家族的“排队”特性在工程上非常吃亏。

如果把训练一万条长句的时间画成图,你会发现大部分时间花在“等待”上——等前面的驿站算完,后面的驿站才能开工。Transformer 之所以被称作“革命”,很大程度就是因为它在时间维度上彻底拆掉了这条串行锁链。

ht=f(ht−1,xt),t=1,2,…,T\displaystyle \mathbf{h}_t = f(\mathbf{h}_{t-1}, \mathbf{x}_t), \qquad t = 1, 2, \ldots, T
这个式子强调的不是函数 f 本身,而是“第 t 步依赖第 t-1 步”这条串行锁链。
  1. 依赖前一步公式左侧的 h_t 右侧出现了 h_{t-1},数据依赖决定了它必须等待上一步:
    ht=f(ht−1,xt)\mathbf{h}_t = f(\mathbf{h}_{t-1}, \mathbf{x}_t)
  2. 串行累加整条序列的总耗时等于每一步耗时 τ_t 的累加,无法压缩:
    T总=∑t=1TτtT_{\text{总}} = \sum_{t=1}^{T} \tau_t
  3. 并行度为 1任意两个时间步之间都存在数据依赖,多核并行只能作用于单步内部,时间维度的并行度恒等于 1:
    并行度=1\text{并行度} = 1

梯度传播:命令传着传着就没了

把将军的军令从帅帐传到前线,如果每个传令兵都误解一点、漏掉一点,五百人规模的命令传到前线可能只剩一句“冲”。反过来,如果每个传令兵都添油加醋,命令就会几何级膨胀成灾难。Seq2Seq 的反向传播(backpropagation,误差从输出端往输入端逐层回传的过程)遇到的正是这两种极端:梯度消失与梯度爆炸。

深层神经网络靠“链式法则”计算梯度:损失对第 1 层参数的偏导,等于沿途所有层的局部导数连乘。RNN 按时间展开后层数等于序列长度 T,因此梯度里出现 T 个雅可比矩阵(Jacobian,描述一阶导数关系的矩阵)连乘。每一步的导数范数如果都小于 1,连乘结果指数衰减趋向 0——梯度消失,网络前期的参数几乎收不到更新信号,早期的词“学了等于没学”;如果都大于 1,连乘结果指数爆炸,训练直接震荡甚至发散,只能靠梯度裁剪硬压。

梯度问题直接决定了“长程依赖”学不学得会:想让模型记住“昨天”与“今天”的关联,梯度却传不过二十步。LSTM 的门控机制本质上是给连乘路径加了几条“高速公路”,让一部分梯度能无损通过,但这同样只是缓解——它缓解了梯度消失,却解决不了前面说的信息瓶颈,也解决不了串行计算问题。

∂L∂h1=∂L∂hT⋅∏t=2T∂ht∂ht−1\displaystyle \frac{\partial \mathcal{L}}{\partial \mathbf{h}_1} = \frac{\partial \mathcal{L}}{\partial \mathbf{h}_T} \cdot \prod_{t=2}^{T} \frac{\partial \mathbf{h}_t}{\partial \mathbf{h}_{t-1}}
这是反向传播沿时间展开的产物:从最后一步一步步连乘回到第一步。
  1. 从终点出发损失对最后一步状态的偏导是连乘的起点,表示“输出误差有多少来自最终状态”:
    ∂L∂hT\frac{\partial \mathcal{L}}{\partial \mathbf{h}_T}
  2. 链式连乘路径上每一步的雅可比矩阵连乘,相当于每个驿站都给命令乘一个“放大或衰减系数”:
    ∏t=2T∂ht∂ht−1\prod_{t=2}^{T} \frac{\partial \mathbf{h}_t}{\partial \mathbf{h}_{t-1}}
  3. 连乘的归宿每步系数小于 1 时指数衰减到 0(梯度消失),大于 1 时指数膨胀到无穷(梯度爆炸):
    γT  →T→∞  0或∞\gamma^T \;\xrightarrow[T \to \infty]{}\; 0 \quad \text{或} \quad \infty

注意力机制:派快马回原站取信

如果将军发现小卡片实在不可靠,最聪明的办法是什么?派快马回沿途每一站,按需取回原话。这就是 2015 年 Bahdanau 等人给 Seq2Seq 开的“药方”:注意力机制(attention mechanism)。解码器生成第 i 个词时,不再死守那一张固定卡片,而是先计算“当前要生成的内容”与“编码器每个位置的状态”有多相关,再按相关度把这些状态加权汇总成一份“临时卡片”。

这份临时卡片有两个关键性质:第一,它每生成一个词都重新计算,不同输出位置可以“翻阅”输入的不同片段——翻译“布鲁塞尔”时重点看源句里的 Brussel,翻译“会议”时重点看 meeting;第二,它不再被固定维度限制,因为权重可以让模型只看最相关的几个位置。注意力权重矩阵还额外带来一个礼物:输入与输出之间的对齐关系(alignment),这让翻译的可解释性大幅提升,甚至可以直接可视化出“哪个源词对应哪个目标词”。

注意力机制一举打破了信息瓶颈:解码器从“只读一张卡片”变成“能翻看所有原始记录”。它让长句翻译、长摘要生成从“灾难”变成了“可控”,也为后来 Transformer 的彻底变革铺平了道路——既然注意力这么好用,能不能干脆只用注意力、不要循环呢?

ci=∑j=1Tαijhj,αij=exp⁡(eij)∑k=1Texp⁡(eik)\displaystyle \mathbf{c}_i = \sum_{j=1}^{T} \alpha_{ij} \mathbf{h}_j, \qquad \alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k=1}^{T}\exp(e_{ik})}
注意力把“固定一张卡片”改成了“动态拼接一沓便签”:每个输出位置都能按需取回输入信息。
  1. 打相关分解码第 i 步时,用解码器当前状态 s_{i-1} 与每个编码状态 h_j 计算相关度 e_{ij},可以简单理解为“问一句:这段话里有我想要的吗”:
    eij=si−1⊤Wahje_{ij} = \mathbf{s}_{i-1}^{\top} \mathbf{W}_a \mathbf{h}_j
  2. 归一化成权重softmax 把各位置的相关分变成总和为 1 的权重,相关度高的位置获得更大权重:
    αij=exp⁡(eij)∑kexp⁡(eik)\alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k} \exp(e_{ik})}
  3. 加权取回信息按权重把所有编码状态加权求和,得到这一步独有的上下文向量,替代原来那张固定卡片:
    ci=∑jαijhj\mathbf{c}_i = \sum_{j} \alpha_{ij} \mathbf{h}_j

Transformer变革:把信写在公共黑板上

驿站体系的终极改革是什么?不传卡片了,改成公共黑板:每个人都把自己的原话写在黑板上,编上序号标明先后,任何人需要什么信息直接去抄,所有人同时开工。2017 年,谷歌团队发表的论文 Attention Is All You Need 正是做了这件事——Transformer 架构彻底移除了循环结构,用“自注意力”(self-attention)让序列中任意两个位置直接对话。

自注意力的工作方式可以这样理解:每个词同时扮演三个角色——“查询者 Q”(我想找什么)、“键 K”(我有什么可以被找到)、“值 V”(我实际提供的内容)。Q 与所有词的 K 点积算出匹配度,再经过 softmax 变成权重,最后对 V 加权求和。这样一来,序列中第 1 个词和第 100 个词的信息交互只需要一步,而不是像 RNN 那样走 100 步。既然没有了对前一步的依赖,所有位置天然可以并行计算,长序列训练速度发生质变;为了不丢失顺序信息,模型再额外注入“位置编码”(positional encoding)。Transformer 随后成为 BERT、GPT 等一系列大模型的共同地基,而它最初的设计动机,正是源于 Seq2Seq 那四重局限。

回看整个故事:Seq2Seq 的小卡片困住了信息,注意力机制让解码器能回原站取信,而 Transformer 干脆取消“传信”这个动作——所有人站在公共黑板前,一步到位、并行抄写。理解了这条演进逻辑,你就掌握了从传统序列模型到现代大模型的最关键一条主线。

Attention(Q,K,V)=softmax(QK⊤dk)V\displaystyle \text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left(\frac{\mathbf{Q}\mathbf{K}^\top}{\sqrt{d_k}}\right)\mathbf{V}
自注意力公式本质是“查字典”:用查询向量 Q 去匹配键 K,按匹配度加权取出值 V。
  1. 查询向量 Q表示“我现在想找什么信息”,由当前词生成:
    Q\mathbf{Q}
  2. 键向量 K表示“每个位置有什么信息可供查找”,相当于字典的索引条目:
    K\mathbf{K}
  3. 点积与缩放Q 与所有 K 做点积得到匹配度,除以 √d_k 防止维度增大后点积数值过大、softmax 过早饱和:
    QK⊤dk\frac{\mathbf{Q}\mathbf{K}^\top}{\sqrt{d_k}}
  4. 加权取出 Vsoftmax 归一化后对值向量 V 加权求和,真正“读到”的内容来自 V:
    softmax(⋅) V\text{softmax}(\cdot)\,\mathbf{V}

AI 应用场景

机器翻译中的长句突围

阶段:模型选型与推理服务

解决的问题:传统 LSTM Seq2Seq 翻译长句时,固定上下文向量“记不住”句首主语,导致译文漏译、错译。加入注意力后,解码器每个输出词都能回看源句任意位置,长句翻译质量大幅提升。Google 在 2016 年上线的神经机器翻译系统(GNMT)正是基于注意力 Seq2Seq 架构。

具体案例:翻译一段包含三个从句的英文长句时,无注意力模型常把句首的"although"逻辑丢失;注意力模型通过对齐权重把 although 与目标句的转折关联起来,翻译完整率显著提升。

长文档摘要的信息保全

阶段:数据建模与特征抽取

解决的问题:传统方案对长文档直接截断,摘要丢失关键结论;注意力机制让生成每一步都可以从文档任意段落取信息,避免“开头被遗忘”。对于对话摘要、合同摘要等任务,这是从“能跑”到“能用”的分水岭。

具体案例:对一份 50 页的财报进行摘要,固定向量模型只记得后半段数据,注意力模型能同时引用开头的营收总体趋势和结尾的风险提示,摘要覆盖度明显更高。

语音识别中的序列对齐

阶段:端到端序列建模

解决的问题:语音信号比文本更长,LSTM 声学模型对长句子的“帧到字”对齐能力差。注意力式 Seq2Seq(如 Listen, Attend and Spell)让模型在解码每个字符时直接“定位”到语音的对应片段,同时缓解了信息瓶颈与对齐难题。

具体案例:识别一段 30 秒的中文会议录音时,传统模型对后半句识别率骤降,注意力模型借助“逐字回看声学特征”保持全程稳定,成为现代端到端语音识别的主流方案。

Python 演示

python79 行
import randomimport torchimport torch.nn as nnimport torch.optim as optim VOCAB = 15HID = 32  def make_batch(n, max_len):    xs, ys = [], []    for _ in range(n):        L = random.randint(3, max_len)        seq = [random.randint(1, VOCAB - 1) for __ in range(L)]        xs.append(seq)        ys.append(list(reversed(seq)))    return xs, ys  def pad(seqs):    mx = max(len(s) for s in seqs)    out = torch.zeros(len(seqs), mx, dtype=torch.long)    for i, s in enumerate(seqs):        out[i, :len(s)] = torch.tensor(s)    return out  class Seq2Seq(nn.Module):    def __init__(self, use_attention):        super().__init__()        self.use_attention = use_attention        self.emb = nn.Embedding(VOCAB, HID)        self.enc = nn.GRU(HID, HID, batch_first=True)        self.dec = nn.GRU(HID * 2, HID, batch_first=True)        self.fc = nn.Linear(HID, VOCAB)     def forward(self, x, y_in):        enc_out, h = self.enc(self.emb(x))        if self.use_attention:            emb = self.emb(y_in)            steps = []            for t in range(y_in.size(1)):                e = emb[:, t:t + 1] @ enc_out.transpose(1, 2)                a = e.softmax(dim=2)                ctx = a @ enc_out                steps.append(torch.cat([emb[:, t:t + 1], ctx], dim=2))            y_emb = torch.cat(steps, dim=1)        else:            emb = self.emb(y_in)            y_emb = torch.cat([emb, emb], dim=2)        out, _ = self.dec(y_emb)        return self.fc(out)  def train_epoch(model, opt, max_len):    loss_fn = nn.CrossEntropyLoss()    total = 0.0    for _ in range(40):        xs, ys = make_batch(64, max_len)        x = pad(xs)        yt = pad(ys)        y_in = pad([[0] + s[:-1] for s in ys])        logits = model(x, y_in)        loss = loss_fn(logits.permute(0, 2, 1), yt)        opt.zero_grad()        loss.backward()        opt.step()        total += loss.item()    return total / 40  for use_attention, name in ((False, "固定上下文"), (True, "注意力机制")):    model = Seq2Seq(use_attention)    opt = optim.Adam(model.parameters(), lr=1e-3)    print(f"--- {name} ---")    for max_len in (6, 12):        for _ in range(8):            loss = train_epoch(model, opt, max_len)        print(f"  最长序列 {max_len:2d} 的平均损失 {loss:.3f}")
目的:用 PyTorch 实现一个极简 Seq2Seq(任务是“输入序列倒序输出”),对比“只用固定上下文向量”与“加注意力机制”在短序列与长序列上的损失差异,直观复现信息瓶颈。
  1. enc_out, h = self.enc(self.emb(x))编码器输出所有时刻的状态 enc_out 和最后一张“小卡片” h;无注意力时解码器只能拿到 h。
  2. ctx = a @ enc_out注意力机制按权重 a 对各时刻状态加权求和,相当于“派快马回原站取信”。
  3. torch.cat([emb[:, t:t + 1], ctx], dim=2)把当前词嵌入与取回的上下文拼接,作为解码器这一步的输入。
  4. logits.permute(0, 2, 1)把输出整理成损失函数要求的 [batch, 词表,序列长度] 形状。
  5. for max_len in (6, 12)分别用短序列和长序列测试,观察“固定卡片”在长序列上的损失明显升高、而注意力模型更稳定。

常见误区

误区我一直以为 Seq2Seq 效果差是 hidden size 设得不够大,把维度从 128 调到 1024 问题就解决了,长句翻译不照样能做得不错吗?

正解调大维度相当于把小卡片换成大卡片,但“固定大小”这个结构缺陷没有变——句子长度可以是几千甚至几万,任何固定维度都无法保证装得下。注意力机制和 Transformer 的实质是放弃“单张卡片传到底”的假设,让解码端能按需访问全部编码状态,这才是结构性解法。

为何常见:调大维度在短句上确实有效果,容易让人误以为“量变能引发质变”,从而忽略了固定容量才是致命伤。

误区教材上说 LSTM 解决了梯度消失,那 RNN 家族的长序列问题应该都解决了吧?为什么还说长序列难处理?

正解LSTM 的门控机制只是给梯度“开了一条慢车道”,把指数级消失缓解成缓慢衰减,并没有根除;与此同时,信息瓶颈、顺序计算低效这两个问题 LSTM 一个都没碰。理解为“缓解”而非“解决”,才符合实际。

为何常见:论文和教材常用“LSTM 解决梯度消失”这种简化说法,初学者容易把“缓解”自动脑补成“根治”。

误区我觉得注意力机制就是工程上的加速技巧,让模型算得更快,所以 Transformer 才会这么流行。

正解注意力首先解决的是“信息访问”问题——它让解码器每步都能直接读取编码器的全部状态,绕过固定上下文向量的瓶颈,并建立输入输出的对齐关系。训练加速是“去掉循环”带来的副产品,而不是注意力机制的初衷。

为何常见:Transformer 论文主打并行训练和速度提升,读者容易被“快”吸引,忽略了注意力最初的动机是“看得见”而不是“跑得快”。

误区Seq2Seq 就是做机器翻译的,语音、语音合成、时间序列预测跟它有什么关系?

正解任何“输入一个序列、输出一个序列”的任务都是序列到序列问题:语音识别(语音帧→文字)、语音合成(文字→声学特征)、音乐生成(音符序列→音符序列)、蛋白质结构预测(氨基酸序列→结构序列)都在用同样的编码器-解码器框架,也受同样的四重局限约束。

为何常见:翻译是 Seq2Seq 最出圈的案例,媒体和教材反复使用,容易把“典型应用”误当成“全部应用”。

面试题

Q1. Seq2Seq 模型最常见的信息瓶颈来自哪个环节?

单选题 · easy

  • A.词表规模不够大
  • B.上下文向量单一固定← 正确答案
  • C.解码器层数过浅
  • D.训练语料噪音过多

答案:B。信息瓶颈的根源是编码器无论输入多长,都只输出一个固定维度的上下文向量,相当于“不管信多长都压成一张小卡片”。词表、层数、语料噪音都是外围因素,不改变“固定容量”这个结构问题。注意力机制正是为了打破这张固定卡片而诞生的。

Q2. 长序列任务中,早期输入信息容易丢失的主要原因是?

单选题 · easy

  • A.反复非线性压缩← 正确答案
  • B.学习率设置过低
  • C.词嵌入维度太高
  • D.训练数据分布不均

答案:A。编码器每一步都要把旧状态和新输入压进固定维度的向量,tanh 等非线性压缩反复进行,早期信息被逐步覆盖和稀释,类似传声筒每传一站丢一点细节。学习率、嵌入维度、数据分布都不是“越传越忘”的结构性原因。

Q3. 为什么 RNN 编码器无法在时间步上并行训练?

单选题 · easy

  • A.每一步依赖上一步状态← 正确答案
  • B.显存占用实在太高
  • C.模型缺少位置编码
  • D.激活函数不可求导

答案:A。h_t 的计算依赖 h_{t-1},时间步之间是严格的数据依赖链,只能串行执行,并行度为 1。显存是工程限制、位置编码是 Transformer 的方案、激活函数可导是前提,都不是“排队”的原因。

Q4. 注意力机制对 Seq2Seq 最重要的作用是?

单选题 · mid

  • A.直接访问全部编码状态← 正确答案
  • B.显著减少模型参数量
  • C.自动调整学习速率
  • D.降低词表规模复杂

答案:A。注意力让解码器每生成一个词都能按相关度加权读取编码器的任意状态,绕开固定上下文向量这个瓶颈。它不会减少参数、不改变学习率、也不影响词表设计,核心价值在于“信息可直达”。

Q5. softmax 在注意力机制中的作用是?

单选题 · mid

  • A.让所有分数同时变大
  • B.把分数归一化成权重← 正确答案
  • C.用来计算损失梯度
  • D.自动生成位置编码

答案:B。相关度分数 e_ij 经过 softmax 后变成总和为 1 的注意力权重 α_ij,决定“看每个位置多少”。softmax 只做归一化,不放大分数、不算梯度、不生成位置编码。

Q6. 梯度消失导致的最直接后果是?

单选题 · mid

  • A.网络前期参数更新微弱← 正确答案
  • B.网络模型参数量膨胀
  • C.输出序列长度变短
  • D.词表数量自动收缩

答案:A。反向传播沿时间连乘,导数小于 1 时乘积趋近 0,序列靠前位置的参数几乎收不到梯度信号,“学了等于没学”,长程依赖建立不起来。参数量、输出长度、词表都不会因梯度消失而改变。

Q7. Transformer 的 Q 与 K 点积后为什么要除以 √d_k?

单选题 · mid

  • A.防止点积饱和梯度消失← 正确答案
  • B.显著加快矩阵乘法
  • C.让矩阵变成对称结构
  • D.降低参数量减少存储

答案:A。当维度 d_k 较大时,Q 与 K 的点积数值会随维度增大而变大,落入 softmax 的饱和区,导致梯度极小、难以学习。除以 √d_k 把数值拉回合理范围。它与速度、对称性、参数量无关。

Q8. 以下哪些属于 Seq2Seq 模型的固有局限?

多选题 · extreme

  • A.固定上下文向量容量有限← 正确答案
  • B.序列信息传递逐步衰减← 正确答案
  • C.时间步上无法并行计算← 正确答案
  • D.词表必须动态伸缩变化

答案:ABC。固定向量容量有限是信息瓶颈;状态逐步更新导致早期信息衰减;时间步之间依赖上一步导致无法并行。词表是否动态变化是任务设计问题,不属于 Seq2Seq 框架的固有局限。

Q9. 关于 LSTM 与长序列的关系,正确的说法是?

单选题 · hard

  • A.LSTM 已彻底解决梯度消失
  • B.LSTM 缓解梯度却仍有瓶颈← 正确答案
  • C.LSTM 支持时间步并行计算
  • D.LSTM 不再需要上下文向量

答案:B。LSTM 的门控机制缓解了梯度消失,但信息瓶颈(固定上下文向量)和顺序计算低效依然存在,时间步依然串行,最终状态仍然需要承担全部信息。它只是“改善”,不是“根治”。

Q10. 注意力机制为解码器提供了哪些能力?

多选题 · hard

  • A.每步生成获取不同上下文← 正确答案
  • B.对齐输入输出对应关系← 正确答案
  • C.完全消除所有训练误差
  • D.绕过固定向量容量限制← 正确答案

答案:ABD。注意力让每个输出位置获得动态计算的上下文(A),权重矩阵天然提供输入输出对齐(B),并绕开固定上下文的容量限制(D)。但它不会消除训练误差——误差还受数据、优化、模型容量等多方面影响。