想象一座传统翻译作坊:一位经验丰富的老师傅坐在桌前,接过一封法语长信,只能逐字读完、逐字记在心里,再逐字译成中文。第二个字必须等第一个字读完,第十个字必须等前九个字过手——这就是 RNN 的工作方式:手艺精湛,但每一步都离不开上一步。2017 年,一支研究团队决定改变这一切,他们把作坊改建成流水线工厂:几十个工位同时开工,每个工人只检查手边一小段物料,再把半成品传给下一道工序,整封信在几分钟内即可译完。这座工厂,就是 ConvS2S——全卷积序列到序列模型。本文将带你走进这座工厂,看看卷积如何实现并行翻译、工位号(位置编码)如何弥补顺序缺失、质检员(门控线性单元)如何放行关键信息,以及它如何启发了后来的 Transformer。

岗位关联

对 NLP 工程师而言,理解 ConvS2S 等于看清 Seq2Seq 并行化演进的关键一环,也是掌握 Transformer 与高效序列模型设计思想的重要源头。

目录
  1. 可视化演示
  2. 模型背景:从手工作坊到流水线的必然
  3. 卷积原理:滑动窗口的并行艺术
  4. 核心架构:双向编码器与因果解码器的工厂布局
  5. 门控机制:GLU 这款智能质检员
  6. 位置编码:给每个零件贴上工位号
  7. 对比与启发:流水线的得失与 Transformer 的诞生
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

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

ConvS2S整体架构:全卷积编码器-解码器 \u7f16\u7801\u5668(Encoder)\u89e3\u7801\u5668(Decoder)\u4ea4\u53c9\u6ce8\u610f\u529b (Cross-Attention)Conv1D k=3 + GLU

模型背景:从手工作坊到流水线的必然

想象一座翻译作坊:老师傅坐在案前,逐字读完原稿,前一个词还没记牢,后一个词就得排队。RNN 正是这样一位“单线程”师傅。它的隐状态像一个滚动的工作笔记,每读一个新词,都要把旧笔记翻出来更新一遍。笔记更新的顺序是硬性的:第二个字必须等第一个字写完笔记才能开始。这种串行依赖让 GPU 这座强大的“厂房”大量算力闲置。

2017 年,Facebook AI 团队提出了 ConvS2S(Convolutional Sequence to Sequence,卷积极序列到序列模型),把翻译任务从“手工作坊”升级为“流水线工厂”。流水线的核心思想是:不再让一个工人从头做到尾,而是把工序拆开,几十个工位同时开工。对应到模型里,就是用卷积神经网络(CNN)替代 RNN 来编码序列,其中一维卷积可以同时处理多个位置上的词,互不等待。

为什么过去没人这么做?因为卷积天然只认“局部”,而翻译需要对整句话的全局理解。ConvS2S 的贡献在于:用多层卷积扩大视野,用位置编码标记顺序,用门控机制筛选信息,再辅以注意力机制对齐源文和目标文。这一套组合拳,让“全卷积”的 Seq2Seq 第一次可以和 RNN 抗衡。回顾 RNN 的数学形式,就能看清瓶颈所在:

ConvS2S 的诞生并非否定老师傅的手艺,而是宣布一种更高效的组织方式:把顺序工序拆成并行工位。理解了动机,我们就能明白后面所有设计都是在为“流水线”补上 RNN 天然自带、而卷积缺失的能力。

ht=f(ht−1,xt)h_t = \displaystyle f(h_{t-1}, x_t)
这个公式说明,当前步的隐状态 \(h_t\) 必须等上一步 \(h_{t-1}\) 算完才能得到,天然串行。
  1. 隐状态 \(h_t\)处理到第 \(t\) 个词时的“工作笔记”,浓缩了前 \(t\) 个词的信息。
    hth_t
  2. 上一步隐状态 \(h_{t-1}\)只有上一步算完它才存在,这就是串行的根源。
    ht−1h_{t-1}
  3. 当前输入 \(x_t\)第 \(t\) 个词的向量表示,是当下要加工的新原料。
    xtx_t
  4. 函数 \(f\)把旧笔记和新原料组合起来的变换,常用 LSTM、GRU 实现。
    f(⋅)f(\cdot)

卷积原理:滑动窗口的并行艺术

流水线的每个工位旁都有一张操作台,台面上只摆得下一小段传送带。工人拿起眼前的三块零件,看一眼规格(特征),拧一个螺丝,产出半成品;传送带轻轻一推,下一组三块零件滑到面前。这里“同时看三块零件”就是卷积核的工作方式,而这三块零件构成的范围称为局部窗口。

在 ConvS2S 中,输入是一串词向量,一维卷积核沿序列方向滑动。每个输出位置只依赖窗口内的 \(k\) 个输入,所以所有位置的计算互不干扰,可以一次性全部算出。这正是流水线的精髓:不是一个人快,而是所有人都同时干活。单一卷积层的数学表达如下:

一个卷积层只有 \(k\) 的视野,就像每个工人只看三块零件。但把多个卷积层叠起来,视野就不断扩张:第二层能看到第一层输出范围内的信息,感受野逐层变大。ConvS2S 正是依靠多层卷积,让局部窗口最终覆盖整个句子,同时保持全程并行。

yi=∑j=0k−1Wj⋅xi+j+by_i = \displaystyle \sum_{j=0}^{k-1} W_j \cdot x_{i+j} + b
这个公式表示,序列第 \(i\) 个位置的输出,是窗口内 \(k\) 个输入加权求和后再加上偏置。
  1. 输出 \(y_i\)序列第 \(i\) 个位置经过卷积后的特征值,对应流水线上第 \(i\) 个工位的半成品。
    yiy_i
  2. 窗口内输入 \(x_{i+j}\)以 \(i\) 为起点、窗口内第 \(j\) 个词向量,\(j\) 从 0 取到 \(k-1\)。
    xi+j,j=0,…,k−1x_{i+j}, \quad j=0,\dots,k-1
  3. 卷积核权重 \(W_j\)窗口第 \(j\) 个偏移上的权重,所有位置共享同一套权重,就像所有工位用同一规格的扳手。
    WjW_j
  4. 偏置 \(b\)每个输出通道的偏移量,相当于操作台的高度调节。
    bb

核心架构:双向编码器与因果解码器的工厂布局

走进 ConvS2S 这座工厂,你会发现两条朝向相反的流水线并肩运行:一条从左到右读原句,一条从右到左读原句。这就是双向卷积编码器——前向卷积和后向卷积的输出拼在一起,每个位置既能“回忆”左侧内容,也能“预看”右侧内容,像两个方向相反的巡检员把整条线的状态汇总到中央控制台。

解码器车间则不同,它的工位有一条铁规矩:只许看左边已完工的产品,不许偷看右边未来要产出的零件。因此解码器使用因果卷积,卷积窗口向右偏移并对未来位置做掩蔽,保证第 \(t\) 个输出的计算只用到前 \(t-1\) 个输出。这就像工人在复刻下一件产品时,只能参考流水线上已经过去的成品,而不能“穿越”到未来。

编码器和解码器之间,还有一道道“质检联络员”——多跳注意力。编码器的每一层卷积后,解码器都做一次注意力校对,让每个解码位置学会从源序列中抓取相关信息。多跳意味着多层之间反复对齐,信息经过层层校验,减少翻译错位。单步注意力的核心公式如下:

这座工厂的布局是 ConvS2S 的核心贡献之一:编码器左右开工,解码器守规矩地向前看,注意力层层把关。相比于 RNN 的“一镜到底”,这种模块化设计让每个环节都能独立优化,也更容易并行。

Attention(Q,K,V)=softmax(QK⊤d)V\mathrm{Attention}(Q,K,V) = \displaystyle \mathrm{softmax}\left(\frac{QK^\top}{\sqrt{d}}\right)V
这个公式通过“查询”和“键”的匹配程度,决定从“值”中抽取多少信息,是解码器向编码器“要点”的机制。
  1. 查询 \(Q\)当前解码位置“想知道什么”的向量,工位上的订单需求。
    QQ
  2. 键 \(K\)源序列每个位置“能提供什么”的向量,仓库货架上的标签。
    KK
  3. 缩放点积 \(QK^\top/\sqrt{d}\)计算查询与每个键的匹配分数,除以 \(\sqrt{d}\) 防止分数过大导致 softmax 饱和。
    QK⊤d\frac{QK^\top}{\sqrt{d}}
  4. Softmax 与加权 \(V\)匹配分数归一化成权重,再对值 \(V\) 加权求和,得到聚合信息。
    softmax(⋅) V\mathrm{softmax}(\cdot)\,V

门控机制:GLU 这款智能质检员

流水线上最怕什么?怕传送带把没用的废料也一起送进下一道工序。传统卷积层后面常接 ReLU 激活函数——它像一位粗鲁的门卫,看到负数就一律轰走(置为 0),看到正数就全放行。这种“一刀切”虽然简单,但会丢失一些细微的相对信息,而且硬截断会让梯度在负数区完全消失。

ConvS2S 换了一位“智能质检员”:门控线性单元(Gated Linear Unit, GLU)。它不直接判断正负,而是把输入分别加工成两份材料:一份是“内容” \(A\),一份是“开度指示” \(B\)。质检员看 \(B\) 决定阀门开多大,再把阀门开度与内容相乘。这样,每个维度都能精细控制放行比例——想全开就输出接近原值,想全关就输出接近 0,犹豫时就放出中间值。

GLU 的另一个隐藏优势是梯度流动。ReLU 对负输入梯度恒为 0,网络深了容易“断流”;而 GLU 中内容路径的梯度可以原样穿过“内容”通道,即使阀门关闭,另一条路径也能为深层网络提供梯度信号。这就像流水线即使某段暂时停摆,检修通道依然能让工人通行。正因如此,ConvS2S 能堆到较深的层数而不怕梯度消失。

v=A⊙σ(B)v = \displaystyle A \odot \sigma(B)
这个公式表示,GLU 的输出是“内容”与“0 到 1 之间的门控值”逐元素相乘,像给信息装上了一道可调节的阀门。
  1. 内容 \(A\)输入经过线性变换后的“真实载荷”,携带待传递的特征。
    A=Wax+baA = W_a x + b_a
  2. 门控值 \(\sigma(B)\)输入另一路线性变换后过 sigmoid,输出范围(0,1),代表阀门开度。
    σ(B)=σ(Wbx+bb)\sigma(B) = \sigma(W_b x + b_b)
  3. 逐元素乘积 \(\odot\)开度与内容逐维度相乘,控制每个通道放行多少信息。
    A⊙σ(B)A \odot \sigma(B)

位置编码:给每个零件贴上工位号

流水线工人有个天生的盲区:他们只认得手边的零件,却不关心零件来自传送带的第几格。卷积操作是“空间等变”的——把输入稍微平移,输出也跟着平移,模型无法区分“我”和“你”谁先谁后。这对语言是致命的,因为“我爱你”和“你爱我”含义完全不同。

RNN 不需要担心这个问题,因为它的工作笔记天然按时间顺序书写。ConvS2S 既然放弃了递归结构,就得另想办法把“顺序”塞进模型。这个办法就是位置编码:为每个位置生成一个专属向量,加到词嵌入上,让卷积核在滑动时能“看到”位置信息。就像每个工位贴上醒目的大号编号牌。

ConvS2S 采用正弦位置编码,第 \(pos\) 个位置的嵌入向量中,偶数维度用 \(\sin\)、奇数维度用 \(\cos\):

把位置向量加到词向量上之后,即便卷积核只扫到一个局部窗口,它也能通过向量的“指纹”判断词与词的相对距离。这就像工人虽然只看三块零件,但每块零件上的编号已经告诉他这是第几件,从而按正确的顺序组装。

PE(pos,2i)=sin⁡(pos100002id),PE(pos,2i+1)=cos⁡(pos100002id)PE_{(pos, 2i)} = \displaystyle \sin\left(\frac{pos}{10000^{\frac{2i}{d}}}\right), \quad PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{\frac{2i}{d}}}\right)
这个公式用不同频率的正弦余弦波标记位置,让模型既能区分相邻位置,也能感知长距离的先后关系。
  1. 位置序号 \(pos\)词在句子中的绝对位置,从 0 开始,相当于工位号。
    pospos
  2. 维度索引 \(2i\) / \(2i+1\)嵌入向量的第几个维度,偶数维用 \(\sin\),奇数维用 \(\cos\)。
    2i, 2i+12i, \ 2i+1
  3. 波长缩放 \(10000^{\frac{2i}{d}}\)维度越高、波长越长,形成不同尺度的位置“指纹”。
    100002id10000^{\frac{2i}{d}}

对比与启发:流水线的得失与 Transformer 的诞生

流水线工厂并非没有代价。ConvS2S 的感受野虽然随层数线性增长,但每多一层都要付出参数和计算成本;窗口以外的信息必须靠层层传递才能抵达,这让它对超参数(卷积核大小、层数)特别敏感。相比之下,RNN 虽然慢,却天然拥有“无限视野”——理论上每个时间步都看过全部历史。一快一稳,各有取舍。感受野的线性扩张规律可以写成:

ConvS2S 的历史地位在于,它证明了“不用 RNN 也能做好 Seq2Seq”,并且贡献了两个影响深远的组件:显式位置编码和门控机制。这些都直接启发了后来横扫 NLP 的 Transformer。Transformer 做了更激进的改革:干脆把卷积核去掉,用全局自注意力让每个位置直接看到所有位置,并用同样的位置编码思路标注顺序。可以说,ConvS2S 是那座验证了“并行工厂”可行性的试验线,而 Transformer 是在它基础上设计的终极智能工厂。

R=1+(k−1)×LR = \displaystyle 1 + (k-1) \times L
这个公式说明,感受野大小 \(R\) 由卷积核 \(k\) 和层数 \(L\) 共同决定,层数越多看得越远。
  1. 感受野 \(R\)输出一个位置能间接看到的输入范围,即“工位的长程视野”。
    RR
  2. 卷积核大小 \(k\)每层窗口的宽度,窗口越大,单层视野越宽。
    kk
  3. 层数 \(L\)卷积堆叠的深度,每多一层,视野向两侧各扩展 \((k-1)/2\)。
    LL
  4. 线性增长关系感受野随层数线性增加,说明要多看远处就得堆更多层。
    R=1+(k−1)LR = 1 + (k-1)L

AI 应用场景

机器翻译的快速原型验证

阶段:模型训练与迭代调优

解决的问题:传统 RNN 翻译模型在千万级平行语料上训练以周计,串行瓶颈让每次实验迭代都无比漫长。ConvS2S 的卷积并行让训练吞吐成倍提升,工程师可以快速验证分词、数据增强等方案是否有效。

具体案例:某跨境电商平台搭建多语言客服翻译系统时,先用 ConvS2S 在小规模语料上完成快速初筛,识别主流语种对的难点,再让更大规模的精调模型接力训练。

长文档摘要的并行编码

阶段:推理性能优化

解决的问题:摘要任务常面对数百甚至上千词的输入,RNN 逐词编码导致推理延迟高。ConvS2S 的局部感知与并行计算能更快地处理长序列,同时保留关键信息。

具体案例:新闻 App 的标题生成管线将原文按句切块,用卷积编码器并行提取每句特征,再通过注意力聚焦核心句,最终压缩成一句话标题。

语音特征序列的低延迟建模

阶段:特征提取与序列建模

解决的问题:语音帧序列极长,逐帧 RNN 实时性差,而卷积天然适合提取局部声学特征。ConvS2S 的 GLU 门控能帮助筛选有效语音特征,降低唤醒词识别的响应延迟。

具体案例:智能音箱的唤醒词流式识别前端,用卷积编码帧级特征,在保证准确率的前提下将响应时间压缩到数百毫秒。

Python 演示

python66 行
import mathimport torchimport torch.nn as nn class PositionalEmbedding(nn.Module):    def __init__(self, d_model, max_len=128):        super().__init__()        pe = torch.zeros(max_len, d_model)        pos = torch.arange(max_len).unsqueeze(1).float()        div = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))        pe[:, 0::2] = torch.sin(pos * div)        pe[:, 1::2] = torch.cos(pos * div)        self.register_buffer('pe', pe.unsqueeze(0))     def forward(self, x):        return x + self.pe[:, :x.size(1)]  class GLU(nn.Module):    def __init__(self, d_model):        super().__init__()        self.proj_a = nn.Linear(d_model, d_model)        self.proj_b = nn.Linear(d_model, d_model)     def forward(self, x):        a = self.proj_a(x)        g = torch.sigmoid(self.proj_b(x))        return a * g  class ConvS2SBlock(nn.Module):    def __init__(self, d_model, kernel_size=3):        super().__init__()        self.conv1d = nn.Conv1d(d_model, d_model * 2, kernel_size,                                padding=kernel_size - 1)        self.glu = GLU(d_model)     def forward(self, x):        h = self.conv1d(x.transpose(1, 2)).transpose(1, 2)        h = h[:, :x.size(1), :]        return self.glu(h)  class ConvS2SEncoder(nn.Module):    def __init__(self, vocab_size, d_model=64, n_layers=3, kernel_size=3):        super().__init__()        self.embed = nn.Embedding(vocab_size, d_model)        self.pos_emb = PositionalEmbedding(d_model)        self.blocks = nn.ModuleList(            [ConvS2SBlock(d_model, kernel_size) for _ in range(n_layers)])     def forward(self, src):        x = self.pos_emb(self.embed(src))        for block in self.blocks:            x = block(x)        return x  if __name__ == '__main__':    torch.manual_seed(42)    vocab_size, seq_len, d_model = 100, 12, 64    src = torch.randint(0, vocab_size, (2, seq_len))    encoder = ConvS2SEncoder(vocab_size, d_model)    out = encoder(src)    print('输出形状:', out.shape)    print('ConvS2S 编码器前向传播成功')
目的:用 PyTorch 实现 ConvS2S 的核心组件——正弦位置编码、GLU 门控和一维卷积编码器,演示全卷积序列建模的基本流程。
  1. pe[:, 0::2] = torch.sin(pos * div)偶数维度用正弦函数生成位置向量,形成位置指纹。
  2. pe[:, 1::2] = torch.cos(pos * div)奇数维度用余弦函数,与正弦交替构成完整编码。
  3. self.register_buffer('pe', pe.unsqueeze(0))把位置编码表注册为缓冲区,随模型移动而移动。
  4. a = self.proj_a(x)对输入做线性变换,生成“内容”通道。
  5. g = torch.sigmoid(self.proj_b(x))另一路线性变换过 sigmoid,生成 0 到 1 的阀门开度。
  6. return a * g内容与门控逐元素相乘,实现 GLU 的精细放行。
  7. h = self.conv1d(x.transpose(1, 2)).transpose(1, 2)一维卷积沿序列方向扫描,同时处理所有位置。
  8. h = h[:, :x.size(1), :]裁剪掉 padding 造成的多余位置,保持序列长度不变。
  9. self.blocks = nn.ModuleList([...])用 ModuleList 堆叠多层卷积块,逐步扩大感受野。

常见误区

误区我刚开始学 ConvS2S 时以为,既然卷积要看远距离信息,那把卷积核设成和句子一样长不就行了?反正滑动窗口越大,看到的信息越多。

正解大卷积核会导致参数量爆炸,而且容易过拟合。ConvS2S 的智慧恰恰在于用小卷积核(通常 3~5)堆叠多层,让感受野线性扩张。这就像流水线不是靠一个工人伸长手臂抓取所有零件,而是靠多道工序依次传递。把核设太大,就像给工位装一个十米长的机械臂,成本高、难维护,还容易抓错。

为何常见:人们直觉上认为“窗口越大 = 看得越多 = 越强”,忽略了参数成本和特征层次性的价值。

误区我一度以为 GLU 就是 ReLU 的替代品,既然都是非线性激活,效果应该差不多,没必要深究。

正解两者机制完全不同。ReLU 是逐元素硬截断:负数直接归零。GLU 是乘性门控:把输入拆成“内容 A”和“门控 σ(B)”,用 0~1 的开度对内容逐维缩放。门控是“软开关”,保留了多少信息完全由数据学习决定;而且内容路径的梯度可以原样流过,有助于深层网络训练。这就像粗鲁门卫(ReLU)只会拦人或放人,智能质检员(GLU)却能精细调节流量。

为何常见:在代码里看两者都只是卷积层后的一行操作,容易归为同类,忽略了乘性结构带来的本质差异。

误区我觉得有了位置编码,模型每个位置都知道自己的序号,那顺序感就和 RNN 的循环结构完全等价了。

正解位置编码只是把“位置标签”显式放进向量里,模型能否用好这个标签,还要靠训练中自己学习;而 RNN 的顺序感是内建在递归结构里的,每步隐状态天然按时间累积历史。ConvS2S 必须“学会”借助位置信息组织上下文,RNN 是“不得不”按顺序组织。就像给工人发编号牌,他得先学会看牌、用牌,才能真正按顺序干活。

为何常见:从结果看两者都能区分先后顺序,容易误以为过程也相同,忽略了“显式注入”和“结构内建”的区别。

误区现在到处是 Transformer 和 BERT,ConvS2S 是个过渡产品,学了也马上过时,不如直接跳过去学注意力。

正解ConvS2S 是 Seq2Seq 从 RNN 走向并行的关键里程碑。它首次证明了无 RNN 的序列模型可以达到有竞争力的效果,其位置编码思想和门控机制被后续大量模型继承。而且卷积在局部特征建模上依然活跃(如音频、分词、图像)。理解 ConvS2S,等于看清 Transformer 的“前传”,能帮你回答“为什么 Transformer 要用位置编码”这类深层问题。

为何常见:技术迭代快,大家只追最新模型,忽略了里程碑工作的思想价值,导致知识根基不牢。

面试题

Q1. ConvS2S 中“全卷积”最准确的解释是什么?

单选题 · easy

  • A.完全不使用循环结构← 正确答案
  • B.所有卷积核尺寸相同
  • C.浮点运算全在卷积层
  • D.仅编码器使用卷积层

答案:A。ConvS2S 的“全卷积”指编码器和解码器都用卷积网络替代 RNN,完全摆脱循环结构。选项 B、C 描述的是实现细节而非本质;D 说反了——解码器同样使用因果卷积。

Q2. ConvS2S 诞生的核心动机是什么?

单选题 · mid

  • A.RNN 每一步必须等上一步← 正确答案
  • B.RNN 参数太多难以训练
  • C.卷积核消耗显存更小
  • D.RNN 无法在 GPU 运行

答案:A。RNN 的隐状态递归计算导致时间步之间强串行,GPU 无法充分利用。ConvS2S 用卷积把序列计算变为并行。B、C 不是核心动机,D 错误——RNN 可以在 GPU 上运行,只是并行效率低。

Q3. GLU 中 σ(B) 起到什么作用?

单选题 · mid

  • A.压缩特征到负一到一
  • B.生成零到一的门控向量← 正确答案
  • C.扩大模型的参数规模
  • D.对输出特征做归一化

答案:B。σ(B) 经过 sigmoid 输出 (0,1) 范围,作为逐维度阀门开度与内容相乘。它不是压缩到 [-1,1],也不是归一化。GLU 通过这个软门控精细控制信息放行比例。

Q4. 解码器使用因果卷积的根本原因是什么?

单选题 · mid

  • A.防止模型看到未来信息← 正确答案
  • B.降低参数量和内存占用
  • C.让梯度回传更加容易
  • D.让各位置输出更均匀

答案:A。因果卷积对卷积窗口做掩蔽,使第 t 个输出只看前 t-1 个位置,杜绝未来信息泄露。类似翻译时不能偷看还没翻译出的内容。B、C、D 都与因果卷积的主要目的无关。

Q5. 在 ConvS2S 中堆叠更多卷积层会带来什么?

单选题 · hard

  • A.感受野随之线性扩大← 正确答案
  • B.参数数量随之同步减少
  • C.模型训练速度线性变快
  • D.位置编码自动失去作用

答案:A。由公式 R = 1 + (k-1)L,感受野随层数 L 线性增长。堆层数能扩大视野,但参数会增多、速度变慢,位置编码不会失效。这也是 ConvS2S 在长距离依赖上的局限来源。

Q6. 位置编码要解决哪些核心问题?

多选题 · mid

  • A.卷积核无法感知全局次序← 正确答案
  • B.卷积天然缺乏顺序概念← 正确答案
  • C.门控单元需要位置作为输入
  • D.注意力必须依靠位置信息

答案:AB。卷积是局部等变的,滑动窗口不关心“第几个”,所以 A、B 是它要解决的问题。GLU 不需要位置作为输入,注意力本身也不强制要求位置——是卷积的引入才连带需要位置编码。

Q7. ConvS2S 的注意力机制与普通 Seq2Seq 有何不同?

单选题 · easy

  • A.它在每一层都做注意力← 正确答案
  • B.它完全不使用注意力
  • C.它把注意力换成内积
  • D.它只对编码端做注意力

答案:A。ConvS2S 使用多跳注意力,解码器每一层都与编码器输出进行对齐,因此是“每层一跳”。它并非不用注意力,选项 C、D 都是杜撰的细节。

Q8. ConvS2S 存在哪些已知局限?

多选题 · hard

  • A.窗口限制远程依赖建模← 正确答案
  • B.超参数多且调参敏感← 正确答案
  • C.完全无法处理变长序列
  • D.训练时无法使用 GPU

答案:AB。卷积感受野随层数线性增长,远处信息传递代价高,A 正确;kernel 大小、层数、通道数等超参数直接影响性能,B 正确。卷积本身可以处理变长输入(padding),且在 GPU 上训练很快,C、D 错误。

Q9. RNN 的“顺序感”与位置编码的本质区别在哪?

单选题 · mid

  • A.循环自带序,位置编码显式注入← 正确答案
  • B.位置编码的参数比 RNN 更多
  • C.两者在本质上是完全一样的
  • D.RNN 完全不需要任何位置信息

答案:A。RNN 通过递归结构天然按时间累积信息,位置编码则是把位置标签显式加到输入上、让模型自己学会使用。B 无依据,C 看似等价实则机制不同,D 中“完全”太绝对。

Q10. 为什么说 ConvS2S 启发了 Transformer?

多选题 · extreme

  • A.证明无 RNN 也能做序列建模← 正确答案
  • B.提出显式的位置编码方案← 正确答案
  • C.首次将注意力引入 NLP
  • D.用卷积核覆盖所有线性层

答案:AB。ConvS2S 证明脱离 RNN 的并行序列模型可行,并提出了正弦位置编码,这两点被 Transformer 直接继承。注意力在 NLP 中早已有之,Transformer 的贡献是“只用注意力”;D 与事实相反。因此 A、B 正确。