第三章化气为形——Tokenization之秘分词之道在平衡子词切分显神功。【本章导读】数据清洗后仍是人类语言的形态模型无法直接理解。Tokenization便是将文本切分为模型可处理的基本单元——Token。如同将灵气凝练为丹药便于吸收修炼。一、何为Tokenization【Token之理】Token是模型处理文本的最小单元英文中一个Token通常是一个词或词的一部分中文中一个Token通常是一个字或词Token是文本与模型之间的桥梁【为何需要Tokenization】统一表示将不同语言的文本统一为数字序列高效编码用有限的词表覆盖无限的文本灵活切分平衡词表大小和序列长度二、分词方法演进第一代词级分词最简单的方法按空格切分大模型修炼秘籍 → [大, 模型, 修炼, 秘籍] Hello World → [Hello, World]问题词表太大百万级无法处理未登录词OOV不适合中文等无空格语言第二代字符级分词将文本切分为单个字符Hello → [H, e, l, l, o] 大模型 → [大, 模, 型]问题序列太长计算效率低字符本身无语义第三代子词分词主流方法结合词级和字符级的优点unhappiness → [un, happiness] tokenizer → [token, izer]优点词表大小适中3万-10万能处理未登录词保留语义信息三、BPE算法字节对编码之术【BPE心法】BPEByte Pair Encoding是最常用的子词分词算法如同武学中的基础内功简单而强大。【BPE原理】BPE的核心思想不断合并最高频的相邻字节对直到达到目标词表大小。BPE训练过程第一步初始化将所有单词拆分为字符语料: [low, lower, newest] 初始状态: low → [l, o, w] lower → [l, o, w, e, r] newest → [n, e, w, e, s, t]第二步统计频率统计所有相邻字节对的出现频率字节对 频率 ───────────── (l, o) 2 (o, w) 2 (w, e) 2 (e, r) 1 (n, e) 1 (e, s) 1 (s, t) 1第三步合并最高频对最高频的是(l,o)、(o,w)、(w,e)任选一个合并合并 (l, o) → lo 更新: low → [lo, w] lower → [lo, w, e, r] newest → [n, e, w, e, s, t]第四步重复合并继续统计、合并直到达到目标词表大小合并 (lo, w) → low 合并 (e, s) → es 合并 (es, t) → est ... 最终词表: {l, o, w, e, r, n, s, t, lo, low, es, est, ...}BPE编码过程训练好词表后对新文本进行编码输入: lowest 步骤1: 拆分为字符 [l, o, w, e, s, t] 步骤2: 应用合并规则 - (l, o) → lo → [lo, w, e, s, t] - (lo, w) → low → [low, e, s, t] - (e, s) → es → [low, es, t] - (es, t) → est → [low, est] 输出: [low, est]四、其他分词算法WordPiece与BPE类似但合并标准不同BPE基于频率WordPiece基于概率提升用于BERT等模型。Unigram Language Model从大到小逐步删减初始词表包含所有可能的子词根据语言模型概率逐步删减保留对整体概率贡献最大的子词用于T5、ALBERT等模型。SentencePiece将文本视为原始字节流无需预分词支持任意语言空格也作为特殊字符处理适合多语言模型【算法对比】算法合并策略优点代表模型BPE频率最高简单高效GPT系列WordPiece概率提升语义更好BERTUnigram概率贡献多种分法T5SentencePiece字节级语言无关多语言模型五、词表构建建立武学根基【词表大小选择】词表大小优点缺点小1万模型小速度快序列长覆盖差中3-5万平衡性好-大10万序列短覆盖好模型大训练慢主流模型词表大小模型词表大小GPT-250,257GPT-3/4约100,000LLaMA32,000DeepSeek128,000Qwen152,000【特殊Token】词表中需要包含特殊TokenToken用途pad填充序列unk未知Tokenbos序列开始eos序列结束sep分隔符cls分类标记六、Tokenization实战【使用HuggingFace Tokenizers】fromtransformersimportGPT2Tokenizer# 加载预训练的tokenizertokenizerGPT2Tokenizer.from_pretrained(gpt2)# 编码textHello, 大模型修炼秘籍!tokenstokenizer.encode(text)print(fTokens:{tokens})print(fToken文本:{tokenizer.convert_ids_to_tokens(tokens)})# 解码decodedtokenizer.decode(tokens)print(f解码:{decoded})输出示例Tokens: [15496, 11, 32668, 108, 36283, 109, 10541, 0] Token文本: [Hello, ,, 大, 模, å, ľ, ¿, !] 解码: Hello, 大模型修炼秘籍!【训练自己的Tokenizer】fromtokenizersimportTokenizerfromtokenizers.modelsimportBPEfromtokenizers.trainersimportBpeTrainerfromtokenizers.pre_tokenizersimportWhitespace# 创建tokenizertokenizerTokenizer(BPE(unk_token[UNK]))tokenizer.pre_tokenizerWhitespace()# 训练trainerBpeTrainer(vocab_size30000,special_tokens[[UNK],[CLS],[SEP],[PAD],[MASK]])files[data/train.txt]tokenizer.train(files,trainer)# 保存tokenizer.save(tokenizer.json)七、Tokenization的影响【对模型性能的影响】影响方面说明序列长度好的分词减少序列长度提高效率未登录词好的分词减少OOV提高覆盖率多语言好的分词支持多语言扩大应用范围领域适应领域特定词表提升专业能力【中文Tokenization的特殊性】中文没有天然的分隔符分词更具挑战方法1: 字级分词 大模型修炼 → [大, 模, 型, 修, 炼] 方法2: 词级分词 大模型修炼 → [大模型, 修炼] 方法3: 子词分词推荐 大模型修炼 → [大, 模型, 修炼]主流中文模型的策略字级子词混合大词表覆盖常见词支持繁简转换八、本章心法总结【口诀】分词之道在平衡子词切分显神功。BPE算法最常用词表构建根基成。【要点回顾】要点说明Token模型处理文本的最小单元子词分词当今主流方法平衡词表大小和序列长度BPE算法不断合并高频字节对构建词表词表大小3-10万为宜需平衡效率和覆盖特殊Token包含pad、unk、bos、eos等第一卷总结第一卷灵气采集篇到此结束。我们学习了数据采集从互联网海量数据中采集训练素材数据清洗去重、去劣、过滤有害内容Tokenization将文本转化为模型可处理的Token这三步完成后我们便拥有了修炼大模型的灵气。【下一卷预告】第二卷内功筑基篇我们将深入预训练之道学习Transformer架构、规模法则、分布式训练等核心内容。这是大模型修炼最关键、最耗资源的阶段。