分词和词嵌入(Tokenization and Word Embeddings) #
分词(Tokenization) #
分词的基本概念 #
⁉️ 什么是 Tokenization?为什么它对LLM至关重要?
什么是 Tokenization?为什么它对LLM至关重要?
Tokenization(分词)是将文本拆分成更小的单元(tokens)的过程,这些单元可以是单词、子词或字符。在自然语言处理中,分词是文本预处理的重要步骤。他直接影响模型对语义的理解能力、计算效率和内存占用。
- Example:句子 “Hello, world!” 可被切分为
["Hello", ",", "world", "!"]
(基于空格和标点)。
Note:简而言之,Tokenization 是一个 将输入文本拆解为 tokens(可能是词、子词或字符)的过程,而词表 是一个 包含所有可能 tokens 的集合,它定义了 token 到数字 ID 的映射。
⁉️ 解释什么是 Encoding?Text Encoding,Feature Encoding,Position Encoding 分别是什么?
解释什么是 Encoding?
Text Encoding 主要做的事情是 把文本转换成结构化的、可索引的格式,这样后续的模型或者算法可以进行查询和计算,这个过程类似于构建一个 “字典”(vocabulary),把文本转换成可以查询的 ID 表示。除了构建可查询的字典。所以说 分词(tokenization)可以理解为 encoding 的子步骤或前置步骤。
除了 Text Encoding,Encoding 还可以分为:
- Text Encoding / Token Encoding - 输入编码 (如 BPE, WordPiece, Token → ID)
- Feature Encoding - 特征构建 (如 TF-IDF, BoW, 词频向量等)
- Position / Structural Encoding - 结构性编码 (如 Position Encoding in Transformers)
一些简单的 Feature Encoding 包括:
Note:Text Encoding ≈ 构建词表 + 确定如何把文本映射成 token。也就是说,“encoding”这个词在 tokenizer.encode() 这种 API 里,通常指的是:
- 把原始字符串 → token(比如 BPE 的子词切分)
- 把 token → token ID(索引在词表中的位置)
这个过程中依赖词表(vocabulary),所以可以说“构建词表是 encoding 的核心部分之一”。
Tokenization 是 encoding 的子步骤,Tokenizer 是执行这套 encoding 规则的工具。
⁉️ 词表大小对模型性能的影响?
词表大小对模型性能的影响?
词表的大小决定了模型可识别的唯一 Token 数量,比如 LLaMA 采用了 32k 的词表,而 GPT-2 使用了 50k 词表。较大的词表(包含子词、常用词,甚至整个句子)允许模型以更少的 Token 表示相同文本,提高表达能力,但也增加了参数规模和计算复杂度;而较小的词表(只包含字符 a-z, 标点等)则 减少了计算需求,但可能导致序列变长,进而影响训练效率。因此,在预训练阶段,词表大小的选择会直接影响模型的记忆能力、计算成本以及推理速度。
Note:词表(Vocabulary)既可以直接使用预训练模型提供的标准词表,也可以根据自己的数据集重新训练一个词表,具体取决于应用需求:
- 直接使用预训练词表:如 GPT-3、LLaMA、T5 等开源模型的 Tokenizer 已经基于大规模文本语料(如 Common Crawl、Wikipedia)训练了词表,并随模型一起发布。直接使用这些词表能够确保与原始模型的 Token 方式一致,避免 Token 不匹配导致的性能下降。这种方法 适用于大多数 NLP 任务,特别是在迁移学习(Transfer Learning)场景下。
- 基于自有数据训练新词表:如果 目标领域与通用 NLP 语料差异较大(如医学、法律、金融等专业领域),或者需要支持特定语言(如低资源语言或多语言任务),可以使用 SentencePiece(支持 BPE、Unigram)或 Hugging Face Tokenizers 来从头训练词表。训练时通常会调整 词表大小(Vocabulary Size),使其适配目标任务。较大的词表可以减少 OOV(Out-Of-Vocabulary)问题,而较小的词表能减少计算复杂度,提高推理速度。
⁉️ Tokenizer 在实际模型预训练阶段是如何被使用的?
Tokenizer 在实际模型预训练阶段是如何被使用的?
Tokenizer(分词器) 的主要作用是 将原始文本转换为模型可理解的离散数值表示,即 Token ID(标记序列)。这个过程通常包括分词(Tokenization)、映射(Mapping to Vocabulary) 和 填充/截断(Padding/Truncation)。在分词时,不同的 Tokenizer会根据预定义的 词表(Vocabulary) 将文本拆分成最优的子词单元。
以 Hugging Face 的 tokenizer 或 OpenAI 的 tokenizer 为例,它通常会完成以下几个步骤:
- 预处理:清理文本,比如去掉空格、标准化 Unicode 等
- 分词(Tokenization):比如把句子 “ChatGPT 是谁?” 切成像
['Chat', 'G', 'PT', ' 是', '谁', '?']
- 映射成 ID(Encoding):把这些 token 映射为对应的词汇表索引,例如
[1345, 67, 9801, 345, 26, 9]
- 加入特殊 token:比如
[CLS]
、[SEP]
或<|startoftext|>
这样的符号- 返回 tensor:供模型输入使用
⁉️ Tokenization 如何影响模型性能?
Tokenization 如何影响模型性能?
词表过大:增加内存消耗,降低计算效率(Softmax 计算成本高)。
词表过小:导致长序列和语义碎片化(如切分为无意义的子词)。
语言适配性:中/日/韩等非空格语言需要特殊处理(如 SentencePiece)。
⁉️ 如何为多语言模型设计Tokenization方案?
如何为多语言模型设计 Tokenization 方案?
统一词表:使用 SentencePiece 跨语言训练(如mBERT)。
平衡语种覆盖:根据语种数据量调整合并规则,避免小语种被淹没。
特殊标记:添加语言ID(如
[EN]
、[ZH]
)引导模型区分语言。
分词方法(BPE, WordPiece, SentencePiece) #
⁉️ 常见的 Tokenization 方法有哪些?它们的区别是什么?
常见的 Tokenization 方法有哪些?它们的区别是什么
Word-level:按词切分(如
“natural language processing” → ["natural", "language", "processing"]
),但词表大且难以处理未登录词(OOV)。Subword-level(主流方法):
- BPE(Byte-Pair Encoding):通过合并高频字符对生成子词(如GPT系列使用)。
- WordPiece:类似BPE,但基于概率合并(如BERT使用)。
- SentencePiece:无需预分词,直接处理原始文本(如T5使用)。
Character-level:按字符切分,词表极小但序列长且语义建模困难。
⁉️ BPE算法的工作原理是什么?请举例说明。
BPE 算法的工作原理是什么?请举例说明。
BPE(Byte Pair Encoding)是一种子词分割(Subword Segmentation)算法,核心思想是基于 统计频率 的合并(Merge frequent pairs)。
- 工作原理:
- 统计字符对(Byte Pair)频率,找到最常见的相邻字符对。
["l", "o", "w", " ", "l", "o", "w", "e", "r", " ", "n", "e", "w", "e", "s", "t"]
- 合并最频繁的字符对,形成新的子词单元。
(第一次)合并("l", "o") -> 2次 ("o", "w") -> 2次 ...
("l", "o") → "lo"
:
(第二次)合并["lo", "w", "lo", "w", "er", "n", "e", "w", "e", "st"]
("lo", "w") → "low"
["low", "low", "er", "n", "e", "w", "e", "st"]
- 重复步骤 1 和 2,直到达到预定的子词词汇量。
["low", "lower", "er", "newest"]
vocab = {"low": 100, "lower": 101, "er": 102, "newest": 103}
- 统计字符对(Byte Pair)频率,找到最常见的相邻字符对。
BPE的优点是它 能够有效地处理未登录词,并且在处理长尾词(rare words)时表现良好。比如,词”unhappiness”可以被分解为”un” + “happiness”,而不是完全看作一个新的词。
⁉️ WordPiece 算法的工作原理是什么?请举例说明。
WordPiece 算法的工作原理是什么?请举例说明
WordPiece 的核心理念与BPE相似,但合并策略更注重语义完整性。其训练过程同样从基础单元(如字符)开始,但选择合并的标准并非单纯依赖频率,而是通过 计算合并后对语言模型概率的提升幅度,优先保留能够增强语义连贯性的子词。
- 假设语言模型的目标是最大化训练数据的似然概率,在 WordPiece 中,简化为 通过子词频率估计概率(即一元语言模型)。通过计算合并后对语言模型概率的提升幅度进行合并:
- 直观理解:若两个子词
u
和v
经常紧密共现,合并为z=uv
后,语言模型对z
的概率估计应比单独处理u
和v
更准确,从而提升整体数据的似然。
- 统计所有相邻子词对
(u, v)
在训练数据中的出现次数count(u, v)
。- 同时记录每个子词
u
的独立出现次数count(u)
和count(v)
。- 当合并
(u, v)
为z
后:
- 原概率:
P(u)×P(v∣u)
- 新概率:
P(z)
- 若合并后
P(z)>P(u)×P(v)
,则整体似然提升。
- 工作原理:
与BPE类似,首先将所有词分解为最小的单位(如字符)。
["l", "o", "w", " ", "l", "o", "w", "e", "r", " ", "n", "e", "w", "e", "s", "t", " ", "w", "i", "d", "e", "s", "t"]
统计所有可能的字符对(或子词对)在文本中的共现频率。
合并字符对,选择合并后能 最大化语言模型似然概率 的字符对。具体公式为:选择使
score = freq(pair) / (freq(first) * freq(second))
最大的字符对(与 BPE 不同,BPE 仅选择频率最高的对)。每次合并对语言模型概率提升最大的合并组合。这里的
##
表示这个 token 只能作为后缀出现,不会单独存在。{"low", "##er", "##ing", "new", "##est", "wide", "##st"}
重复合并得分最高的字符对,直到达到预设的词汇表大小。
vocab = {"low": 100, "##er": 101, "##ing": 102, "new": 103, "##est": 104, "wide": 105, "##st": 106}
WordPiece 通过最大化语言模型概率合并子词,生成的子词更贴合语义需求。但计算复杂度更高,需多次评估合并得分。
若需模型捕捉深层语义(如预训练任务),优先选择 WordPiece。
若需快速处理大规模数据且词汇表灵活,BPE 更合适。
⁉️ SentencePiece 算法的工作原理是什么?请举例说明。
SentencePiece 算法的工作原理是什么?请举例说明
SentencePiece 是一种无监督的子词分割算法,其核心创新在于直接处理原始文本(包括空格和特殊符号),无需依赖预分词步骤。它支持两种底层算法:BPE 或 基于概率的Unigram Language Model。训练时,SentencePiece 将空格视为普通字符 _
,可 直接处理多语言混合文本(如中英文混杂),并自动学习跨语言的统一子词划分规则。
- Example:
"Hello世界" → 编码为 ["▁He", "llo", "▁世", "界"]。
SentencePiece 支持多语言(Multilingual)无需调整,统一处理空格与特殊符号。这一特性使其在需要多语言支持的场景(如T5模型)中表现突出,同时简化了数据处理流程,特别适合处理社交媒体文本等非规范化输入。
⁉️ 如何处理未登录词(OOV)?
如何处理未登录词(OOV)?
子词切分:将OOV(Out-of-Vocabulary)词拆分为已知子词(如
“tokenization” → ["token", "ization"]
)。回退策略:使用特殊标记(如
[UNK]
),但会损失信息。动态更新词表:在增量训练时扩展词表。
词嵌入(Word Embeddings) #
词嵌入的基本概念 #
⁉️ 什么是词嵌入(Word Embeddings)?为什么它重要?
什么是词嵌入(Word Embeddings)?为什么它重要?
在自然语言处理中,Embedding(词嵌入)是将 离散的文本数据(如单词、短语或句子)映射到一个连续的、低维度的向量空间(vector space)的过程。他的作用包括:
- 捕捉语义关系(Semantic Relationships):能表示同义词、类比关系(如 king - man + woman ≈ queen)。
- 降维(Dimensionality Reduction):将高维的 独热编码(One-hot Encoding) 转换为低维密集向量,提高计算效率。
- 解决稀疏性问题(Handling Sparsity):相比于独热编码,词嵌入具有更好的泛化能力(Generalization)。
Note: 词嵌入可以理解为是把普通的词表对应关系 投影到一个高维空间,所以可以通过学习获得词之间的关系信息。也可以将词嵌入(Embedding)看作是提供并增加了模型可以训练的参数。
在词嵌入模型训练之前,所有的词向量通常是随机初始化的,这些初始的词向量并没有语义上的意义,实际上它们只是一些 随机数。但通过训练,模型能够根据上下文和语料库中的信息,逐渐学习到每个单词的有效表示。在训练过程中,模型调整这些词向量,使得相似含义的词语具有相似的向量表示,进而反映出词语之间的语义关系。
⁉️ 静态词向量 和 上下文动态词向量的区别?
静态词向量 和 上下文动态词向量的区别?
静态词向量(Static Word Embeddings) 的核心特点是 无论词语出现在何种上下文中,其向量表示均保持不变。这类方法通过大规模语料训练,捕捉词语间的语义和语法关系。静态词向量的优势在于训练高效、资源消耗低,且生成的向量可直观反映语义相似性(如“猫”和“狗”向量接近);但其 局限性是无法处理多义词(如“苹果”在“水果”和“手机”场景中的不同含义),因为 每个词仅对应单一向量。代表模型包括:Word2Vec, GloVe。
上下文动态词向量(Contextual Word Embeddings):静态嵌入虽然可以表示词语的语义,但它们无法根据上下文动态调整,例如 “bank” 在 “river bank” 和 “bank account” 里的含义不同。而 动态词嵌入 解决了这个问题,代表性模型包括 ELMo、BERT 和 GPT。
静态词向量(Word2Vec,Skip-gram,CBOW,GloVe) #
⁉️ 解释 Word2Vec 的两种模型:Skip-gram 和 CBOW。
解释 Word2Vec 的两种模型:Skip-gram 和 CBOW。
跳元模型(Skip-gram) 假设 一个词可以用来在文本序列中生成其周围的单词。以文本序列
“the”“man”“loves”“his”“son”
为例。假设中心词选择“loves”
,并将上下文窗口设置为2,给定中心词“loves”
,跳元模型考虑生成上下文词“the”“man”“him”“son”
的条件概率。最大化给定中心词时上下文词的条件概率: $$ max{\sum log P(context_w|center_w)} $$ Word2Vec 的核心是 一个浅层神经网络(Shallow Neural Network),由一个输入层、一个隐藏层(线性变换层)、一个输出层(Softmax 或其他采样方法)组成:- 输入示例:
- 句子:
“I love natural language processing.”
- 若窗口大小为1,中心词为
“natural”
,则上下文词为“love”
和“language”
。
- 句子:
- 输入通过 One-Hot 编码 表示为一个稀疏向量。例如,若词汇表为
["cat", "dog", "fish"]
,则“dog”
的输入编码为[0, 1, 0]
。 - 输入层到隐藏层:输入向量与 输入权重矩阵
W_{in}
(维度为V×d
,V
是词汇表大小,d
是词向量维度)相乘,得到中心词的嵌入向量v_i
。
$$ v_i=W_{in}⋅OneHot(w)。 $$ - 通过 输出权重矩阵
W_{out}
(维度为d×V
)将隐层向量映射到输出概率: $$ u_i = W_{out}⋅v_i。 $$ - 使用 Softmax 归一化,通过梯度下降优化词向量,使得上下文词的概率最大化。
跳元模型(Skip-gram)特点:
- 擅长捕捉低频词:通过中心词预测多个上下文,低频词有更多训练机会。
- 训练速度较慢:输出层需计算多个上下文词的概率。
- 输入示例:
Note: 训练后,输入矩阵中的向量
v_i
即为词的低维表示。输入向量更聚焦中心词语义,输出向量辅助建模上下文关系,最终通常只使用输入向量。
连续词袋(CBOW) 与 Skip-gram 相对,CBOW 的训练过程是 给定上下文词,预测中心词。这里的目标是将多个上下文词的向量平均起来,并通过它们来预测中心词。在文本序列
“the”“man”“loves”“his”“son”
中,在“loves”
为中心词且上下文窗口为 2 的情况下,连续词袋模型考虑基于上下文词“the”“man”“him”“son”
生成中心词“loves”
的条件概率。最大化给定上下文时中心词的条件概率: $$ max{\sum log P(center_w|context_w)} $$ 连续词袋(CBOW)的训练细节与 跳元模型(Skip-Gram)大部分类似,但是在输入 One-Hot 编码表示时,跳元模型(Skip-Gram)将中心词进行 One-Hot 编码,而连续词袋(CBOW)将上下文词进行 One-Hot 编码并取平均值。 例如,中心词为“natural”
,上下文词为“love”
和“language”
。输入为[0, 1, 0, 0, 0]
(“love”
)和[0, 0, 0, 1, 0]
(“language”
)的平均向量[0, 0.5, 0, 0.5, 0]
。此外,输出概率通过 Softmax 计算公式也有不同。连续词袋(CBOW)特点:
- 训练速度快:输入为多个词的均值向量,计算效率高。
- 对高频词建模更好:上下文词共同贡献中心词预测。
Note: CBOW 也是通过类似浅层神经网络学习关系。在实践中同样也是把词汇表投影到高维空间(
nn.Embedding
)。利用周围词预测中心词的原理训练其中的参数。注意,Skip-gram 和 CBOW 学习的都是nn.Embedding
映射的 matrix,只是训练的方法和训练目标(loss)不一样。其过程可以通过下面的 code 理解:
# 1. 查找词向量 embedded = self.embeddings(context_words) # (batch_size, context_size, embedding_dim) # 2. 计算上下文词向量的平均值 embedded = embedded.mean(dim=1) # (batch_size, embedding_dim) # 3. 通过全连接层计算每个单词的概率 output = self.linear(embedded) # (batch_size, vocab_size)
⁉️ Word2Vec 如何优化训练效率?
Word2Vec 如何优化训练效率?
由于 softmax 操作的性质,上下文词可以是词表中的任意项,但是,在一个词典上(通常有几十万或数百万个单词)求和的梯度的计算成本是巨大的!为了降低计算复杂度,可以采用两种近似训练方法:负采样(Negative Sampling)和层序softmax(Hierarchical Softmax)。
负采样(Negative Sampling):
- 核心思想:将复杂的多分类问题(预测所有词的概率)简化为二分类问题,用少量负样本近似全词汇的Softmax计算。
- 正负样本构建:
- 对每个正样本(中心词与真实上下文词对),随机采样 K 个负样本(非上下文词)。
- 例如,中心词
“apple”
的真实上下文词为“fruit”
,则负样本可能是随机选择的“car”
,“book”
等无关词。
- 目标函数:最大化正样本对的相似度,同时最小化负样本对的相似度。
层序softmax(Hierarchical Softmax):
- 核心思想:通过二叉树(如霍夫曼树)编码词汇表,将全局Softmax分解为路径上的二分类概率乘积,减少计算量。
- 霍夫曼树构建:按词频从高到低排列词汇,高频词靠近根节点,形成最短路径。每个内部节点含一个可训练的向量参数。
⁉️ 解释 GloVe 的原理?
解释 GloVe 的原理?
GloVe(Global Vectors for Word Representation)是一种基于全局统计信息的词向量训练方法,它通过构造整个语料库的共现矩阵(co-occurrence matrix)并进行矩阵分解来学习词的向量表示,其核心思想是 通过捕捉词与词之间的全局共现关系来学习语义信息,而不是像 Word2Vec 那样依赖于局部上下文窗口的预测方法。 具体而言,GloVe 首先统计语料库中的词对共现次数,构建一个共现矩阵 X ,其中 X_{ij} 表示词 i 在词 j 附近出现的频率,并计算共现概率:
\[ P(j|i) = \frac{X_{ij}}{\sum_k X_{ik}} \]GloVe 的核心目标是学习一个词向量映射,使得向量之间的点积能够近似这个共现概率的对数:
\[ \mathbf{u}_j^\top \mathbf{v}_i + b_i + c_j = \log(X_{ij}) \]- v_i, u_j 是词 i 和词 j 的向量表示,每个词都由两个向量组成,一个是中心词向量 ,一个是上下文词向量
GloVe 并不依赖传统的神经网络,它的学习过程 更接近矩阵分解(Matrix Factorization)的优化方法,而非 Word2Vec 这样的前馈神经网络(Feedforward Neural Network)。GloVe 不依赖反向传播(Backpropagation),而是直接最小化共现概率对数的加权平方误差,来学习词向量。
GloVe 的优势在于它直接建模了全局的词共现信息,使得词向量能够更好地捕捉语义相似性和类比关系,如 “king - man + woman ≈ queen”
,但由于依赖于整个共现矩阵,计算和存储成本较高,因此适用于大规模离线训练,而不是在线学习任务。
Transformer 中的 Word Embedding #
⁉️ 如何理解 nn.Embedding?
如何理解 nn.Embedding?
nn.Embedding
是 PyTorch 中用于实现词嵌入(Word Embedding)的一个非常核心的类。它的作用是:把一个词的整数编码(index)映射成一个稠密的向量(通常是高维的),这个向量是可以被训练学习的参数。
torch.nn.Embedding(num_embeddings, embedding_dim)
num_embeddings
: 词表的大小,也就是词的数量(每个词用一个整数表示,类似于 token id)。embedding_dim
: 每个词要被映射成的向量维度(比如 300 或 768)。
Note: 可以把 nn.Embedding 看成一个 查找表(lookup table):
- 它其实就是一个
num_embeddings × embedding_dim
的权重矩阵 W。- 输入的 token id 会被用作行索引,从 W 中取出对应的向量。
比如,
W[0]
就是 token id 为 0 的词的嵌入向量。这些向量是 可训练的参数,会在训练过程中通过反向传播自动学习优化。
用 one-hot 表示词再乘上一个线性层,其实就相当于 embedding。但:
one-hot
是稀疏向量,效率低。nn.Embedding
是直接用查表的方法,计算效率高,存储也少。
⁉️ 如何理解 Transformer中 nn.Embedding 和注意力层的关系?
如何理解 Transformer中 nn.Embedding 和注意力层的关系?
nn.Embedding
的输入是 离散的 token index(整数),输出则是向量表示(如 768 维)。他的本质作用是建立词的初始语义表示,像是给每个词一个「名片」或「初始特征」。
Note: nn.Embedding 学到的是每个 token 的 静态语义向量表示(全局语义空间,相同的词 embedding 总是一样的),使得词语在 embedding 空间中更好地反映其语义与上下文分布特征:语义相似的词向量会更接近,并为后续 self-attention 提供语义基础。如果 embedding 学不到词义,那 attention 就无从发挥。
注意力机制并不是对单词进行「嵌入」,而是在已有的表示(embedding)上进一步挖掘:它学习当前 token 和其它 token 的相关性,并据此融合其它 token 的信息。对于某个词,Attention 通过融合其它词的信息,动态改变它的表示,关注“这次和谁有关”也就是说,Attention 模块输入的是 embedding(或者中间层表示),输出的是融合上下文信息后的表示。Attention 像是让这些词「互相交谈」,决定哪些词对我更重要,然后融合彼此的特征。
总结来说,nn.Embedding
是每个词的静态语义初始向量,Attention 层是让词与词交互后产生的上下文相关向量。
Q: 如果把 nn.Embedding 当成一个固定(不可学习)的映射层,只是把 token index 投影到某个高维空间,Attention 机制是否还能正常工作?是否会受到限制?
A: 可以工作,但效果会显著受限,尤其是在表达复杂语义、上下文理解、泛化能力方面。attention 接收的输入质量差,导致它要用更多层去补救,甚至学不到真正任务相关的信息。
很多论文都做过类似 ablation(消融)实验。一般发现:
- 在简单任务上(如文本分类):性能下降 5~10%
- 在复杂生成任务(如机器翻译、对话、语言建模):性能下降巨大,有时甚至无法训练收敛
⁉️ 在实际项目中,Vector Database 使用的 Embedding 一般是哪一种类型?
在实际项目中,Vector Database 使用的 Embedding 一般是哪一种类型?
在使用类似这样的嵌入时:
OpenAIEmbeddings(model="text-embedding-3-small", openai_api_key=openai_api_key)
生成的 embedding 是 动态生成,静态存储的,即:
- 嵌入向量在生成时是动态的(依赖输入文本的完整上下文),但一旦存入 VectorDB,便成为静态数据。后续检索时直接比较这些快照,不会重新计算。
- 尽管存储后是静态的,但动态嵌入在生成时已融入了上下文信息,相比静态嵌入质量更高。
Note: VectorDB 中存储的嵌入虽然本身是静态的,但它们在 生成时已经融入了原始文本的上下文信息。查询嵌入的动态生成确保了它与存储的静态嵌入在同一语义空间中进行相似度比较。即使存储的嵌入是静态的,查询嵌入的动态性仍能精准匹配到语义相关的文档。
e.g.
- 存储阶段
- 文档1:“苹果发布新款手机” → 嵌入偏向 科技产品。
- 文档2:“苹果的营养价值” → 嵌入偏向 水果。
- 查询阶段
- 查询文本:“苹果的最新科技产品” → 动态生成的嵌入靠近文档1的语义。
- 检索结果:文档1会被优先召回,因为查询嵌入动态捕捉了“科技产品”的上下文,而非孤立词“苹果”。
⁉️ 在实际项目中,如何选择不同的嵌入方法(Embedding Methods)?
在实际项目中,如何选择不同的嵌入方法(Embedding Methods)?
- 任务类型与语义需求:
- 基础语义任务(如文本分类、简单相似度计算):
- 静态嵌入:Word2Vec、GloVe、FastText。
- 优点:轻量高效,适合低资源场景。
- 示例:新闻分类任务中,预训练的 Word2Vec 向量足以捕捉主题关键词的语义。
- 静态嵌入:Word2Vec、GloVe、FastText。
- 复杂语义任务(如问答、指代消解、多义词理解):
- 上下文嵌入:BERT、RoBERTa、XLNet。
- 优点:动态生成上下文相关向量,解决一词多义。
- 示例:在医疗问答系统中,BERT可区分“Apple”指公司还是水果。
- 上下文嵌入:BERT、RoBERTa、XLNet。
- 数据量与领域适配:
小数据场景:
- 预训练静态嵌入 + 微调:使用公开预训练的 Word2Vec/GloVe,结合任务数据微调。
- 轻量上下文模型:ALBERT或TinyBERT,降低训练成本。
大数据场景:
- 从头训练上下文模型:基于领域数据训练BERT或GPT,捕捉领域专属语义。
- 领域适配:在金融/法律等领域,使用领域语料继续预训练(Domain-Adaptive Pretraining)。