Unigram算法常用于SentencePiece中,这是Albert、T5、mBART、Big Bird和XLNet等模型使用的分词算法。
💡 本节将深入讲解Unigram,包括完整的实现过程。如果你只想了解分词算法的概要,可以跳到最后。
训练算法
与BPE和WordPiece不同,Unigram的工作方式相反:它从一个大型词汇表开始,然后逐步移除其中的词汇,直到达到所需的词汇大小。构建基础词汇表的方法有很多种,例如,我们可以取预处理单词中最常见的子串,或者在初始语料库上应用大词汇量的BPE。
在训练的每一步,Unigram算法会根据当前词汇表计算语料库的损失。然后,对于词汇表中的每个符号,算法计算如果移除该符号,整体损失会增加多少,并寻找那些增加损失最少的符号。这些符号对语料库的整体损失影响较小,可以说它们“需求较低”,是最佳的移除候选。
由于这个过程很昂贵,这里的 “𝑝” 是一个超参数,你可以控制它,通常设置为10%或20%。这个过程不是仅仅移除与最小损失增加相关联的单个符号,而是移除与最小损失增加相关联的𝑝百分比的符号。然后重复这个过程,直到词汇表达到期望的大小。
注意,我们永远不会移除基本字符,以确保任何单词都能被分割。
现在,这仍然有些模糊:算法的主要部分是计算语料库的损失,并查看移除一些词汇后它如何变化,但我们还没有解释如何做到这一点。这一步依赖于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"]
分词算法
Unigram模型是一种语言模型,它假设每个令牌与之前的令牌独立。这是最简单的语言模型,因为给定先前上下文的令牌X的概率只是令牌X的概率。如果使用Unigram语言模型生成文本,我们总是预测最常出现的令牌。
给定令牌的概率是它在原始语料库中的频率(找到它的次数),除以词汇表中所有令牌频率之和(确保概率总和为1)。例如,“ug"在"hug”、"pug"和"hugs"中出现,所以它在我们的语料库中的频率为20。
以下是词汇表中所有可能子词的频率:
("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)
所有频率的总和为210,因此子词"ug"的概率为20/210。
📝 现在轮到你了! 编写代码计算上述频率,并检查显示的结果是否正确,以及总和是否正确。
现在,要对给定的单词进行分词,我们查看所有可能的分割方式,并根据Unigram模型计算每种方式的概率。由于所有令牌都被视为独立的,这个概率是每个令牌概率的乘积。例如,"pug"的分词["p", "u", "g"]的概率为:
P([“p”,“u”,“g”])=P(“p”)×P(“u”)×P(“g”)=5210×36210×20210=0.000389P([“p”,“u”,“g”])=P(“p”)\times P(“u”)\times P(“g”)=\frac{5}{210}\times\frac{36}{210}\times\frac{20}{210}=0.000389P([“p”,“u”,“g”])=P(“p”)×P(“u”)×P(“g”)=2105×21036×

最低0.47元/天 解锁文章
9105

被折叠的 条评论
为什么被折叠?



