\[ \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,目标是能够明确因果信息边界,核对序列、掩码和注意力张量的维度,并选择与任务相符的上下文建模方法。
准确解释序列任务、因果信息边界与循环状态;
根据公式和张量维度分析注意力,并识别常见实现错误;
用 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 函数。这样得到的平均损失不会仅仅因为序列长度不同而改变。
本章小结
序列建模首先要定义信息可用边界。
循环与注意力采用不同的上下文聚合机制。
长度、填充、位置和掩码必须在维度上明确表达。