Clipping 微信公众号

万物皆向量:Embedding技术的原理与十年演进

by Fox爱分享 原文 ↗
Created: 2026-05-06

公众号名称: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提了两种方法,像照镜子一样互为倒影:

  1. CBOW(连续词袋模型):给你周围的词,预测中间是什么词

  2. 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等人)给出了第一个解法:读完整句话再决定词的向量

具体做法:

  1. 先给每个词一个基于字符级CNN的基础向量(这样遇到没见过的词也能处理)

  2. 双向LSTM读完整句话

  • 从左往右读一遍

  • 从右往左读一遍

  1. 把两个方向的隐藏状态和基础向量加权融合

这样,“我吃了一个苹果”里的”苹果”,因为左边有”吃了”,右边有”一个”,它的向量被上下文修饰成了”水果”的方向。

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)出手了。

做法不复杂:

  1. 拿两个一模一样的BERT(共享权重,孪生结构)

  2. 一个编码句子A,一个编码句子B

  3. 各自做一次mean pooling,得到两个句向量

  4. 训练目标:相似的句子向量靠近,不相似的推远

效果很直观:之前用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等)基本都用了同一套训练流程:

  1. 先在几十亿个弱标注文本对上预训练

  2. 再在几百万个精标数据上微调

  3. 加上hard negative挖掘——自动找那些”看似相关实则不同”的困难负样本

  4. 还有个设计:非对称编码——查询和文档用不同的指令前缀,让模型知道”这是一个问题”还是”这是一篇文章”

这些模型输入一段话,输出一个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的哪些技术?欢迎在评论区留言!


cover_image

Original Fox爱分享 Fox爱分享

输入关键词开始搜索