跳转至

六:Embedding 与常用编码方法

来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247483808&idx=1&sn=dcd578534b98eb97c22feddf8d5b2ea1&chksm=f01eb2d9c7693bcfbe8ed5fd4f082582e6d373bca1cc7ebab709adceb9bb98c636d93e9595c6#rd

1. 学习定位

Embedding 是把离散对象映射到连续向量空间的方法。在大模型基础中,Embedding 既包括输入层的 token embedding,也包括用于语义检索、RAG、推荐、聚类、去重、相似度匹配的文本 embedding。 第六天的重点是“常用编码方法”。这里的“编码”不是 tokenizer 的 tokenization,而是把词、句子、段落、文档或 query 映射成向量表示:

离散文本或对象
-> encoder / embedding model
-> dense vector
-> similarity search / classification / retrieval / clustering
本日需要建立三条主线: - 经典词向量:one-hot、Word2Vec、GloVe、FastText。

  • 上下文表示:ELMo、BERT/Transformer hidden states、pooling。

  • 现代文本 embedding:SBERT、SimCSE、BGE、E5、CONAN、对比学习与 hard negatives。

面试中 Embedding 常被问到: - embedding 和 one-hot 的区别。

  • Word2Vec 的 CBOW、Skip-gram、negative sampling。

  • GloVe 如何利用全局共现统计。

  • FastText 如何利用子词信息处理 OOV。

  • 静态 embedding 和上下文 embedding 的区别。

  • 句向量如何从 token hidden states 得到。

  • bi-encoder、cross-encoder、reranker 的区别。

  • contrastive loss、in-batch negatives、hard negatives 的作用。

  • BGE/CONAN 这类 embedding 模型如何服务 RAG 检索。

  • embedding 评测指标和常见工程问题。

2. Embedding 的基本定义

Embedding 的本质是一个映射函数:

f(x) -> vector in R^d
其中 x 可以是 token、word、sentence、document、image、user、item、query 等对象。输出向量通常是低维稠密实数向量,例如 128、384、768、1024、4096 维。 对于 NLP,embedding 的目标是让语义、句法、主题或任务相关相似的对象在向量空间中更接近。 例如:

sim(embedding("猫"), embedding("狗")) > sim(embedding("猫"), embedding("汽车"))
在检索场景中,query 和 document 被编码到同一个向量空间,相关文档应该和 query 更接近。

3. One-Hot 编码

one-hot 是最简单的离散编码。假设词表大小为 V,每个 token 对应一个长度为 V 的向量,只有该 token 对应位置为 1,其余为 0。 示例:

vocab = ["cat", "dog", "car"]

cat -> [1, 0, 0]
dog -> [0, 1, 0]
car -> [0, 0, 1]
one-hot 的优点是简单、无歧义。缺点很明显: - 维度等于词表大小,通常非常高。

  • 向量稀疏,计算和存储低效。

  • 任意两个不同 token 的距离相同,无法表达语义相似性。

  • 无法处理词表外词。

Embedding table 可以看作从 one-hot 到稠密向量的线性映射:

one_hot(token) @ embedding_table = embedding(token)
实际实现不会构造 one-hot,而是直接按 token id 查表。

4. Embedding Table 与神经网络输入

在 Transformer 中,token id 通过 embedding table 变成输入向量:

input_ids: [B, T]
embedding_table: [V, d_model]
hidden = embedding_table[input_ids]
hidden: [B, T, d_model]
这里的 embedding table 是模型参数,会随着预训练目标更新。它学习的是 token 在模型任务中的表示,而不只是词典定义。 如果模型使用 weight tying,输入 embedding 和输出 LM head 可以共享权重:

lm_head.weight = embedding_table.weight
token embedding 是大模型内部表示的一部分,而 sentence/document embedding 通常是为了外部任务单独设计的输出向量,例如检索和聚类。

5. 静态 Embedding 与上下文 Embedding

静态 embedding 为每个词分配一个固定向量。不管上下文如何变化,同一个词的向量不变。

embedding("bank") = same vector
这会带来多义词问题。bank 在“river bank”和“bank account”中含义不同,但静态词向量无法区分。 上下文 embedding 则由模型根据句子上下文动态生成:

embedding("bank" in "river bank") != embedding("bank" in "bank account")
Transformer hidden states 就是典型上下文表示。现代 LLM 内部的 token 表示会随上下文变化。

6. Word2Vec 总览

Word2Vec 是经典神经词向量方法,核心思想是通过局部上下文预测学习词表示。它基于分布式假设:

You shall know a word by the company it keeps.
也就是:语义相似的词往往出现在相似上下文中。 Word2Vec 有两个经典结构: - CBOW:用上下文预测中心词。

  • Skip-gram:用中心词预测上下文。

训练后,词向量可以捕捉一定语义和句法规律,例如相似词接近、类比关系等。

7. CBOW

CBOW 是 Continuous Bag-of-Words。它用上下文词预测中心词。 示例句子:

I like deep learning models
如果中心词是 learning,上下文是:

I, like, deep, models
CBOW 的目标是:

P(center_word | context_words)
它通常把上下文词向量平均或求和,然后预测中心词。CBOW 训练速度较快,对高频词表现较好,但对稀有词的建模可能不如 Skip-gram。

8. Skip-Gram

Skip-gram 用中心词预测上下文词。 目标是:

P(context_words | center_word)
例如中心词是 learning,模型要预测窗口内的 I, like, deep, models。 Skip-gram 对低频词通常更友好,因为每个中心词会产生多个训练样本。它训练成本可能高于 CBOW,但词向量质量常较好。

9. Negative Sampling

Word2Vec 原始 softmax 需要对整个词表计算概率:

P(w | c) = exp(score(w,c)) / sum_{v in V} exp(score(v,c))
当词表很大时,计算代价很高。negative sampling 用二分类目标近似这个过程。 对一个正样本 (center, context),采样若干负样本 (center, negative_word)。模型学习:

正样本 score 高
负样本 score 低
常见目标:

log sigmoid(v_c · v_o) + sum_i log sigmoid(-v_c · v_{neg_i})
negative sampling 的本质是避免每次更新整个词表,只更新少量正负样本,大幅提高训练效率。

10. Hierarchical Softmax

Hierarchical softmax 是另一种加速大词表 softmax 的方法。它把词表组织成一棵二叉树,每个词是叶子节点。预测某个词的概率转化为从根节点走到该叶子的路径概率。 原来 softmax 复杂度大约是:

O(V)
hierarchical softmax 约为:

O(log V)
Word2Vec 中常用 Huffman tree,让高频词路径更短,提高训练效率。

11. GloVe

GloVe 是 Global Vectors for Word Representation。它试图结合全局矩阵分解和局部上下文窗口方法的优点。 Word2Vec 更强调局部窗口预测;GloVe 直接利用全局词-词共现矩阵。 设 X_ij 表示词 i 和词 j 在语料中的共现次数。GloVe 学习词向量,使:

w_i^T w_j + b_i + b_j ≈ log X_ij
典型损失:

J = sum_{i,j} f(X_ij) (w_i^T w_j + b_i + b_j - log X_ij)^2
其中 f(X_ij) 是加权函数,用来降低极高频或极低频共现的影响。 GloVe 的核心是:词向量应该解释全局共现统计中的比例关系。

12. FastText

FastText 在 Word2Vec 基础上引入子词信息。它不是只为每个完整词学习向量,而是把词表示为字符 n-gram 向量的组合。 例如:

where -> <wh, whe, her, ere, re>
词向量可以由这些子词 n-gram 向量求和得到。 FastText 的优点: - 能利用词形结构。

  • 对形态丰富语言更友好。

  • 可以为未登录词生成向量,只要其子词 n-gram 已见过。

  • 对拼写变体、词缀、复合词有更强泛化。

缺点是它仍主要是静态词向量,不能根据上下文区分多义词。

13. 传统词向量的局限

Word2Vec、GloVe、FastText 都是经典静态或近似静态表示方法。它们有重要历史价值,也适合一些轻量任务,但在现代 LLM 语境下有明显局限: - 无法充分处理多义词上下文。

  • 句子或文档 embedding 需要额外聚合。

  • 训练目标较简单,难以捕捉复杂语义推理。

  • 与现代 RAG 检索中的 query-document 对齐目标不完全一致。

  • 对 instruction、任务意图、跨语言语义等支持有限。

现代文本 embedding 通常基于 Transformer encoder 或 decoder,并用对比学习、排序数据、检索数据和 instruction 数据训练。

14. 上下文 Embedding

上下文 embedding 由模型根据上下文动态生成。同一个 token 在不同句子中会有不同 hidden state。 BERT、RoBERTa、ELECTRA 等 encoder 模型会输出:

hidden_states: [B, T, H]
其中每个 token 的向量都融合了上下文信息。 这些 token-level hidden states 可以用于: - 序列标注

  • 实体抽取

  • token 分类

  • QA span 抽取

  • 作为句向量 pooling 的基础

但直接使用 BERT 的 [CLS] 或平均池化并不一定得到高质量 sentence embedding。句向量模型通常需要专门训练。

15. Sentence Embedding

Sentence embedding 把一句话或一段文本编码成一个固定维度向量:

sentence -> vector in R^d
常见 pooling 方法: - [CLS] pooling:使用特殊 token 的 hidden state。

  • mean pooling:对有效 token hidden states 求平均。

  • max pooling:取每维最大值。

  • weighted pooling:按权重聚合 token 表示。

  • last token pooling:decoder-only embedding 模型中常见。

mean pooling 在很多 encoder-based sentence embedding 模型中很常见。pooling 时必须使用 attention mask 排除 padding。

16. SBERT

Sentence-BERT 使用 Siamese 或 triplet 网络结构,让 BERT 产生可直接比较的句向量。 传统 BERT 做句子对匹配时,通常把两句拼在一起输入 cross-encoder:

[CLS] sentence A [SEP] sentence B [SEP]
这种方式准确但慢,无法为大规模语料预先建索引。 SBERT 把两个句子分别编码成向量:

u = encoder(sentence A)
v = encoder(sentence B)
sim = cosine(u, v)
这样文档向量可以离线预计算,query 向量在线计算,适合语义检索、聚类和相似度匹配。

17. SimCSE

SimCSE 是一种简单有效的句向量对比学习方法。 无监督 SimCSE 的核心是:同一个句子输入模型两次,由 dropout 产生轻微不同表示,把它们作为正样本对;batch 内其他句子作为负样本。 监督 SimCSE 使用 NLI 数据: - entailment pairs 作为正样本。

  • contradiction pairs 作为 hard negatives。

它使用 contrastive learning 改善句向量空间的 alignment 和 uniformity,使语义相似句更近,不相似句更分散。

18. Bi-Encoder 与 Cross-Encoder

语义检索中常见两类架构:

Bi-Encoder:
  query 和 document 分别编码成向量。
  用 dot product 或 cosine similarity 比较。
  可离线建库,检索快。

Cross-Encoder:
  query 和 document 拼接后一起输入模型。
  输出相关性分数。
  交互充分,精度高,但计算慢。
RAG 常用流程:

Bi-Encoder embedding retrieval -> top-k candidates
Cross-Encoder reranker -> rerank candidates
LLM generation
embedding 模型通常承担召回,reranker 承担精排。

19. Dense Retrieval

Dense retrieval 用稠密向量进行语义检索。 流程:

documents -> embedding model -> document vectors -> vector index
query -> embedding model -> query vector
similarity(query, doc) -> top-k docs
常见相似度: - dot product

  • cosine similarity

  • L2 distance

如果向量已经 L2 normalize,dot product 和 cosine similarity 等价。 Dense retrieval 能捕捉语义相似,但可能不如 BM25 擅长精确关键词匹配。因此很多系统会使用 hybrid retrieval:dense + sparse。

20. Contrastive Learning

现代 embedding 模型常用对比学习。核心目标是让正样本更近,负样本更远。 给定 query q、正样本文档 d+、负样本文档 d-

sim(q, d+) > sim(q, d-)
常见 InfoNCE / softmax contrastive loss:

L = -log exp(sim(q, d+) / tau) /
        sum_j exp(sim(q, d_j) / tau)
其中 tau 是 temperature。batch 内其他样本常作为 in-batch negatives。 对比学习的关键在于: - 正样本质量。

  • 负样本数量。

  • hard negative 难度。

  • batch size 和跨 GPU negatives。

  • 任务分布和 prompt/instruction 设计。

21. Negative Samples 与 Hard Negatives

negative samples 是与 query 不相关的样本。hard negatives 是表面相似但实际不相关,或模型容易混淆的负样本。 示例:

query: "苹果手机如何换电池"
easy negative: "如何做红烧肉"
hard negative: "苹果电脑如何更换电池"
easy negatives 太容易,模型很快学会区分,训练信号有限。hard negatives 更能提升模型细粒度语义区分能力。 但 hard negatives 也有风险: - 假负样本:实际上相关却被标成负样本。

  • 过难负样本:训练早期导致不稳定。

  • 采样偏差:模型只学到某类负例模式。

22. BGE 系列

BGE 是 BAAI General Embedding,是北京智源推出的一系列 embedding 模型。BGE 模型常用于语义检索、RAG、相似度匹配和 reranking 流水线。 BGE 的典型使用方式:

query_embedding = model.encode_queries(queries)
doc_embedding = model.encode_corpus(documents)
scores = query_embedding @ doc_embedding.T
BGE 系列包含英文、中文、多语言和多功能模型。BGE-M3 的 M3 指: - Multi-Linguality:支持多语言。

  • Multi-Functionality:支持 dense retrieval、sparse retrieval、multi-vector retrieval。

  • Multi-Granularity:支持从短句到较长文档的不同粒度。

在面试中,BGE 可以作为现代 embedding 模型的代表,用来说明 embedding 如何服务 RAG 检索。

23. Instruction 与 Query/Passage 编码

很多 embedding 模型会区分 query 和 passage 的输入格式。query 可能需要加 instruction:

Represent this sentence for searching relevant passages: {query}
这样做的目的是让模型知道当前文本是“查询意图”,而不是普通句子。passage 则通常按文档内容编码。 对于 instruction-tuned embedding model,使用错误 instruction 或遗漏 query instruction 可能导致检索效果下降。 这和 chat model 的 chat template 类似:输入格式是模型训练分布的一部分。

24. CONAN Embedding

CONAN embedding 是一个面向通用文本 embedding 的工作,核心关注如何利用更多、更好的负样本提升 embedding 能力。 它的主要思想包括: - dynamic hard negative mining:训练过程中动态挖掘更有挑战的 hard negatives,而不是只依赖预处理阶段固定负样本。

  • cross-GPU balancing loss:利用跨 GPU 的样本作为更多 negatives,同时处理多任务 batch size 不均衡问题。

  • prompt-response pairs:利用 LLM 产生或已有的问答/响应对作为 embedding 训练数据。

CONAN 的面试价值在于说明:现代 embedding 模型不只是选一个 encoder 做 pooling,更关键的是训练数据、负样本构造、对比学习目标和跨设备训练策略。

25. Multi-Vector 与 Sparse-Dense Hybrid

标准 dense embedding 通常把一段文本编码成单个向量。multi-vector retrieval 会为一个文本保留多个 token-level 或片段级向量,例如 ColBERT 风格。 对比:

Single-vector:
  doc -> one vector
  检索快,表达压缩强。

Multi-vector:
  doc -> multiple vectors
  细粒度匹配更强,存储和计算更高。
sparse retrieval 例如 BM25 或 learned sparse embedding 擅长关键词匹配。dense retrieval 擅长语义匹配。hybrid retrieval 结合二者,常用于 RAG 生产系统。 BGE-M3 这类模型就强调 dense、sparse、multi-vector 多功能能力。

26. Embedding 的相似度计算

常见相似度包括:

dot product:      q^T d
cosine similarity: q^T d / (||q|| ||d||)
L2 distance:      ||q - d||_2
如果向量已 L2 normalize:

cosine(q, d) = q^T d
很多 embedding 检索系统会归一化向量,用 inner product index 近似 cosine 检索。 相似度分数不一定有绝对概率意义。不同模型、不同任务、不同归一化方式下,分数分布可能不同,不能简单用统一阈值。

27. Embedding 评测

Embedding 评测要根据任务选择指标。 检索任务常用: - Recall@K

  • Precision@K

  • MRR

  • NDCG

  • MAP

语义相似度任务常用: - Spearman correlation

  • Pearson correlation

分类或聚类任务常用: - accuracy

  • F1

  • clustering purity

  • normalized mutual information

MTEB 是常见文本 embedding 综合评测框架,覆盖检索、分类、聚类、语义相似度、reranking 等任务。但实际系统中,最终仍应使用自己的业务数据和任务指标验证。

28. Embedding 工程问题

Embedding 在 RAG 和检索系统中常见工程问题: - query 和 document 使用了不匹配的 encoder 或 instruction。

  • 向量没有 normalize,导致相似度分布异常。

  • chunk 切分过长或过短。

  • embedding 模型与目标领域不匹配。

  • 中英文、多语言、代码文本效果差异大。

  • hard negative 不足,召回结果语义很粗。

  • 只用 dense retrieval,丢失关键词精确匹配。

  • 只看 MTEB 排名,不做业务评测。

  • 维度太高导致存储和检索成本大。

  • ANN 索引参数设置不当,召回率和延迟失衡。

embedding 不是孤立组件,它和 chunking、retrieval、reranking、generation、evaluation 一起决定 RAG 效果。

29. 面试中的核心表达

第六天内容可以压缩为:

Embedding 把离散对象映射成连续向量,使语义相近对象在向量空间中更接近。
one-hot 稀疏且不能表达语义相似;embedding 是可学习稠密表示。
Word2Vec 用局部上下文预测学习词向量,包括 CBOW 和 Skip-gram。
GloVe 利用全局词-词共现矩阵学习词向量。
FastText 引入字符 n-gram 子词信息,能处理 OOV 和形态变化。
静态词向量无法处理多义词;Transformer hidden states 是上下文 embedding。
句向量需要 pooling 或专门训练,SBERT/SimCSE 用对比学习改善句向量空间。
现代 embedding 模型如 BGE/CONAN 服务检索和 RAG,核心训练信号包括正负样本、hard negatives、in-batch negatives 和跨 GPU negatives。

30. 参考资料

  • Efficient Estimation of Word Representations in Vector Space: https://arxiv.org/abs/1301.3781

  • Distributed Representations of Words and Phrases and their Compositionality: https://arxiv.org/abs/1310.4546

  • GloVe: Global Vectors for Word Representation: https://nlp.stanford.edu/pubs/glove.pdf

  • Enriching Word Vectors with Subword Information: https://arxiv.org/abs/1607.04606

  • Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks: https://arxiv.org/abs/1908.10084

  • SimCSE: Simple Contrastive Learning of Sentence Embeddings: https://arxiv.org/abs/2104.08821

  • MTEB: Massive Text Embedding Benchmark: https://arxiv.org/abs/2210.07316

  • BGE Series Documentation: https://bge-model.com/tutorial/1_Embedding/1.2.1.html

  • BGE-M3: Multi-Linguality, Multi-Functionality, Multi-Granularity Text Embeddings: https://arxiv.org/abs/2402.03216

  • Conan-embedding: General Text Embedding with More and Better Negative Samples: https://arxiv.org/abs/2408.15710

  • OpenAI tiktoken 和 embedding 不同概念参考: https://github.com/openai/tiktoken

  • 盘点经典 Embedding 算法:https://blog.csdn.net/xpy870663266/article/details/101849044

  • BGE 简介:https://zhuanlan.zhihu.com/p/676410726

            预览时标签不可点
    

    <div class="