暑假的夏令营里,教官把孩子们排成一列玩“传话游戏”:教官先给队首的小明念一篇 200 字的小故事,小明要一边听一边在脑子里提炼“核心意思”,然后把这个意思悄悄告诉下一个人;就这样一路传下去,队伍末尾的小华拿到信息后,要把它扩写成一个完整的故事讲给大家听。游戏结束后孩子们惊讶地发现,原本“小猫追着红色毛线球,撞翻了奶奶的花盆”的精彩故事,传到终点时只剩一个孤零零的字——“猫”。 这个游戏的制造者,正是今天的主角:编码器-解码器架构(Encoder-Decoder),也叫 Seq2Seq(序列到序列)。队列前段的小明就是编码器,他倾听长长的输入序列,把信息一点一点压缩成一句“核心意思”;队列末端的小华就是解码器,他拿到这份压缩信息,一步步把它重新扩写成完整的输出序列。两人之间唯一传递的小纸条,就叫上下文向量。 你可能想不到,这个传话游戏和人工智能的关系如此密切:手机里的中英互译、新闻 App 把长文浓缩成三句话摘要、语音助手听懂你说“帮我订咖啡”,背后都站着这个框架。深度学习崛起以来,编码器-解码器一直是序列转换任务不可撼动的黄金框架,今天大语言模型的骨架里,依然流淌着它的基因。接下来,我们就跟着小明和小华把这段传话之旅从外到内拆开看个明白。

岗位关联

学习编码器-解码器,等于拿到理解机器翻译、文本摘要、语音识别等一切序列转换系统的通用钥匙;它更是注意力机制与 Transformer 的进化原点,能让 AI 从业者真正看懂大模型设计语言里的底层语法。

目录
  1. 可视化演示
  2. 架构总览
  3. 编码器原理
  4. 上下文向量
  5. 解码器生成
  6. 训练策略
  7. 信息瓶颈
  8. 改进方向
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

通过编码器序列压缩(输入token→LSTM→上下文向量)、信息瓶颈(序列越长信息保留越少)与解码器自回归生成(上下文→逐词生成→结束标记)三个模式,展示Seq2Seq黄金框架的核心机制。

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

编码器序列压缩机制 LSTM/GRU逐个处理输入token不断更新隐状态 最终隐状态作为上下文向量压缩整个输入序列信息 h_t = LSTM(x_t, h_{t-1}) → C = h_n 编码器将变长输入压缩为固定维度向量

架构总览

传话游戏的第一课,是认清两个角色的分工:队首的小明负责“听”和“压缩”,队尾的小华负责“拿”和“还原”。这就是编码器-解码器架构的基本流水线——输入一条序列,经过一次“先压缩后还原”的旅行,输出另一条长度往往不同的序列。你可能会问:为什么非要搞得这么麻烦?因为输入和输出的长度压根对不上。机器翻译里,“你好吗”是 3 个字,英文译文 “How are you?“ 是 3 个词;语音转文字时,一句话的音频包含几千帧,而对应的文字只有十几个字。这种”长度不齐”的转换任务,让传统定长模型完全无从下手。

Seq2Seq(Sequence to Sequence)正是为解决这类问题而生的端到端框架:编码器把整个输入序列“读”成一个稠密向量——上下文向量;解码器再以这个向量为起点,“写”出输出序列。写作时是逐词进行的,每生成一个新词,模型都会参考已经生成的词,形成链式推进。正是这种“先听、后复述”的结构,让模型在两种不同长度的序列之间学会了灵活映射,也让它成了机器翻译、文本摘要、语音识别等众多任务共同的地基。

回看传话游戏,架构总览就是游戏规则:小明只负责听和总结,小华只负责拿到字条讲故事,两人之间唯一的交接物是那张纸条。接下来我们就先钻进小明的耳朵,看看他是怎么一边听一边做批注的。

编码器原理

小明有个特别的本事——他从不等到 200 个字全听完才开始总结,而是边听边在大脑里更新“批注”:听到“小猫”记一笔,听到“追”补一笔,每进来一个新词,批注就把新词和旧记忆融在一起。深度学习里,这个“边读边批注”的机制叫 RNN(循环神经网络)。RNN 是一种自带记忆的神经网络,它按时间步逐个读取词,并不断更新自己的隐藏状态 $h_t$——所谓隐藏状态,就是那条“批注”:一个努力浓缩了迄今为止全部信息的向量。

当编码器读到第 $t$ 个词时,它把上一条批注 $h_{t-1}$ 和新词 $x_t$ 一起喂给一个非线性函数 $f$(通常是一个 GRU 或 LSTM 单元),得到新的批注 $h_t$:

这是编码器最核心的一步更新。$h_t$ 既承载了当前词的信息,也保留了对前文所有词的记忆。值得注意的是,RNN 是“按顺序”处理序列的,所以天然尊重词的先后顺序——“猫追老鼠”和“老鼠追猫”会得到完全不同的批注;而普通全连接网络无法做到这一点。

小明一路听一路写批注,批注越来越丰满。但有个规矩:他不能把一整本“批注本”直接塞给小华,只能把最终批注抄到一张固定大小的纸条上——这正是下一节“上下文向量”的由来。

ht=f(ht−1,xt)h_t = f(h_{t-1}, x_t)
  1. 当前输入词 $x_t$第 $t$ 个时刻读入的词,比如“猫”这个词向量。
    xtx_t
  2. 上一步的隐藏状态 $h_{t-1}$读完上一个词后脑中留下的批注,承载着历史信息。
    ht−1h_{t-1}
  3. 映射函数 $f$可学习的非线性变换单元(GRU/LSTM),负责“融合”旧批注和新词。
    f(⋅)f(\cdot)
  4. 新隐藏状态 $h_t$融合历史与新词后的最新批注,是下一步更新的基础。
    hth_t

上下文向量

故事听完了,小明要在几秒钟内把 200 字的故事浓缩成一句“核心意思”,工工整整地写在小纸条上递给小华。注意,不管原故事是 50 字还是 2000 字,这张纸条的大小永远不变。这张固定大小的纸条,就是上下文向量(Context Vector)。它是编码器与解码器之间唯一的“信物”。

在经典 RNN 编码器-解码器里,上下文向量被定义为编码器读完整个输入序列之后的最终隐藏状态:

其中 $T$ 是输入序列的长度,$h_T$ 是最后一个时间步的隐藏状态。这个向量用固定维度(比如 256 或 512 个浮点数)承载整句话的语义。拿到 $c$ 之后,编码器的任务就宣告完成,小明可以功成身退了。

上下文向量是整个序列转换的“咽喉要道”:编码器侧的全部信息都必须从这个固定大小的篮子里递给解码器。这带来一个著名的隐患——信息瓶颈。我们稍后会看到,这正是长句翻译掉链子的根源。眼下,小华已经拿到纸条,他要怎么从零开始把故事讲出来?下一节轮到解码器登场。

c=hTc = h_T
  1. 输入长度 $T$原故事一共有多少个词,决定了编码器要迭代多少步。
    TT
  2. 最终隐藏状态 $h_T$读完最后一个词时脑中留存的完整批注。
    hTh_T
  3. 上下文向量 $c$被抄写到纸条上的最终向量,是整个输入序列留给解码器的唯一信息。
    cc

解码器生成

小华拿到纸条后,并不会像倒放录音一样“还原”原文,而是从头开始,一个字一个字地把故事讲出来。每开口说一个词,他都要兼顾三件事:之前说过了什么、纸条上写了什么、接下来哪个词最顺口。解码器的工作方式与此惊人地一致:它本质上也是一个 RNN,但输入多了一个上下文向量 $c$。

在每个时间步,解码器输出一个概率分布,表示“下一个词是词表里每个词的可能性”,然后从中选出概率最高的词作为这一步的输出。用公式表示就是:

其中 $s_t$ 是解码器的隐藏状态,由上一个输出词 $y_{t-1}$、上一个状态 $s_{t-1}$ 和上下文 $c$ 共同更新;$W_s$ 是可学习的权重矩阵,把隐藏状态“投影”到词表大小的空间上。

这个过程是自回归的——第 $t$ 步生成的词会作为第 $t+1$ 步的输入,一个字符一个字符地“挤”出来,直到模型预测到结束标记 EOS 才收声。这很像写诗:先有了上一个字,才敢定下一个字。小华每说一个词就更新一次“故事进度”,他越讲越远,离纸条也越来越远——那么问题来了:怎么训练小华,才能让他讲得又准又稳?

p(yt∣y<t,c)=softmax(Wsst)p(y_t \mid y_{<t}, c) = \mathrm{softmax}(W_s s_t)
  1. 当前生成词 $y_t$故事中第 $t$ 个要吐出的词。
    yty_t
  2. 历史条件 $y_{<t}, c$已知条件——之前说过的所有词和纸条内容。
    y<t,cy_{<t}, c
  3. softmax 函数把原始得分揉成总和为 1 的概率分布,直观反映“哪个词最可能”。
    softmax(⋅)\mathrm{softmax}(\cdot)
  4. 权重矩阵 $W_s$把隐藏状态映射到词表维度的可学习参数,相当于“词库检索器”。
    WsstW_s s_t

训练策略

传话游戏开赛前要排练。排练时,教练会塞给小华“标准答案”:不管小华上一句说错了什么,教练都会把他该说的下一句原原本本递到他嘴边,让他照着说下去。这种“错了也按标准答案继续”的排练法,在 Seq2Seq 里叫 Teacher Forcing(老师强迫)。它的数学目标是最大化输出序列的条件概率——让模型在每个时间步都尽量猜中真实词。我们用交叉熵损失来刻画“预测分布”与“真实分布”的差距:

训练时,解码器第 $t$ 步的输入直接取真实词 $y_{t-1}$,而不是模型自己刚预测的词。这样模型在每一步都站在“正确位置”上学习规律,梯度信号更干净,训练也快得多。但代价是:推理时没有教练递答案,模型只能拿自己的预测当输入,一旦开头出错,错误就会一路滚雪球——这叫曝光偏差(Exposure Bias),是训练与推理之间的“两副面孔”。

另外,训练序列必须用两个特殊标记开头和结尾:BOS(Beginning of Sequence,序列开始)用来告诉解码器“故事从这起笔”;EOS(End of Sequence,序列结束)用来告诉解码器“故事到这收尾”。没有 EOS,解码器永远不会学会“闭嘴”。排练结束后,小华上了赛场,却很快发现一个残酷的事实——纸条太小了。

L=−∑t=1T′log⁡p(yt∣y<t,c)\mathcal{L} = -\sum_{t=1}^{T'} \log p(y_t \mid y_{<t}, c)
  1. 真实词 $y_t$标准答案里第 $t$ 个词,比如 "love"。
    yty_t
  2. 条件概率 $p(y_t \mid y_{<t}, c)$模型认为下一个词是 $y_t$ 的概率,越接近 1 越好。
    p(yt∣y<t,c)p(y_t \mid y_{<t}, c)
  3. 对数函数 $\log$把概率乘积转化为累加,同时放大“自信但错了”的惩罚。
    log⁡p(⋅)\log p(\cdot)
  4. 负号与求和 $-\displaystyle\sum_{t=1}^{T'}$把每个位置的“遗憾”累加起来,整体损失越小,模型越好。
    −∑t=1T′log⁡(⋅)-\sum_{t=1}^{T'} \log(\cdot)

信息瓶颈

游戏进行到晋级赛,教官换了一篇 2000 字的超长故事。小明听完后,依然只能把那张 50 字容量的小纸条写满。他拼了命想塞下所有情节,但纸条就那么大,只能忍痛割爱挑重点写。结果小华还原出来的故事支离破碎,连主角的名字都丢了。

这个悲剧在数学上叫信息瓶颈(Information Bottleneck)。上下文向量是固定维度 $d$ 的,而输入序列长度 $T$ 是变化的。平均每个输入词能分到的“表示空间”是:

句子越长,每个词平均分到的容量就越小,细节自然被挤掉。论文实验也证实了这一点:当句子长度超过约 20~30 个词时,Seq2Seq 的翻译质量会断崖式下跌,长距离的依赖关系大面积丢失。这不是训练不够努力,而是结构上的先天缺陷——让无限长度的信息穿过一个有限宽度的“漏斗”,必然有损。

传话游戏里,我们有一个直觉解法:别让小华只盯那张纸条,干脆让他随时翻原稿。这个朴素想法在 AI 界有个响亮的名字——注意力机制。它能不能救小华于水火?下一节就是大结局。

dˉ=dT\bar{d} = \frac{d}{T}
  1. 向量维度 $d$纸条的固定容量,例如 256 或 512 个数字。
    dd
  2. 输入长度 $T$原故事的词数,是个会变化的量。
    TT
  3. 平均容量 $\bar{d}$每个输入词平均能占用的“笔墨”,随 $T$ 增大而急剧变小。
    dˉ=dT\bar{d} = \frac{d}{T}

改进方向

老师终于看不下去了,修改了游戏规则:小华讲故事时可以拿着原稿,讲到哪一段就低头看哪一段,拿不准时甚至可以把原稿上对应的句子找出来反复读。这一改,传话失真的问题瞬间缓解。这就是注意力机制(Attention)的核心思想——解码器每一步不再只依赖那一个固定的上下文向量,而是可以“回看”编码器的每一个隐藏状态,并按需分配它们的权重:

其中 $e_{ij}$ 表示解码器第 $i$ 步对编码器第 $j$ 个词的“相关性打分”;经过 softmax 归一化后,$\alpha_{ij}$ 是总和为 1 的注意力权重;最后编码器的所有隐藏状态按权重加权求和,得到当前步的动态上下文。于是那个固定的小纸条被升级成“随时可查的原稿”,信息瓶颈被一举打破。

注意力机制之后,这条进化之路继续延伸:双向编码器让每个词的表示同时看到前文和后文,语义更立体;Transformer 则彻底抛弃了 RNN 的循环结构,用自注意力并行处理整个序列,成为今天大语言模型(如 GPT、BERT)的基座。从小纸条到原稿,从单向复述到随时查证,传话游戏最终长成了一棵枝繁叶茂的大树——而编码器-解码器,正是这棵树最坚实的树干。

αij=exp⁡(eij)∑k=1Texp⁡(eik)\alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k=1}^{T}\exp(e_{ik})}
  1. 相关性得分 $e_{ij}$解码器第 $i$ 步时,把“我的进度”与“原文第 $j$ 处”对比得到的相关程度。
    eije_{ij}
  2. 指数运算 $\exp$把任意实数的得分转成正数,保留大小关系。
    exp⁡(eij)\exp(e_{ij})
  3. 分母归一化 $\sum_{k=1}^{T}\exp(e_{ik})$把所有指数结果加起来,使权重总和为 1。
    ∑k=1Texp⁡(eik)\sum_{k=1}^{T}\exp(e_{ik})
  4. 注意力权重 $\alpha_{ij}$决定第 $i$ 步该看原文哪几处、各看多少。
    αij\alpha_{ij}

AI 应用场景

机器翻译:传话游戏的全球化

阶段:序列转换 / 模型架构

解决的问题:传统统计机器翻译需要人工设计海量对齐规则,处理长句时规则穷举不现实。编码器-解码器把“原文→译文”的映射变成端到端学习:编码器读原文,解码器写译文,中间只传一张“小纸条”,省去了所有人工特征工程。

具体案例:Google 神经机器翻译(GNMT)用 LSTM 编码器-解码器取代了沿用多年的短语统计模型,让整句翻译的流畅度大幅提升——这正是“小明听故事、小华讲故事”在几十种语言之间的工业化复现。

文本摘要:把长篇故事浓缩成一句话

阶段:文本生成 / 内容理解

解决的问题:人工撰写摘要成本高,抽取式摘要只是“剪贴”原文的句子,不够凝练。基于 Seq2Seq 的生成式摘要能像小明一样把整篇文章读进上下文向量,再像小华一样用两三句话重新“讲”出核心内容——信息瓶颈在这里反而是个优点,它逼着模型只保留最重要的信息。

具体案例:新闻 App 的摘要模型把千字长文压缩成三句导读;客服系统自动把一通 10 分钟的通话录音转写成纪要,再浓缩成待办事项清单。

语音转文字:跨模态的长度错配

阶段:跨模态序列转换

解决的问题:语音波形是序列,文字也是序列,但两者的长度极不对齐——1 秒音频可能对应 100 帧特征,而文字只有 2~3 个字符。Seq2Seq 天然容忍这种“严重长短不一”:编码器把声学特征序列消化成上下文向量,解码器逐字吐出文字,长度随内容自由伸缩。

具体案例:智能语音助手的 ASR 模块把用户说出的“帮我订一杯拿铁”从音频序列转成文本序列,再交给下游的自然语言理解模块。这套架构同样适用于“文字转语音”的反向任务。

Python 演示

python83 行
import torchimport torch.nn as nnimport torch.optim as optim torch.manual_seed(42)VOCAB = 13                # 0=PAD, 1=EOS, 2=BOS, 3~12=数字0~9HIDDEN = 32EOS_ID = 1BOS_ID = 2CHAR_IDS = {c: i + 3 for i, c in enumerate('0123456789')}ID_CHARS = {i + 3: c for i, c in enumerate('0123456789')}  def make_sample(length=4):    # 随机生成一个4位数字序列,目标是它的逆序    nums = [str(torch.randint(0, 10, (1,)).item()) for _ in range(length)]    src = [CHAR_IDS[c] for c in nums] + [EOS_ID]    tgt = [BOS_ID] + [CHAR_IDS[c] for c in reversed(nums)] + [EOS_ID]    return torch.tensor(src, dtype=torch.long), torch.tensor(tgt, dtype=torch.long)  class Encoder(nn.Module):    def __init__(self):        super().__init__()        self.emb = nn.Embedding(VOCAB, HIDDEN)        self.rnn = nn.GRU(HIDDEN, HIDDEN)     def forward(self, x):        # x: (seq_len, batch),GRU 返回最后一个隐藏状态作为上下文向量        _, h = self.rnn(self.emb(x))        return h  class Decoder(nn.Module):    def __init__(self):        super().__init__()        self.emb = nn.Embedding(VOCAB, HIDDEN)        self.rnn = nn.GRU(HIDDEN, HIDDEN)        self.fc = nn.Linear(HIDDEN, VOCAB)     def forward(self, x, hidden):        out, hidden = self.rnn(self.emb(x), hidden)        return self.fc(out), hidden  enc = Encoder()dec = Decoder()opt = optim.Adam(list(enc.parameters()) + list(dec.parameters()), lr=0.01)loss_fn = nn.CrossEntropyLoss() for epoch in range(300):    src, tgt = make_sample()    context = enc(src.unsqueeze(1))    # Teacher Forcing: 输入是 tgt[:-1](含BOS),监督标签是 tgt[1:](含EOS)    logits, _ = dec(tgt[:-1].unsqueeze(1), context)    loss = loss_fn(logits.view(-1, VOCAB), tgt[1:].reshape(-1))    opt.zero_grad()    loss.backward()    opt.step()    if epoch % 60 == 0:        print(f"epoch {epoch} loss {loss.item():.3f}")  def predict(num_str):    src = torch.tensor([CHAR_IDS[c] for c in num_str] + [EOS_ID],                       dtype=torch.long).unsqueeze(1)    with torch.no_grad():        context = enc(src)        x = torch.tensor([[BOS_ID]], dtype=torch.long)        out = []        for _ in range(8):            logits, context = dec(x, context)            x = logits.argmax(dim=2)            if x.item() == EOS_ID:                break            out.append(ID_CHARS[x.item()])        return ''.join(out)  demo = '7258'print('input  :', demo)print('predict:', predict(demo))print('expect :', demo[::-1])
目的:用 PyTorch 从零搭建一个字符级 Seq2Seq 模型,训练它学会“把一串数字倒过来读”——麻雀虽小,五脏俱全,编码器、解码器、上下文向量、BOS/EOS、Teacher Forcing、交叉熵全部到齐。
  1. context = enc(src.unsqueeze(1))这行是“小明听故事”:编码器一次性读完整条输入序列,返回最终隐藏状态作为上下文向量(小纸条)。
  2. logits, _ = dec(tgt[:-1].unsqueeze(1), context)这行是“教练塞答案”:Teacher Forcing 模式下,解码器输入真实目标序列(去掉末尾 EOS),输出每一步的预测分数。
  3. loss = loss_fn(logits.view(-1, VOCAB), tgt[1:].reshape(-1))交叉熵损失把预测分布和真实词逐一对比,正确词概率越高,损失越小。
  4. _, h = self.rnn(self.emb(x))GRU 直接返回最后一步隐藏状态,这就是论文里 c = h_T 的代码实现。
  5. x = torch.tensor([[BOS_ID]], dtype=torch.long)推理时从 BOS 开始,让解码器“从零起笔”;在循环里用上一步预测的 argmax 作为下一步输入,体现自回归生成。
  6. if x.item() == EOS_ID: break遇到 EOS 就收声,没有这个判断,模型会无限生成下去。

常见误区

误区“编码器-解码器是翻译模型吧?我见到的例子全都是中英互译,估计就只能处理文字。”

正解Seq2Seq 处理的是通用序列——文本、语音帧、视频片段、股价走势都可以。只要是“一串有顺序的东西映射到另一串有顺序的东西”,就能套进“编码-压缩-解码”的框架。好比传话游戏传的不一定是话,也可以是唱一段旋律、比划一套动作,队首照样能压缩,队尾照样能还原。

为何常见:机器翻译是 Seq2Seq 最早、最出圈的落地场景,教程和新闻都爱拿翻译举例,导致大家误以为它是“文本专属”。

误区“信息装不下,那我把向量维度加到 10000,不就能把长句信息都装下了吗?”

正解维度加大确实扩大了字条面积,但参数量随之爆炸、过拟合风险升高,而且 RNN 的困局不只是“容量”——把任意长度的序列硬压成一个向量,本身就是有损压缩。好比无论把字条换成多大多厚,你都要求别人把整本《红楼梦》浓缩成一页纸,这已经不是“纸不够大”的问题了。

为何常见:直觉上把“信息量”等同于“存储空间”,忽略了序列压缩的结构性损失。

误区“训练时模型已经知道答案了,那它不是作弊吗?直接让它像真正翻译时那样自己生成,不是更能锻炼能力?”

正解训练时完全自助生成会让错误滚雪球——第一步错一点,第二步被错误输入带偏,梯度信号被噪声淹没,模型很难学到稳定的规律。Teacher Forcing 好比教练扶着孩子的手写字:练习时给标准轨迹,考试时才让孩子自己写。推理时确实没人递答案,这也是“曝光偏差”问题的由来,但两阶段分开设计是刻意的,而不是疏漏。

为何常见:默认“训练和推理应该完全一致”,没有意识到训练的目标是快速收敛、推理的目标是稳健生成。

误区“模型自己知道该输出多长的句子吧?加个结束标记是不是多此一举?”

正解模型并不知道输出该有多长——“长度”是由任务和内容共同决定的,模型只能通过训练数据学到一个模糊的分布。EOS 相当于“传话结束”的暗号:训练时,每个目标序列末尾都挂着它,模型学会“看到合适时机就输出 EOS”;推理时,模型预测到 EOS 才会停下来。没有 EOS,解码器会成为一台停不下来的复读机。

为何常见:人在说话时天然知道何时说完,于是想当然地以为模型也有这种“先天语感”。

面试题

Q1. Seq2Seq 模型最擅长处理什么类型的任务?

单选题 · easy

  • A.输入输出长度不同、对顺序敏感的序列转换任务← 正确答案
  • B.单张图片的分类任务
  • C.单个数值的回归预测
  • D.无监督的聚类任务

答案:A。Seq2Seq 的核心优势在于“序列到序列”,且容忍输入输出长度不一致。图像分类输出是单个标签、数值回归输出是单个标量,都不属于序列转换;聚类则是无监督任务,与编码器-解码器的有监督序列映射不相干。

Q2. 在编码器-解码器中,“上下文向量”的本质是什么?

单选题 · mid

  • A.解码器每一步输出的概率分布
  • B.编码器把整个输入序列压缩成的固定长度向量← 正确答案
  • C.训练时计算的交叉熵损失值
  • D.输入序列所有词的词嵌入矩阵

答案:B。上下文向量是编码器读完全部输入后得到的最终隐藏状态,相当于传话游戏中那张“小纸条”,用固定维度承载整句语义。它既不是概率分布,也不是损失值,更不是单纯的词嵌入表。

Q3. 以下哪些属于编码器-解码器的典型应用场景?

多选题 · mid

  • A.机器翻译← 正确答案
  • B.文本摘要← 正确答案
  • C.图像直方图的颜色统计
  • D.语音转文字← 正确答案

答案:ABD。机器翻译(原文序列→译文序列)、文本摘要(长文序列→短文序列)、语音转文字(音频帧序列→文字序列)都是典型的“长度不同、顺序敏感”的序列转换任务。图像直方图统计是数值统计操作,不涉及序列映射。

Q4. Teacher Forcing 在训练时的做法是什么?

单选题 · easy

  • A.解码器每一步用真实目标词作为下一步的输入← 正确答案
  • B.解码器一律用自己上一步预测的词作为下一步输入
  • C.训练时完全禁用标签信息
  • D.把学习率调大两倍

答案:A。Teacher Forcing 的核心是“教练递答案”——即使上一步预测错了,下一步的输入仍用真实词。选项 B 是推理时的自回归方式,训练时用它会导致错误累积。

Q5. “信息瓶颈”问题的核心是什么?

单选题 · hard

  • A.编码器网络层数太多,前向传播太慢
  • B.固定长度的上下文向量无法完整容纳长输入序列的全部信息← 正确答案
  • C.解码器参数量不足,表达力有限
  • D.损失函数陷入了局部极小值

答案:B。信息瓶颈源于“变长输入 vs 定长向量”的结构性矛盾:句子越长,每个词分到的表示空间越小(平均容量 d/T 越小),细节必然丢失。这与层数、参数量、优化器无关,是架构层面的先天缺陷。

Q6. 关于 EOS(结束标记),下列说法正确的是?

多选题 · mid

  • A.训练时放在目标序列末尾,告诉解码器“句子到此结束”← 正确答案
  • B.推理时解码器预测出 EOS 就会停止生成← 正确答案
  • C.EOS 可以用 PAD(填充符)代替,效果完全一样
  • D.没有 EOS 标记,解码器无法学会何时停止← 正确答案

答案:ABD。EOS 是“句号 + 暗号”的双重角色:训练时标记终点,推理时触发停止。PAD 用于填充短序列使其等长,若混用会导致模型把填充位置也当成有效输出,语义混乱。

Q7. RNN 编码器中,隐藏状态 $h_t$ 的作用是什么?

单选题 · easy

  • A.记录当前词在词典中出现的次数
  • B.融合当前输入词与之前所有历史信息的“批注”← 正确答案
  • C.保存训练时的梯度大小
  • D.控制模型的学习率

答案:B。$h_t = f(h_{t-1}, x_t)$ 表明新的隐藏状态由旧批注和新词共同生成,逐步浓缩整个输入序列的信息。它既不是词频统计,也不是训练超参数。

Q8. 为什么交叉熵损失适合 Seq2Seq 训练?

单选题 · mid

  • A.它能直接衡量预测分布与真实分布的差异,正确词概率越高损失越低← 正确答案
  • B.它不需要反向传播就能更新参数
  • C.它只关注输入序列而不看输出
  • D.它无需标签就能计算

答案:A。交叉熵对每个时间步的预测分布与真实词位置做“差异打分”,并把整个句子的遗憾累加起来。它需要梯度反向传播、需要标签、同时关注输入与输出,因此 B、C、D 均不成立。

Q9. 注意力机制中 softmax 函数扮演什么角色?

单选题 · hard

  • A.把每个相关性得分归一化为非负且总和为 1 的权重← 正确答案
  • B.让所有词的注意力权重完全相等
  • C.放大梯度爆炸的风险
  • D.直接降低模型的参数总量

答案:A。softmax 将原始得分 $e_{ij}$ 映射成概率分布,权重越大代表该词对当前生成越重要。它不会让权重相等(否则注意力失效),与梯度爆炸、参数缩减无关。

Q10. 关于 Seq2Seq 的改进方向,下列说法正确的是?

多选题 · extreme

  • A.双向编码器让每个词的表示同时看到前文和后文← 正确答案
  • B.Transformer 用自注意力替代 RNN 的循环结构,实现并行建模← 正确答案
  • C.注意力机制出现后,编码器就不再需要了
  • D.上下文向量的维度越小越好

答案:AB。双向 RNN 通过“正向+反向”两个方向编码丰富语义;Transformer 完全抛弃循环,用自注意力并行处理序列,是编码器-解码器思想在新时代的继承。注意力机制只是让解码器“看原稿”,并不否定编码器的存在;上下文向量过小会加剧信息瓶颈,而非更好。