前言
在构建大模型的过程中,token 分词与词向量扮演着举足轻重的角色。它们不仅是模型理解文本语言的基础,还深刻影响着模型的性能与精度。本文将深入探讨 token 分词技巧与词向量的构建,了解其工作原理
?
一、Token 分词
首先,大模型会对用户输入的文本进行 Token 分词,这一步是将原始文本分解为更小的 Token 单元,如单词、子词或字符。不同的模型使用不同的 Token 分词策略,例如 BPE(Byte-Pair Encoding)或 WordPiece(用于 BERT)等。例如有一个句子:I am a student,经过分词(tokenization)后,每个 token 默认是以字符串的形式存在的,以下是整个过程的详细说明:分词是将句子转换为 token 的过程,在这个例子中,句子 “I am a student” 被分成了以下几个 token:
"I"
"am"
"a"
"student"
在这个阶段,每个 token 仍然是一个字符串,表示为:
Tokens=["I","am","a","student"]这些 token 还没有被转换为数值向量,它们仅仅是字符串,不能直接用于模型的计算。Token分词是将文本分割成可管理的单元,使得模型能够有效理解和处理。完整字符直接输入会导致信息丢失或复杂性增加,而 Token 化能保持语义、减少稀疏性,最终提高模型的训练效率和预测准确性
如何选择 token 化的方法
选择 Tokenization(分词)方法通常取决于多个因素,包括但不限于使用的具体自然语言处理(NLP)任务、所处理文本的语言特性以及所采用的机器学习或深度学习模型的要求。并不是所有的 Tokenization 方法都是通用的,不同的模型可能会有自己的 Tokenization 方式,特别是那些预训练的模型,如 BERT、GPT 等,它们往往使用特定的方法来处理输入数据。以下是一些考虑 Tokenization 方法时需要考虑的因素:
1.任务需求
不同的任务可能需要不同的分词粒度。例如,对于情感分析而言,词级别的信息可能更为重要;而对于命名实体识别,字符级别的信息可能会更有用。
2.语言特性
不同语言的结构决定了适合它们的分词策略。例如,英语和其他以空格分隔单词的语言可以使用简单的基于空格的分词方法,而像中文这样的语言则需要更复杂的分词技术。
3.模型要求
一些现代的预训练模型使用特定的分词方法,如 WordPiece(用于 BERT),BPE(Byte Pair Encoding,用于 GPT-2),或者 SentencePiece(一种无空格的分词工具)。这些方法可以帮助模型更好地理解和处理未见过的词汇。
4.上下文相关性
某些 Tokenization 方法能够保留上下文信息,这对于理解语义非常重要。例如,在处理长句子时,能够捕捉到上下文依赖性的分词方法会更有优势。
5.计算效率
在处理大规模数据集时,分词的速度和内存消耗也是重要的考量因素。
6.可解释性
在某些应用场景中,分词结果的可解释性也是一个重要因素。例如,在医疗领域,保持术语的一致性和准确性是至关重要的。
因此,在选择 Tokenization 方法时,需要综合考虑以上提到的各种因素,并根据实际应用场景做出最合适的决策。
典型模型的 token 化方法
Qwen模型:作为阿里云开发的预训练语言模型之一,使用的是子词级别(subword)的分词方法。具体来说,它采用了 SentencePiece 工具来进行分词。SentencePiece 能够将输入文本分解成一系列的 token,这些 token 可能是完整的单词、也可能是一个单词的一部分,这使得模型能够在处理未知词时仍然具有很好的泛化能力。通过使用子词级别的分词方法,Qwen 可以有效地处理各种语言,并且对于不在训练数据中的新词也有较好的处理能力。这种方法允许模型学习到更加细粒度的语言结构,从而有助于提高在各种下游任务上的性能。总的来说,Qwen 主要依赖于子词级别的分词来处理文本输入,而不是简单地基于字元或完整的词语。这种分词方式在现代的预训练语言模型中非常常见,因为它提供了良好的灵活性和扩展性。
智谱GLM(General Language Model):是由清华大学研发的一个语言模型系列,它采用了子词级别的分词方法。具体来说,GLM 模型使用的是 Byte Pair Encoding (BPE) 或者类似的分词技术。BPE 是一种无监督的分词算法,它从字符开始逐步合并最常见的字符对,直到达到预定的词汇表大小。这样得到的词汇表包含了从单个字符到较长的子词单位,模型可以利用这些单位来表示任何输入文本。这种方法尤其适用于处理大量的未知词汇或拼写错误的情况,因为它允许模型通过组合已知的部分来推测新的词汇。使用 BPE 或类似的技术,GLM 模型可以在处理多样化的文本数据时表现出较好的泛化能力。这种分词方式已经成为许多现代预训练语言模型的标准做法之一。
智谱 GLM 和 qwen 都使用子词级别的分词,但是实现有差异,子词级别的分词,其包含了几种不同的实现技术。尽管智谱 GLM 和 Qwen 都使用了子词级别的分词方法,但它们可能使用了不同的具体技术来实现这一目标。在子词级别的分词技术中,常见的有:
•Byte Pair Encoding (BPE):这是一种将文本分解为子词序列的技术。BPE 从一个字符集开始,然后不断地合并最常见的字符对,形成更大的子词单元,直到达到预定的词汇表大小。
•WordPiece:这是另一种子词分词技术,最初由 Google 提出并用于其预训练模型 BERT 中。WordPiece 与 BPE 类似,但是具体的训练过程和细节可能有所不同。
•SentencePiece:这是一个无监督的分词和词汇归纳工具,它可以处理多种语言,并且不需要预先进行词性标注。SentencePiece 支持字符、词和子词级别的分词。
智谱 GLM 和 Qwen 在实现上可能有所差异。例如,如果智谱 GLM 使用的是 BPE 方法,而 Qwen 使用的是 SentencePiece,那么尽管它们都是子词级别的分词,但具体的实现细节和技术会有区别。总结来说,尽管智谱 GLM 和 Qwen 都采用了子词级别的分词方法,但它们可能使用了不同的具体技术来实现这一点。具体到每一种模型,它们可能会根据自身的设计目标和优化方向选择最适合的分词工具。
?
二. 词向量(Embedding)
接下来,模型会将这些 Token 转换为数值表示,即向量化。具体来说,模型将每个 Token 映射到一个高维稠密向量空间。这些向量能够捕捉到词的语义信息和上下文关系。在分词之后通常使用嵌入层(Embedding Layer)来实现这一点。嵌入层会将每个 token 映射到一个高维空间,例如 12288 维 (gpt3)。
假如本次输入的就是上面这句话,那么 embeding 层会生成一个 4 x 12288 维的矩阵,作为 encoder 层的输入在 Transformer 架构中,这一步通常是通过一个嵌入层(Embedding Layer)来完成的。嵌入层负责将每个 Token 转换成对应的向量表示。
向量化的原理
嵌入矩阵(Embedding Matrix)是嵌入层(Embedding Layer)的核心组件,用于将词表 ID 映射到高维的稠密向量表示。它可以理解为一个大表格,里面存储了模型词汇表中每个 Token(词或子词)的向量表示。在向量化的过程中,模型通过词表 ID 在嵌入矩阵中查找相应的向量,来实现从离散的词 ID 到连续向量空间的转换。
1. 嵌入矩阵的结构
嵌入矩阵的维度通常是 V x D,其中:
•V 是模型词汇表(vocabulary)的大小,即模型所能识别的所有词或子词的数量。
•D 是每个词向量的维度,通常是一个较大的数字(比如 300 维、512 维、1024 维等),这取决于具体模型的设计。
因此,嵌入矩阵可以看作一个大小为 V x D 的二维矩阵:
•每一行对应一个词表中的词 ID。
•每一行存储的向量就是这个词 ID 对应的高维向量表示。
举例:假设词汇表大小为 V = 10000,词向量维度 D = 300,那么嵌入矩阵的大小就是 10000 x 300,每一个词表中的词都有一个 300 维的向量表示。假设有以下的映射:
•"I"(词表 ID: 102) → 嵌入向量 [0.1, 0.2, -0.3, ..., 0.6]
•"love"(词表 ID: 2034) → 嵌入向量 [0.05, -0.12, 0.3, ..., 0.4]
嵌入矩阵的部分内容可能看起来像这样:
词表 ID 词向量(部分)
ID 101: [0.08, -0.1, 0.4, ..., 0.2] # 对应其他词ID 102: [0.1, 0.2, -0.3, ..., 0.6] # 对应 "I"ID 2034: [0.05, -0.12, 0.3, ..., 0.4] # 对应 "love".........
2. 嵌入矩阵的来源
预定义嵌入矩阵指的是在模型训练过程中,嵌入矩阵的参数被初始化并通过训练进行更新。这个矩阵并不是在模型初始化时已经带有所有词的语义信息,而是通过模型的训练数据逐步学习到每个词或子词的语义和上下文关系。
嵌入矩阵的初始化:
•随机初始化:大多数模型在一开始会用随机数来初始化嵌入矩阵的每个向量。随着训练的进行,模型通过反向传播来调整嵌入向量,使得相似词的向量更加接近,不同词的向量则更远离。
•预训练嵌入:在某些情况下,模型可能使用预训练的词向量来初始化嵌入矩阵。例如,可以使用 Word2Vec、GloVe 或 FastText 等模型生成的词向量作为嵌入层的初始值。这些预训练的词向量已经通过大量语料训练,包含了丰富的词汇语义关系。在预训练模型中(如 BERT、GPT),预训练的嵌入向量会结合模型的自监督学习任务(如掩码语言模型或下一个词预测)进行进一步微调。
3. 嵌入矩阵的工作机制
在训练或推理过程中,当输入经过 Token 化并转化为词表 ID 序列后,嵌入层会利用这些 ID 在嵌入矩阵中查找相应的词向量。这是通过查找(lookup)机制完成的。模型会将这些向量作为输入,送入神经网络的后续层进行处理。
举例:
•输入句子:"I love NLP"
•Token 化后:["I", "love", "N", "##LP"] → 对应 ID:[102, 2034, 400, 1501]
•在嵌入矩阵中查找这些 ID 对应的向量:
-ID 102 → 向量 [0.1, 0.2, -0.3, ..., 0.6]
-ID 2034 → 向量 [0.05, -0.12, 0.3, ..., 0.4]
-ID 400 → 向量 [0.02, 0.3, -0.1, ..., 0.1]
-ID 1501 → 向量 [0.4, 0.5, -0.2, ..., 0.7]
嵌入层输出的就是这些对应的向量,作为后续网络处理的输入。
?
三、token 分词、词向量与大模型的关系
向量化使用的嵌入矩阵因不同模型而异。像 LLaMA 2 和 GPT-4 这样的模型,它们的嵌入矩阵会根据各自的词汇表(vocabulary)和训练数据的不同而有所差别。嵌入矩阵的主要差异体现在以下几个方面:
1. 词汇表(vocabulary)不同
每个模型都有自己的词汇表,这取决于模型在训练时使用的 Token 化方式、数据集、语言以及预处理步骤。例如,LLaMA 2 和 GPT-4 可能使用不同的 Token 化算法(如 BPE 或 WordPiece),并且针对的语言任务可能不同,因此它们的词汇表也会不同。词汇表的不同意味着每个模型的词表 ID 映射到嵌入矩阵的方式也会有所不同。
2. 嵌入矩阵的大小不同
嵌入矩阵的大小由词汇表的大小和词向量的维度决定。不同模型的词汇表大小和嵌入向量维度可能不同,因此嵌入矩阵的维度也会不同。例如:
•如果 LLaMA 2 的词汇表有 50,000 个词,每个词的嵌入向量维度是 768,那么其嵌入矩阵的大小就是 50,000 x 768。
•如果 GPT-4 的词汇表更大,嵌入矩阵的大小就可能是 100,000 x 1024,因为模型可能使用了更大的词汇表和更高维度的词向量。
3. 嵌入矩阵的初始化与学习
嵌入矩阵在模型的训练过程中通过训练数据进行学习。虽然在模型训练之前,嵌入矩阵可能是随机初始化或使用预训练的嵌入向量(如 GloVe、Word2Vec 等),但在训练过程中,嵌入向量会根据模型的损失函数和训练任务进行更新,从而学习到具体的语义表示。
4. 嵌入矩阵在模型训练完成后是固定的
嵌入矩阵在模型训练结束后一般是固定的,即不再进一步调整(除非在微调过程中进行再次训练),这意味着:
•一旦 LLaMA 2 或 GPT-4 完成训练,其嵌入矩阵中的每个词向量就确定了。
•在使用模型时(推理阶段),这些嵌入向量会作为输入送入模型的后续层进行处理,不会发生变化。