【Diy-LLM】Task 1 分词器

张开发
2026/4/15 8:04:23 15 分钟阅读

分享文章

【Diy-LLM】Task 1 分词器
分词器通常先用正则表达式对原始文本做预处理再通过统计方法构建高效词表vocab并建立“文本片段 ↔ token ID”的映射。这个映射决定了模型看到的是字、词还是更细的子词片段从而直接影响后续语义建模的效率。1 训练分词器训练一个用于现代大型语言模型的分词器可以拆成四步准备语料 → 初始化基础单元(可省略) → 统计并迭代合并 → 输出产物并用于编码、解码。1.1 准备语料1.在准备语料阶段应尽量收集覆盖目标应用场景的多样化文本以便训练出的词表对下游任务具有良好泛化能力。准备不同类型的文本信息比如小说、散文、诗歌等不同描述风格的信息。多种语言的文本信息比如中文、英文、韩语、法语等。2.对原始文本进行清洗和标准化是必须的步骤包含去除或屏蔽无关元数据、修正或删除乱码与非法字符、统一字符编码为UTF-8并对重复或近重复样本进行去重以减少训练偏移。3.对带有敏感信息或隐私的语料要提前进行脱敏处理与合规检查明确哪些信息不可用于训练并记录数据来源与许可。4.在多语言或混合语料场景中应统计各语言占比并评估是否对低资源语言进行过采样或定向保留避免词表被高频语言主导。否则语料类型与语言分布不均衡会加剧低资源语言的token碎片化增加token开销并降低其任务性能。5.建议保留一小部分未参与训练的验证语料比如训练集:验证集99:1用来在训练过程中评估分词器对真实文本的编码效率与平均token长度等统计指标。1.2 初始化基础单元1.预分词的主要任务是将原始文本切分成可统计、可合并的基础单元例如字符、字节或Unicode片段。常见策略包括基于空格和标点的切分、按Unicode类别划分或直接采用字节级切分。需要注意的是并不是所有的分词器都需要用户显式进行预分词。例如基于SentencePiece的分词器将标准化和预分词逻辑内置因此无需在外部额外执行预分词步骤。2.对大多数以空格为词边界的语言可先用正则表达式按单词边界和标点进行初步切割而对中文、日文等不以空格为词界的语言则通常采用逐字符或基于字的初始单元来保证覆盖性。字节级预分词的好处token利用率更高提高BPE合并token的自由度以及尽可能合并共现频率高的单个字符提高文本信息压缩率。可兼容处理多种语言。学到更多高频片段减少未登录词的出现情况模型推理更快token数少。3.预分词生成的基础单元序列将作为后续统计合并的输入务必保存该序列与对应位置信息以便在训练过程反复高效更新。1.3 统计并迭代更新1.子词候选统计遍历语料以收集用于后续决策的统计信息具体方法随算法不同而异BPE统计当前字符、子词序列中相邻对的出现频次每次贪心合并出现频次最高的相邻对迭代构建词表——其决策仅基于频率统计。WordPiece评估合并或保留某些子词对对语料似然即语言模型性能的贡献选择能显著提升语料拟合度的合并操作。Unigram从一个过大的种子词表出发初始化每个token的概率。SentencePiece是一个语言无关的子词分词框架提供统一的训练与编码流程支持多种分词算法如BPE和Unigram。这些算法在同一框架下独立使用而非直接融合使用其互补性体现在不同任务和数据条件下的适用性差异。总体来说以上四种子词分词算法各有特点没有哪一种是绝对最好的。选择算法时应根据具体的文本内容语料分布、任务类型理解或生成、词表规模以及是否需要处理多语言来决定这样才能让训练出来的LLM模型发挥最佳性能。2.迭代BPE、WordPiece、Unigram、SentencePiece这四种迭代算法简要分析BPE算法可以借助第一步子词候选统计数据作为初始化数据进行单个token合并形成新的token然后在多次迭代过程中动态统计共现次数得到新的token。WordPiece算法会在迭代过程中动态统计当前词汇表中所有相邻子词对的出现情况。其关键并非简单合并频率最高的对子而是优先选择能最大提升语料整体似然的子词对从而形成更有表征意义的token。Unigram算法它基于一个子词概率语言模型将一个句子的概率定义为其所有可能分词方式概率的总和。核心思想是通过迭代优化子词概率使得整个语料的似然最大化。SentencePiece算法它是一个独立的分词工具和实现库能够直接从原始文本训练子词模型因此无需用户在外部显式执行预分词步骤。它在内部会将空格、词边界等信息编码为特殊字符训练输出中常见的▁用于表示词首空格从而可以将空格也作为建表对象之一接着会在这些初始token上应用BPE或Unigram算法生成最终的token词表及映射。这个迭代过程中需要保持特殊控制token如PAD、UNK、CLS、MASK等在分词器迭代更新过程中不参与修改这样可以确保它们的词——数字映射保持固定编码后的离散数字序列能够准确还原为原始文本。同时这些token不会在统计合并或概率优化中被拆分或覆盖从而有效减少碎片化token的出现。无论使用BPE、WordPiece、SentencePiece还是Unigram等算法这一策略都适用有助于保护关键token的完整性保证模型训练和推理的一致性。3.通用终止条件当继续训练已无法显著提升分词压缩效率或语言建模质量时如词表达到上限或高频合并不再明显算法停止。例如在BPE训练中早期“is”、“he”合并能明显减少token数但后期只剩低频组合比如拼写错误词继续合并几乎不减少token数这时就可以停止。4.大规模语料优化通过分布式统计与近似计数等工程手段在保证结果稳定可复现的前提下高效处理超大规模语料。例如训练1TB语料的tokenizer时不可能单机统计所有词组频率通常会把数据切分到多台机器并行统计再合并结果同时固定随机种子保证每次训练得到同一个词表。5.监控与评估指标通过token粒度、压缩率和OOV等指标评估分词器是否在“表达能力”和“效率”之间取得良好平衡。例如如果一个tokenizer把*“international”*切成20个token说明粒度太细如果直接当成一个token又会容易导致OOV问题因此需要在token粒度和词表覆盖之间找到平衡点。总结分词器训练的核心是迭代更新候选子词 → 控制词表大小或收敛指标 → 监控质量指标不同算法仅在“候选生成方式”和“迭代更新策略”上有差异。1.4 输出产物并用于编码与解码1.导出核心产物训练完成后需要导出至少两个关键文件vocab文件记录所有token及其对应的id是编码器和解码器的核心索引。merges文件按顺序记录所有子词合并规则或概率模型。二者共同决定tokenizer的编码与解码逻辑并确保编码的可逆。2.下游使用前的验证与评估将tokenizer应用于一部分验证集后建议统计以下关键指标平均token数与最大长度分布直接影响显存占用、训练速度和推理效率碎片化情况检查关键实体、专业术语是否被拆得过碎避免影响模型理解跨语言token平衡度多语言任务中需确保不同语言的常见模式都有足够的token支持。如果后续需要扩表如加入新领域术语、专业词或品牌名等建议优先采用这些方式而非完全重训tokenizer增量训练、加入新的merges项、清理极低频token。扩表后应进行一次回归测试确保与旧模型保持兼容且根据数字化编码可以还原回到最开始的输入文本、不发生token分配冲突或token耗尽问题。4.版本管理与可复现性保证词表与merges文件应纳入严格的版本控制包括语义化版本号如1.2.0 、每次修改的变更日志、在训练脚本和推理pipeline中显式固定tokenizer版本防止模型训练阶段与推理部署阶段使用不同tokenizer导致结果不可复现或性能下降。2 常用的分词器在NLP的发展历程中分词策略经历了几次重要的演变。我们主要关注四种最典型的范式字符、字节、词级、BPE分词器以及结合课程lecture1各个分词器伪代码转化为python代码实践。在LLM的token划分中常见策略包括1基于规则的预分词如按空格和标点切分2按Unicode类别分段如连续汉字、连续拉丁字母或数字3更底层的UTF-8字节级切分。1、2方法在以下场景中存在局限文本缺乏显式分隔符或出现长段同类字符例如连续中文长句、拼接的代码标识符、压缩后的字符串。在这些情况下预处理阶段难以有效断句为了保证文本可编码可能会被迫回退到更细粒度的兜底切分接近字符级。相比之下UTF-8字节级策略具有最强的通用性它把任意文本统一拆为字节序列从而从根本上减少未词汇表外OOV问题并覆盖任意字符集。但因为它以最细粒度开始训练时通常需要更多轮的共现统计与合并来把零散字节压缩为紧凑且具语义的token才能在Transformer计算效率与语义表征之间取得平衡。3 思考1有研究表明视觉特征能够增强LLM的理解能力但并非适用于所有语言任务。那么是否可以在视觉表征与离散 token 之间寻求一种动态“平衡点”同时为模型提供两类表征方式并借鉴MoE的思想设计轻量级动态路由使模型能够在不同任务或文本片段中自动选择或融合最合适的词——数字映射表形式从而显著提升跨场景的适配能力2能否设计一种“自适应分词器”在训练阶段先与LLM分开训练并通过一种特殊机制将训练好的分词器与模型结合使其在下游任务中仍能动态学习和优化token划分策略3借助微分子词模块、元学习或强化学习等方法让分词器能够从少量对话或任务样本中自动发现最合适的token划分方式从而降低下游任务对数据的依赖同时提升模型的鲁棒性和泛化能力

更多文章