第三讲 · 序列建模

循环神经网络与长短期记忆

RNNs and LSTMs

词的表示与学习,历史状态的递推,门控记忆的更新,以及机器翻译中的序列生成、搜索和注意力。

3 个章节 · 20 个主题 · 91 个演示步骤

序列数据为什么需要新的表示

从图片分类到按顺序处理信息

前馈网络可以把一张图片映射到类别,例如判断图片是否为猫。这个任务把固定形状的输入交给网络,得到一次分类输出。

再看一段输入:one minus two plus three。依次读入数字和运算后,中间结果从 1 变为 −1,最后变为 2。模型需要保留前面计算的结果,并按顺序更新它。改变顺序或运算符,结果也会改变。

从识别一张图到理解一段序列。one minus two plus three:顺序决定运算过程
one minus two plus three:顺序决定运算过程

序列任务的输入可以有不同长度,当前计算还会依赖已经出现的内容。循环神经网络通过反复更新内部状态,把历史信息带到下一步。

本讲的四个环节

  • 词表示:离散词语怎样成为网络输入,向量怎样从文本中学习。
  • RNN:怎样根据前缀预测下一词,怎样沿时间传递状态和训练共享参数。
  • LSTM 与 GRU:怎样受控保留、写入和读出信息。
  • Seq2Seq:怎样生成另一个序列,怎样搜索译文,以及怎样用注意力访问源句。
本讲路线。Word Representation → RNN → LSTM → Sequence to Sequence
Word Representation → RNN → LSTM → Sequence to Sequence

从独热向量到词嵌入

先把词变成可计算的数值

神经网络的输入需要数值形式,因此先为每个词分配向量。仅仅分配几个数字还不足以表达语义;向量之间应该具有什么关系,要由表示方法和学习任务决定。

把词表示成向量。把离散符号转成可计算的输入
把离散符号转成可计算的输入

用余弦相似度比较方向

对两个非零向量,余弦相似度定义为:

\operatorname{cos}(u,v)=\frac{u^\top v}{\|u\|_2\|v\|_2}

向量同向时为 1,正交时为 0,反向时为 −1。它比较方向,消除了向量长度的影响;能否把这种接近解释为词义接近,取决于向量是否经过合适训练。

怎样比较两个词向量。余弦相似度比较方向
余弦相似度比较方向

词表编号没有编码词义关系

hotel、motel、conference 都可以出现在旅行相关文本中,但 hotel 和 motel 通常具有更相近的用法。希望词的表示能表达这些关系。

独热表示给每个词一个词表位置,只在对应位置取 1,其余为 0。例子中 hotel、motel、conference 分别位于第 8、11、2 个位置。

独热向量:一个词占一个位置。索引不同,向量内积仍为 0
索引不同,向量内积仍为 0

不同词的独热向量内积始终为 0,即使词义相近也是如此。大词表还会带来高维稀疏输入,词表可以超过 50 万项。

用低维稠密向量替代独热坐标

词嵌入为每个词分配一个可学习的低维稠密向量。训练使词的使用关系反映到向量的几何结构中;二维投影只是观察手段,实际维度通常更高。

词嵌入:低维稠密表示。通过可学习坐标建立词空间
通过可学习坐标建立词空间

嵌入矩阵 E 的每一行对应一个词。五个词、三个特征的示意表为:

  • motel:[0.234, -0.567, 0.891]
  • hotel:[-0.123, 0.456, -0.789]
  • conference:[0.678, -0.234, 0.345]
  • 第四行:[-0.456, 0.789, -0.123]
  • 第五行:[0.567, -0.891, 0.234]
从嵌入表取出一个词。独热选择与查表是同一计算
独热选择与查表是同一计算

这些示意数值用来说明表的结构,不能据此断言 hotel 与 motel 接近。查表等价于用独热向量选择矩阵中的一行:

E\in\mathbb{R}^{|V|\times d},\quad x_w\in\mathbb{R}^{|V|},\quad e_w=E^\top x_w\in\mathbb{R}^{d}

一个词由多个坐标共同刻画

可用动物、年龄、物体等手工特征帮助理解分布式表示:多个坐标共同描述一个词,不同词可以共享部分特征。实际学习的各维通常没有可直接命名的语义。

分布式表示共同刻画多种特征。多个坐标共同表示一个词
多个坐标共同表示一个词

词嵌入只解决输入编码,还可以作为编码器—解码器等序列网络的输入。接下来先解决这些向量怎样训练的问题。

三维示意向量的余弦值

cos

这些坐标用于说明嵌入表结构,相似度不代表训练后的语义关系。

分布式语义:意义来自上下文

从使用语境获得训练信号

为每个词设置向量之后,怎样学到有用的坐标?分布式语义的直觉是:一个词的意义可以由它经常出现的上下文刻画。具有相似用法的词,往往出现在相似环境中。

这些词向量从哪里来。文本中的使用关系提供训练信号
文本中的使用关系提供训练信号

例如 banking 在不同句子中与 debt、crises、regulation、system 等词共同出现:

观察 banking 的上下文。debt、crises、regulation、system 提供线索
debt、crises、regulation、system 提供线索

一次出现只提供局部线索,大量句子的邻近关系共同形成训练信号。Word2Vec 把这个直觉转为可以优化的预测任务。

Word2Vec 的两种预测任务

同一窗口,两种预测方向

  • CBOW:根据周围的上下文词预测中心词。
  • Skip-gram:根据中心词预测周围的上下文词。
CBOW 与 Skip-gram。上下文预测中心;中心预测上下文
上下文预测中心;中心预测上下文

训练先随机初始化词向量,再扫描文本窗口、计算预测概率和损失、更新向量,重复处理大量样本。

Word2Vec 怎样训练。扫描文本 → 预测邻词 → 调整词向量
扫描文本 → 预测邻词 → 调整词向量

移动中心词,形成新的词对

取文本片段 problems turning into banking crises as,窗口半径 m=2:

  • 中心为 into:预测 problems、turning、banking、crises。
  • 中心右移到 banking:预测 turning、into、crises、as。

一个完整窗口产生四个中心—上下文词对;中心本身不作为自己的上下文。句子边界附近的有效上下文可能更少。

Skip-gram 的概率目标

提高真实邻词的条件概率

语料有 T 个词,中心词为 w_t,窗口半径为 m。在模型的条件独立假设下,目标似然为:

L(\theta)=\prod_{t=1}^{T}\prod_{\substack{-m\le j\le m\\j\ne0}}P(w_{t+j}\mid w_t;\theta)

只包含实际存在的上下文位置。提高这个乘积,意味着提高观察到的邻接关系的概率。

让真实上下文的概率变大。对位置和窗口偏移求乘积
对位置和窗口偏移求乘积

取对数将乘积变为和,再取负号转成最小化问题:

J(\theta)=-\frac1T\sum_{t=1}^{T}\sum_{\substack{-m\le j\le m\\j\ne0}}\log P(w_{t+j}\mid w_t;\theta)
把似然转为可优化的损失。取对数,再取负号
取对数,再取负号

用两套向量表示词的两个角色

每个词有中心向量 v 和上下文向量 u。中心 c 与上下文候选 o 的兼容度由点积 u_oᵀv_c 给出。

同一个词为什么有两套向量。中心角色 v;上下文角色 u
中心角色 v;上下文角色 u

用 Softmax 在完整词表上归一化:

P(o\mid c)=\frac{\exp(u_o^\top v_c)}{\sum_{w\in V}\exp(u_w^\top v_c)}
把点积分数变成条件概率。完整词表上的 Softmax
完整词表上的 Softmax

分母需要所有上下文候选参与。两套各有 |V| 个 d 维向量,全部参数组成 θ:

\theta\in\mathbb{R}^{2d|V|},\qquad\theta\leftarrow\theta-\eta\nabla_\theta J
优化哪些参数。θ 包含全部中心向量与上下文向量
θ 包含全部中心向量与上下文向量

SGD 用一个样本或小批量估计梯度,沿梯度反方向更新。学习率 η 控制本次移动幅度。

负采样与稀疏更新

为什么完整 Softmax 昂贵

每个词对都需要对整个词表打分并计算归一化分母。即使只有一个真实上下文词,全部输出向量仍可能参与梯度。

完整 Softmax 的代价。每个词对都需要遍历整个词表
每个词对都需要遍历整个词表

负采样把任务改成二分类:区分真实中心—上下文词对与从噪声分布抽出的词对。一个真实词对配 k 个负样本,计算范围由词表规模变成抽样数量。

改成真假词对判断。真实邻接为正样本;抽取噪声词对为负样本
真实邻接为正样本;抽取噪声词对为负样本

这改变了训练目标,不能把结果直接当作完整 Softmax 下已归一化的下一词概率。

正样本拉近,负样本压低兼容度

Sigmoid 将实数分数映射到 0 与 1 之间:

\sigma(z)=\frac1{1+\exp(-z)}
Sigmoid 给出二分类概率。点积越大,越倾向真实词对
点积越大,越倾向真实词对

单个真实词对 (c,o) 的负采样损失为:

J_{c,o}=-\log\sigma(u_o^\top v_c)-\sum_{r=1}^{k}\log\sigma(-u_{n_r}^\top v_c)
负采样的损失。一个正样本与 k 个负样本
一个正样本与 k 个负样本

第一项希望真实点积更大。负项中点积前的负号使损失希望噪声点积更小;负样本也是训练数据的一部分,不能只计算正项。

噪声词怎样抽样

按词频的 3/4 次幂重新归一化:

P_n(w)=\frac{f(w)^{3/4}}{\sum_{v\in V}f(v)^{3/4}}

以频率 0.9 和 0.01 为例,取 3/4 次幂后分别约为 0.924 和 0.0316,再在整个词表上归一化。两词的抽样概率比从 90 缩小到约 29.2:高频词仍更容易抽到,低频词获得相对更多机会。

词频的 3/4 次幂抽样。高频仍更常见,低频获得相对更多机会
高频仍更常见,低频获得相对更多机会

只触及少量参数

一个完整窗口包含一个中心向量、2m 个真实上下文向量,每个真实词对再抽 k 个噪声上下文。因此最多触达:

1+2m+2km
一个窗口只更新少量向量。最多 2m + 1 + 2km 个向量
最多 2m + 1 + 2km 个向量

重复抽到同一词时,实际触达更少。其余向量在本次负采样更新中的梯度为 0。

静态词向量的一词多义

多种含义混在一个向量里

pike 可用于鱼、尖状武器、道路、跳水姿势等不同语境。标准静态词嵌入给同一个词表项一个固定向量,因此不同用法的训练信号会混合。

一个 pike,多个含义。不同语境共用一个固定向量
不同语境共用一个固定向量

一种改进思路是把同一个词周围的上下文窗口聚类,再将各簇作为不同词项重新训练,例如分别学习 bank1、bank2 的向量。这样能区分不同用法,但词义划分仍依赖聚类结果。

聚类上下文,分别表示不同词义。bank1、bank2:不同窗口簇作为不同词项训练
bank1、bank2:不同窗口簇作为不同词项训练

接下来从单个词转向整段序列:把词嵌入作为输入,再让网络状态根据已经出现的上下文变化。

从固定窗口到循环状态

先明确语言模型的任务

语言模型根据已经出现的前缀预测下一词,并给所有候选词一个概率分布。链式法则把整段序列的概率分解为:

P(x_1,\ldots,x_T)=\prod_{t=1}^{T}P(x_t\mid x_1,\ldots,x_{t-1})
语言模型要预测什么。根据前缀预测下一个词
根据前缀预测下一个词

搜索自动补全和输入提示都体现了这个任务:输入前缀变化,下一词分布也随之变化。

下一词预测的应用。搜索补全与输入提示
搜索补全与输入提示

固定窗口前馈网络怎样做

把最近几个词的嵌入拼接,例如 the students opened their,经过隐藏层和 Softmax 得到下一词分布。

固定窗口前馈语言模型。the students opened their → 下一词分布
the students opened their → 下一词分布
  • 窗口以外的历史完全不可见。
  • 不同位置使用不同的输入连接,不能自然共享同一种时间更新规则。
  • 扩大窗口会增加输入维度和参数,仍然有一个固定边界。

由此引出循环状态:用一个持续更新的向量概括已经读过的内容。

RNN 的递推计算

展开的是时间,复用的是参数

循环网络接收当前输入 x_t 和上一步状态 h_{t-1},用同一组参数计算 h_t。展开图中的多个单元,是同一个网络在不同时间的使用。

用同一个网络反复更新状态。h_t 由 h_(t−1) 和 x_t 决定
h_t 由 h_(t−1) 和 x_t 决定

完整前向流程

x_t=E^\top q_t,\quad h_t=\tanh(W_xx_t+W_hh_{t-1}+b_h)
\hat y_t=\operatorname{softmax}(W_yh_t+b_y)

q_t 是当前词的独热输入,x_t 是词嵌入,h_t 是隐藏状态,\hat y_t 预测下一词。读完 the 后预测 students;读完 students 后预测 opened,以此类推。

如果词嵌入为 d 维、隐藏状态为 n 维、词表大小为 |V|,则:

W_x\in\mathbb{R}^{n\times d},\quad W_h\in\mathbb{R}^{n\times n},\quad W_y\in\mathbb{R}^{|V|\times n}

隐藏状态是学习得到的数值摘要,不是预先写好的自然语言解释。不同前缀通过递推产生不同状态。

能力与代价

RNN 支持变长输入,相同参数处理每个位置,参数量不随长度增加。但每步依赖上一步,限制了时间维度上的并行;远处信息也可能在反复更新中被削弱。

RNN 的优势与限制。变长与共享;串行与长期遗忘
变长与共享;串行与长期遗忘

语言模型训练与 BPTT

用真实下一词监督每个位置

训练文本本身提供标签。当前位置输出的概率与真实下一词比较,得到交叉熵;整段损失取平均:

J=\frac1T\sum_{t=1}^{T}J_t,\qquad J_t=-\log\hat y_t[x_{t+1}]

这里 \hat y_t[x_{t+1}] 表示取出真实下一词对应的概率,不是把词向量当作类别标签。

训练时每一步都有真实下一词。汇总各位置的交叉熵
汇总各位置的交叉熵

共享参数接收所有时间位置的梯度

把网络沿时间展开,按普通链式法则反向传播,就是 BPTT。晚期损失会通过隐藏状态连接影响更早的计算。

沿时间展开图反向传播。各次参数使用的梯度贡献相加
各次参数使用的梯度贡献相加

如果 W_h 在多个时间位置使用,最终梯度为这些使用位置的贡献之和:

\frac{\partial J}{\partial W_h}=\sum_t\left.\frac{\partial J}{\partial W_h}\right|_{\text{第 }t\text{ 次使用}}

每一项包含通过计算图传来的相关路径。不能只给最后一次参数使用求梯度,也不能把展开后的参数当作互不相关的多组参数。

实际训练常采用截断 BPTT,例如每次只反传约 20 个时间步,以控制计算和存储成本。状态仍可向前传递更久,但梯度不会穿过截断位置。

梯度消失、爆炸与裁剪

多步反传的矩阵连乘

对 tanh RNN,单步状态雅可比为:

A_t=\frac{\partial h_t}{\partial h_{t-1}}=\operatorname{diag}(1-h_t^2)W_h

从 t 传回 k 的状态影响为:

\frac{\partial h_t}{\partial h_k}=A_tA_{t-1}\cdots A_{k+1}

矩阵乘法顺序不能交换。多个变换可能反复缩小某些方向的梯度,使远处监督难以改变早期状态。

梯度为什么越传越小。多个连续变换可能反复缩小梯度
多个连续变换可能反复缩小梯度

梯度爆炸导致不稳定更新

反复放大则可能产生过大的梯度。SGD 更新 θ←θ−ηg 时,过大步长可能跨入高损失区域,甚至出现 Inf 或 NaN。

过大梯度造成过大更新。θ_new = θ_old − ηg
θ_new = θ_old − ηg

裁剪保持方向并限制幅度

设阈值为 τ,范数裁剪可写成:

g_{\mathrm{clip}}=g\min\left(1,\frac{\tau}{\|g\|_2}\right)

g=0 时保持为零。超过阈值才按比例缩小;它控制爆炸,不会自动恢复已经消失的长期监督。

梯度裁剪:同方向,小步长。超过阈值时按比例缩小范数
超过阈值时按比例缩小范数

接下来要解决长期保留

普通 RNN 的整个状态不断经过非线性变换,历史信息容易被改写。可以增加一条能受控保留、擦除和写入的记忆通路,这正是进入 LSTM 的动机。

怎样在多步之后仍保留信息。普通状态不断被整体改写
普通状态不断被整体改写

LSTM 的状态与门

时间递推不变,单元内部改变

LSTM 仍沿序列更新,但相较普通 RNN,内部增加细胞状态与门控运算。

从普通循环单元到 LSTM。时间结构相同,内部更新更丰富
时间结构相同,内部更新更丰富

每一步同时维护 c_t 与 h_t,二者都是 n 维向量:c_t 作为记忆通路,h_t 作为当前对外输出,并参与下一步计算。

细胞状态 c 与隐藏状态 h。记忆通路与当前输出分开
记忆通路与当前输出分开

门是动态的逐元素控制信号

遗忘门 f_t 控制旧记忆的保留,输入门 i_t 控制候选内容的写入,输出门 o_t 控制记忆对外暴露。每一道门都是向量,各分量由当前输入和上一步隐藏状态计算。

门决定擦除、写入和读出多少。各分量随当前上下文动态计算
各分量随当前上下文动态计算

Sigmoid 输出介于 0 与 1 之间,可近似理解为关闭、打开或中间比例。同一时刻,不同分量可以采取不同策略。

完整更新:先定位记忆主通路

把 z_t=[h_{t-1};x_t] 作为拼接输入,四个变换为:

f_t=\sigma(W_fz_t+b_f),\quad i_t=\sigma(W_iz_t+b_i)
o_t=\sigma(W_oz_t+b_o),\quad\tilde c_t=\tanh(W_cz_t+b_c)
c_t=f_t\odot c_{t-1}+i_t\odot\tilde c_t,\quad h_t=o_t\odot\tanh(c_t)
沿细胞通路读完整更新。线性相加与输入拼接两种写法等价
线性相加与输入拼接两种写法等价

⊙ 是逐元素乘法,方括号中的分号表示拼接。写成 W_hh_{t-1}+W_xx_t 与写成 [W_h,W_x][h_{t-1};x_t] 等价;拼接改变输入组织,不改变更新主旨。

用一组数值看清计算关系

固定旧记忆 c=[0.8,−0.4],遗忘门 f=[0.75,0.25],输入门 i=[0.5,0.8],候选 c̃=[0.2,0.3],输出门 o=[0.5,0.8]:

保留项为 [0.6,−0.1],写入项为 [0.1,0.24],相加得到新记忆 [0.7,0.14],再得到 h≈[0.302,0.111]。这是用于说明运算的补充数值例子,实际门值由网络学习。

LSTM 的四步更新

第一步:决定丢弃哪些旧信息

当前输入和上一步隐藏状态共同产生遗忘门。每个分量越接近 1,对应旧记忆保留越多;越接近 0,保留越少。

f_t=\sigma(W_f[h_{t-1};x_t]+b_f),\qquad f_t\odot c_{t-1}
第一步:保留旧信息。f_t ⊙ c_(t−1)
f_t ⊙ c_(t−1)

第二步:准备新内容和写入量

i_t=\sigma(W_i[h_{t-1};x_t]+b_i),\qquad\tilde c_t=\tanh(W_c[h_{t-1};x_t]+b_c)

输入门决定写入多少,候选状态给出写什么。候选经过输入门缩放后才进入细胞状态。

第二步:准备新内容。输入门 i_t 与候选 c̃_t
输入门 i_t 与候选 c̃_t

第三步:更新细胞状态

c_t=f_t\odot c_{t-1}+i_t\odot\tilde c_t
第三步:合并保留项与写入项。c_t = f_t ⊙ c_(t−1) + i_t ⊙ c̃_t
c_t = f_t ⊙ c_(t−1) + i_t ⊙ c̃_t

保留项与写入项通过加法合并。沿细胞主通路可以更直接地保存信息;保留程度仍取决于门值,不能据此保证梯度永不消失。

第四步:产生当前隐藏状态

o_t=\sigma(W_o[h_{t-1};x_t]+b_o),\qquad h_t=o_t\odot\tanh(c_t)
第四步:从新记忆产生输出。h_t = o_t ⊙ tanh(c_t)
h_t = o_t ⊙ tanh(c_t)

tanh 将数值压到 −1 与 1 之间,输出门再控制暴露量。较大或较小的绝对值并不直接代表语义重要性。c_t 继续沿记忆通路传递,h_t 服务当前输出和下一步控制。

GRU:更紧凑的门控单元

一个状态,两道门

GRU 合并细胞状态和隐藏状态。更新门 z_t 控制旧状态与候选的混合,重置门 r_t 控制生成候选时使用多少旧信息。

GRU 合并两种状态。更新门与重置门控制一个状态
更新门与重置门控制一个状态
z_t=\sigma(W_z[h_{t-1};x_t]+b_z),\quad r_t=\sigma(W_r[h_{t-1};x_t]+b_r)
\tilde h_t=\tanh(W_c[r_t\odot h_{t-1};x_t]+b_c)
h_t=(1-z_t)\odot h_{t-1}+z_t\odot\tilde h_t
GRU 的四项计算。门 → 候选 → 新状态
门 → 候选 → 新状态

在这里的约定下,z 越大,新候选的贡献越多。有些资料采用相反的 z 定义,比较时要检查状态混合公式。更简单的结构不意味着每个任务上都优于 LSTM。

机器翻译、对齐与搜索

先明确机器翻译任务

机器翻译把源语言句子转成目标语言句子,要求保留意思并生成自然表达。两侧的词数和词序都可能不同。

机器翻译:源句到目标句。语言与长度都可以不同
语言与长度都可以不同

早期系统主要依赖双语词典和人工规则,例如俄译英。逐词替换遇到歧义和语序变化后,需要越来越多的人工处理。

早期翻译依赖规则和词典。从逐词对应开始
从逐词对应开始

统计翻译分开建模忠实和流畅

以法语 x 到英语 y 为例,贝叶斯分解得到:

\arg\max_yP(y\mid x)=\arg\max_yP(x\mid y)P(y)
统计翻译分别建模忠实与流畅。P(x|y) × P(y)
P(x|y) × P(y)

P(x|y) 是翻译模型,从平行语料学习对应关系;P(y) 是语言模型,从目标语言文本学习流畅性;搜索负责找到二者共同高分的译文。

平行语料提供表达同一内容的句子对,通常没有逐词对齐标签。

从平行语料学习翻译。同一内容的两种语言版本
同一内容的两种语言版本

对齐是句子内部的对应关系

引入潜变量 a 表示源词和目标词的对应:

P(x\mid y)=\sum_aP(x,a\mid y)
对齐:句子内部的词怎样对应。未知对应关系作为潜变量 a
未知对应关系作为潜变量 a

有的词没有另一侧的直接对应,可以引入空对应。语言表达习惯不同,对齐关系不局限于一对一:

  • 多对一:多个词共同对应一个词。
对齐可以多对一。多个源词共同表达一个目标词
多个源词共同表达一个目标词
  • 一对多:一个词对应多个词;fertility 表示对应词的数量。
对齐也可以一对多。一个源词生成多个目标词
一个源词生成多个目标词

法语 entarté 对应英语 hit … with a pie 所表达的动作。il m’a entarté → he hit me with a pie 将贯穿后面的序列生成与搜索例子。

entarté:一个词表达整个动作。he hit me with a pie
he hit me with a pie
  • 多对多:可以把整个短语作为对应单位。
短语级对齐可以多对多。整个短语共同表达意义
整个短语共同表达意义

学习对齐和模型参数

统计模型组合词翻译概率、位置关系、fertility 等因素。由于 a 没有直接标注,需要 EM 等学习含潜变量的算法,同时估计对应关系和参数。

没有对齐标签,怎样学习。同时估计对齐与模型参数
同时估计对齐与模型参数

有了概率模型,仍然需要解码

穷举所有译文过于昂贵。在满足特定独立性假设时,可以用动态规划复用子问题,例如 Viterbi。其最优性适用于相应模型假设,不能推广到任意翻译系统。

学出概率之后,还要搜索译文。独立性假设使动态规划可用
独立性假设使动态规划可用

统计翻译因此形成许多单独设计的子系统、特征和短语资源,维护时还要为不同语言对重复投入。接下来用一个神经网络统一优化整个翻译过程。

统计翻译的工程负担。多个子系统、特征和外部资源
多个子系统、特征和外部资源

编码器—解码器与条件语言模型

两个循环网络连接源句和目标句

编码器读取源句,产生源表示;解码器接收源表示,根据已经生成的目标前缀逐词输出。基础 Seq2Seq 用编码器最后的状态初始化解码器。

用两个循环网络完成翻译。编码源句,按条件生成目标句
编码源句,按条件生成目标句

输入 il m’a entarté,输出 he hit me with a pie。解码从起始符开始,直到产生结束符;输入输出长度不必相同。

Seq2Seq 同样适用于摘要、对话、把句子解析为结构序列,以及从自然语言生成代码。

Seq2Seq 不限于翻译。摘要、对话、解析与代码生成
摘要、对话、解析与代码生成

解码器是条件语言模型

P(y\mid x)=\prod_{t=1}^{T}P(y_t\mid y_{<t},x)
解码器是条件语言模型。P(y|x) = ∏ P(y_t|y_<t,x)
P(y|x) = ∏ P(y_t|y_<t,x)

它既依赖目标前缀,又依赖源句 x,这个分解给出整段译文的概率。

训练时使用真实前缀

平行语料提供真实目标序列。每步输入真实前一个词,计算真实下一词的负对数概率,损失沿编码器与解码器端到端反传。

平行语料上的端到端训练。真实前缀 → 下一词交叉熵
真实前缀 → 下一词交叉熵

推理时前缀由模型自己生成,因此还需要决定怎样在可能的译文之间搜索。

翻译评价与系统边界

NMT 的优势与限制

相较分立的统计系统,神经翻译能统一优化整体概率,更好利用连续表示、上下文和相似短语,减少人工模块、特征和外部资源的设计。

神经翻译一起优化整个系统。流畅、上下文利用与工程简化
流畅、上下文利用与工程简化

统一模型也更难解释和调试,不容易直接写入复杂翻译规则,显式控制与安全要求仍需要额外处理。

统一模型也有新的限制。解释、调试与显式控制较难
解释、调试与显式控制较难

BLEU:短语重合的自动指标

BLEU 将机器译文与一个或多个参考译文比较,通常综合 1 至 4 元短语的裁剪精确率,并对过短译文施加惩罚。

BLEU 怎样评价翻译。n-gram 匹配与短句惩罚
n-gram 匹配与短句惩罚

它便于批量比较,但不能覆盖完整语义质量。一个忠实的同义译文也可能因短语重合低而得分较低。

历史进展与仍然存在的困难

2013—2016 年的对比图展示了神经翻译在当时实验中的提升。2014 年的 Seq2Seq 工作和 2016 年大型翻译系统向 NMT 的转变,是这段历史中的关键节点。

统计翻译到神经翻译的进展。2013—2016 的实验和技术转变
2013—2016 的实验和技术转变

性能提高仍不等于任务已经解决:未知词、训练测试领域差异、长文本上下文、低资源语言对都可能造成困难。

性能提高之后仍有难点。未知词、领域、长上下文与低资源
未知词、领域、长上下文与低资源

错误例子分别揭示什么

习语与常识:pelo en la lengua 的字面翻译丢失了习语含义,译文流畅也可能意思错误。

习语和常识不能靠字面对应。pelo en la lengua 的翻译错误
pelo en la lengua 的翻译错误

语料偏差:原文没有指定性别,模型却在护士与程序员例子中补入不同性别,反映了训练数据中的关联。

语料偏差也会进入译文。原文未指定性别,译文却补上性别
原文未指定性别,译文却补上性别

难解释的异常行为:重复字符被翻译成看似完整的句子,说明需要检查异常输入与失败模式。

异常输入产生难解释的输出。重复字符被翻译成完整句子
重复字符被翻译成完整句子

改进方向之一是注意力。先回到基础 Seq2Seq 的信息路径,找出结构上的瓶颈。

继续改进:直接查看源句。从翻译的进展转入 Attention
从翻译的进展转入 Attention

固定向量瓶颈与注意力

整段源句挤在最终状态里

基础编码器—解码器用编码器最后一个状态承载全部源信息,再让解码器逐词输出。源句越长,这个固定表示承担的信息越多。

整段源句压到最后一个状态。固定表示承载全部源信息
固定表示承载全部源信息

每个解码步直接查看全部源状态

注意力保留编码器各位置的状态。解码器根据当前状态,为源位置分配不同关注量,再提取这一轮需要的信息。生成不同目标词时,关注也会改变。

每个解码步直接连接源状态。每轮选择相关源位置
每轮选择相关源位置

先沿图走完过程

  • 当前解码状态分别与每个源状态比较,得到一组兼容度分数。
  • 通过 Softmax 变成非负、和为 1 的关注分布。
  • 按这些权重汇总源状态,得到这一轮的上下文向量。
  • 将上下文与当前解码状态一起用于预测下一词。
  • 进入下一步,更新解码状态,重新计算分数、权重与上下文。

例子先生成 he,再生成 hit、me、with、a、pie。每一步都重新选择源信息,整个过程不再只依靠最后一个编码状态。

注意力的公式与打分变体

打分和归一化

设源状态为 h_1,…,h_N,当前解码状态为 s_t。先采用相同维度下的点积:

e_{t,i}=s_t^\top h_i,\qquad\alpha_{t,i}=\frac{\exp(e_{t,i})}{\sum_{j=1}^{N}\exp(e_{t,j})}
把图解写成打分与归一化。e_(t,i) = s_tᵀh_i;α_t = softmax(e_t)
e_(t,i) = s_tᵀh_i;α_t = softmax(e_t)

分数向量与权重向量都包含 N 项;归一化沿源位置进行,权重非负且求和为 1。

加权汇总并预测

a_t=\sum_{i=1}^{N}\alpha_{t,i}h_i,\qquad[a_t;s_t]
加权汇总后一起预测。a_t = ∑ α_(t,i)h_i;[a_t;s_t]
a_t = ∑ α_(t,i)h_i;[a_t;s_t]

若源状态为 d_h 维,a_t 也是 d_h 维。与 d_s 维解码状态拼接后为 d_h+d_s 维,交给输出层预测。α 表示权重,a 表示汇总后的上下文,二者不能混用。

直接访问与软对齐

注意力通过聚焦相关源位置改善翻译表现,绕过固定向量瓶颈,使当前词有专属上下文,也为远处源位置提供更短的监督路径。这有助于长期依赖学习,但不意味着所有问题都会消失。

直接访问源状态带来什么。绕过瓶颈,缩短梯度路径
绕过瓶颈,缩短梯度路径

观察关注分布,还可以看到软对齐:即使没有显式对齐标签,entarté 仍能与多个目标词形成对应关系。

关注分布提供软对齐。没有显式对齐标签,仍能观察对应关系
没有显式对齐标签,仍能观察对应关系

权重能辅助观察网络访问哪些位置,不能直接当作完整的因果解释。

三种兼容度打分

e_{t,i}=s_t^\top h_i

点积要求两种状态维度相同。

e_{t,i}=s_t^\top Wh_i,\quad W\in\mathbb{R}^{d_s\times d_h}

双线性打分用矩阵连接不同维度。

e_{t,i}=v^\top\tanh(W_hh_i+W_ss_t+b)
W_h\in\mathbb{R}^{d_a\times d_h},\quad W_s\in\mathbb{R}^{d_a\times d_s},\quad v,b\in\mathbb{R}^{d_a}

加性注意力先映射到 d_a 维共同空间,再得到标量分数。这些变体改变打分函数,后续的 Softmax 与加权汇总保持相同。

三种兼容度打分函数。点积、双线性与加性注意力
点积、双线性与加性注意力