0 概述:符号系统数值化的准备
分词Tokenization和嵌入Embedding(表示学习Representation Learning中的Word Representation)是将符号系统的自然语言转变为数值系统以供计算机处理的前提。而自然语言具有组合复杂、长短不定等灵活特性,因此首先必须对这一符号系统进行切分,这一切分的最小单元就是词元,也就是耳熟能详的token。将长且复杂的自然语言文本按照某一策略分割为最小词元的集合后依然不够,还需要对其进行数值化,以便计算机处理。最简单的数值化就是对其进行标号,以及衍生出的one-hot编码。但很快我们发现,对于语言,我们不仅要对其进行唯一性表示,还希望对其之间的关系进行表示,所以诞生了之后琳琅满目的词嵌入产品。分词和嵌入密不可分,但篇只讲Tokenization,因为Embedding本质上已经是一个独立的语言模型了(虽然目前作为大模型的一个基础组件),因此将会单独整理。
具有隐喻意味的是,Twitter基于GPT-2模型和平台诗歌语料训练的一个bot说过这样一段话:‘tokens’ are not a real thing. they are a computer generated illusion created by a clever engineer. 中文意思是:token不是真实的事物,而是聪明的机器人产生的幻觉 。
2021年 Sabrina J. Mielke等人的论文Between words and characters: A Brief History of Open-Vocabulary Modeling and Tokenization in NLP中,较为系统地解释了token是什么这一概念的漫长演变,主要在不同语言类型(例如,对于英文空格分词法+重要搭配基本就能完成分词,但对于中文而言,需要基于规则、统计、深度学习等更复杂的分词方法)和不同分词粒度(word\subword\character\byte)上有区别。下面基于这篇文章和其他网络资料整理Tokenization的发展历程如下。
1 分词Tokenization术语与Word-level分词法诞生
1.1 学术溯源
1992年,分词Tokenization概念首次出现。Jonathan J. Webster等人在论文Tokenization as the initial phase in NLP 中指出,作为NLP任务的第一步,将文本分割为基本单元(basic units)是进行文本分析、生成的前提,但英语中简单的、天然的空格分割让人们低估了俚语(idioms)、固定搭配(fixed expression)的分割的复杂性,更遑论中文等其他没有空格作为自然单元分割的语言。
在这篇文章中,作者几乎是首次使用tokenization作为分词的术语——We define this preprocessing as tokenization,虽然之前1990年有两篇类似的论文探索了对俚语、固定搭配进行转换中有简介提及。在这篇文章中,作者还对token的概念进行了厘清:token是基于重要组合(significant collocation,相对于casual collocation)的单元,而不仅仅是空格分割出的单元。通过将文本中的搭配映射到预存储的搭配模式来实现单词识别的可能性。
此外,该篇文章还可以被视作Word-level分词法的正式起源,由于这一分词法过于符合直觉,所以最初起源难以考证。在英文中,token很自然地代表由空格space和标点punctuation分隔的word,例如,MAF (Morphological Annotation Framework,ISO标准)中定义token为non-empty contiguous sequence of graphemes or phonemes in a document,即文档中字素或音素的非空连续序列,通常的处理方式是用空格切分。但显然,这种思想处理不了类似don’t等组合词以及固定搭配、俚语。
这种分词法主要有两种实现方式,即依靠人工制定的分词规则、基于机器学习统计进行分词。规则分词是基于字典、词库匹配的分词方法(机械分词法),其实现的主要思想是:切分语句时,将语句特定长的字符串与字典进行匹配,匹配成功就进行切分。常用的规则包括最大匹配法、最小匹配法、双向匹配法和条件匹配法等。其中,最大匹配法是最简单的基于规则的分词方法,它将待分词文本按照一定的顺序(如从左到右或从右到左)划分成若干个词组,选取其中最长的那个词组作为分词结果。此外,基于机器学习统计的核心是词的稳定的组合,即,在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此相邻出现的概率或频率能较好地反映成词的可信度。可以对训练文本中相邻出现的各个字的组合的频度进行统计,计算它们之间的互现信息。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可以认为此字组可能构成了一个词。该方法又称为无字典分词。
1.2 Word-level分词法代表
如前所述,代表成果主要有人工规则匹配和机器学习统计两种范式
- 基于匹配规则的分词法
- 正向最大匹配法:Forward maximum matching segmentation,通常简称为MM法。步骤:
- 若分词词典中的最长词有i个字符,则从前往后选取待处理字符串中的i个字作为匹配字段,查找字典。
- 若字典中存在这样的一个i字的词,则匹配成功,这个字段就被作为一个词从待处理字符串中切分出来。
- 如果词典中找不到这样的一个i字的词,则匹配失败,将i个字的匹配字段中的最后一个字去掉,对剩下的i-1个字的匹配字段重新进行匹配处理,直到匹配成功(切出一个词),或剩余字串的长度为零为止。
- 逆向最大匹配法:Reverse maximum matching method,通常简称为RMM法。基本原理与MM法相同,不同的是分词切分的方向、使用的分词辞典。由于汉语中偏正结构较多,若从后向前匹配,可以适当提高精确度。所以,逆向最大匹配法比正向最大匹配法的误差要小。
- 从被处理文档的末端开始匹配扫描,每次取最末端的2i个字符作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。
- 使用的分词词典是逆序词典,其中的每个词条都将按逆序方式存放。在实际处理时,先将文档进行倒排处理,生成逆序文档。然后,根据逆序词典,对逆序文档用正向最大匹配法处理即可。
- 双向最大匹配法:综合了前两者的算法。先根据标点对文档进行粗切分,把文档分解成若干个句子,然后再对这些句子用正向最大匹配法和逆向最大匹配法进行扫描切分。如果两种分词方法得到的匹配结果相同,则认为分词正确,否则,按最小集处理。这种方法的主要目的是因为,有时候正向最长匹配正确,而有的时候逆向匹配的更好,当然也有可能正向最长匹配和逆向最长匹配都无法消除歧义的情况。
- 正向最大匹配法:Forward maximum matching segmentation,通常简称为MM法。步骤:
- 基于机器学习统计的分词法:由于大规模语料的建立,基于统计的中文分词成为主流。利用词频统计和上下文信息进行分词,常见的基于统计的分词算法包括
- 隐马尔可夫模型(Hidden Markov Model,HMM):隐马尔可夫模型的历史可以追溯到20世纪50年代,是用来描述一个含有隐含未知参数的马尔可夫过程,其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。基于序列标注的模型,需要预先对文本进行标注处理。假设有三个不同的骰子,第一个骰子是常见六面骰子(D6),每个面出现的概率是1/6。第二个骰子是个四面体(D4),每个面出现的概率是1/4。第三个骰子有八个面(D8),每个面出现的概率是1/8。定义掷骰子过程为:先从三个骰子里挑一个,挑到每一个骰子的概率都是1/3。然后掷骰子得到一个数字:
- 可见状态链:不停重复掷骰子的过程10次,得到的序列1 6 3 5 2 7 3 5 2 4。可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(emission probability)。例如六面骰(D6)产生1的输出概率是1/6,其他面的概率也都是1/6。或者对一个被赌场动过手脚的六面骰子,掷出来是1的概率更大,是1/2,掷出来是2,3,4,5,6的概率是1/10。
- 隐含状态链:用的骰子的序列,例如D6 D8 D8 D6 D4 D8 D6 D6 D4 D8。一般来说,HMM中说到的马尔可夫链其实是指隐含状态链,隐含状态之间存在转换概率(transition probability)。在上述例子,D6的下一个状态是D4,D6,D8的概率都是1/3,D4,D8的下一个也都一样是1/3。这也可随意设定转换概率的,比如规定D6后面不能接D4,D6后面是D6的概率是0.9,得到一个不同的HMM。
- 条件随机场(Random Condition Field, RCF):由Lafferty等人于2001年提出,是一种基于遵循马尔可夫性的概率图模型的数学算法。结合了最大熵模型和隐马尔可夫模型的特点,是一种无向图模型,近年来在分词、词性标注和命名实体识别等序列标注任务中取得了很好的效果。条件随机场是一个典型的判别式模型,其联合概率可以写成若干势函数联乘的形式,其中最常用的是线性链条件随机场。基于序列标注的模型,需要预先对文本进行标注处理。
- 感知机分词:感知器模型,被视为一种最简单形式的前馈式人工神经网络,是一种二元线性分类器。也是一个逻辑回归模型,一个分词任务相当于一个序列标注问题。因此分词任务可以视为机器学习问题中的——结构化预测问题。
- Bi-LSTM(双向长短期记忆网络):基于深度学习的模型,可以利用上下文信息进行分词。
- 隐马尔可夫模型(Hidden Markov Model,HMM):隐马尔可夫模型的历史可以追溯到20世纪50年代,是用来描述一个含有隐含未知参数的马尔可夫过程,其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。基于序列标注的模型,需要预先对文本进行标注处理。假设有三个不同的骰子,第一个骰子是常见六面骰子(D6),每个面出现的概率是1/6。第二个骰子是个四面体(D4),每个面出现的概率是1/4。第三个骰子有八个面(D8),每个面出现的概率是1/8。定义掷骰子过程为:先从三个骰子里挑一个,挑到每一个骰子的概率都是1/3。然后掷骰子得到一个数字:
2 Character-level分词法:基于Word-level的缺点
Word-level分词法无法处理罕见和新奇的单词,是一种封闭的词汇模型(对应静态词向量模型)。除此之外,形态不同意思相近的词在词表中会被当作不同的词处理,造成训练冗余。因此,2002年,Character-level分词法提出,是突破word桎梏的尝试。第一篇基于字标注(Character-based Tagging)的分词论文发表在2002年第一届SIGHAN研讨会上,当时并未引起学界的重视。研究者们认为word级标记序列在噪声存在时将发生显著变化,从而character模型对噪声和非分布数据更有鲁棒性。
但是限制采用字符级模型的一个主要因素是,字符序列往往比它们的字级或子字级的对应字符长得多,这使得训练和推理变慢。此外,单个字符本身缺少语义。优化方法如下
- Character hashes:优化长度,不直接对字符的embedding进行分析。在多语言环境中,使用字符级模型会导致非常大的词汇量。不给每个字符自己的embedding,而是用多个哈希函数将所有可能的代码点散列到更小的集合中,以便在代码点之间共享参数,以获得合理的计算效率,并专注于非生成序列标记任务。
- 字节级Bytes:如UTF-8编码,但也过长。这可以看作是使用了由标准团体Unicode联盟创建的固定的标记化方案,而不是基于语言或统计信息的过程。具体使用Unicode字节的主要优势是遵循建模数据中最小有意义单位的原则时,字节级模型与字符级模型具有类似的好处,对噪声有更好的鲁棒性,避免词汇量不足等问题,但也有类似的缺点,如由于序列较长,训练和推理时间较长。
- 视觉级Visual featurization: Pixels,思路打开,直接像素分解。另一种 “tokenization-free” 的建模方式是基于视觉概念,字节级模型的目标是覆盖磁盘上所表示的全部底层“词汇”,而视觉表示的目标是编码人类读者在处理文本时可能使用的字符之间的相似性。字节级模型依赖于一致的观察序列,这使得它们容易受到变化和噪声的影响,这些可能会在视觉上呈现相似的效果,而使用视觉特征的最初动机是创造反映共享字符组件的嵌入,如汉字或韩语,因此能够更好地概括罕见的或不可见的字符,直接从像素分解进行转换这种模型在机器翻译的各种语言和脚本上都具有竞争力,而且对诱导噪声具有更强的鲁棒性。
3 Subword-level:融合前两者,基于构词法
前两者分词法分别具有一定的缺陷,尤其是后者Character-level分词法构建的词汇表有限,字符的粒度太细会导致丧失单词本身具有的语义信息。于是,2015左右,Subword-level逐渐成型,采用基于构词法的思路来进行表示,用有限的单元表示无限的新词汇。例如:对于常见的词不做处理仍然取word-level分词,将稀有单词分割为具有含义的子词单词语(subword)。例如**:unfriendly分解为un-friend-ly**。最常用的三种tokenize算法,BPE(Byte-Pair Encoding),WordPiece和SentencePiece,例如ChatGLM就是用基于SentencePiece的分词器。
3.1 BPE字节对编码 (Byte Pair Encoder)
2015被引入NLP领域,最早1994年提出用于数据压缩,基本原理是哈夫曼树的思想,根据最高频字节对进行融合Merge。步骤是:
- 确定词表大小,即subword的最大个数;在每个单词最后添加一个,并且统计每个单词出现的频率;
- 将所有单词拆分为单个字符,构建出初始的词表,此时词表的subword其实就是字符;
- 挑出频次最高的字符对,比如说a和b组成的ab,将新字符加入词表,然后将语料中所有该字符对融合merge。
- 新字符依然可以参与后续的 merge,本质是一种贪心算法;重复3,4的操作,直到词表中单词数量达到预设的阈值或者下一个字符对的频数为1,
3.2 UnigramLM
2018年在动态词向量模型ULM-Fit模型的论文Subword Regularization: Improving Neural Network Translation Models with Multiple Subword Candidates中被提出。是WordPiece算法的反过程。相比WordPiece自底向上组合新subword加入词表,UniLM则先初始化一个足够大的词表,之后每一步删除一定比例的低概率的Subword。
3.3 WordPiece
2018年在Bert模型中提出,但思想源于2012年的研究Japanese and Korean voice search。WordPiece的流程和BPE一样,迭代从词表中选出两个Subword合并成新的Subword,不同点在于WordPiece基于语言模型似然概率的最大值生成新的Subword而不是频率。
3.4 SentencePiece
2018年谷歌开发并开源。谷歌将一些词-语言模型相关的论文进行复现,开发了一个开源工具——训练自己领域的sentencepiece模型,该模型可以代替预训练模型(BERT,XLNET)中词表的作用。BPE和WordPiece都需要一串单词作为输入,也就是说在应用这两个算法之前,就已经应用了某种基于空格的分词方法。与之相比,SentencePiece模型不需要对文本进行预先分词,可以直接把它应用于生语料。该模型由归一化器(Normalizer),训练器(Trainer),编码器(Encoder)和解码器(Decoder)等四个模块组成。
- 归一化器:把语义等效的Unicode字符转换为统一的形式。
- 训练器:使用归一化的语料库训练一个子词分割模型。
- 编码器:用训练器训练得到的子词模型对输入文本进行分词
- 解码器:将分词后的子词序列再转换为归一化之后的输入文本。
SentencePiece作为一种通用的subword分词算法,与其他三种方法相比,具有一些独特的特点。例如,SentencePiece可以直接处理句子级别的文本,而不需要预先进行句子分割。此外,SentencePiece采用了基于unigram语言模型的子词切分算法,相较于传统的BPE和WordPiece等方法,具有更高的分词效率和准确性。
4 多模态Tokenization
除了Text文本的Tokenization,在多模态大语言模型中,视觉等信息也需要进行Tokenization,以便和Text对齐。由于图像和文本两大模态是当前多模态的主流,因此主要介绍图像方面,后续持续补充。将图像和文本数据转换为统一表示形式的过程,涉及到将图像和文本分解成一系列的token,这些token是模型可以理解和处理的离散单元。
4.1 对视觉信息的Tokenization
空间,典型的有粗粒度像素化,即把一组像素作为一个token。例如Towards Semantic Equivalence of Tokenization in Multimodal LLM的动态聚类算法,将视觉特征划分为一个一个的语义单元,基于图像的复杂度灵活决定图片的token数目,这样可以更好地保留图片的语义完整性、低频和高频视觉特征。再例如,Meta公司的Chameleon使用了一个基于Make-A-Scene的新图像tokenizer。这个tokenizer将一张512 x 512的图像转换为1024个离散的tokens,这些tokens来自于一个大小为8192的codebook。
4.2 对视频信息的Tokenization
时间+空间,ICLR 2024有一篇文章LANGUAGE MODEL BEATS DIFFUSION
—TOKENIZER IS KEY TO VISUAL GENERATION提出了一个名为MAGVIT-v2的视频tokenizer,旨在将视觉场景中的时间-空间动态映射为适合语言模型的紧凑离散token。该方法建立在 MAGVIT 的基础上。
4.3 对其他模态的Tokenization
待补充。