Tokenizer 分词

Tokenizer 分词 Tokenizer 的核心任务是将人类可读的自然语言文本转换为模型可以处理的离散 token 序列是大模型性能的基础瓶颈之一。为什么不直接按字 / 词分词按字分词词汇表太小中文约 3000 常用字但序列长度会爆炸人工智能 变成 4 个 token导致计算成本指数级上升且丢失了词级语义。按词分词序列长度最短但词汇表会无限大新词、专有名词、错别字无法处理且中文没有天然空格分隔分词错误会直接导致语义错误。我们需要一种介于字和词之间的分词单位 —— 子词Subword既能控制词汇表大小又能处理未登录词OOV。BPEByte Pair Encoding最经典的子词算法BPE 是 GPT 系列、LLaMA 系列使用的分词算法核心思想是统计最频繁出现的相邻字符对将其合并为一个新的 token迭代直到达到预设的词汇表大小。完整流程示例初始词汇表所有单个字符{a, b, c, ..., z, _, ...}_表示单词开头统计语料中所有相邻字符对的出现频率合并频率最高的字符对加入词汇表重复步骤 2-3直到词汇表大小达到目标通常为 32k-128k例子语料low low low newer newer wider wider第一次合并er出现 4 次→ 词汇表新增er每次只合并当前频率最高的一对字符第二次合并_n出现 2 次→ 词汇表新增_n 合并至最后最终分词其为贪心合并[low] _ [low] _ [low] [_n] [ew] [er] [_n] [ew] [er] _ [wid] [er] _ [wid] [er]SentencePiece谷歌的通用分词方案SentencePiece 是 BPE 的改进版解决了 BPE 的两个核心问题语言无关性不需要预先对文本进行分词如中文分词直接将输入视为 Unicode 字符流空格处理将空格本身作为一个普通字符处理而不是单词分隔符SentencePiece 的两个核心改进Byte-level BPE初始词汇表固定包含 256 个 UTF-8 字节 特殊 tokens,/s,pad等文本预处理将输入文本直接转换为 UTF-8 字节流BPE 合并和传统 BPE 完全一样统计相邻字节对的频率合并最高频的字节对终止条件直到词汇表大小达到预设目标通常为 32k-128kUnigram Language Model概率最大的分词就是最优分词完整训练流程构建初始大词汇表包含语料中所有出现过的字符以及所有出现频率超过阈值的 n-gram通常是 1-6 gram计算每个 token 的概率使用 EM 算法期望最大化计算每个 token 在语料中的最优概率计算每个 token 的损失如果删除这个 token语料的对数似然会下降多少删除损失最小的 token保留损失最大的 token即对语料贡献最大的 token重复步骤 2-4直到词汇表大小达到预设目标第二步使用 Viterbi 算法进行分词训练完成后我们得到了一个词汇表和每个 token 的概率。对于一个新的句子我们使用Viterbi 算法快速找到概率最大的分词方式。Viterbi 算法是一个动态规划算法它可以在 O (nL) 的时间复杂度内找到最优分词其中 n 是句子长度L 是词汇表中最长 token 的长度。特性Unigram LMBPE字节对编码分词方式全局最优基于概率最大化贪心局部最优基于频率合并训练方向从超大初始词汇表逐步删除从单个字符逐步合并概率模型有明确的概率模型每个 token 都有概率无概率模型只有合并规则输出能力可以输出多个候选分词及其概率只能输出唯一的分词结果生僻字处理与 byte_fallback 天然兼容鲁棒性好生僻字容易被拆成单个字符鲁棒性差多语言支持对无词边界语言中文、日文表现更好对有词边界语言英文表现较好token 是怎么变成数字的这个过程非常简单分为两步构建词汇表Vocabulary分词算法训练完成后会生成一个固定的词汇表每个 token 对应一个唯一的整数 ID映射Lookup将分词后的 token 序列通过词汇表映射为对应的整数 ID 序列例子词汇表{我: 100, 爱: 200, 人工: 300, 智能: 400}文本我爱人工智能分词结果[我, 爱, 人工, 智能]数字序列[100, 200, 300, 400]注意词汇表中还会包含一些特殊 token如s句子开始/s句子结束pad填充 token用于将不同长度的序列对齐到相同长度unk未知 token虽然现代分词器几乎不会出现为什么中文分词会影响模型效果中文没有天然空格分隔英文单词之间有空格分词歧义少中文需要模型自己判断词的边界分词错误会直接导致语义错误如 南京市长江大桥 可能被错误分为 南京 / 市长 / 江大桥子词粒度的平衡粒度过细接近字序列长度增加计算成本上升且丢失词级语义粒度过粗接近词词汇表变大未登录词增多模型泛化能力下降中文的最优子词粒度与英文不同需要专门针对中文语料训练分词器词汇表覆盖度中文的常用字约 3000 个但常用词超过 10 万个还有大量的专有名词、成语、网络用语如果分词器的词汇表没有覆盖这些词就会将其拆分为无意义的子词导致模型无法理解歧义消解中文存在大量的分词歧义如 乒乓球拍卖完了 可以分为 乒乓球 / 拍卖 / 完了 或 乒乓 / 球拍 / 卖完了分词器的歧义消解能力直接影响模型的语义理解能力