上一节我们系统性证明了:传统RNN/LSTM受梯度链式连乘 与串行递推约束,既无法高效建模长距离依赖,又丧失并行加速能力,难以胜任复杂序列转换任务。
而自然语言处理核心刚需------机器翻译、文本生成、摘要改写 ,本质都是变长输入序列 → 变长输出序列 的映射问题。为统一解决这类序列到序列的建模需求,学界提出 Seq2Seq(Sequence to Sequence)编码器-解码器通用框架 ,它也是原始Transformer最先落地、最经典的应用底座。本节从数学建模思想、结构分工、数值极简示例、核心痛点四层讲解,为后续Transformer拆解铺垫底层逻辑。
一、Seq2Seq核心数学建模定义
设定通用序列符号体系:
- 源输入序列(待翻译/待转换):
X=[x1,x2,...,xTx], xi∈Rd\boldsymbol{X} = [x_1,x_2,\dots,x_{T_x}],\ x_i\in \mathbb{R}^dX=[x1,x2,...,xTx], xi∈Rd
TxT_xTx:输入序列长度 - 目标输出序列(翻译结果/生成文本):
Y=[y1,y2,...,yTy], yj∈Rd\boldsymbol{Y} = [y_1,y_2,\dots,y_{T_y}],\ y_j\in \mathbb{R}^dY=[y1,y2,...,yTy], yj∈Rd
TyT_yTy:输出序列长度,满足 Tx≠TyT_x \ne T_yTx=Ty(变长映射核心特征)
Seq2Seq 的终极数学目标:
学习映射函数 \\mathcal{F} ,最大化条件概率:
F:max P(Y∣X) \mathcal{F}: \quad \max \ P(\boldsymbol{Y}\mid \boldsymbol{X}) F:max P(Y∣X)
也就是:给定完整输入源序列,建模输出目标序列的联合条件分布。
二、编码器 Encoder:将输入序列压缩为全局上下文向量
2.1 核心思想
编码器的唯一任务:逐时序吸收输入所有位置的语义、时序、关联信息,把变长源序列,抽象压缩成一个固定维度的全局上下文隐向量 C\boldsymbol{C}C 。
摒弃局部短时记忆,聚合全局序列特征,完成「序列 → 全局表征」。
2.2 数学表达(经典RNN编码器)
沿用基础循环递推:
ht=σ(Wxhxt+Whhht−1+bh) h_t = \sigma\left(W_{xh}x_t + W_{hh}h_{t-1}+b_h\right) ht=σ(Wxhxt+Whhht−1+bh)
遍历全部 TxT_xTx 个输入时刻后:
直接取最后一刻隐藏状态作为全局上下文:
C=hTx \boldsymbol{C} = h_{T_x} C=hTx
C∈Rh\boldsymbol{C}\in\mathbb{R}^hC∈Rh:固定维度向量,浓缩整句输入的全部核心信息。
2.3 通俗理解
机器翻译场景:输入中文句子所有字词,编码器读完之后,把整句话的含义、语序、逻辑打包压缩成一个向量包裹,传给解码器。
三、解码器 Decoder:基于上下文向量逐时刻生成目标序列
3.1 核心思想
解码器承接编码器输出的全局上下文 C\boldsymbol{C}C,自回归逐一生成目标序列每一个token :
每一步的生成,依赖:全局上下文 + 上一时刻已生成的输出记忆,完成「全局表征 → 变长目标序列」。
3.2 数学自回归生成逻辑
初始化:首个时刻依托上下文向量启动生成
s0=C s_0 = \boldsymbol{C} s0=C
后续每一步递推:
sj=σ(Wysyj−1+Wsssj−1+WcsC+bs) s_{j} = \sigma\left(W_{ys}y_{j-1} + W_{ss}s_{j-1} + W_{cs}\boldsymbol{C}+b_s\right) sj=σ(Wysyj−1+Wsssj−1+WcsC+bs)
再通过线性层映射词表概率:
P(yj∣y1,...,yj−1,X)=softmax(Wvocabsj+bvocab) P(y_j \mid y_1,\dots,y_{j-1},\boldsymbol{X}) = \text{softmax}(W_{\text{vocab}}s_j + b_{\text{vocab}}) P(yj∣y1,...,yj−1,X)=softmax(Wvocabsj+bvocab)
核心特点:自回归串行生成,当前词依赖历史生成词与全局上下文,严格模拟人类逐词造句、逐词翻译的过程。
四、具象机器翻译实战数值案例
本节贴合真实极简中英机器翻译场景,不再抽象标量模拟,绑定业务语义+词嵌入数值+完整编解码数学推演,全程可手动验算,完美匹配你专栏「数学原理+落地数值」的写作风格。
4.1 设定真实翻译业务场景
翻译任务:短句直译
源中文输入:我 爱 → 翻译目标英文输出:I love
- 源输入序列长度 Tx=2T_x=2Tx=2
- 目标输出序列长度 Ty=2T_y=2Ty=2
- 特殊标记:解码器起始占位符
<Start>
4.2 词嵌入初始化(人为定义低维数值,方便计算)
为每个字词分配一维简化词嵌入向量:
- x1x_1x1 = "我" :词嵌入 =1.0= 1.0=1.0
- x2x_2x2 = "爱" :词嵌入 =2.5= 2.5=2.5
- 解码器起始符 y0y_0y0 =
<Start>:固定赋值 =0= 0=0
4.3 全局统一模型超参数
编码器(中文序列压缩 RNN)
递推公式:
ht=tanh(Wxh⋅xt+Whh⋅ht−1)h_t = \tanh\left(W_{xh}\cdot x_t + W_{hh}\cdot h_{t-1}\right)ht=tanh(Wxh⋅xt+Whh⋅ht−1)
初始隐状态:h0=0h_0 = 0h0=0
固定权重:Wxh=0.3, Whh=0.4W_{xh}=0.3,\ W_{hh}=0.4Wxh=0.3, Whh=0.4
全局上下文规则:C=hTx\boldsymbol C = h_{T_x}C=hTx(取编码器最后时刻隐状态)
解码器(英文序列生成 RNN)
初始记忆绑定:s0=Cs_0 = \boldsymbol Cs0=C
递推公式:
sj=tanh(Wysyj−1+Wsssj−1+WcsC)s_j = \tanh\left( W_{ys}y_{j-1} + W_{ss}s_{j-1} + W_{cs}\boldsymbol C \right)sj=tanh(Wysyj−1+Wsssj−1+WcsC)
固定权重:Wys=0.2, Wss=0.3, Wcs=0.5W_{ys}=0.2,\ W_{ss}=0.3,\ W_{cs}=0.5Wys=0.2, Wss=0.3, Wcs=0.5
简化约定:解码器隐状态直接近似为当前生成单词的表征输出
4.4 第一步:Encoder 对中文序列编码压缩
时刻 t=1:输入第一个中文token「我」x1=1.0x_1=1.0x1=1.0
z1=Wxhx1+Whhh0=0.3×1.0+0.4×0=0.3 z_1 = W_{xh}x_1 + W_{hh}h_0 =0.3\times 1.0 + 0.4\times 0 = 0.3 z1=Wxhx1+Whhh0=0.3×1.0+0.4×0=0.3
h1=tanh(z1)≈0.2913 h_1 = \tanh(z_1) \approx 0.2913 h1=tanh(z1)≈0.2913
含义:模型读取字词「我」,生成第一时刻局部语义记忆。
时刻 t=2:输入第二个中文token「爱」x2=2.5x_2=2.5x2=2.5
z2=Wxhx2+Whhh1=0.3×2.5+0.4×0.2913=0.75+0.1165=0.8665 \begin{align} z_2 &= W_{xh}x_2 + W_{hh}h_1 \\ &= 0.3\times 2.5 + 0.4\times 0.2913 \\ &= 0.75 + 0.1165 \\ &= 0.8665 \end{align} z2=Wxhx2+Whhh1=0.3×2.5+0.4×0.2913=0.75+0.1165=0.8665
h2=tanh(0.8665)≈0.6996 h_2 = \tanh(0.8665) \approx 0.6996 h2=tanh(0.8665)≈0.6996
生成全局语义上下文向量
C=h2≈0.6996 \boldsymbol C = h_2 \approx \boldsymbol{0.6996} C=h2≈0.6996
物理语义:
编码器读完整句「我 爱」,把两个汉字的语义、搭配关系强行压缩进单个固定维度向量,作为全局记忆传递给解码器。
4.5 第二步:Decoder 自回归生成英文翻译序列
初始化配置:
解码器初始隐状态 s0=C=0.6996s_0=\boldsymbol C=0.6996s0=C=0.6996
首步输入起始标记 y0=0y_0=0y0=0
生成第1个英文单词:对应翻译「I」 (j=1)
zs1=Wysy0+Wsss0+WcsC=0.2×0+0.3×0.6996+0.5×0.6996=0+0.2099+0.3498=0.5597 \begin{align} z_{s1} &= W_{ys}y_0 + W_{ss}s_0 + W_{cs}\boldsymbol C \\ &= 0.2\times0 + 0.3\times0.6996 + 0.5\times0.6996 \\ &= 0 + 0.2099 + 0.3498 \\ &= 0.5597 \end{align} zs1=Wysy0+Wsss0+WcsC=0.2×0+0.3×0.6996+0.5×0.6996=0+0.2099+0.3498=0.5597
s1=tanh(0.5597)≈0.5075 s_1 = \tanh(0.5597) \approx 0.5075 s1=tanh(0.5597)≈0.5075
输出表征:y1≈0.5075y_1 \approx 0.5075y1≈0.5075 ,对应翻译单词 I
生成第2个英文单词:对应翻译「love」(j=2)
依赖三大信息:全局中文语义C\boldsymbol CC、已生成单词「I」、解码器上一刻记忆
zs2=Wysy1+Wsss1+WcsC=0.2×0.5075+0.3×0.5075+0.5×0.6996=0.1015+0.1523+0.3498=0.6036 \begin{align} z_{s2} &= W_{ys}y_1 + W_{ss}s_1 + W_{cs}\boldsymbol C \\ &= 0.2\times0.5075 + 0.3\times0.5075 + 0.5\times0.6996 \\ &= 0.1015 + 0.1523 + 0.3498 \\ &= 0.6036 \end{align} zs2=Wysy1+Wsss1+WcsC=0.2×0.5075+0.3×0.5075+0.5×0.6996=0.1015+0.1523+0.3498=0.6036
s2=tanh(0.6036)≈0.5402 s_2 = \tanh(0.6036) \approx 0.5402 s2=tanh(0.6036)≈0.5402
输出表征:y2≈0.5402y_2 \approx 0.5402y2≈0.5402 ,对应翻译单词 love
注意:真实大模型流程:解码器隐状态 sj → 全连接映射 → Softmax 归一化 → 词典概率分布 → 概率最大索引匹配单词。这个过程是比较复杂的,本例中简化了这个步骤,简化后的流程大概如下:
我们提前固化两个翻译单词的标准中心值:
- 单词 I\boldsymbol{I}I:基准中心值 μ1=0.50\mu_1 = 0.50μ1=0.50
- 单词 love\boldsymbol{love}love:基准中心值 μ2=0.54\mu_2 = 0.54μ2=0.54
这一步模拟真实模型中:词汇在语义向量空间拥有独有的聚类中心点。
接下来计算距离:匹配对应单词(欧式距离简化判定)
第一步:匹配 y1≈0.5075y_1 \approx 0.5075y1≈0.5075
- 与 I(μ1=0.50)\boldsymbol{I}(\mu_1=0.50)I(μ1=0.50) 的绝对距离:∣0.5075−0.50∣=0.0075|0.5075-0.50| = 0.0075∣0.5075−0.50∣=0.0075
- 与 love(μ2=0.54)\boldsymbol{love}(\mu_2=0.54)love(μ2=0.54) 的绝对距离:∣0.5075−0.54∣=0.0325|0.5075-0.54| = 0.0325∣0.5075−0.54∣=0.0325
0.0075<0.03250.0075 < 0.03250.0075<0.0325,数值空间上更近,因此判定:
y1≈0.5075 ⟺ 单词I\boldsymbol{y_1 \approx 0.5075 \iff 单词I}y1≈0.5075⟺单词I
第二步:匹配 y2≈0.5402y_2 \approx 0.5402y2≈0.5402
- 与 I(μ1=0.50)\boldsymbol{I}(\mu_1=0.50)I(μ1=0.50) 的绝对距离:∣0.5402−0.50∣=0.0402|0.5402-0.50| = 0.0402∣0.5402−0.50∣=0.0402
- 与 love(μ2=0.54)\boldsymbol{love}(\mu_2=0.54)love(μ2=0.54) 的绝对距离:∣0.5402−0.54∣=0.0002|0.5402-0.54| = 0.0002∣0.5402−0.54∣=0.0002
0.0002≪0.04020.0002 \ll 0.04020.0002≪0.0402,距离高度贴近love的中心,因此判定:
y2≈0.5402 ⟺ 单词love\boldsymbol{y_2 \approx 0.5402 \iff 单词love}y2≈0.5402⟺单词love
4.6 整段翻译链路汇总
- 原始中文输入序列:X={我(1.0),爱(2.5)}\boldsymbol X=\{我(1.0),爱(2.5)\}X={我(1.0),爱(2.5)}
- 编码压缩聚合:得到全局统一语义向量 C≈0.6996\boldsymbol C \approx 0.6996C≈0.6996
- 自回归解码输出英文序列:Y={I(0.5075),love(0.5402)}\boldsymbol Y=\{I(0.5075),love(0.5402)\}Y={I(0.5075),love(0.5402)}
完美落地 Seq2Seq 核心逻辑:
自然语言变长输入 →编码器聚合\xrightarrow{\text{编码器聚合}}编码器聚合 全局上下文表征 →解码器自回归\xrightarrow{\text{解码器自回归}}解码器自回归 目标语言变长输出
五、传统RNN版Seq2Seq致命缺陷
- 信息压缩瓶颈
所有输入长序列强行压缩单个固定向量C\boldsymbol{C}C,序列越长,信息丢失越严重,长句翻译直接崩坍; - 继承上篇全部RNN弊病
依然串行计算、长距离梯度消失、无法并行训练; - 全局无差异化依赖
解码器生成每一个词,平等依赖同一个C\boldsymbol{C}C,不能动态聚焦输入中最相关的局部字词。
六、总结
- Seq2Seq 编码器-解码器,是一切序列生成任务的通用数学框架,核心流水线:
输入变长序列→编码器全局上下文向量→解码器输出变长序列\boldsymbol{输入变长序列} \xrightarrow{编码器} \boldsymbol{全局上下文向量} \xrightarrow{解码器} \boldsymbol{输出变长序列}输入变长序列编码器 全局上下文向量解码器 输出变长序列 - 原始Transformer并不是凭空诞生:它完全沿用这套编解码架构,只是做了底层重构
- 抛弃RNN循环结构
- 用自注意力+位置编码替代串行压缩
- 解决固定上下文向量的信息瓶颈、梯度消失、无法聚焦、不可并行四大痛点