语言模型不能直接对一段可见文字执行矩阵乘法。原始字节必须先被解释为有边界的文本记录,再按任务规则形成样本,经规范化、分词、特殊词元插入和长度处理,最终成为整数张量。只有先说明这些对象,后续的嵌入、注意力和训练目标才有明确输入。
本章是全书数据主线的第一部分,处理理解模型计算所必需的输入语义:文本长什么样、样本边界在哪里、词元编号如何产生,以及变长序列如何组成批次。第18章《训练数据工程基础》是第二部分,再讨论大规模采集、治理、去重、混合、分片和可恢复生产。前一部分回答“模型接收什么”,后一部分回答“这些输入如何被可靠地生产出来”。
文本编码决定序列长度、稀有字符串的表示方式、模型输出空间以及对话边界。本章区分字符、字节和词元,再讨论基于合并规则、最长匹配和概率分段的三类方法;同时保留从 N-gram、词向量到循环网络的必要背景,用来说明序列表示为何逐步转向注意力。所有手算例均为明示的小型构造,用于检验数学过程,不代表任何现有模型的实际词表或性能。
4.1模型输入构造
文本边界
磁盘中的文本首先是按某种字符编码保存的字节,但训练器通常不直接把整个文件当作一个样本。数据还需要区分至少四个层次:原始资料是抓取文件、文档或消息快照;逻辑记录保留一篇文章、一轮对话或一组问答的语义结构;训练样本是按特定任务从记录中选择或切出的消费单位;模型序列则是加入边界符号、完成截断或填充后的词元编号。一个对象在上一层完整存在,不意味着它在下一层仍保持相同边界。
例如,同一段包含标题、两个段落和来源字段的 JSONL 记录,可以作为一条完整文档参加预训练,也可以按段落切成两条样本;用于监督微调时,它还可能被转换成带角色边界的消息序列。三种处理读取了相同文字,却定义了不同的条件上下文、结束位置和有效标签。换行是否保留、空文档是否丢弃、相邻记录之间是否插入 EOS,都不是分词器能够自行决定的事实。
| 层次 | 典型对象 | 本层必须明确的决定 |
|---|---|---|
| 存储层 | UTF-8 文件、JSONL、Parquet | 字节编码、字段与记录边界 |
| 语义层 | 文档、消息序列、问答对 | 字段含义、顺序与分组关系 |
| 样本层 | 文本窗口、提示—回答、句对 | 任务边界、截断与监督区域 |
| 模型层 | 词元编号、特殊词元、有效性掩码 | 词表版本、长度、填充及位置来源 |
这里先固定一个重要边界:本章只建立单条记录如何成为模型输入的最小语义,不展开来源许可、海量去重、混合比例、分片发布和删除传播。那些问题不影响读者理解一次分词和一次注意力计算,却会决定真实训练集的分布与可追溯性,因而集中留到第18章《训练数据工程基础》。
最小输入管线及张量形状
设第 \(b\) 条原始文本为 \(s^{(b)}\),规范化函数为 \(N\),固定分词器为 \(T\)。编码结果是长度可变的编号序列
任务模板可以在编码前组织结构,也可以由后处理器插入 BOS、EOS、SEP 等特殊词元。随后按明确策略截断,并将同一批次补齐到 \(T_{\max}\),得到编号张量 \(K\in\{0,\ldots,V-1\}^{B\times T_{\max}}\) 和有效性掩码 \(M\in\{0,1\}^{B\times T_{\max}}\)。\(M_{bt}=1\) 表示该位置来自样本协议中的真实输入,零表示为组成矩形张量而添加的填充位置。
本章后文将通过嵌入矩阵把 \(K\) 转换为连续张量 \(X\in\Real^{B\times T_{\max}\times d}\);第4章《注意力机制》再在允许的位置之间以注意力机制读取这些向量。因此,从字符串到注意力输入的主线是
若记录边界、特殊词元或填充位置在前两步已经错误,后续张量即使形状合法,也只会精确计算一个定义错误的任务。
两层数据问题
输入表示层关心一条样本如何变成可解释的编号、掩码和向量,是理解模型结构的前提;训练数据工程层关心大量异构来源如何经过治理与生产形成可复现的数据版本,是理解训练分布的前提。二者共享“样本边界”和“词元计量”等接口,但不应混成同一章的同一抽象层。
4.2神经语言模型
N-gram 用有限上下文估计序列概率
自然语言处理(Natural Language Processing,NLP)研究如何让计算系统表示、理解和生成语言。早期统计语言模型常作有限记忆假设,用最近 \(n-1\) 个词预测下一个词:
这类模型称为N-gram 语言模型(N-gram Language Model)。二元模型只看前一个词,三元模型看前两个词。条件概率可由计数估计,但未见组合会得到零概率,因此需要加法平滑、回退或插值。\(n\) 增大能保留更长的局部模式,同时使组合数量迅速增加,数据稀疏和存储成本也随之加重。
N-gram 的价值不只在历史意义。它明确展示了语言模型的核心任务:根据上下文分配下一词的概率;也展示了有限上下文、稀疏计数和泛化之间的矛盾。神经语言模型改变了概率参数化方式,但没有改变条件预测这一目标。
离散符号的连续嵌入
独热向量能区分词的身份,却不能直接表达词之间的相似性。词向量为每个词分配一个低维可学习向量。早期方法可以从词与上下文的共现统计中分解矩阵,也可以通过预测上下文或中心词学习表示。训练完成后,语义或句法关系可能表现为向量距离和方向上的规律。
词向量的含义来自训练目标和语料,不能把几何接近直接解释为事实相同。传统静态词向量为同一个词提供固定表示,无法随句子消解一词多义;后来的上下文表示会根据整段输入产生不同向量。本章后文将从嵌入查表继续讨论离散身份的连续表示,第4章《注意力机制》和第7章《位置表示》再分别建立注意力计算与位置表示。
4.3神经序列模型
前馈网络依赖固定宽度输入
前馈神经网络(Feedforward Neural Network,FNN)中的信息只从输入流向输出,不保存跨步状态。用于语言建模时,可以把固定窗口内的若干词向量拼接或汇总,再预测下一个词:
与 N-gram 相比,不同上下文通过共享词向量和网络参数获得统计共享,未见过的完整组合也可能得到合理预测。但窗口长度仍需预先固定,超过窗口的信息无法进入当前预测。
RNN 用隐藏状态汇总历史
循环神经网络(Recurrent Neural Network,RNN)在每一步更新隐藏状态:
\(h_t\) 是对截至位置 \(t\) 的历史摘要,同一组参数在所有时间步共享,因此模型可以处理变长序列。训练时把循环按时间展开,再通过时间反向传播计算梯度。虽然依赖路径原则上可以很长,反复乘以状态雅可比会使梯度指数衰减或增长,造成梯度消失或爆炸;隐藏状态容量也限制了远距离信息的保留。
LSTM 用门控制记忆读写
长短期记忆网络(Long Short-Term Memory,LSTM)在隐藏状态之外维护记忆单元 \(c_t\),并用门控制遗忘、写入和输出:
门向量的元素位于 \((0,1)\),可逐维决定保留多少旧记忆、写入多少新信息。记忆单元中的加性路径缓解了普通 RNN 的长期梯度问题,但不能保证任意长依赖都被保存。RNN 和 LSTM 还必须按时间顺序计算,难以像 Transformer 那样同时处理所有位置。后续的注意力机制通过显式读取多个位置,改变了信息交互和并行计算方式。
4.4文本表示的层次
字符、码点、字节及词元
日常所说的“一个字符”有时指一个可见字形,有时指一个 Unicode 码点,两者并不总是一一对应。例如,带重音的字母可以由单一码点表示,也可以由基本字母与组合标记共同表示。字素簇描述更接近读者感知的文本单位;码点则是字符编码标准中的编号。讨论字符串长度时必须说明采用哪一种计数方式。1
字节是八位存储单元,具有 \(256\) 种可能取值。UTF-8 将 Unicode 标量值编码为一个到四个字节。例如,汉字“中”的码点是 U+4E2D,UTF-8 表示为十六进制字节 E4 B8 AD。这一个汉字在字节级模型中最初对应三个基本单元;经过子词合并后,可能对应一个、两个或三个词元。
词元(Token)是模型词表中的离散单位,可以对应完整单词、子词、单个字符、字节片段或者结构控制符号。子词(Subword)强调单位可能小于通常意义上的词,不保证每一项都是语言学上的词根或词缀。中文不使用空格分隔全部词语,程序代码、数字和混合语言文本也具有不同结构,因而不能将“按空格切分”视为普遍适用的文本表示。
设普通词表为 \(\mathcal V_{\mathrm{text}}\),特殊词元集合为 \(\mathcal V_{\mathrm{special}}\),完整词表为它们的不交并 \(\mathcal V\),大小为 \(V\)。每个词元对应唯一编号,通常选自 \(\{0,\ldots,V-1\}\)。编号只指定参数矩阵的行,不表达数量大小或语义距离。编号 \(12\) 与 \(13\) 相邻,不意味着对应词元比编号 \(12\) 与 \(900\) 更相似。
变长映射及符号约定
对合法文本集合 \(\mathcal S\),确定性编码器写为
这里 \(L(s)\) 随输入变化,不能在定义域之外将它视为固定长度。解码器 \(D\) 将词元序列恢复为文本或字节。为了讨论原文可逆性,本章默认普通文本编码时不额外插入控制词元;加入控制词元后的序列需要按明确协议解释。
| 符号 | 含义 |
|---|---|
| \(s\);\(N(s)\) | 原始文本;规范化后的文本。 |
| \(\mathcal V,V\) | 完整词表及其大小,包含实际可用的新增词元。 |
| \(x_{1:L}\) | 词元编号序列,\(L\) 为词元数。 |
| \(b(v)\) | 普通词元 \(v\) 所代表的字节串。 |
| \(r(a,b)\) | 已训练 BPE 规则中符号对 \((a,b)\) 的合并优先级。 |
| \(\mathcal Z(s)\) | 能够完整拼接为文本 \(s\) 的候选分段集合。 |
| \(q(v)\) | Unigram 分词模型为词元 \(v\) 指定的概率参数。 |
| \(B,T_{\max},d\) | 批大小、填充后长度及模型隐藏维数。 |
若嵌入矩阵为 \(E\in\Real^{V\times d}\),则词元序列的连续表示为 \(H_i=E[x_i]\),形状为 \([L,d]\)。将词元编号写成独热行向量 \(e_{x_i}^{\mathsf T}\),同一操作可写为 \(H_i=e_{x_i}^{\mathsf T}E\)。查表实现避免显式构造稀疏独热矩阵;其数学语义仍然是选择对应的行。批处理时输入编号为 \([B,T_{\max}]\),嵌入输出为 \([B,T_{\max},d]\)。
编码流程
一个分词系统通常包含规范化、预分词、词元模型、后处理和解码五类职责。规范化决定哪些文本差异被保留;预分词决定哪些位置允许发生子词组合;词元模型选择切分;后处理加入任务边界;解码将普通词元还原为文本。不同实现可以合并其中若干步骤,但不能省略对这些语义的说明。
例如,空格可以作为预分词边界,也可以被保留为词元内容或边界标记。若预处理只保留切出的非空片段而丢弃所有间隔,连续空格、换行与制表符便无法恢复。规范化规则和分词算法的选择共同决定系统行为,算法名称相同不代表整数序列相同。
4.5字节对编码
训练目标及计数对象
字节对编码(Byte Pair Encoding,BPE)通过逐次合并相邻基本符号构造词表。将这一思想用于子词表示,是处理未登录词的一种经典方法(Sennrich, Haddow, 和 Birch 2016)。现代字节级变体以字节为基础符号;字符级变体则以字符为基础。算法名称中的“字节”不能代替对初始字母表的实际说明。
设训练语料经预处理后包含片段 \(s^{(1)},\ldots,s^{(m)}\),片段权重为正整数 \(w_1,\ldots,w_m\),表示出现次数。在第 \(k\) 轮,片段的当前表示为符号序列 \(s^{(j,k)}\)。相邻对计数为
内层遍历一个片段内部的相邻位置,外层累加全语料权重。预分词边界两侧的符号不参与同一次计数。选出最大计数的候选对后,将其非重叠出现替换为新符号,更新语料表示,再重新统计。词表达到目标大小,或不存在合法合并时,训练停止。
这里的目标是基于局部频率逐步缩短序列,并非直接最大化下游语言模型的似然,也不保证得到全局最优压缩词表。训练后的规则必须保留先后顺序。若第 \(k\) 轮学习 \((a,b)\mapsto ab\),可记其优先级为 \(r(a,b)=k\);数值越小表示越早执行。词元编号与规则优先级是不同概念,有些格式将它们结合存储,有些格式分别存储。
算法4.1 BPE 词表训练
输入:预分词后的加权片段、基础符号集合、目标词表大小及确定的平局规则。输出:词表、编号映射与按学习顺序排列的合并规则。
将每个片段展开为基础符号序列,保留片段边界;初始化规则表为空。
若已达到目标词表大小,停止。否则根据式(4.10)统计当前片段内全部合法相邻对。
若没有合法候选,停止。按频数及平局规则选择一对,登记其合并规则和新符号。
在每个片段内从左到右替换该对的非重叠出现,保留权重,返回第2步。
合并不改变片段所代表的字节串。基础字节覆盖不因某轮未出现而删除。朴素重计数每轮扫描当前语料,若初始总符号数为 \(N\)、执行 \(M\) 次合并,扫描成本上界为 \(O(MN)\);局部计数索引可降低重复扫描,但必须保持相同规则。
取三个训练片段:abab 出现两次,abac 出现一次,ac 出现一次。以 \(a,b,c\) 为初始符号,不允许跨片段合并。初始加权总长度为
初始相邻对中,\((a,b)\) 在 abab 内出现两次,考虑权重后贡献四次;在 abac 中再贡献一次,因此总计为五。相似地,\((b,a)\) 计数为三,\((a,c)\) 计数为二。第一轮合并 \((a,b)\mapsto ab\),得到
总长度变为 \(N_1=2\times2+3+2=9\),减少五,与本轮五次非重叠替换一致。
第二轮中,\((ab,ab)\) 与 \((a,c)\) 的计数都为二,\((ab,a)\) 的计数为一。为使过程确定,规定比较两个符号所代表的字节串,按有序对的字典序处理平局;由此本例选择 \((a,c)\),得到
总长度变为 \(N_2=7\)。第三轮选择计数为二的 \((ab,ab)\),得到 \((abab)\times2\)、\((ab,ac)\times1\)、\((ac)\times1\),于是 \(N_3=5\)。
| 轮次 | 选中规则 | 频数 | 合并后加权词元数 |
|---|---|---|---|
| 1 | \((a,b)\mapsto ab\) | 5 | 9 |
| 2 | \((a,c)\mapsto ac\) | 2 | 7 |
| 3 | \((ab,ab)\mapsto abab\) | 2 | 5 |
本例只为三个基础符号增加三个合并词元,并未覆盖全部字节。如果改为完整字节级初始词表,未在训练样例出现的其他基础字节仍需保留。这一区别决定未见字符能否表示,不能从一个英文手算例推断完整输入覆盖性。
分词器推理规则
对新片段 ababac,训练好的规则按既定优先级执行:
第一步应用优先级一,第二步应用优先级二,第三步应用优先级三。编码时不重新比较新文本中的频率,也不添加未训练的合并规则。否则相同字符串在不同批次或不同上下文中可能获得不同编号,模型参数所对应的表示协议随之改变。
BPE 编码也不是简单地从最终词表选择最长前缀。设另一套有效规则依次为 \((b,c)\mapsto bc\)、\((a,b)\mapsto ab\)。对输入 abc,BPE 先得到 \((a,bc)\),不能再合并;若只看词表并优先选最长前缀,则会得到 \((ab,c)\)。两种结果都能还原原文,却给模型提供不同的输入。因此,无损解码不足以证明两种编码实现等价。
分词合并不变量
对 \((a,a,a)\),相邻对 \((a,a)\) 的位置计数为二,但两次出现共享中间符号,无法同时替换。规定从左向右处理后,一轮替换结果为 \((aa,a)\),长度只减少一。由此可见,频数与实际压缩量并非在所有情况下相等。对于自重叠候选,应明确计数方式与非重叠替换规则,不能将式(4.10)直接当作精确压缩收益。
训练平局需要稳定的规则;编码平局还涉及同一合并在不同位置重叠的处理顺序。实现可以采用高效数据结构维护局部候选,但优化不能改变这两种语义。最直接的正确性不变量是
对每一次实际合并均成立,其中 \(\Vert\) 表示字节串连接。它证明每轮只删除边界而不改变内容。频率降低、语义改善或下游模型性能提升都不是这一不变量的结论。
4.6WordPiece 分词模型
(选修)
词首及续接片段
WordPiece 同样使用子词词表,但常见 BERT 编码器按从左到右的最长匹配执行切分(Google Research 2018)。词首片段和词内续接片段可使用不同词表项,续接项常以 ## 标记。这个标记是制品约定,不是原文中的两个井号。
设词表包含 play、player、##ing、##s。对预分词后的 playing,从词首尝试能够匹配的最长片段,找到 play,剩余 ing 使用续接词元 ##ing。对 players,词首直接选择更长的 player,再选择 ##s。已经选定的前缀不因后续概率更高而自动回退。
这个最后的性质容易被忽略。取词表 \(\{a,ab,\texttt{\#\#bc}\}\),输入 abc。最长匹配首先选择 \(ab\),但剩余 \(c\) 没有续接项;原始 BERT 的这一路径会把整个词替换为未知词元,而不会回退到 \((a,\texttt{\#\#bc})\)。尽管后一条分段存在,它不是该贪心算法自动搜索的结果。超过实现规定的最大词长也可能触发未知词元,属于应记录的实现边界。
WordPiece 训练边界
词表训练决定保留哪些片段,最长匹配决定给定词表后怎样编码。这是两个不同问题。WordPiece 的历史训练方法与似然改进有关,但不同实现的候选构造、打分和停止规则并不完全相同。仅凭 BERT 发布的词表和编码源文件,无法还原生成该词表的全部训练过程。
一些教学实现使用类似
的关联分数选择合并,它倾向于突出相对于边缘频率更紧密的组合。然而,这一表达式并不是所有 WordPiece 实现统一遵守的训练定义,也不能被直接写成某个既有词表的原始训练算法。本章因此分别陈述可核实的编码规则与训练问题,不以一个便于演示的分数替代未公开的细节。
BPE 保存有序合并规则,WordPiece 的常见编码路径依赖最终词表及最长匹配约定。二者都可以产生类似的子词,但排序语义不同。重新训练任一分词器都可能改变词元编号;不能因为算法仍叫 BPE 或 WordPiece,就沿用原模型嵌入矩阵而不检查对应关系。
4.7Unigram 分词模型
(选修)
候选集合构造
Unigram 分词模型为候选词元赋予概率,并在能够拼接出原文本的分段中选择或采样(Kudo 2018)。与逐次合并不同,它允许同一文本同时存在多条有权重的分段路径。下面用独立构造的有限例子推导这一计算过程。
设普通词表中的每个非空词元 \(v\) 具有参数 \(q(v)>0\),且 \(\sum_vq(v)=1\)。对分段 \(z=(z_1,\ldots,z_K)\in\mathcal Z(s)\),定义权重
给定字符串后的分段分布为
分母只汇总能够重构同一字符串的路径。词元概率之积体现一元独立假设,但约束“必须拼出 \(s\)”使候选位置之间并非可以任意独立选择。2
分段及数值比较
(选修) 取词表 \(\{a,b,ab,ba\}\),分别赋值 \(0.2,0.2,0.4,0.2\)。对字符串 aba,全部候选分段如下:
| 分段 | 权重计算 | 给定字符串的概率 |
|---|---|---|
| \((ab,a)\) | \(0.4\times0.2=0.08\) | \(\frac{0.08}{0.128}=0.625\) |
| \((a,ba)\) | \(0.2\times0.2=0.04\) | \(\frac{0.04}{0.128}=0.3125\) |
| \((a,b,a)\) | \(0.2\times0.2\times0.2=0.008\) | \(\frac{0.008}{0.128}=0.0625\) |
最可能分段是 \((ab,a)\)。若将参数改为 \(q(a)=q(b)=0.3\)、\(q(ab)=0.1\)、\(q(ba)=0.3\),则三条路径权重分别变为 \(0.03,0.09,0.027\),最优分段成为 \((a,ba)\)。词表没有改变,概率变化却改变了分段结果;只保存词表不能完整描述 Unigram 编码器。
动态规划及 Viterbi 路径
直接枚举全部分段可能随长度指数增长。利用每条路径最后一个词元的位置,可以建立动态规划。令 \(s_{1:n}\) 为长度 \(n\) 的基本字符序列,\(\alpha_j\) 为前 \(j\) 个字符所有分段的总权重,初始化 \(\alpha_0=1\)。则
每一项对应以 \(s_{i+1:j}\) 为最后一个词元的全部前缀路径。不同最后词元的起点划分了候选集合,因此求和既不重复也不遗漏。
在 aba 的第一组参数下,
这与逐项枚举一致。若最大词元长度为 \(K_{\max}\),且候选匹配可以有效检索,则每个位置只需检查至多 \(K_{\max}\) 个起点;动态规划的组合部分为 \(O(nK_{\max})\),实际成本还取决于字符串匹配结构。
aba 的分段格。每条从位置 0 到位置 3 的路径是一种分段;路径权重为边权之积。求最优路径时,将求和改为取最大值,并在对数空间计算:
同时保存取得最大值的起点,最后反向追溯即可恢复分段,这就是此处的 Viterbi 计算。前向求和在长序列上也应使用对数和指数技巧,避免很小的概率乘积下溢。最大路径权重与全部路径总权重不可混淆:前者用于确定性最优编码,后者用于边缘化与概率采样。
参数估计及词表裁剪
固定词表后,可最大化语料的分段边缘对数目标
分段是隐变量。期望最大化(Expectation–Maximization,EM)交替计算分段后验与词元的期望出现次数。令 \(n_v(z)\) 表示词元 \(v\) 在路径 \(z\) 中出现的次数,则期望计数为
在无额外先验或平滑项的基本模型下,最大化 \(\sum_v C_v\log q(v)\) 并满足 \(\sum_vq(v)=1\)。引入拉格朗日乘子并求导,得到
这一步是由带约束的最大化推导而来,实际训练器还可能加入先验、剪枝近似和保底符号限制。
只用前述 aba 一条样例,其三条后验概率为 \(0.625,0.3125,0.0625\)。因此
期望总词元数为 \(2.0625\),归一化后得到 \(q_{\mathrm{new}}=\frac{17,1,10,5}{33}\)。这个例子同时表明 EM 计数是后验加权的分数计数,不是先选一条最佳分段再统计整数次数。
词表学习还需要决定保留哪些候选。常见流程从较大的候选集合出发,估计概率,再评估移除词元带来的目标下降,逐步删除影响较小的项(Kudo 2018)。不能简单删除当前概率最小的词元:一个低频基础字符可能是某些输入唯一可用的表示,删除后这些输入的候选集合变为空集。保留基础覆盖或指定回退机制,是剪枝约束的一部分。
可用同一例子理解删除代价。暂时固定其他权重,只屏蔽含 \(ab\) 的路径,剩余总权重从 \(0.128\) 降为 \(0.048\),对数目标下降 \(\log(\frac{0.128}{0.048})\approx0.9808\);屏蔽 \(ba\) 时只降为 \(0.088\),下降约 \(0.3747\)。这只是固定参数下的路径敏感性,不是删除后重新归一化、重新估计参数的完整训练结果。它解释了词元重要性与“为多少替代路径提供支持”有关。
概率分段及训练一致性
概率分词可以在语言模型训练时为同一文本提供不同表示,这种子词正则化利用分段变化增加输入多样性。若服务端要求稳定编码,则通常采用固定最优路径,并明确训练与推理各自的策略。采样种子、温度及候选限制会改变分段分布,不能在缓存键只记录原文时悄然改变这些设置。
SentencePiece 是可承载不同子词模型的工具系统,支持 BPE 和 Unigram 等方法,并包含规范化和空白表示规则(Google 不详)。因此,“采用 SentencePiece”没有完整回答分词算法是什么,还应说明模型类型与预处理配置;也不能由采用该工具就推断原文一定逐字节可逆。
4.8可逆性、偏移及语言覆盖
字节覆盖边界
若普通词表包含所有 \(256\) 个基础字节,所有合并只连接字节而不删除内容,且前处理无损,则对合法 UTF-8 文本有
未见词或未见字符仍能分解为基础字节,因而不必因为词表缺少整词而使用未知词元。但是,能够表示一种语言与善于表示这种语言不同:一个文本若大量退回单字节,序列可能明显增长,参数中也未必学习到充分的组合知识。
对“中”,若编码得到分别对应 E4 和 B8 AD 的两个词元,两个词元都不是独立完整的 UTF-8 字符。对每个词元分别进行严格字符解码会失败;若使用替代字符继续解码,则原信息可能被破坏。正确做法是先连接完整字节流,再解码。流式显示同样需要保留尚未组成完整字符的尾部字节。
规范化的不可逆性
设 \(N\) 将大小写折叠,则 \(N(\texttt{A})=N(\texttt{a})\)。两种输入变成同一规范形式后,无论后续编码多么精确,都不能仅由编码结果判断原文是哪一种。一般地,若存在 \(s_1\ne s_2\) 且 \(N(s_1)=N(s_2)\),那么不保留额外信息的系统无法同时满足对两者的原文恢复。
因此规范化后可讨论的保证通常是
而非式(4.31)。统一兼容字符、折叠空白和清除控制字符各自具有用途,也各自删除不同信息。代码缩进、数学符号、文件路径和专有名词可能依赖这些差异,规范化策略应由任务语义决定。
词元偏移及原文对齐
抽取式问答、命名实体识别和搜索高亮需要把词元位置映射回原文区间。偏移应明确单位是字节、码点还是其他字符索引。一个中文词元可能只含部分字节,却在用户界面对应同一个可见字符;规范化又可能让一个原字符映射到多个输出字符,或反过来。因此偏移映射不一定是逐词元一一、不重叠的区间划分。
特殊词元没有原文来源位置,应使用约定的空区间或独立标志表示,不能把占位偏移当作真正指向文本开头。解码输出中的空白清理也可能改变文本,故原文恢复检验必须记录清理和跳过特殊词元的选项。可读的词表字符串只是检查视图,不能代替原始字节与位置协议。
4.9词表规模、序列长度及计算代价
参数及计算的两种方向
扩大词表可能使高频片段由多个词元合为一个,减少序列长度;同时增加输入嵌入和输出投影的参数。设隐藏维数为 \(d\),不计输出偏置,输入和输出矩阵独立时需要约 \(2Vd\) 个参数,权重共享时需要约 \(Vd\) 个。全词表输出投影每个位置的乘加规模仍与 \(Vd\) 成正比,权重共享不会消除该计算。
例如,把词表从 \(32,000\) 增至 \(64,000\),在 \(d=4,096\) 且权重共享时,额外参数为
若仅按每参数两字节存储,新增权重占用 \(262,144,000\) 字节,即 \(250\,\mathrm{MiB}\)。训练还需梯度、优化器状态等额外内存,不能把这个权重存储数当作训练总显存。
另一方面,长度为 \(L\) 的密集注意力具有随 \(L^2d\) 增长的主要交互计算。若同一文本的长度由 \(1000\) 降至 \(750\),这部分规模的比例为 \((\frac{750}{1000})^2=0.5625\)。但若同时将词表翻倍,全词表输出投影的 \(LVd\) 规模比例为 \(0.75\times2=1.5\)。这两个方向相反的结果说明,不能用序列压缩率直接预测端到端加速比。
训练分布及多语言公平比较
分词器训练语料的语言配比、领域配比与重复样本会影响词表容量分配。高频模板可能消耗大量合并机会;数据量较少的语言可能被切得更碎。相同词元预算下,不同语言能够放入上下文的原文长度因此不同。数字按单个数字、连续数字块或其他边界切分,也会改变算术任务的表示难度,不能单凭某一种切分更短就判定其更优。
分词器训练应与留出评估分开,按文档或其他适当分组避免相近文本跨越边界。评估至少分别观察各语言、领域和长度区间的词元数、字节回退、未知词元及长尾分布。平均压缩良好却在关键少数语言上严重碎片化,仍可能不符合模型用途。
跨分词器比较每词元困惑度缺乏共同单位。若在相同原始文本上统计负对数似然,可进一步按原始字节数归一化:
这里 BPB 表示每字节比特数,\(N_{\mathrm{bytes}}\) 为指定文本编码下的原始字节数。该量仍需统一文本、规范化、终止词元和上下文边界;若多个词元序列可解码为同一字符串,单一路径分数也未必等于字符串全部概率质量。归一化提供了共同计量单位,并没有自动解决所有模型可比性问题。
4.10特殊词元及序列协议
角色、字面形式、编号和行为
特殊词元(Special Token)承担控制职责,但其语义由训练和执行协议共同建立。应分别识别四个对象:词元的角色、配置中的字面形式、实际编号以及运行时行为。登记一个字符串为 EOS 不会自动教会未训练的模型何时结束,设置 BOS 属性也不一定意味着编码器会自动插入它。
| 角色 | 含义 | 需要区分的边界 |
|---|---|---|
| BOS | Beginning of Sequence,序列开始 | 不一定存在,也不一定由后处理自动加入。 |
| EOS | End of Sequence,序列结束 | 训练监督终点与生成停止条件需共同配置。 |
| PAD | Padding,填充 | 补齐张量,不是自然语言内容。 |
| UNK | Unknown,未知词元 | 回退表示可能丢失原始字符串。 |
| SEP | Separator,分隔符 | 结构分界不必等同于生成终止。 |
| CLS | Classification,分类位置 | 常用于汇聚分类表示,不是通用 BOS。 |
| MASK | Mask,输入扰动符号 | 与注意力掩码、损失掩码是不同对象。 |
| 角色与哨兵 | 对话角色、工具边界、缺失片段标识 | 必须与训练数据及模板一致。 |
BERT 类句对输入可以采用 [CLS] A [SEP] B [SEP];某些自回归模型采用起始符号、提示、回答和终止符号的序列;编码器—解码器则分别构建源序列与目标序列。具体模型可能采用不同变体,应读取制品协议,不能只从架构名称推断固定编号或固定模板。句段编号和位置编号是附加输入,不是特殊词元。
对话模板的条件语义
对话模板将结构化消息转换为词元序列,包括角色边界、轮次结束、工具调用和待生成回答的前缀。同样的消息内容,经不同模板编码后得到不同条件,因此模型看到的任务也不同。模板已经插入特殊词元时,再由后处理器重复加入起始符号,可能产生训练中未见的格式。
用户正文中出现与控制符号相同的字面字符串,应由输入策略明确处理为普通文本、转义文本或被允许的控制符号。不能不加区分地让正文自行改变角色边界;反过来,也不能假定控制词元能独立消除提示注入。结构解析和模型对内容的遵循属于不同层次。
截断同样需要理解结构。截去回答尾部会删除真实结束位置;截去消息头部可能留下没有角色的内容;截去工具调用的括号或字段会破坏结构。序列长度预算应在模板展开后计算,再按任务规则保留完整片段和必要边界。特殊词元的数量本身也占用上下文容量。
4.11填充、因果可见性及损失选择
掩码功能分类
长度分别为 \(T_b\) 的 \(B\) 条序列补齐为 \([B,T_{\max}]\) 张量。令 \(m_{bj}\in\{0,1\}\) 表示位置 \(j\) 是否是真实输入,填充位置为零。注意力读取位置 \(j\) 时应排除填充键。对有效查询位置 \(i\),自回归模型还要求键位置不晚于查询位置,因此允许关系为
实现可以把不允许的位置映射为注意力分数上的负无穷偏置,也可以使用等价的稀疏或内核接口。填充查询位置通常不承担输出任务;若额外将其整行全部屏蔽,应处理全屏蔽行的数值边界。
损失掩码 \(\ell_{bt}\in\{0,1\}\) 则决定目标位置是否参与训练:
提示词可以作为可见条件而不计入损失,真实 EOS 可以同时可见且接受监督,PAD 则通常既不是有效键也不接受监督。因果掩码控制未来信息,填充掩码控制虚构位置,损失掩码控制学习目标,三者不可互相替代。
下一词元对齐
设一个自回归训练样本由提示词元 \(p\)、回答词元 \(a\) 与真实 EOS 构成;批处理需要再补齐两个位置。以下表格将输入与目标显式错开一位:相对于目标,解码器输入在开头加入 BOS 并右移;等价地,相对于完整词元串,目标向左错开一位。输入位置 \(t\) 的输出预测下一词元 \(y_t\):
| 预测位置 \(t\) | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 输入 | BOS | \(p\) | \(a\) | EOS | PAD |
| 目标 \(y_t\) | \(p\) | \(a\) | EOS | PAD | PAD |
| 输入有效性 \(m_t\) | 1 | 1 | 1 | 1 | 0 |
| 回答监督 \(\ell_t\) | 0 | 1 | 1 | 0 | 0 |
第一个输出预测提示,因此此处不计损失;第二个输出以 BOS 和 \(p\) 为条件预测回答;第三个输出学习回答何时结束。对于接受同一完整序列作为输入与标签的训练接口,损失内部通常将位置 \(t\) 的分数与位置 \(t+1\) 的标签配对。若已使用表中的输入—目标对齐,就不能再执行一次这种错位,否则监督会错开两个位置。
若 PAD 与 EOS 共享编号,表中真实 EOS 与两个填充目标在数值上相同,按“编号等于 EOS 就忽略”处理将误删第三个监督位置。正确区分依据是样本长度与位置来源。标签忽略值如 \(-100\) 是某些损失接口的约定,不属于词表,不能送入嵌入层。
编码器—解码器及批处理边界
条件生成还可将源文本交给编码器,将目标 \(y_1,\ldots,y_T,\mathrm{EOS}\) 交给解码器监督。对应解码器输入为起始词元、\(y_1,\ldots,y_T\)。起始词元由模型配置决定,不要求等于分词器中的 BOS。源端填充掩码、目标端因果掩码及目标损失掩码分别构造;不能把自回归提示拼接的处理规则直接照搬到这一结构。
动态填充按批次最长长度补齐,可减少无效位置;长度分桶还能降低批内差异。在通常取最后位置预测的解码接口中,左右填充的选择会影响最后有效位置、位置编号和缓存索引,必须与接口行为配合。填充方向本身不能决定正确性,正确性来自有效位置被一致处理。
将多条独立样本打包为一条长序列也不是普通填充的反操作。若任务要求样本之间互不可见,仅插入 EOS 不会自动阻断注意力,还需限制跨样本读取。若预训练明确允许跨文档条件,则属于另一种训练定义,必须在数据目标中说明。
4.12分词器及模型制品的一致性
分词器制品构成
完整制品至少应能恢复词表和编号、BPE 规则或 Unigram 概率、规范化、预分词、后处理、解码、特殊词元映射及对话模板。调用层还会设置截断、填充、最大长度和返回张量形式。底层算法资产与上层调用配置共同决定输入整数序列。
标准分词接口通常可分为三层理解:加载工厂依据配置选择实现;包装层处理批处理和任务选项;后端执行具体编码流程。分层有助于定位差异,例如整数序列相同而特殊词元位置不同,应先检查模板和后处理,而非重新训练词表。批输出除了编号,还可能包含有效性掩码、句段编号、特殊位置标记和原文偏移。
注册新增词元以后,输入嵌入和输出投影必须包含其对应行。对于稠密连续编号,参数行数应与包含新增词元的完整词表大小一致;如果制品使用非连续编号,还需检查最大编号,不能只数词表项。新增行的随机初始化不等于获得语义,模型还需要相应训练。已有词元的编号置换更危险:张量形状可能完全合法,语义却已错位。
分词器语义一致性
对两套实现 \(T_1,T_2\),若目标是兼容同一模型,核心要求是在指定输入集合上逐项比较 \(T_1(s)=T_2(s)\),并分别核对特殊位置、偏移和批处理行为。仅验证 \(D_1(T_1(s))=D_2(T_2(s))=s\) 只能证明两者可还原同一文本,不能证明模型输入相同。
检验集合应覆盖普通文本、重复空白、不同规范形式、混合语言、未见字符、特殊符号字面量、空文本、长输入以及长度差异显著的批次。重载应跨越实际序列化边界,避免原对象内存中的参数掩盖缺失文件。确定性编码与概率采样分别检验,不能用随机不一致否定本来就声明随机的算法,也不能让随机行为掩盖发布配置差异。
制品身份可由配置内容、训练来源摘要和文件哈希共同记录。数据来源、许可和分词器训练划分属于可追溯元数据,而不是所有加载库都必需识别的字段。分词器升级还会改变预编码训练数据、检索切块、服务计费单位和缓存键,故应与模型权重及上游预处理协同发布。序列可读性、算法等价性和模型任务效果分别需要不同证据,不能用其中一项替代其余两项。
本章前文已经把文本记录整理为带边界、特殊词元和有效性掩码的离散编号,但编号本身没有能够用于矩阵计算的语义几何。编号为100的词元既不必比编号为10的词元更重要,两者的数值差也不代表语言距离。模型必须先建立从离散身份到连续向量的映射,才能让后续网络对词元表示执行矩阵运算。
本节从查表的数学形式解释嵌入参数如何学习,以及输入输出权重共享为何改变梯度来源。词元嵌入表示离散身份,却不单独提供序列中的绝对或相对位置;第4章《注意力机制》将在形状为 \([B,T,d]\) 的连续表示之上建立注意力计算,第7章《位置表示》再讨论顺序信息如何进入模型。
4.13嵌入表示
嵌入矩阵及张量形状
设词表大小为 \(V_{\mathrm{vocab}}\),模型宽度为 \(d\)。嵌入(Embedding)参数构成矩阵 \(E\in\Real^{V_{\mathrm{vocab}}\times d}\),其中每一行对应词表中的一个编号。对批量编号张量 \(K\in\{1,\ldots,V_{\mathrm{vocab}}\}^{B\times T}\),输入表示定义为
这里 \(b\) 是样本索引,\(t\) 是词元位置,最后一轴是连续特征。嵌入矩阵是模型参数;编号则是用于选择参数行的离散输入。 3
| 符号 | 含义 | 形状或范围 |
|---|---|---|
| \(B,T,d\) | 批量大小、序列长度、模型宽度 | 正整数 |
| \(V_{\mathrm{vocab}}\) | 词表大小,区别于注意力值矩阵 | 正整数 |
| \(E\) | 词元嵌入参数 | \(V_{\mathrm{vocab}}\times d\) |
| \(X\) | 单条序列的嵌入,省略批量轴 | \(T\times d\) |
独热乘法及查表的等价性
令 \(e_k\in\{0,1\}^{V_{\mathrm{vocab}}}\) 为第 \(k\) 个独热列向量,即 \((e_k)_j=\mathbf1[j=k]\)。它与嵌入矩阵相乘时,只有一行参与求和:
因此查表与独热矩阵乘法表示同一个函数。前者直接选择参数行,后者将选择操作写成了线性代数形式。第3章《神经网络基础》已经用这一等价关系解释反向传播;在词表规模较大时,它还决定输入表示的资源代价。
显式独热张量需要 \(BTV_{\mathrm{vocab}}\) 个元素,整数编号需要 \(BT\) 个元素,查表输出需要 \(BTd\) 个元素。即使独热张量绝大多数元素为零,若按稠密数组保存仍须承担完整存储量。稀疏选择无需形成这份中间数组,但不会消除嵌入参数本身的 \(V_{\mathrm{vocab}}d\) 个元素。
三词元嵌入查表
设一个三词元词表的参数为
选择矩阵与输出分别为
第0与第2个位置读取了同一参数行,因此在加入上下文和位置之前,两个输出完全相同。词元在句中承担的不同作用,需要由后续计算建立,不能由固定查表独立完成。
重复编号及梯度累加
设上游梯度为 \(G_X=\frac{\partial\mathcal L}{\partial X}\)。由 \(X=SE\) 得到
对于上述例子,若三个位置的上游梯度为 \((1,2)\)、\((3,4)\)、\((5,6)\),则三行参数梯度依次为 \((3,4)\)、\((0,0)\)、\((6,8)\)。重复词元并不是两份独立参数,因此其梯度必须合并。对批量输入,还要同时沿样本轴累加。
未被读取的行在这一条计算路径上的梯度为零,但这不等于该参数在整个训练步骤中保持不变。其他使用该参数的计算路径、动量以及权重衰减都可能带来变化。嵌入查表也不对整数编号提供通常的连续导数:可学习的是连续表项,而不是编号与编号之间的算术关系。
4.14输入输出权重共享及语义几何
词表输出投影
设上下文模块产生隐藏状态 \(h_t\in\Real^d\),未共享时的输出投影为 \(W_{\mathrm{out}}\in\Real^{d\times V_{\mathrm{vocab}}}\)。词元 \(v\) 的分数为
输出矩阵的每一列给出该词元在预测空间中的方向。若输入与输出宽度相同,可以令 \(W_{\mathrm{out}}=E^{\mathsf T}\),得到
这一约束称为权重绑定(Weight Tying),也称权重共享,输入查表与输出预测复用同一组词表参数(Press 和 Wolf 2017)。两个独立的 \(V_{\mathrm{vocab}}d\) 参数块因此合并为一个。若隐藏宽度不同,则还需要相容的投影,不能仅依靠转置完成共享。
共享规定的是参数一致性,而不是两个任务的含义完全相同。输入侧回答词元如何参与上下文计算,输出侧回答当前状态与候选词元是否匹配。约束这两个角色可以减少自由参数,也可能限制模型可表达的组合。因此不能只依据参数节省推断所有数据和模型配置下的质量变化。
同一参数收到两条梯度路径
将所有参与计算的位置合并为 \(N\) 行,写作
其中 \(\alpha\) 是固定的输入缩放系数,\(F_\theta\) 表示上下文模块。令 \(G_U=\frac{\partial\mathcal L}{\partial U}\),\(G_X=\frac{\partial\mathcal L}{\partial X}\)。总微分包含输入侧和输出侧两个显式出现的 \(E\):
所以总梯度为
第一项沿被读取的编号累加,第二项来自候选词元的输出竞争。对于完整词表 Softmax,未作为输入出现的词元也可能通过第二项获得非零梯度;特殊数值或跨位置抵消可以使某些行恰好为零,因此“每行必然改变”并不是一般结论。
填充词元需要特别区分两项机制。查表时屏蔽填充行的梯度,只约束输入侧的局部操作;注意力掩码决定填充位置是否参与读取,损失掩码决定填充目标是否参与优化。若填充行还被共享输出投影使用,它仍可能收到输出路径梯度。将某一行初始化为零,既不能替代掩码,也不能自动保证共享训练后仍为零。
距离的含义依赖训练目标
连续向量允许定义长度、内积和夹角。对两个非零嵌入向量 \(u,v\),余弦相似度(Cosine Similarity)为
其值位于 \([-1,1]\)。欧氏距离同时受方向和长度影响;余弦相似度消除了各自的正比例缩放,但对零向量没有定义。使用哪种度量,应由模型的训练目标和后续使用方式决定。
嵌入能够在训练中承载有关共现与预测的规律,但向量接近不必表示同义。反义词可能出现在相似句法环境中,词元片段也未必对应完整概念。固定查表将一个编号对应到同一向量;上下文表示 \(h_t\) 则同时依赖其他词元和位置。前者的邻近关系与后者的语境相似性不能直接互换,二维投影中看似清晰的簇也不能证明原空间具有同样分离程度。
还应注意表示的坐标并不天然可解释。对相邻的两个线性映射 \(EW\),任取可逆矩阵 \(A\),有
在这个组合中,改变中间坐标并相应改变下游权重,输出保持不变,嵌入距离却可能变化。正交变换保持内积,一般可逆变换则不保持。这说明不能仅凭某一坐标轴命名语义属性。上述等价仅针对所写的线性组合;含归一化、非线性或权重共享约束的完整网络,不一定允许任意这样的重参数化。