\[ \begin{align}\begin{aligned}\newcommand{\ba}{\boldsymbol{a}} \newcommand{\bb}{\boldsymbol{b}} \newcommand{\be}{\boldsymbol{e}} \newcommand{\bw}{\boldsymbol{w}} \newcommand{\bx}{\boldsymbol{x}} \newcommand{\by}{\boldsymbol{y}} \newcommand{\bz}{\boldsymbol{z}} \newcommand{\bd}{\boldsymbol{d}} \newcommand{\bv}{\boldsymbol{v}} \newcommand{\bs}{\boldsymbol{s}}\\\newcommand{\btheta}{\boldsymbol{\theta}} \newcommand{\bbeta}{\boldsymbol{\beta}} \newcommand{\bgamma}{\boldsymbol{\gamma}} \newcommand{\bsigma}{\boldsymbol{\sigma}} \newcommand{\md}{\mbox{d}} \newcommand{\bmu}{\boldsymbol{\mu}} \newcommand{\bone}{\boldsymbol{1}} \newcommand{\trans}{^{\rm\scriptsize T}} \newcommand{\var}{\mathrm{var}}\\\newcommand{\bA}{\boldsymbol{A}} \newcommand{\bB}{\boldsymbol{B}} \newcommand{\bC}{\boldsymbol{C}} \newcommand{\bD}{\boldsymbol{D}} \newcommand{\bG}{\boldsymbol{G}} \newcommand{\bI}{\boldsymbol{I}} \newcommand{\bM}{\boldsymbol{M}} \newcommand{\bP}{\boldsymbol{P}} \newcommand{\bS}{\boldsymbol{S}} \newcommand{\bU}{\boldsymbol{U}} \newcommand{\bW}{\boldsymbol{W}} \newcommand{\bX}{\boldsymbol{X}} \newcommand{\bY}{\boldsymbol{Y}} \newcommand{\bZ}{\boldsymbol{Z}} \newcommand{\cotp}{\textcolor[RGB]{48,209,88}{TP}} \newcommand{\cotn}{\textcolor[RGB]{100,210,255}{TN}} \newcommand{\cofp}{\textcolor[RGB]{94,92,230}{FP}} \newcommand{\cofn}{\textcolor[RGB]{191,90,242}{FN}}\\\newcommand{\numcotp}{\textcolor[RGB]{48,209,88}{50}} \newcommand{\numcotn}{\textcolor[RGB]{100,210,255}{30}} \newcommand{\numcofp}{\textcolor[RGB]{94,92,230}{10}} \newcommand{\numcofn}{\textcolor[RGB]{191,90,242}{10}} \DeclareMathOperator*{\argmin}{arg\,min}\end{aligned}\end{align} \]

序列模型#

学习目标与记号#

  文本、时间序列和其他序列数据的含义依赖顺序、上下文以及预测时可获得的信息。序列模型需要在表示长期依赖、训练并行性和计算成本之间权衡;本章将学习 RNN、LSTM、GRU、注意力、Transformer 与 BERT,目标是能够明确因果信息边界,核对序列、掩码和注意力张量的维度,并选择与任务相符的上下文建模方法。

  1. 准确解释序列任务、因果信息边界与循环状态;

  2. 根据公式和张量维度分析注意力,并识别常见实现错误;

  3. Python 实现或验证位置表示;在其他条件相同的情况下,只改变一个需要研究的因素进行比较,并根据实验结果分析该因素可能带来的影响。

  本章沿用统一记号:普通小写字母表示标量,粗体小写字母表示向量,粗体大写字母表示矩阵或高阶张量;层编号写作上标 \([l]\)⁠,样本或时间编号写作下标;转置写作 \(\trans\)⁠。除非另有说明,单个向量均为列向量;需要写成行向量时,必须显式使用转置符号 \(\trans\)⁠。若把 \(N\) 个列向量按行组成矩阵,则统一写为 \(\boldsymbol{U}=[\boldsymbol{u}_1\trans;\ldots;\boldsymbol{u}_N\trans]\)⁠。本章各节的程序均应同时检查数值结果和数组维度。

核心推导与实现核验#

核心关系

\[(\bx_1,\ldots,\bx_T)\longmapsto(\by_1,\ldots,\by_{T'}),\]

其中 \(\bx_t\in\mathbb{R}^{d_x}\)\(\by_t\in\mathbb{R}^{d_y}\) 均为列向量;公式两侧的圆括号表示按时间顺序排列的向量序列,并不表示行向量。

  推导路径。 序列模型先规定每个预测时刻允许观察的输入集合,再用循环状态或注意力聚合上下文;输出长度由任务类型决定,不必等于输入长度。

关键条件

  如果训练或测试模型时使用了实际预测时尚未获得的未来数据,或者使用全部数据计算均值、标准差等预处理参数,模型就会提前获得本不应该知道的信息。此时得到的测试结果通常过于乐观,不能准确反映模型在实际应用中的表现。

数据规模

  若一个批次有 \(B\) 条序列、每条序列长度为 \(T\)⁠、每个位置的特征列向量为 \(\bx_{b,t}\in\mathbb{R}^{d}\)⁠,则实现中可将 \(\bx_{b,t}\trans\) 放在批量张量的第 \((b,t)\) 个位置,得到大小为 \(B\times T\times d\) 的输入张量。表示有效位置的基本掩码大小为 \(B\times T\)⁠。多头注意力使用掩码时,还需让它覆盖各注意力头以及查询和键的位置。

常见误区

  随机划分时间序列、让填充词元参与损失、或忘记位置与因果掩码,会产生看似良好的错误结果。

动手检查

  把公式 \((\bx_1,\ldots,\bx_T)\longmapsto(\by_1,\ldots,\by_{T'})\) 分解为可独立检查的中间量,使用简单数据手工计算结果,并检查输出是否满足模型必须具备的性质;如果已有可靠的程序库实现,还应将两者的结果进行比较。

数值稳定性与规模

  对长度不同的序列组成批次时,通常需要在较短序列的末尾加入 padding由于这些位置不包含真实词元,因此不应参与损失计算。程序可以使用布尔掩码标记有效词元,将有效位置的交叉熵相加,再除以有效词元的总数。输出层的线性运算结果可以直接传给交叉熵函数,无须事先手动计算 Softmax 函数。这样得到的平均损失不会仅仅因为序列长度不同而改变。

本章小结#

  1. 序列建模首先要定义信息可用边界。

  2. 循环与注意力采用不同的上下文聚合机制。

  3. 长度、填充、位置和掩码必须在维度上明确表达。