Skip to content

文本怎样变成 next-token 训练样本 ​

语言模型不能直接对字符串做矩阵乘法。进入 Transformer 之前,必须先回答:文本被切成什么单位、每个单位如何编号、模型在每个位置要预测什么。

一条对象链 ​

text
文本 → token → token ID → embedding → 带位置信息的表示 X
对象示例身份
文本我喜欢猫原始字符序列
token<BOS>、我、喜欢、猫、<EOS>tokenizer 定义的离散单位
token ID0、7、12、25、1token 在词表中的索引
embedding每个 ID 对应一行 C 维参数可学习连续向量
位置表示第 1、2、3…个位置让相同 token 在不同位置可区分

ID 的数值大小没有距离含义;ID 25 不表示“猫”比 ID 7 的“我”更大。真正参与模型计算的是 embedding 向量。

Token 不一定等于词 ​

Tokenizer 可能按字符、子词、字节或混合规则切分。同一个字符串在不同 tokenizer 下可能得到不同 token,因此:

  • token 数决定模型实际看到的序列长度;
  • 词表 ID 只能交给与该词表匹配的 embedding;
  • 不能把界面中看到的“词”直接当成一个模型 token;
  • 本章把“喜欢”当成一个教学 token,只为保持例子可读。

右移一位产生监督信号 ​

text
完整 : <BOS>  我    喜欢  猫  <EOS>
input: <BOS>  我    喜欢  猫
label: 我     喜欢  猫    <EOS>

位置 t 的隐藏表示只能读取 input[0:t],却要提高 label[t] 的概率。训练数据本身由同一序列右移得到,不需要人工为每个位置填写类别。

BOS、EOS 与 Padding ​

  • <BOS> 给第一个真实 token 一个可见起点;并非所有模型都显式使用。
  • <EOS> 告诉模型序列可以结束;生成时选中它通常意味着停止。
  • <PAD> 用于把不同长度样本整理成 batch;padding 位置通常不计入 loss,也不能作为有效内容读取。

必须分别检查 attention mask 和 loss mask。前者决定哪些输入可见,后者决定哪些位置参与评分;它们解决的问题不同。

Shape ​

若 batch 大小为 B、训练长度为 T、隐藏维为 C:

text
token_ids [B,T] → embedding lookup → X [B,T,C]

Embedding lookup 是按 ID 取参数表中的行,不是把 ID 当连续数值乘进去。位置机制可能直接加入表示,也可能像 RoPE 一样在后续改变 Q/K;具体结构不同,但模型必须获得顺序信息。

常见错误 ​

  • 输入和 labels 没右移,模型只学会复制当前位置。
  • 使用了另一个 tokenizer 的 ID,词表与 embedding 不匹配。
  • padding 位置参与 loss,模型花大量能力预测 <PAD>。
  • 把 token 数当字符数,导致长度与成本估算错误。
  • 忘记 EOS,生成只能依赖外部长度上限停止。

本节自测 ​

静态答案与检查点
  1. 错误。2. 猫。3. 回答必须区分“能否读取”和“是否计分”。

小结与下一步 ​

Tokenizer 定义离散单位和 ID,Embedding 把 ID 变成连续表示;右移一位把原文本变成每个位置的 next-token 标签。下一步学习训练文本怎样变成批次与因果遮罩。

最近更新