Transformers从入门到精通:token和它的三种粒度
大家对于token的概念可能司空见惯了,现在的大语言模型的计费方式一般都采用输入和输出的token数量来计费。那到底什么是token,它的作用是什么?
1. 什么是Token?
在自然语言处理中,Token是文本预处理的基本单元,通常是指由空格、标点符号等分隔开的文本中的一个个部分,比如单词、词组、符号等。Tokenization(分词)是将文本分割成Token的过程。
2. Token和文本处理的特殊性
我们知道神经网络模型的输入和输出都是数值
- 对于图像处理如CNN来说,图像本身就是0-255的数值,不需要额外的处理,就可以直接作为神经网络的输入
- 而对于文本来说,本身是字符并不是数值,所以必须将字符转换为数值,输入到神经网络,神经网络的输出也是数值,最后还需要将数值转换为字符
所以文本处理的特殊性:需要一个词汇表表示神经网络预测输出的范围,通常称为vocabulary
3. tokenize三种粒度:word/subword/char
tokenization 是将文本分解成更小单位(tokens)的过程。根据分解的粒度不同,tokenization 可以分为三种主要类型:单词级(word-level)、子词级(subword-level)和字符级(character-level)。每种粒度都有其独特的优点和适用场景。
3.1. 单词级 Tokenization(Word-level Tokenization)
描述
单词级 tokenization 是将文本分解成单个单词的过程。这是最直观和常见的分词方法,尤其适用于空格显著的语言如英语。
优点
- 直观性强:与人类的语言理解方式一致。
- 便于操作:容易实现和理解,适合快速原型开发。
缺点
- 词汇表庞大:需要存储大量不同的单词形式,增加存储和计算开销。
- 处理未登录词(OOV)问题:对于未出现在训练数据中的词汇,处理能力较弱。
- 不同语言的复杂性:对于没有明确分词符号的语言(如中文),单词级分词较为复杂。
示例
英文文本:"This is a tokenizer." 分词结果:
['This', 'is', 'a', 'tokenizer', '.']
工具
- Python 内置
split()
函数 - NLTK 库
- spaCy
- Jieba(适用于中文)
3.2. 子词级 Tokenization(Subword-level Tokenization)
描述
子词级 tokenization 是将文本分解成比单词更小的单位(子词)的过程。常见的方法有 BPE、WordPiece 和 SentencePiece。子词级 tokenization 通过分解单词,可以有效处理未登录词,并且减少词汇表大小。
优点
- 处理未登录词:通过分解为已知子词,能够处理未登录词。
- 减少词汇表大小:通过合并高频子词对,生成的词汇表更加紧凑。
- 适应多语言任务:较好地处理多语言文本。
缺点
- 实现复杂度高:实现和理解相对复杂。
- 有时难以解释:分词结果有时不直观,不易于解释。
示例
英文文本:"unaffable" 分词结果(使用 WordPiece):
['un', 'aff', 'able']
工具
- Byte Pair Encoding(BPE)
- WordPiece
- SentencePiece
3.3. 字符级 Tokenization(Character-level Tokenization)
描述
字符级 tokenization 是将文本分解成单个字符的过程。这种方法将每个字符视为独立的 token。
优点
- 处理未登录词:最小化未登录词问题,每个字符都在词汇表中。
- 词汇表最小:词汇表大小通常为字符集的大小,存储和计算开销最小。
- 灵活性高:适用于所有语言和符号。
缺点
- 上下文理解能力弱:单个字符的信息量较少,模型需要更长的上下文来理解文本。
- 训练复杂度高:由于 token 数量多,模型训练时间较长。
示例
英文文本:"token" 分词结果:
['t', 'o', 'k', 'e', 'n']
工具
- Python 内置
list()
函数 - 自定义字符分割函数
4 总结
在 NLP 中,不同粒度的 tokenization 方法各有优缺点:
- 单词级 tokenization:直观、操作简单,但词汇表大,处理未登录词能力差。
- 子词级 tokenization:平衡了词汇表大小和处理未登录词能力,但实现复杂。
- 字符级 tokenization:最小化未登录词问题,词汇表小,但需要处理更多的 token,总体训练复杂度高。
选择合适的 tokenization 方法取决于具体的应用场景、语言特点和计算资源。合理的 tokenization 是提升 NLP 模型性能的重要步骤之一。