万物皆向量:Embedding技术的原理与十年演进
公众号名称:Fox爱分享
作者名称:Fox爱分享
发布时间:2026-05-06 07:00
你在搜索引擎输入”苹果”,出来的既有水果营养知识,也有手机发布新闻。AI怎么知道你找的是哪个”苹果”?
更有意思的是,你从来没有告诉过AI”苹果”有两个意思,它自己就能搞明白。它是怎么做到的?
答案藏在一种叫**Embedding(嵌入)**的技术里——它把每个词变成一串数字,让意思相近的词,数字也相近。
01 从最笨的办法开始
要把词喂给AI,第一件事就是把它变成数字。
最笨的办法:给每个词编个号(one-hot编码):
-
猫 = [1, 0, 0, 0]
-
狗 = [0, 1, 0, 0]
-
汽车 = [0, 0, 1, 0]
-
飞机 = [0, 0, 0, 1]
问题来了:在这种编码方式下,猫和狗的距离 = 猫和飞机的距离。AI根本不知道猫和狗是同类,汽车和飞机是同类。

而且中文有5万多个常用词(据《现代汉语常用词表》收录56008个),每个词就是一个5万多维的向量,其中56007个位置是0。算不动,也丢了语义。
那能不能换个思路:让意思相近的词,坐标也相近?
02 Word2Vec:让意思相近的词靠近(2013)
2013年,谷歌的Mikolov等人找到了一个方法来实现这个目标。这个方法叫Word2Vec。
它的核心思想很简单:
一个词的意思,取决于它周围出现的词。
这不是什么新发现。英国语言学家J.R. Firth早在1957年就说过一句名言:“You shall know a word by the company it keeps”(你可以通过一个词的伙伴来认识它)。
上下文重叠:医生与护士的例子
想想看,“医生”这个词在语料中周围经常出现什么?
- 医院、患者、诊断、处方、治疗…
“护士”这个词呢?
- 医院、患者、护理、医嘱、治疗…
它们的上下文高度重叠,意思自然很接近——都属于医疗行业从业者。Word2Vec做的就是把这个直觉变成可计算的数学。

怎么训练?
Word2Vec提了两种方法,像照镜子一样互为倒影:
-
CBOW(连续词袋模型):给你周围的词,预测中间是什么词
-
Skip-gram(跳字模型):给你中心词,预测周围有什么词
实践中,Skip-gram效果更好,尤其是对那些出现次数少的词。
为什么要两套向量?
每个词一开始都是一组随机数字。但这里有个问题:
如果每个词只有一套向量,模型要预测”医生”旁边最可能出现谁——答案永远是”医生”自己。和自己比,当然最像。
这就像让学生自己给自己打分——永远是满分,没有意义。
所以Word2Vec给每个词准备了两套向量:
-
中心词向量(input矩阵 W):当这个词作为中心词出现时使用
-
上下文向量(output矩阵 W’):当这个词作为上下文词出现时使用
训练完之后,只保留中心词向量(即W矩阵的行)作为最终的词向量,上下文向量被丢弃。
负采样:把5万次计算变成十几次
最直觉的训练方法:用softmax算”医生”和词表里每一个词的点积,归一化后得到所有词的概率。
但词表有5万多个词,每训练一步就要算5万多次点积,太慢了!
Word2Vec换了个思路:不再问”5万个词里哪个最可能”,而是只问几个是非题:
-
“护士”是不是医生的上下文?→ 是(正样本)
-
“方向盘”是不是医生的上下文?→ 不是(负样本)
-
“彩虹”是不是医生的上下文?→ 不是(负样本)
正样本:真正出现在上下文里的词
负样本:随机抽几个无关的词
这就是负采样。每一步只算十几个词的点积,而不是5万个,训练快了几十倍。
还有一个小技巧:负样本不是均匀随机抽的,而是按词频的3/4次方采样。因为按纯词频抽样,“的”占了绝大多数,罕见词几乎永远抽不到。3/4次方把分布压平了一点,给罕见词更多出场机会。
为什么有效?
给中心词”医生”,模型要预测”护士”出现在上下文的概率。预测靠的是”医生”和”护士”两个向量的点积。
点积什么时候大?两个向量方向越接近,点积越大。
所以每次训练,模型为了把预测做准,就把”医生”的向量往”护士”方向推一点。反过来,“护士”是中心词时,也会往”医生”方向推。
而”方向盘”几乎不出现在”医生”旁边,它们的向量从来不会被推到一起,负采样还会主动把它们推远。

这件事在几十亿个句子上反复进行:
-
“医生”和”护士”越推越近
-
“猫”和”狗”越推越近
-
“北京”和”上海”越推越近
所以只靠”预测上下文”这一件事,向量空间就自动组织出了语义结构。不需要人工标注,不需要知识库,只要句子足够多,统计规律自然就把词排好了。
king - man + woman ≈ queen,真的吗?
你可能听过这个例子:
-
king - man + woman ≈ queen
-
东京 - 日本 + 法国 ≈ 巴黎
当时很多人拿这个当Word2Vec的招牌,但实际上它只对简单二元关系有效(性别、国家-首都、时态),对更复杂的关系效果很差。
而且如果你不手动排除输入词,“king - man + woman”的最近邻其实是king自己。所谓类比效果,有部分是评测方法的偏差。
2014年,Levy和Goldberg在论文里证明了:Word2Vec的Skip-gram负采样,其实在隐式地分解一个加权点互信息(PMI)矩阵。
“king”和”queen”在语料里的语境高度相似,“man”和”woman”也是,而且这两对之间的差异模式是平行的,所以向量空间里就出现了平行的方向。
有数学基础,但也有局限。
03 但Word2Vec有个硬伤:向量是静态的
前面说的所有向量都有一个特点——一个词永远对应一个向量,不管出现在什么句子里。
比如”苹果”这个词:
-
“我吃了一个苹果” → 水果
-
“苹果发布了新款手机” → 科技品牌
同一个词,不同意思,Word2Vec只能给它一个向量。这个向量被迫夹在”水果”和”科技品牌”中间,两头都不像。
怎么办?
04 ELMo:让同一个词有不同向量(2018)
2018年,ELMo(Peters等人)给出了第一个解法:读完整句话再决定词的向量。
具体做法:
-
先给每个词一个基于字符级CNN的基础向量(这样遇到没见过的词也能处理)
-
用双向LSTM读完整句话
-
从左往右读一遍
-
从右往左读一遍
- 把两个方向的隐藏状态和基础向量加权融合
这样,“我吃了一个苹果”里的”苹果”,因为左边有”吃了”,右边有”一个”,它的向量被上下文修饰成了”水果”的方向。
ELMo还发现了一件有意思的事:不同层捕捉的信息不一样。
-
底层更懂语法(词性、句法)
-
高层更懂语义(词义、语境)
但ELMo有个问题:前向LSTM和后向LSTM是分开训练的——从左往右读的时候看不到右边的信息,从右往左读的时候也看不到左边的信息。就像一个人先用左眼看了一遍,再用右眼看了一遍,但从来没有两只眼睛同时看过。
05 BERT:让每个词同时看到整句话(2018年底)
2018年底,BERT(Devlin等人)换了一个方案:用Transformer的自注意力机制,让每个词同时看到句子里所有其他词。
-
“我吃了一个苹果” → “苹果”注意到了”吃了""一个”,知道自己是水果
-
“苹果发布了新款手机” → “苹果”注意到了”发布""手机”,知道自己是科技品牌

同一个词,不同上下文,不同向量。 多义性的问题,到这里算是解决了。
但BERT又带来了一个新问题。很多人以为直接拿BERT的[CLS]向量就能当句子的embedding,结果发现效果很差——根据Sentence-BERT论文的实验,在语义文本相似度(STS)任务上,BERT的[CLS]向量的Spearman相关系数只有约0.29,甚至比GloVe词向量简单平均还差。
为什么?因为BERT的[CLS]是为两个预训练任务——掩码语言模型(MLM)和下一句预测(NSP)——训练的,不是为生成好的句子语义向量训练的。BERT很强,但直接拿它当句向量用,效果不行。
06 Sentence-BERT:专门为句子向量而训练(2019)
2019年,Sentence-BERT(Reimers和Gurevych)出手了。
做法不复杂:
-
拿两个一模一样的BERT(共享权重,孪生结构)
-
一个编码句子A,一个编码句子B
-
各自做一次mean pooling,得到两个句向量
-
训练目标:相似的句子向量靠近,不相似的推远

效果很直观:之前用BERT比较1万对句子的相似度要65个小时(每对都要同时输入BERT),现在只需要约5秒——因为每句话只编码一次存为向量,之后所有比较都是简单的余弦相似度计算。
“相似的靠近,不相似的推远”——这个训练方法有个名字:对比学习。
07 对比学习:思路和Word2Vec一回事
对比学习听起来和Word2Vec的正负样本很像?没错,思路确实一样。
但现代对比学习做了几个关键升级:
1. In-batch Negatives(批次内负样本)
一个batch里有1024对句子,每对句子的表示可以把其他1023个当负样本,不用额外采样,就有1000多个负样本。
2. Hard Negatives(困难负样本)
随机负样本太容易区分了:
- “如何学习Python编程” vs “量子力学导论” → 模型闭着眼都知道不一样
真正难的是:
-
“如何学习Python基础语法” vs “Python入门教程推荐” → 意思几乎一样,但表述不同。模型必须把这两个拉近。
-
“如何学习Python基础语法” vs “Python基础语法的常见错误有哪些” → 词几乎一样,但问的完全不是一回事。模型必须把这两个推远。
能区分这些,才叫真正理解语义。

为什么对比学习有效?
跟Word2Vec是同一个道理:
-
Word2Vec:经常一起出现的词,向量要靠近
-
对比学习:意思相同的句子,向量要靠近
反复被拉到一起的东西,最终就会靠在一起。Word2Vec靠的是共现统计,对比学习靠的是标注的相似度,监督信号不同,但做的事一样。
08 今天的Embedding模型长什么样
今天的embedding模型(BGE、E5、GTE等)基本都用了同一套训练流程:
-
先在几十亿个弱标注文本对上预训练
-
再在几百万个精标数据上微调
-
加上hard negative挖掘——自动找那些”看似相关实则不同”的困难负样本
-
还有个设计:非对称编码——查询和文档用不同的指令前缀,让模型知道”这是一个问题”还是”这是一篇文章”

这些模型输入一段话,输出一个768维或1024维的密集向量。这个向量就是这段话在语义空间里的坐标。
从one-hot到BGE,方法越来越复杂,但追求的目标一直没变。
09 十年回顾:一句话总结
回头看:
| 阶段 | 技术 | 解决了什么 |
|---|---|---|
| One-hot → Word2Vec | 静态词向量 | 让意思相近的词靠近 |
| Word2Vec → ELMo/BERT | 上下文相关 | 让同一个词在不同语境里有不同坐标 |
| BERT → Sentence-BERT | 句向量 | 把整段话压缩成一个向量 |
| 现代模型 | 对比学习 | 大规模预训练+精调,查询/文档区分编码 |
绕了一大圈,核心就一句话:意思相近的东西,坐标就应该相近。
2013年Word2Vec这么干,2023年BGE还是这么干。方法变了,思路没变。
结语
从one-hot到Word2Vec,从Word2Vec到BERT,从BERT到今天的BGE——人类花了10年,一步步把语言翻译成了坐标。
你下次在搜索引擎输入”苹果”,看到结果里既有水果也有手机的时候,可以想一想:你面前这个屏幕的背后,有一个768维的空间,“苹果”在那个空间里有两个位置,一个挨着”香蕉""橘子”,一个挨着”华为""三星”。搜索引擎做的,就是算你输入的”苹果”离哪个位置更近。
这就是AI理解语言的方式。
📚 参考资料
主要技术论文:
-
Mikolov et al. Word2Vec (2013, Google) — “Efficient Estimation of Word Representations in Vector Space” & “Distributed Representations of Words and Phrases and their Compositionality”
-
Levy & Goldberg (2014) — “word2vec Explained: Deriving Mikolov et al.’s Negative-Sampling Word-Embedding Method”
-
Peters et al. ELMo (2018, Allen AI) — “Deep Contextualized Word Representations”
-
Devlin et al. BERT (2018, Google) — “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”
-
Reimers & Gurevych Sentence-BERT (2019, UKP Lab) — “Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks”
-
Xiao et al. BGE (2023, BAAI) — “C-Pack: Packaged Resources To Advance General Chinese Embedding”
-
Wang et al. E5 (2022, Microsoft) — “Text Embeddings by Weakly-Supervised Contrastive Pre-training”
-
Li et al. GTE (2023, Alibaba) — “Towards Generalist Embedding Model: A Recipe for General Text Embedding”
如果你觉得这篇文章有帮助,欢迎:
-
👍 点赞支持
-
💬 评论交流
-
🔄 分享给更多朋友
-
⭐ 关注我,获取更多AI技术深度解析
你还想了解AI的哪些技术?欢迎在评论区留言!


Original Fox爱分享 Fox爱分享