暑假的夏令营里,教官把孩子们排成一列玩“传话游戏”:教官先给队首的小明念一篇 200 字的小故事,小明要一边听一边在脑子里提炼“核心意思”,然后把这个意思悄悄告诉下一个人;就这样一路传下去,队伍末尾的小华拿到信息后,要把它扩写成一个完整的故事讲给大家听。游戏结束后孩子们惊讶地发现,原本“小猫追着红色毛线球,撞翻了奶奶的花盆”的精彩故事,传到终点时只剩一个孤零零的字——“猫”。 这个游戏的制造者,正是今天的主角:编码器-解码器架构(Encoder-Decoder),也叫 Seq2Seq(序列到序列)。队列前段的小明就是编码器,他倾听长长的输入序列,把信息一点一点压缩成一句“核心意思”;队列末端的小华就是解码器,他拿到这份压缩信息,一步步把它重新扩写成完整的输出序列。两人之间唯一传递的小纸条,就叫上下文向量。 你可能想不到,这个传话游戏和人工智能的关系如此密切:手机里的中英互译、新闻 App 把长文浓缩成三句话摘要、语音助手听懂你说“帮我订咖啡”,背后都站着这个框架。深度学习崛起以来,编码器-解码器一直是序列转换任务不可撼动的黄金框架,今天大语言模型的骨架里,依然流淌着它的基因。接下来,我们就跟着小明和小华把这段传话之旅从外到内拆开看个明白。
学习编码器-解码器,等于拿到理解机器翻译、文本摘要、语音识别等一切序列转换系统的通用钥匙;它更是注意力机制与 Transformer 的进化原点,能让 AI 从业者真正看懂大模型设计语言里的底层语法。
可视化演示
通过编码器序列压缩(输入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 是“按顺序”处理序列的,所以天然尊重词的先后顺序——“猫追老鼠”和“老鼠追猫”会得到完全不同的批注;而普通全连接网络无法做到这一点。
小明一路听一路写批注,批注越来越丰满。但有个规矩:他不能把一整本“批注本”直接塞给小华,只能把最终批注抄到一张固定大小的纸条上——这正是下一节“上下文向量”的由来。
- 当前输入词 $x_t$第 $t$ 个时刻读入的词,比如“猫”这个词向量。
- 上一步的隐藏状态 $h_{t-1}$读完上一个词后脑中留下的批注,承载着历史信息。
- 映射函数 $f$可学习的非线性变换单元(GRU/LSTM),负责“融合”旧批注和新词。
- 新隐藏状态 $h_t$融合历史与新词后的最新批注,是下一步更新的基础。
上下文向量
故事听完了,小明要在几秒钟内把 200 字的故事浓缩成一句“核心意思”,工工整整地写在小纸条上递给小华。注意,不管原故事是 50 字还是 2000 字,这张纸条的大小永远不变。这张固定大小的纸条,就是上下文向量(Context Vector)。它是编码器与解码器之间唯一的“信物”。
在经典 RNN 编码器-解码器里,上下文向量被定义为编码器读完整个输入序列之后的最终隐藏状态:
其中 $T$ 是输入序列的长度,$h_T$ 是最后一个时间步的隐藏状态。这个向量用固定维度(比如 256 或 512 个浮点数)承载整句话的语义。拿到 $c$ 之后,编码器的任务就宣告完成,小明可以功成身退了。
上下文向量是整个序列转换的“咽喉要道”:编码器侧的全部信息都必须从这个固定大小的篮子里递给解码器。这带来一个著名的隐患——信息瓶颈。我们稍后会看到,这正是长句翻译掉链子的根源。眼下,小华已经拿到纸条,他要怎么从零开始把故事讲出来?下一节轮到解码器登场。
- 输入长度 $T$原故事一共有多少个词,决定了编码器要迭代多少步。
- 最终隐藏状态 $h_T$读完最后一个词时脑中留存的完整批注。
- 上下文向量 $c$被抄写到纸条上的最终向量,是整个输入序列留给解码器的唯一信息。
解码器生成
小华拿到纸条后,并不会像倒放录音一样“还原”原文,而是从头开始,一个字一个字地把故事讲出来。每开口说一个词,他都要兼顾三件事:之前说过了什么、纸条上写了什么、接下来哪个词最顺口。解码器的工作方式与此惊人地一致:它本质上也是一个 RNN,但输入多了一个上下文向量 $c$。
在每个时间步,解码器输出一个概率分布,表示“下一个词是词表里每个词的可能性”,然后从中选出概率最高的词作为这一步的输出。用公式表示就是:
其中 $s_t$ 是解码器的隐藏状态,由上一个输出词 $y_{t-1}$、上一个状态 $s_{t-1}$ 和上下文 $c$ 共同更新;$W_s$ 是可学习的权重矩阵,把隐藏状态“投影”到词表大小的空间上。
这个过程是自回归的——第 $t$ 步生成的词会作为第 $t+1$ 步的输入,一个字符一个字符地“挤”出来,直到模型预测到结束标记 EOS 才收声。这很像写诗:先有了上一个字,才敢定下一个字。小华每说一个词就更新一次“故事进度”,他越讲越远,离纸条也越来越远——那么问题来了:怎么训练小华,才能让他讲得又准又稳?
- 当前生成词 $y_t$故事中第 $t$ 个要吐出的词。
- 历史条件 $y_{<t}, c$已知条件——之前说过的所有词和纸条内容。
- softmax 函数把原始得分揉成总和为 1 的概率分布,直观反映“哪个词最可能”。
- 权重矩阵 $W_s$把隐藏状态映射到词表维度的可学习参数,相当于“词库检索器”。
训练策略
传话游戏开赛前要排练。排练时,教练会塞给小华“标准答案”:不管小华上一句说错了什么,教练都会把他该说的下一句原原本本递到他嘴边,让他照着说下去。这种“错了也按标准答案继续”的排练法,在 Seq2Seq 里叫 Teacher Forcing(老师强迫)。它的数学目标是最大化输出序列的条件概率——让模型在每个时间步都尽量猜中真实词。我们用交叉熵损失来刻画“预测分布”与“真实分布”的差距:
训练时,解码器第 $t$ 步的输入直接取真实词 $y_{t-1}$,而不是模型自己刚预测的词。这样模型在每一步都站在“正确位置”上学习规律,梯度信号更干净,训练也快得多。但代价是:推理时没有教练递答案,模型只能拿自己的预测当输入,一旦开头出错,错误就会一路滚雪球——这叫曝光偏差(Exposure Bias),是训练与推理之间的“两副面孔”。
另外,训练序列必须用两个特殊标记开头和结尾:BOS(Beginning of Sequence,序列开始)用来告诉解码器“故事从这起笔”;EOS(End of Sequence,序列结束)用来告诉解码器“故事到这收尾”。没有 EOS,解码器永远不会学会“闭嘴”。排练结束后,小华上了赛场,却很快发现一个残酷的事实——纸条太小了。
- 真实词 $y_t$标准答案里第 $t$ 个词,比如 "love"。
- 条件概率 $p(y_t \mid y_{<t}, c)$模型认为下一个词是 $y_t$ 的概率,越接近 1 越好。
- 对数函数 $\log$把概率乘积转化为累加,同时放大“自信但错了”的惩罚。
- 负号与求和 $-\displaystyle\sum_{t=1}^{T'}$把每个位置的“遗憾”累加起来,整体损失越小,模型越好。
信息瓶颈
游戏进行到晋级赛,教官换了一篇 2000 字的超长故事。小明听完后,依然只能把那张 50 字容量的小纸条写满。他拼了命想塞下所有情节,但纸条就那么大,只能忍痛割爱挑重点写。结果小华还原出来的故事支离破碎,连主角的名字都丢了。
这个悲剧在数学上叫信息瓶颈(Information Bottleneck)。上下文向量是固定维度 $d$ 的,而输入序列长度 $T$ 是变化的。平均每个输入词能分到的“表示空间”是:
句子越长,每个词平均分到的容量就越小,细节自然被挤掉。论文实验也证实了这一点:当句子长度超过约 20~30 个词时,Seq2Seq 的翻译质量会断崖式下跌,长距离的依赖关系大面积丢失。这不是训练不够努力,而是结构上的先天缺陷——让无限长度的信息穿过一个有限宽度的“漏斗”,必然有损。
传话游戏里,我们有一个直觉解法:别让小华只盯那张纸条,干脆让他随时翻原稿。这个朴素想法在 AI 界有个响亮的名字——注意力机制。它能不能救小华于水火?下一节就是大结局。
- 向量维度 $d$纸条的固定容量,例如 256 或 512 个数字。
- 输入长度 $T$原故事的词数,是个会变化的量。
- 平均容量 $\bar{d}$每个输入词平均能占用的“笔墨”,随 $T$ 增大而急剧变小。
改进方向
老师终于看不下去了,修改了游戏规则:小华讲故事时可以拿着原稿,讲到哪一段就低头看哪一段,拿不准时甚至可以把原稿上对应的句子找出来反复读。这一改,传话失真的问题瞬间缓解。这就是注意力机制(Attention)的核心思想——解码器每一步不再只依赖那一个固定的上下文向量,而是可以“回看”编码器的每一个隐藏状态,并按需分配它们的权重:
其中 $e_{ij}$ 表示解码器第 $i$ 步对编码器第 $j$ 个词的“相关性打分”;经过 softmax 归一化后,$\alpha_{ij}$ 是总和为 1 的注意力权重;最后编码器的所有隐藏状态按权重加权求和,得到当前步的动态上下文。于是那个固定的小纸条被升级成“随时可查的原稿”,信息瓶颈被一举打破。
注意力机制之后,这条进化之路继续延伸:双向编码器让每个词的表示同时看到前文和后文,语义更立体;Transformer 则彻底抛弃了 RNN 的循环结构,用自注意力并行处理整个序列,成为今天大语言模型(如 GPT、BERT)的基座。从小纸条到原稿,从单向复述到随时查证,传话游戏最终长成了一棵枝繁叶茂的大树——而编码器-解码器,正是这棵树最坚实的树干。
- 相关性得分 $e_{ij}$解码器第 $i$ 步时,把“我的进度”与“原文第 $j$ 处”对比得到的相关程度。
- 指数运算 $\exp$把任意实数的得分转成正数,保留大小关系。
- 分母归一化 $\sum_{k=1}^{T}\exp(e_{ik})$把所有指数结果加起来,使权重总和为 1。
- 注意力权重 $\alpha_{ij}$决定第 $i$ 步该看原文哪几处、各看多少。
AI 应用场景
机器翻译:传话游戏的全球化
阶段:序列转换 / 模型架构
解决的问题:传统统计机器翻译需要人工设计海量对齐规则,处理长句时规则穷举不现实。编码器-解码器把“原文→译文”的映射变成端到端学习:编码器读原文,解码器写译文,中间只传一张“小纸条”,省去了所有人工特征工程。
具体案例:Google 神经机器翻译(GNMT)用 LSTM 编码器-解码器取代了沿用多年的短语统计模型,让整句翻译的流畅度大幅提升——这正是“小明听故事、小华讲故事”在几十种语言之间的工业化复现。
文本摘要:把长篇故事浓缩成一句话
阶段:文本生成 / 内容理解
解决的问题:人工撰写摘要成本高,抽取式摘要只是“剪贴”原文的句子,不够凝练。基于 Seq2Seq 的生成式摘要能像小明一样把整篇文章读进上下文向量,再像小华一样用两三句话重新“讲”出核心内容——信息瓶颈在这里反而是个优点,它逼着模型只保留最重要的信息。
具体案例:新闻 App 的摘要模型把千字长文压缩成三句导读;客服系统自动把一通 10 分钟的通话录音转写成纪要,再浓缩成待办事项清单。
语音转文字:跨模态的长度错配
阶段:跨模态序列转换
解决的问题:语音波形是序列,文字也是序列,但两者的长度极不对齐——1 秒音频可能对应 100 帧特征,而文字只有 2~3 个字符。Seq2Seq 天然容忍这种“严重长短不一”:编码器把声学特征序列消化成上下文向量,解码器逐字吐出文字,长度随内容自由伸缩。
具体案例:智能语音助手的 ASR 模块把用户说出的“帮我订一杯拿铁”从音频序列转成文本序列,再交给下游的自然语言理解模块。这套架构同样适用于“文字转语音”的反向任务。
Python 演示
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])
context = enc(src.unsqueeze(1))这行是“小明听故事”:编码器一次性读完整条输入序列,返回最终隐藏状态作为上下文向量(小纸条)。logits, _ = dec(tgt[:-1].unsqueeze(1), context)这行是“教练塞答案”:Teacher Forcing 模式下,解码器输入真实目标序列(去掉末尾 EOS),输出每一步的预测分数。loss = loss_fn(logits.view(-1, VOCAB), tgt[1:].reshape(-1))交叉熵损失把预测分布和真实词逐一对比,正确词概率越高,损失越小。_, h = self.rnn(self.emb(x))GRU 直接返回最后一步隐藏状态,这就是论文里c = h_T的代码实现。x = torch.tensor([[BOS_ID]], dtype=torch.long)推理时从 BOS 开始,让解码器“从零起笔”;在循环里用上一步预测的argmax作为下一步输入,体现自回归生成。if x.item() == EOS_ID: break遇到 EOS 就收声,没有这个判断,模型会无限生成下去。
常见误区
误区“编码器-解码器是翻译模型吧?我见到的例子全都是中英互译,估计就只能处理文字。”
正解Seq2Seq 处理的是通用序列——文本、语音帧、视频片段、股价走势都可以。只要是“一串有顺序的东西映射到另一串有顺序的东西”,就能套进“编码-压缩-解码”的框架。好比传话游戏传的不一定是话,也可以是唱一段旋律、比划一套动作,队首照样能压缩,队尾照样能还原。
为何常见:机器翻译是 Seq2Seq 最早、最出圈的落地场景,教程和新闻都爱拿翻译举例,导致大家误以为它是“文本专属”。
误区“信息装不下,那我把向量维度加到 10000,不就能把长句信息都装下了吗?”
正解维度加大确实扩大了字条面积,但参数量随之爆炸、过拟合风险升高,而且 RNN 的困局不只是“容量”——把任意长度的序列硬压成一个向量,本身就是有损压缩。好比无论把字条换成多大多厚,你都要求别人把整本《红楼梦》浓缩成一页纸,这已经不是“纸不够大”的问题了。
为何常见:直觉上把“信息量”等同于“存储空间”,忽略了序列压缩的结构性损失。
误区“训练时模型已经知道答案了,那它不是作弊吗?直接让它像真正翻译时那样自己生成,不是更能锻炼能力?”
正解训练时完全自助生成会让错误滚雪球——第一步错一点,第二步被错误输入带偏,梯度信号被噪声淹没,模型很难学到稳定的规律。Teacher Forcing 好比教练扶着孩子的手写字:练习时给标准轨迹,考试时才让孩子自己写。推理时确实没人递答案,这也是“曝光偏差”问题的由来,但两阶段分开设计是刻意的,而不是疏漏。
为何常见:默认“训练和推理应该完全一致”,没有意识到训练的目标是快速收敛、推理的目标是稳健生成。
误区“模型自己知道该输出多长的句子吧?加个结束标记是不是多此一举?”
正解模型并不知道输出该有多长——“长度”是由任务和内容共同决定的,模型只能通过训练数据学到一个模糊的分布。EOS 相当于“传话结束”的暗号:训练时,每个目标序列末尾都挂着它,模型学会“看到合适时机就输出 EOS”;推理时,模型预测到 EOS 才会停下来。没有 EOS,解码器会成为一台停不下来的复读机。
为何常见:人在说话时天然知道何时说完,于是想当然地以为模型也有这种“先天语感”。
面试题
Q1. Seq2Seq 模型最擅长处理什么类型的任务?
- A.输入输出长度不同、对顺序敏感的序列转换任务← 正确答案
- B.单张图片的分类任务
- C.单个数值的回归预测
- D.无监督的聚类任务
答案:A。Seq2Seq 的核心优势在于“序列到序列”,且容忍输入输出长度不一致。图像分类输出是单个标签、数值回归输出是单个标量,都不属于序列转换;聚类则是无监督任务,与编码器-解码器的有监督序列映射不相干。
Q2. 在编码器-解码器中,“上下文向量”的本质是什么?
- A.解码器每一步输出的概率分布
- B.编码器把整个输入序列压缩成的固定长度向量← 正确答案
- C.训练时计算的交叉熵损失值
- D.输入序列所有词的词嵌入矩阵
答案:B。上下文向量是编码器读完全部输入后得到的最终隐藏状态,相当于传话游戏中那张“小纸条”,用固定维度承载整句语义。它既不是概率分布,也不是损失值,更不是单纯的词嵌入表。
Q3. 以下哪些属于编码器-解码器的典型应用场景?
- A.机器翻译← 正确答案
- B.文本摘要← 正确答案
- C.图像直方图的颜色统计
- D.语音转文字← 正确答案
答案:ABD。机器翻译(原文序列→译文序列)、文本摘要(长文序列→短文序列)、语音转文字(音频帧序列→文字序列)都是典型的“长度不同、顺序敏感”的序列转换任务。图像直方图统计是数值统计操作,不涉及序列映射。
Q4. Teacher Forcing 在训练时的做法是什么?
- A.解码器每一步用真实目标词作为下一步的输入← 正确答案
- B.解码器一律用自己上一步预测的词作为下一步输入
- C.训练时完全禁用标签信息
- D.把学习率调大两倍
答案:A。Teacher Forcing 的核心是“教练递答案”——即使上一步预测错了,下一步的输入仍用真实词。选项 B 是推理时的自回归方式,训练时用它会导致错误累积。
Q5. “信息瓶颈”问题的核心是什么?
- A.编码器网络层数太多,前向传播太慢
- B.固定长度的上下文向量无法完整容纳长输入序列的全部信息← 正确答案
- C.解码器参数量不足,表达力有限
- D.损失函数陷入了局部极小值
答案:B。信息瓶颈源于“变长输入 vs 定长向量”的结构性矛盾:句子越长,每个词分到的表示空间越小(平均容量 d/T 越小),细节必然丢失。这与层数、参数量、优化器无关,是架构层面的先天缺陷。
Q6. 关于 EOS(结束标记),下列说法正确的是?
- A.训练时放在目标序列末尾,告诉解码器“句子到此结束”← 正确答案
- B.推理时解码器预测出 EOS 就会停止生成← 正确答案
- C.EOS 可以用 PAD(填充符)代替,效果完全一样
- D.没有 EOS 标记,解码器无法学会何时停止← 正确答案
答案:ABD。EOS 是“句号 + 暗号”的双重角色:训练时标记终点,推理时触发停止。PAD 用于填充短序列使其等长,若混用会导致模型把填充位置也当成有效输出,语义混乱。
Q7. RNN 编码器中,隐藏状态 $h_t$ 的作用是什么?
- A.记录当前词在词典中出现的次数
- B.融合当前输入词与之前所有历史信息的“批注”← 正确答案
- C.保存训练时的梯度大小
- D.控制模型的学习率
答案:B。$h_t = f(h_{t-1}, x_t)$ 表明新的隐藏状态由旧批注和新词共同生成,逐步浓缩整个输入序列的信息。它既不是词频统计,也不是训练超参数。
Q8. 为什么交叉熵损失适合 Seq2Seq 训练?
- A.它能直接衡量预测分布与真实分布的差异,正确词概率越高损失越低← 正确答案
- B.它不需要反向传播就能更新参数
- C.它只关注输入序列而不看输出
- D.它无需标签就能计算
答案:A。交叉熵对每个时间步的预测分布与真实词位置做“差异打分”,并把整个句子的遗憾累加起来。它需要梯度反向传播、需要标签、同时关注输入与输出,因此 B、C、D 均不成立。
Q9. 注意力机制中 softmax 函数扮演什么角色?
- A.把每个相关性得分归一化为非负且总和为 1 的权重← 正确答案
- B.让所有词的注意力权重完全相等
- C.放大梯度爆炸的风险
- D.直接降低模型的参数总量
答案:A。softmax 将原始得分 $e_{ij}$ 映射成概率分布,权重越大代表该词对当前生成越重要。它不会让权重相等(否则注意力失效),与梯度爆炸、参数缩减无关。
Q10. 关于 Seq2Seq 的改进方向,下列说法正确的是?
- A.双向编码器让每个词的表示同时看到前文和后文← 正确答案
- B.Transformer 用自注意力替代 RNN 的循环结构,实现并行建模← 正确答案
- C.注意力机制出现后,编码器就不再需要了
- D.上下文向量的维度越小越好
答案:AB。双向 RNN 通过“正向+反向”两个方向编码丰富语义;Transformer 完全抛弃循环,用自注意力并行处理序列,是编码器-解码器思想在新时代的继承。注意力机制只是让解码器“看原稿”,并不否定编码器的存在;上下文向量过小会加剧信息瓶颈,而非更好。