Hugging Face课程:深入理解Unigram分词算法
course The Hugging Face course on Transformers 项目地址: https://gitcode.com/gh_mirrors/cou/course
什么是Unigram分词
Unigram是一种基于统计概率的分词算法,与BPE和WordPiece不同,它采用"自顶向下"的方式构建词表。该算法最初被应用于SentencePiece工具中,成为AlBERT、T5、mBART等知名模型的基础分词方法。
Unigram的核心思想是将输入文本视为原始字符流(包括空格),通过概率模型找出最优的子词分割方式。这种方法特别适合处理不使用空格分隔单词的语言(如中文、日语等)。
Unigram的工作原理
训练过程
Unigram的训练过程可以概括为以下几个步骤:
-
初始化大词表:从预分词后的语料中提取所有可能的子串,或使用BPE等算法生成一个较大的初始词表
-
迭代剪枝:
- 计算当前词表在整个语料上的损失
- 评估移除每个词对总体损失的影响
- 移除对损失影响最小的p%(通常10-20%)的词
- 重复直到词表达到目标大小
-
保留基础字符:确保任何单词都能被分词
分词算法
Unigram采用概率模型进行分词,主要特点包括:
- 独立假设:每个token的出现概率独立于前面的token
- 概率计算:token概率=该token在语料中的频率/所有token频率总和
- 最优分割:对每个单词,选择概率乘积最大的分割方式
实际实现中使用Viterbi算法高效地找到最优分割路径。该算法通过动态规划,记录每个位置的最佳分割方案,最终回溯得到全局最优解。
实战示例
让我们通过一个具体例子理解Unigram分词:
语料:
("hug", 10), ("pug", 5), ("pun", 12), ("bun", 4), ("hugs", 5)
初始词表(所有严格子串):
["h", "u", "g", "hu", "ug", "p", "pu", "n", "un", "b", "bu", "s", "hug", "gs", "ugs"]
频率统计:
"h":15, "u":36, "g":20, "hu":15, "ug":20, "p":17, "pu":17, "n":16
"un":16, "b":4, "bu":4, "s":5, "hug":15, "gs":5, "ugs":5
分词示例:
- "pug"可能的分割:
- 最终会选择后两种更高概率的分割方式之一。
损失计算
Unigram训练的损失函数是语料中所有单词的负对数似然之和。对于每个单词:
- 用当前词表进行分词
- 计算分词结果的概率
- 取负对数得到该单词的损失
- 所有单词损失加权求和
移除词表中的token时,需要重新计算损失的变化,选择对总体影响最小的token移除。
实现要点
实际实现Unigram算法时需要注意:
- 初始词表构建:可以使用增强后缀数组(ESA)等高效算法
- 数值稳定性:使用对数概率而非原始概率避免数值下溢
- 优化计算:
- 近似计算移除token的影响,而非完全重新训练
- 批量处理token评估
- 特殊token处理:保留单字符token确保全覆盖
应用场景
Unigram分词特别适合以下场景:
- 多语言混合文本处理
- 不使用空格分隔单词的语言
- 需要平衡词表大小与分词效果的场景
- 处理专业领域术语和罕见词
通过调整词表大小和剪枝比例,可以在分词粒度和模型效率之间取得平衡。
理解Unigram算法的工作原理,有助于我们更好地使用和微调基于该算法的分词器,特别是在处理特定领域文本或多语言场景时。
course The Hugging Face course on Transformers 项目地址: https://gitcode.com/gh_mirrors/cou/course
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考