这个系列用于记录我的大语言模型学习过程
前言
LLM(Large Language Model,大型语言模型)的Tokenization是自然语言处理(NLP)中的一个重要步骤,它指的是将原始文本转换成模型可以理解和处理的离散符号序列的过程。
一、Tokenization的定义与作用
Tokenization是LLM处理文本数据的基石,它将自然语言文本分解成更小的单元或标记(Token),这些Token可以是单词、单词的一部分(如子词)、甚至是一个字符。然后这些 token 被转换成向量(vector),它们是这些单词的数字表示。这些Token作为模型理解和生成的最小意义单位,帮助模型有效地处理各种NLP任务,如写作、翻译和回答查询等。
二、Tokenization的一般流程
Tokenization的一般流程包括以下几个步骤:
2.1 文本预处理
- 将文本转换为统一的字符集(如Unicode)。
- 转换为小写(如果适用)。
- 去除无关字符,如多余空白、制表符、换行符等。
- 进行拼写校正(可选,取决于是否期望模型在训练时学习拼写变体)。
- 对特定语言进行特定的规范化处理,如德语的连字符合并、汉语的简繁体转换等。
2.2 不同粒度Tokenization
- 词汇级Tokenization
直接按照预定义的词汇表将文本切分为单词或短语。这种方法简单直观,但可能无法有效处理词汇表外的单词(OOV问题),并且需要存储大量不同的单词形式,增加存储和计算开销。
示例:
文本:"what is tokenizer?"
分词结果:['what', 'is', 'tokenizer', '?']
- 子词级Tokenization
使用如WordPiece、Byte-Pair Encoding (BPE) 或 SentencePiece 等算法将文本分割成更细粒度的子词或子词序列。这些算法通过统计学方法自动生成词汇表,包含常见单词和代表罕见或未知词汇的子词组合,从而解决OOV问题。但是实现和理解相对复杂,分词结果有时不直观,不易理解。
1.BPE
BPE 全称 Byte Pair Encoding,字节对编码,是一种数据压缩方法。最早是论文将其引入到 NLP 技术中。BPE 迭代地合并最频繁出现的字符或字符序列。
2.WordPiece
WordPiece核心思想是将单词拆分成多个前缀符号(比如BERT中的##)最小单元,再通过子词合并规则将最小单元进行合并为子词级别。
3.UniLM
Unigram 语言建模首先在 《 Improving neural network translation models with multiple subword candidates》 中提出。这种方法与 WordPiece 相同点是:同样使用语言模型来挑选子词。与 WordPiece 最大区别:WordPiece 算法的词表大小都是从小到大变化。UniLM 的词库则是从大到小变化,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。ULM 算法考虑了句子的不同分词可能,因而能够输出带概率的多个子词分段。
4.SentencePiece
SentencePiece 由谷歌将一些词-语言模型相关的论文进行复现,开发了一个开源工具——训练自己领域的SentencePiece 模型,该模型可以代替预训练模型(BERT,XLNET)中词表的作用。开源代码地址为:https://github.com/google/sentencepiece。其原理就相当于:提供四种关于词的切分方法。这里跟中文的分词作用是一样的,但从思路上还是有区分的。通过使用我感觉:在中文上,就是把经常在一起出现的字组合成一个词语;在英文上,它会把英语单词切分更小的语义单元,减少词表的数量。
以上几种方法的具体原理和实现过程、代码实现可以参考:
【LLM系列之Tokenizer】如何科学地训练一个LLM分词器_llm分词器 使用-CSDN博客
- 字符级Tokenization
字符级 tokenization 是将文本分解成单个字符的过程。这种方法将每个字符视为独立的 token。适用于所有的语言和符号,存储和开销最小。但是单个字符的信息量小,需要辅助上下文理解,而且因为token数多,模型训练时间长。
示例:
文本:"token"
分词结果:['t','o','k','e','n']
2.3 Token到ID的映射
- 为每个生成的Token分配一个唯一的整数ID。
- 构建词汇表(或子词表),其中每个Token对应一个ID。
- 将Tokenized文本序列转换为相应的整数序列(Token IDs),作为模型输入。
2.4 添加特殊Tokens
- 添加特殊Tokens,如开始符号[CLS]、结束符号[SEP](对于Transformer架构模型),以及可能的padding token[PAD]和未知词token[UNK]。这些特殊Tokens有助于模型理解上下文和处理不同长度的输入序列。
2.5 序列截断或填充
- 根据模型的输入限制,对Token ID序列进行截断或填充,以保证所有输入序列具有相同的长度。
三、Tokenization的重要性
- 降低计算和内存成本:通过将长文本分割成较小的Token序列,可以显著降低模型的计算和内存需求。
- 提高模型性能:细粒度的Tokenization(如子词级Tokenization)有助于模型更好地处理罕见词和未知词,从而提高模型在NLP任务中的性能。
- 捕捉语义信息:Tokenization不仅将文本分割成更小的单元,还通过词汇表或子词表的映射保留了单词或子词的语义信息。
四、Tokenization的应用示例
以GPT-3为例,其Tokenization过程采用了Byte-Pair Encoding (BPE) 算法。在将文本发送到GPT-3进行生成之前,会先对文本进行Tokenization处理。例如,单词"transformer"可能被分成"trans-", "form-", "er"等几个子词Token。这些Token在模型内部被赋予数值或标识符,并以序列的形式输入或从模型输出。
百度文心一言在Tokenization方法上采用了BPE和WordPiece的混合技术,这些方法共同作用于输入的文本数据,将其切分成一系列适合模型处理的离散单元(tokens),以便后续进行语义理解和处理。
阿里通义千问在Tokenization方法上采用了BPE算法和WordPiece的混合技术,并通过TikToken这一具体实现工具来进行文本的分词处理。这种方法能够有效地将文本数据转换为模型能够处理的token序列,且最终得到的词表压缩率相比主流的开源模型表现优异,词表大小达到了152K。这种Tokenization策略对于提升通义千问模型在处理自然语言任务时的性能和效率起到了重要作用。
总结
Tokenization是LLM处理文本数据的关键步骤之一,它通过将文本分割成更小的单元(Token)并映射为唯一的整数ID序列,为模型提供了可理解和处理的输入数据。这一过程不仅降低了模型的计算和内存成本,还提高了模型在NLP任务中的性能。