跳到主要内容

06 · 数据:模型的上限在这里就定了

1. 这一章讲什么

02 章留过一句话:数据质量直接写进困惑度。原书第 6 章把这句话展开成一套工序:训练与微调之前,数据要经过清洗、增强、分词、嵌入四道处理,「数据质量直接影响模型的表现,精细的数据预处理与清洗可以有效提高模型的学习效率」1

这一章和 11 章(训练实战)是数据这条线的两半:本章讲「怎么把原始文本变成好数据」,11 章讲「怎么在大规模训练流水线里做这些事」。

2. 顶层全景:一锅汤的四道工序

原始文本(网页、评论、文章……)
│ ① 清洗:去 HTML/标点/特殊字符/多余空格/停用词/重复词
▼ 干净但「数量不够、花样不多」的语料
│ ② 增强:同义替换 / 随机插入 / 随机删除 / 随机交换
▼ 又多又杂的语料(杂是特性也是风险)
│ ③ 分词:BPE——高频字对反复合并,长出子词
▼ 一串词表里的索引
│ ④ 嵌入:索引 → 向量(Word2Vec/上下文嵌入),可再 PCA 降维可视化

模型能吃的输入

3. 核心原理

3.1 清洗:先去噪,再去「没信息」的词

清洗分两档。第一档是格式噪声:原书列的流程是去前后空格、统一小写、去 HTML 标签(正则匹配)、去数字、去特殊字符、多余空格合并成一个2。中文场景多了两件事:用正则保留汉字(其余符号全删)、全角空格转半角——因为全角半角不一致会让同一篇文本里的「空格」对模型来说是两种东西3

第二档是语义噪声:HTML 和标点去完,还有两类「没信息」的词。停用词就是「的、是、在」这类出现极多却不携带主题信息的词,用停用词表整表过滤4;重复词去重则保证「重要重要重要」不会膨胀成三次权重5

判断(我们的,不是书里的): 这一章的清洗规则是为传统小模型/分类任务设计的。大模型预训练的清洗逻辑不同——停用词不能删(「的、是、在」恰恰是语法——词怎么排队的规矩——的骨架),数字也不能一刀切掉(会丢掉年份、金额这类硬信息)。按 6.1 的配方去洗预训练用的原始文本,会洗出「残疾文本」。 如果错,会错在: 如果后续章节有实验证明停用词删除对大模型无害甚至有益,这条判断就过了——但原书全章的演示都停在词袋式小任务上,没有这种证据。

3.2 增强:一条数据变三条

数据少是常态,数据增强的思路是「改写原句,意思不散」。原书给了四招:

招式做法风险
同义词替换随机挑词,查 WordNet 词典换同义词6替错语境,语义漂移
随机插入随机位置插入某词的同义词7语法变怪
随机删除按概率 p 删词,至少留一个词8删到关键信息
随机交换挑两个位置互换,可调次数9语序敏感的句意受损

主走查:增强把一句话变成了什么。 原书 6.2.2 的输出值得原样看:

原句: 「数据增强技术可以通过多种方式扩展文本数据,以提升模型的泛化能力。」
增强后: 「数据增加增强技术可以通过多种方式扩展文本数据以提升模型的能力泛化。」
↑「增强」被替换成近义的「增加」 ↑「泛化能力」被拆成了「能力泛化」

走查说明:原书自己的例子就暴露了机械增强的毛病——「数据增加」已经不是「数据增强」,还把泛化(机器对付没见过样子的本事)安错了地方,造出「能力泛化」这种怪词组——可见机械增强会造出病句。增强的本质是拿「语义不变」换「数据量」,这笔交易在小任务上划算,在精调任务上可能亏本;用之前先人工抽十条看变体质量。

3.3 BPE:让稀有词不再无家可归

按「整词」建词表有个死穴:词表里没收录的词(错字、新词、人名)直接无家可归。BPE 分词的解法是从最小单位出发往上长:先把文本拆成字符当初始词表,统计哪对相邻单元(挨着的两个小块)出现最多,把它们合并成一个新单元,写回词表;重复这个「统计→合并」的过程,高频组合就长成了子词10。原书的定义是:合并高频的字节(一个字符的底层编号)级配对、反复合并长出子词,从而解决稀有词问题11

补充(不在书里,依据我们的 frontier 书架): 真实 GPT 系分词器在 BPE 之前还加了一道预切分——先用正则按「字母/数字/标点/空白」把文本切成小块,合并只发生在块内、永不跨块;这是 GPT 分词器各种「怪癖」(数字三位一段、空格跟词走)的来源。原书 6.3 只讲了裸 BPE,没讲这一层。 依据: shelf=ai-frontier-reference/minbpe#02-regex-split.md 事实=BPE 之前先按字符类别预切分,「合并只能在同一个选区内发生」。

3.4 嵌入的生成与「看一眼」

分词之后是嵌入。原书点了三代做法:Word2Vec(静态词向量)、GloVe(全局共现向量)、BERT 式上下文嵌入(同一个词在不同句子里向量不同)12。演示里用 Word2Vec 训词向量(100 维、窗口 5),再把 100 维 PCA 降到 2 维画散点图——「意思近的词在图上也近」第一次肉眼可见13

综合案例收尾:从莎士比亚作品取 1000 字片段,把分词、同义替换、随机插入、随机删除连成一条流水线;原书这次没贴运行结果,只说读者自行运行,「最终运行结果应分为如下 4 个部分」14——这是全书少有的「留作业」式结尾。

4. 作者的判断与证据

  • 有演示数据的: 预处理前后文本对照(6.1.1)、增强前后句对照(6.2.2)、BPE 分词结果(6.3.1)、PCA 二维散点图(6.3.2)。
  • 是作者判断的: 「数据增强有助于提升泛化能力」是全章反复出现的定性论断,书里没有「增强 vs 不增强」的对照实验;四招的顺序优先级也没有给。
  • 书里照实承认的: 综合案例不给运行结果(6.3.3),直接说明让读者自己跑——这份坦白比硬编一个结果诚实。

5. 边界与局限

  • 6.1 的清洗配方按小任务设计,直接搬去洗预训练的原始文本会出问题(见 3.1 判断块)。
  • 增强四招全部依赖 WordNet,中文场景先天不适用(WordNet 是英文词汇网络)——原书演示输出的中文增强句之所以语病百出,根子就在拿英文工具处理中文;原书没有点破这一点。
  • 原书没讲去重的进阶形态:模糊去重(近似重复)、按 MinHash 的规模化去重——set() 去重只挡完全相同的句子,而真实文本堆里的重复大多是「换皮重复」。
  • 嵌入一章只到「可视化」,没有讲嵌入怎么在大模型里随训练更新(那在第 1 章的嵌入层训练演示里其实出现过)。

6. 可带走的

  1. 数据工序的顺序是死规矩:先清洗、再增强、后分词——顺序反了会把噪声一起「增强」进喂给机器的文本里。
  2. 清洗两档:格式噪声用正则,语义噪声用停用词表+去重;预训练场景停用词别删。
  3. 增强四招都拿「语义不变」换「数据量」;中文别用 WordNet,换了工具也要人工抽查变体。
  4. BPE 解决的是词表的覆盖率问题:高频组合长成子词,任何新词都能拆回已知单元。
  5. 「意思变成距离」可以用 PCA 降到二维亲眼看——验证嵌入质量最便宜的办法。
  6. 综合流水线(分词→替换→插入→删除)适合当数据管道的骨架,每一步都可以单独拆换。
  7. 原书不给运行结果的地方(6.3.3)恰好是适合自己动手跑的练习点。

7. 原文地图

主题原书章原文位置
章导语第6章text/36-ch06.txt:24(搜「数据质量直接影响模型的表现」)
清洗六步6.1text/37-ch06-01-6-1.txt:33(搜「去除标点符号」) · text/37-ch06-01-6-1.txt:51(搜「去除HTML标签」)
中文正则与全角转半角6.1text/37-ch06-01-6-1.txt:121(搜「保留汉字」) · text/37-ch06-01-6-1.txt:124(搜「全角空格转为半角」)
停用词与去重6.1text/37-ch06-01-6-1.txt:194(搜「停用词」) · text/37-ch06-01-6-1.txt:197(搜「确保每个词只出现一次」)
增强四招6.2text/38-ch06-02-6-2.txt:33(搜「替换原句中的部分词语为其同义词」) · text/38-ch06-02-6-2.txt:72(搜「随机插入是一种增强数据多样性的技术」) · text/38-ch06-02-6-2.txt:160(搜「至少保留一个词」) · text/38-ch06-02-6-2.txt:163(搜「进行交换」)
增强的病句示例6.2text/38-ch06-02-6-2.txt:123(搜「数据增加增强技术」)
BPE 原理与步骤6.3text/39-ch06-03-6-3.txt:33(搜「合并高频字节对」) · text/39-ch06-03-6-3.txt:48(搜「合并最频繁字对」)
Word2Vec/PCA 演示6.3text/39-ch06-03-6-3.txt:100(搜「全局向量(GloVe)」) · text/39-ch06-03-6-3.txt:118(搜「vector_size=100」) · text/39-ch06-03-6-3.txt:124(搜「降至二维」)
莎士比亚综合案例6.3text/39-ch06-03-6-3.txt:151(搜「莎士比亚」) · text/39-ch06-03-6-3.txt:188(搜「限于篇幅原因」)

Footnotes

  1. 出处:「第6章 数据处理与数据增强」第 24 段(text/36-ch06.txt:24,搜「数据质量直接影响模型的表现」)。

  2. 出处:「6.1 数据预处理与清洗」第 33-60 段(text/37-ch06-01-6-1.txt:33,搜「去除标点符号」;text/37-ch06-01-6-1.txt:51,搜「去除HTML标签」)。

  3. 出处:「6.1 数据预处理与清洗」第 121 与 124 段(text/37-ch06-01-6-1.txt:121,搜「保留汉字」;text/37-ch06-01-6-1.txt:124,搜「全角空格转为半角」)。

  4. 出处:「6.1 数据预处理与清洗」第 194 段(text/37-ch06-01-6-1.txt:194,搜「停用词」)。

  5. 出处:「6.1 数据预处理与清洗」第 197 段(text/37-ch06-01-6-1.txt:197,搜「确保每个词只出现一次」)。

  6. 出处:「6.2 文本数据增强」第 33 与 48 段(text/38-ch06-02-6-2.txt:33,搜「替换原句中的部分词语为其同义词」;text/38-ch06-02-6-2.txt:48,搜「synsets」)。

  7. 出处:「6.2 文本数据增强」第 72 段(text/38-ch06-02-6-2.txt:72,搜「随机插入是一种增强数据多样性的技术」)。

  8. 出处:「6.2 文本数据增强」第 160 段(text/38-ch06-02-6-2.txt:160,搜「至少保留一个词」)。

  9. 出处:「6.2 文本数据增强」第 163 段(text/38-ch06-02-6-2.txt:163,搜「进行交换」)。

  10. 出处:「6.3 分词与嵌入层的应用」第 45-53 段(text/39-ch06-03-6-3.txt:48,搜「合并最频繁字对」;text/39-ch06-03-6-3.txt:51,搜「get_stats」)。

  11. 出处:「6.3 分词与嵌入层的应用」第 33 段(text/39-ch06-03-6-3.txt:33,搜「合并高频字节对」)。

  12. 出处:「6.3 分词与嵌入层的应用」第 100 段(text/39-ch06-03-6-3.txt:100,搜「全局向量(GloVe)」)。

  13. 出处:「6.3 分词与嵌入层的应用」第 118-130 段(text/39-ch06-03-6-3.txt:118,搜「vector_size=100」;text/39-ch06-03-6-3.txt:124,搜「降至二维」)。

  14. 出处:「6.3 分词与嵌入层的应用」第 151 与 188 段(text/39-ch06-03-6-3.txt:151,搜「莎士比亚」;text/39-ch06-03-6-3.txt:188,搜「限于篇幅原因」)。