token词典
1、什么是OOV溢出词表的词
OOV 是 “Out Of Vocabulary” 的缩写,中文可以翻译为溢出词表的词或未登录词,指的是在自然语言处理(NLP)系统中,出现在输入文本中但不在系统预设词汇表(vocabulary)中的词语。
一、分词的概念
基于词汇的分词在某些语言(如中文)中可能对相同输入产生不同的分词结果,导致生成包含海量低频词的庞大词表,还可能存在未登录词(Out-of-Vocabulary, OOV)问题。因此,当前语言模型更多地采用字符作为最小单位进行分词。
那么怎么设计最小分词单位比较好呢?
从分词粒度来看,主要包括三种类型:Word、Subword 和 Char。
Word分词
- 以完整的单词为单位进行分词,能够很好地保留词的语义,适合上下文理解和语义分析。
- 然而,它面临着长尾效应和稀有词问题,可能导致词汇表庞大并且出现OOV问题(Out-of-Vocabulary)。
Char分词
- 将文本拆分为字符级别,可以解决OOV问题,因为任何字符都能处理。
- 缺点是可能缺乏明确的语义信息,且粒度过细会增加后续处理的计算成本和时间。
Subword分词
- 介于Word和Char之间,旨在克服两者的缺点,同时保留语义信息并减少OOV问题的发生。
- Subword分词方法如 BPE(Byte Pair Encoding) 和 WordPiece 通过统计学方法切分单词为更小的有意义的单元,在处理生僻词和缩写时更为有效。
二、Transformer分词方法
其中子词分词器(Subword Tokenizer)被广泛应用于基于Transformer的语言模型中,包括 BPE分词、WordPiece分词 和 Unigram分词 三种常见方法。
BPE/BBPE分词
- BPE(Byte Pair Encoding)从字符级别开始,逐步合并最频繁连续出现的字符或字符组合,形成新的词汇单元。
- BBPE(Byte-Level BPE)扩展BPE,将字节视为合并操作的基本符号,实现更细粒度的分割,并解决未登录词问题。代表性语言模型包括 GPT-2、BART 和 LLaMA。
- 对于英文和拉丁体系的语言,使用BPE分词足以在可接受的词表大小下解决OOV问题。但对中文、日文等语言,需要使用字节级BBPE来解决不同语言的分词问题。
BPE词表构建整体流程:
- 初始化字符集,转化为字符序列。
- 统计频率最高的字符对并合并。
- 重复上述步骤,直至达到预设词汇表大小。
WordPiece分词
- WordPiece分词与BPE类似,但合并选择标准不同:
- 不选择最频繁的词对,而是为每个词对计算分数,综合考虑词对和每个词的出现频率。
- 合并得分最高的词对,更新词汇表。
- WordPiece通过将所有「常用字」和「常用词」存到词表中来分词,但要穷举所有语言中的常用词会导致词表过大,难以实现。
使用分词策略进行合并子词
计算合并后的似然值:
WordPiece 方法的一般步骤如下:
- 准备足够大的训练语料库,并确定期望的子词词表大小。
- 将单词拆分成最小的单元,作为初始词表。
- 根据不同的分词策略,以不同的最大化目标合并子词形成新的子词单元。
- 重复执行单元合并,直至达到设定的子词词表大小。
在执行 WordPiece 方法时,子词合并时最大化的目标是本次合并相邻子词能否使得整个语料库的似然值升高。使用形式化语言描述,具体如下:
logP(S)=∑i=1nlogP(ti) \log P(S) = \sum_{i=1}^{n} \log P(t_i) logP(S)=i=1∑nlogP(ti)
其中,tit_iti是每一个子词。如果执行合并操作,将tit_iti和tjt_jtj进行合并以形成tkt_ktk,那么logP(S)\log P(S)logP(S)的变化为:
ΔlogP(S)=logP(tk)−[logP(ti)+logP(tj)] \Delta \log P(S) = \log P(t_k) - \left[ \log P(t_i) + \log P(t_j) \right] ΔlogP(S)=logP(tk)−[logP(ti)+logP(tj)]
Unigram分词
- Unigram分词器与BPE和WordPiece不同,其构建过程是一个反向的操作,构建过程如下:
- 初始化时创建一个非常大的词汇表。
- 根据标准逐步丢弃不常用的词汇单元,直到满足限定的词汇表大小。
- 这种方法尤其适合处理生僻词。
三、总结
在自然语言处理(NLP)中,OOV(Out-of-Vocabulary,未登录词)问题是分词与语言建模中的关键挑战,指输入文本中出现但未包含在模型词汇表中的词语。为有效应对这一问题,现代语言模型普遍采用更灵活的分词策略,取代传统的以“词”或“字符”为单位的分词方式。
分词的最小单位主要分为三类:
- Word分词:语义清晰,但易导致词汇表庞大,难以处理稀有词和OOV问题;
- Char分词:粒度最细,可避免OOV,但语义信息弱,计算成本高;
- Subword分词:介于两者之间,兼顾语义保留与OOV缓解,成为当前主流方案。
在基于Transformer的模型中,子词分词器(Subword Tokenizer) 被广泛采用,主要包括以下三种方法:
- BPE(Byte Pair Encoding):从字符出发,迭代合并高频字符对,逐步构建词表。其字节级变体 BBPE 更适用于多语言场景(如GPT-2、LLaMA等模型),能有效处理中文、日文等复杂语言的分词问题。
- WordPiece:与BPE类似,但选择合并对象时基于似然值最大化原则,即优先合并能使整体语言模型概率提升最大的子词对,从而优化语料表达。
- Unigram分词:采用“反向构建”策略,从大词表开始逐步剔除低频单元,适合处理生僻词,具备良好的泛化能力。
综上所述,Subword 分词方法通过平衡语义表达与词汇覆盖能力,显著缓解了OOV问题,是当前大语言模型实现高效、鲁棒文本处理的核心技术之一。其中,BPE及其变体因高效性和通用性,已成为主流架构(如GPT、BERT等)的重要基础组件。