分词器和词嵌入的那些故事
我们在调用大模型之前,往往会进行分词器分词,进行分词器分词后,然而还需要嵌入。其中的原因在于它们的功能和作用是相辅相成的。分词器的任务是将文本转化为模型可以处理的离散单位,而嵌入则负责将这些离散单位转化为模型可以理解的连续数值表示。下面我分别来讲讲他们的作用到底是什么。
一、模型自注意力前面的处理流程描述
1.文本分词:
输入句子被分词器(如 WordPiece
、BPE
等)处理,转化为 token
索引序列。
示例:"I love cats" → [101, 1045, 2293, 8873, 102]
2.词嵌入(Embedding
):
将每个 token 索引映射为一个高维连续向量(如 768 维)。果是一个矩阵,形状为 索引长度 × 嵌入维度,表示整个序列的嵌入。
[1045, 2293, 8873] → 向量 [[0.5, -0.2, ...], [1.2, 0.8, ...], [0.3, -0.7, ...]]
3.嵌入加位置信息:
自注意力机制对序列位置不敏感,因此需要引入 位置编码(Positional Encoding
) 或 位置嵌入(Positional Embedding
) 来区分不同 token
的顺序。最终结果是每个 token
的嵌入向量加上位置信息,形成输入矩阵。
4.自注意力机制:
模型接收嵌入后的序列向量,计算每个 token
与其他 token
的相关性。这一步通过生成 Query(Q)
、Key(K)
和 Value(V)
,计算加权关系并更新表示。
上面4个流程体现了 自注意力机制(Self-Attention
)的输入就是经过 词嵌入 后的连续向量表示。
二、分词器
分词器负责将输入文本拆分为更小的单元(如单词、子词或字符),然后将这些单元映射为离散的 索引(tokens
),例如:
输入句子:"I love cats"
分词器输出:[101, 1045, 2293, 8873, 102]
这一步的目的是将自然语言转化为离散的符号序列,便于后续处理。
二、词嵌入
嵌入是将分词器生成的离散索引转化为连续的、密集的向量表示(embedding vectors
)。这些向量表示模型理解每个单元的语义、上下文关系等。离散索引本身没有语义信息,嵌入的引入解决了以下问题:
1.捕捉语义信息
分词后的索引 [1045, 2293, 8873] 只是数字,没有语义,而嵌入将其映射为高维向量(如 300 维或 768 维),捕捉单词的语义关系。例如,"love" 和 "like" 的向量会更接近,而 "love" 和 "cat" 的向量则稍远。
2.在向量空间建模上下文
嵌入允许模型捕捉上下文关系,在句子 "I love cats" 中,嵌入可以帮助模型理解 love 是一种情感,而 cats 是一个具体的实体。嵌入还可以帮助模型建模更复杂的上下文,如词在句子中的顺序和作用。
三、分词器 + 嵌入:相辅相成
分词器和嵌入的结合是深度学习模型处理文本的关键步骤:
1.分词器将自然语言分解为离散符号(tokens
)。
2.嵌入将这些符号转化为连续向量表示,便于神经网络处理。
比如 Transformer
架构(如 BERT
或 GPT
),就是依赖分词器将文本拆解为子词单元,然后使用嵌入层将这些子词表示为向量,输入到模型中。
三、为什么两者都不可缺少?
有的同学可能会问,如果我们只采用分词器,或者只采用词嵌入不就可以了吗,都是转化成特定维度的向量,最后交给大模型。我来给大家说说舍弃其中一个的问题。 1.只采用分词器 模型只能处理离散的 token 索引,而离散的索引之间没有语义信息。模型也无法捕捉词与词之间的关系。 2.只采用词嵌入 如果没有分词器的预处理,直接嵌入整段文本会导致复杂性过高(例如处理词表外单词或长文本)。
四、总结
分词器:将文本分解为可处理的最小单元(tokens
)。
嵌入:为这些最小单元提供语义信息的数值表示。
只有当二者结合才能高效处理自然语言并输入到深度学习模型中,让模型既理解词语的语义,又能建模其上下文关系。