购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 分词

2.1.1 粒度

文本在输入大语言模型之前需要先进行分词,再转换为id序列。大语言模型的训练或推理是在id序列上进行的。常用的分词方法是子词(subword)拆分算法。它将文本数据作为字节序列处理,不依赖于语言特定的规则,而是使用一种基于采样的算法自动学习最佳的分词策略。这种策略将文本分割成子词序列。子词可以是完整的单词,也可以是单词的一部分。拆分成子词而不是完整的单词,在解决自然语言处理中的以下几个关键问题方面有优势:

(1)OOV(Out Of Vocabulary)。在处理大规模文本数据时,总会遇到一些罕见或未知的词汇。使用子词拆分算法可以将这些词汇分解为更常见的子词单元,从而提高模型的泛化能力。

(2)词汇表大小。在自然语言处理模型中,词汇表的大小直接影响模型的复杂性和计算成本。通过将词汇分解为子词,可以显著减小词汇表,同时保持对语言的表达能力。

(3)多语言支持。对于多语言模型,使用子词拆分算法可以更容易地处理不同语言的词汇,因为这些算法不依赖于特定语言的单词边界。

2.1.2 子词拆分算法

主流的子词拆分算法有BPE [1] (Byte Pair Encoding)和Unigram [2] 。BPE的工作原理是迭代地合并文本中最常见的连续字符对,直到达到预定的词汇表大小。这种方法倾向于生成更小的词汇表,因为它主要关注最常见的字符组合。BPE词汇表中的每个子词都是由字符对合并而成的,这限制了词汇表的增长。相比之下,Unigram模型是基于语言模型概率来优化词汇表的。使用一个平滑的Unigram模型估计每个子词的频率,并尝试找到能够最大化给定语料库中所有句子的概率的子词集。这意味着Unigram模型不仅关注最常见的子词,还会包含一些不那么常见但有助于提高语言模型概率的子词。因此,Unigram模型可能会生成一个更大的词汇表,因为它包含了更多样化的子词。Unigram模型需要更多的计算资源。综合考虑词表大小、训练效率和泛化能力等因素,BPE成为大语言模型的流行的分词算法。

1.BPE算法

使用BPE算法创建词汇表的步骤如下:

(1)初始化。从字符级别开始,每个单词被表示为字符序列。

(2)统计频率。对语料库中的所有单词进行扫描,统计字符对(两个连续字符)的出现频率。

(3)合并最频繁的字符对。选择频率最高的字符对,并将它们合并为一个新的字符。

(4)迭代过程。重复步骤(2)和(3),直到达到预定的词汇表大小或没有更多的字符对可以合并。

2.Unigram算法

使用Unigram算法创建词汇表的步骤如下:

(1)从训练语料库中启发式地创建一个足够大的种子词汇表。

(2)通过迭代过程优化词汇表的大小和子词的概率。

①固定词汇表,使用EM算法优化子词的概率。

②计算每个子词的损失值,它表示当该子词从当前词汇表中移除时似然函数值减小的程度。

③根据损失值对符号进行排序,并保留顶部一定百分比的子词(例如80%),同时保留所有单个字符的子词以避免OOV问题。

BPE和Unigram都将生成一个包含大量常见子词单元的词汇表。该词汇表可以用来将文本拆分成子词,这样就可以减小词汇表,同时仍然能够处理罕见和未知的单词。

2.1.3 实现

WordPiece [3] 是Google BERT预训练中使用的分词器实现。它可以视为一种独立的子词拆分算法。不过,由于其训练逻辑和BPE非常相似,可以将它视为BPE的一个变体。两者的训练逻辑的不同在于合并字符对的选择。不像原始的BPE算法,WordPiece将字符对的出现频率除以其各部分出现的频率的乘积,得到字符对的一个分数。每次迭代,选择分数最高的字符对进行合并。因此,WordPiece优先合并词汇表中各部分出现频率较低的字符对。

SentencePiece [4] 实现了BPE和Unigram两种算法,成为目前大语言模型的默认分词器实现。 G0rN6AoZu1f2jQ3uvTWCVJbgitblrLpVw/kmn31bI6GHs1sknJX2zC8MUP4K6nKX

点击中间区域
呼出菜单
上一章
目录
下一章
×