95-向量嵌入Embedding-从one-hot到word2vec到BERT-语义距离的数学本质

📅 发布时间:2026/8/9 1:44:49
95-向量嵌入Embedding-从one-hot到word2vec到BERT-语义距离的数学本质
文章目录【95.PythonAI】向量嵌入Embedding到底是什么为什么它能表示语义导入语1 ~ 起点计算机只认数字怎么表示一个词1.1 演进脉络2 ~ one-hot最朴素的方案与两大致命伤2.1 方案一人一个坑位2.2 致命伤一维度爆炸2.3 致命伤二语义鸿沟3 ~ word2vec让词义住进向量里3.1 核心思想近朱者赤3.2 著名的向量算术3.3 遗留问题一词一向量4 ~ BERT同一个词不同语境不同向量4.1 上下文嵌入4.2 从词向量到句向量5 ~ 相似度的数学本质为什么是余弦5.1 两个候选方案的较量5.2 Python实测眼见为实5.3 降维可视化亲眼看看语义空间思考 总结结尾【95.PythonAI】向量嵌入Embedding到底是什么为什么它能表示语义文章简介本文系统讲解向量嵌入Embedding的本质是理解RAG、语义搜索、推荐系统的数学地基。文章从计算机不懂文字这一根本矛盾切入沿着技术演进路线逐层拆解三种表示方案one-hot编码最朴素的离散表示以及它维度爆炸、语义鸿沟两大致命缺陷、word2vec分布式表示的突破国王-男人女人≈女王的向量运算奇迹从何而来、BERT上下文嵌入同一个苹果在水果句和手机句里为什么有不同向量。深入讲解语义距离的数学本质——为什么用余弦相似度而不是欧氏距离配Python代码实测猫/狗/汽车的相似度关系并用matplotlib将768维向量降维可视化让你亲眼看到语义相近的词在空间中聚成一簇。配以Mermaid流程图展示表示方案的演进脉络适合想真正搞懂Embedding而不是只会调API的开发者阅读参考。 个人主页源码骑士❄专栏传送门《Android开发基础》《python基础课程》⭐️热衷从源码视角拆解技术底层原理将复杂架构讲得通俗易懂 源码骑士的简介5年Android Framework系统开发经验曾主导多项系统级性能优化专项技术栈覆盖Android系统全链路Binder/Handler/AMS/WMS/启动流程及Java后端全家桶Spring MyBatis Redis Oracle累计产出原创技术文章100篇文章以流程图为特色被读者评价为看一篇胜过啃一周源码导入语用过Embedding API的同学都有过这种会用但心虚的感觉把一句话POST上去返回768个浮点数然后把这串数字存进向量数据库、算个相似度搜索就神奇地work了。可一旦有人追问这768个数字凭什么代表这句话的意思猫和狗的向量为什么比猫和汽车的向量更接近多数人就答不上来了只能含糊一句模型学出来的。答不上来后面所有东西都是空中楼阁为什么Chunk切分影响检索质量、为什么换个Embedding模型要全量重建索引、为什么余弦相似度是0.7算相关——这些问题的答案全藏在Embedding的原理里。这篇文章就把这层窗户纸捅破从one-hot一路讲到BERT让你知其然更知其所以然。1 ~ 起点计算机只认数字怎么表示一个词所有的矛盾从一个简单的事实开始计算机的世界里没有文字只有数字。想让机器处理语言第一步就是把每个词变成一组数字——这一步叫表示Representation。表示方案的好坏只有一个评判标准数字之间的关系能不能反映语言之间的关系。意思相近的词数字也应该相近——这个朴素的要求就是三种方案几十年演进的主线。1.1 演进脉络维度爆炸语义鸿沟一词一向量无法区分多义表示问题词 → 数字one-hot离散表示 1950s~word2vec分布式表示 2013BERT/GPT上下文嵌入 2018~句子级EmbeddingBGE/M3E/OpenAI专门用于检索2 ~ one-hot最朴素的方案与两大致命伤2.1 方案一人一个坑位词表里有5个词就用5维向量每个词独占一个位置词表[猫,狗,苹果,汽车,跑]猫 →[1,0,0,0,0]狗 →[0,1,0,0,0]苹果 →[0,0,1,0,0]汽车 →[0,0,0,1,0]跑 →[0,0,0,0,1]2.2 致命伤一维度爆炸真实词表动辄几十万词——每个词要用几十万维的向量表示其中99.999%是0。存储和计算都是灾难。2.3 致命伤二语义鸿沟更要命的是语义全丢了。算一下猫和狗的相似度对应位置相乘再相加结果恒等于0。在one-hot的世界里猫和狗的关系 猫和汽车的关系 毫无关系。词与词之间是两两孤立的孤岛机器永远不可能知道猫和狗都是动物。one-hot的失败给出了一个深刻的教训表示方案的价值不在区分词这个one-hot做得很好而在关联词。谁能让数字承载关联谁就是下一代方案。3 ~ word2vec让词义住进向量里3.1 核心思想近朱者赤2013年谷歌提出的word2vec思想朴素得像句谚语一个词的含义由它经常和哪些词一起出现决定。“猫的上下文里常见喵、毛、宠物、抓”“狗的上下文里常见汪、毛、宠物、遛”——上下文高度重叠含义自然相近。模型干的活给每个词学一个几百维的稠密向量使得上下文相似的词向量也相似。3.2 著名的向量算术学出来的向量空间里语义关系变成了几何关系国王 - 男人 女人 ≈ 女王 几何解读国王到男人的差向量 ≈ 性别方向的偏移 把这个偏移加到女人上落点恰好在女王附近这不是魔术是训练目标的自然结果“国王和女王的上下文几乎完全一样唯一的系统性差异就在性别上——这个差异被向量精准地捕捉成了一个方向”。语义第一次变成了可以加减的数字。3.3 遗留问题一词一向量word2vec有一个绕不过去的硬伤一个词只有一个向量。苹果在我吃了一个苹果和苹果发布了新手机里是同一个向量——多义词的所有含义被平均成了一个四不像的表示。4 ~ BERT同一个词不同语境不同向量4.1 上下文嵌入2018年BERT登场规则改写了向量不再属于词而属于这个词在这个句子里。句子一我吃了一个苹果→苹果的向量落在【水果】区域附近 句子二苹果发布了新手机→苹果的向量落在【科技公司】区域附近 同一个词两个向量各自贴合语境实现这一点的关键机制是注意力第39篇讲过Transformer生成苹果的向量时模型会回头看整句话——看到吃了就往水果靠看到发布、手机就往公司靠。4.2 从词向量到句向量RAG时代我们嵌的不是单个词而是整段文本句子级EmbeddingOpenAI的text-embedding系列、BGE、M3E就是在BERT类架构上针对检索这个任务专门训练的让含义相近的句子在向量空间里离得近——哪怕它们字面完全不同。“如何退款和钱怎么退回来”没有一个字相同但向量几乎贴在一起。这就是语义搜索碾压关键词搜索的底气。5 ~ 相似度的数学本质为什么是余弦5.1 两个候选方案的较量欧氏距离量两个点之间直线多远问题向量一长文本长、数值大距离天然变大 → 长文本和短文本永远看起来不相似哪怕语义一致 余弦相似度量两个向量方向差多少cos θ(A·B)/(|A|×|B|)只关心方向不关心长度 → 免疫文本长短的影响语义藏在方向里——这是word2vec时代就确立的经验“性别方向”“首都方向”所以检索场景几乎清一色用余弦。取值范围[-1, 1]1表示方向完全一致。5.2 Python实测眼见为实importnumpyasnp# 用三个简化的三维向量模拟真实是768/1536维原理相同vec_catnp.array([0.9,0.8,0.1])# 猫动物属性高vec_dognp.array([0.85,0.9,0.15])# 狗动物属性高vec_carnp.array([0.1,0.2,0.95])# 汽车机械属性高defcosine(a,b):returnnp.dot(a,b)/(np.linalg.norm(a)*np.linalg.norm(b))print(cosine(vec_cat,vec_dog))# ≈ 0.999 语义相近 → 方向几乎重合print(cosine(vec_cat,vec_car))# ≈ 0.49 语义疏远 → 方向差得远换成真实API验证也是同样的结论——“猫/狗的余弦相似度稳定高于猫/汽车”。这串数字终于回答了导入语的问题Embedding表示语义的方式就是把语义翻译成几何。5.3 降维可视化亲眼看看语义空间# pip install scikit-learn matplotlibfromsklearn.decompositionimportPCAimportmatplotlib.pyplotasplt words[猫,狗,老虎,汽车,卡车,公交,苹果,香蕉,橙子]vectors[get_embedding(w)forwinwords]# 调你的Embedding APIpointsPCA(n_components2).fit_transform(vectors)plt.figure(figsize(8,6))plt.rcParams[font.sans-serif][SimHei]# Windows中文显示for(x,y),winzip(points,words):plt.scatter(x,y)plt.annotate(w,(x,y),fontsize13)plt.title(Embedding空间的PCA降维投影)plt.show()跑完你会看到一幅非常治愈的图猫狗虎挤成一团汽车卡车公交另成一团水果们远远地聚在第三角——九个词、三簇没人告诉机器分类标准语义自己在空间里完成了聚类。这张图值得放进你的每一次技术分享里。思考 总结表示问题的评判标准只有一个数字之间的关系能否反映语言之间的关系——one-hot输就输在它只区分不关联。one-hot两大致命伤维度爆炸几十万维全是0和语义鸿沟任意两词相似度恒为0。word2vec的突破是近朱者赤上下文相似的词向量相似语义关系变成了几何关系——国王-男人女人≈女王是训练目标的自然产物。BERT解决多义词向量属于词在句子中而非词本身句子级Embedding让字面不同、含义相同的句子在空间里贴近这是语义搜索的地基。余弦相似度量的是方向语义藏在方向里方向免疫文本长短——所以检索场景用余弦而非欧氏距离。搞懂了语义是怎么变成数字的下一个工程问题随之而来手里握着一千万个向量用户一个查询过来怎么在毫秒级找出最相似的那几个暴力比对一千万次显然不现实——下一篇讲向量检索算法ANN看HNSW、IVF、PQ各显神通。结尾各位小伙伴本文的内容到这里就全部结束了源码骑士在这里再次感谢您的阅读源码骑士 — Android Framework 全栈开发关注跟博主一起从源码视角深耕底层原理见证每一次成长❤️点赞让优质内容被更多人看见让知识传递更有力量⭐收藏把核心知识点存好在需要时随时查、随时用评论分享你的经验或疑问评论区一起交流避坑一键四连不要忘记给博主一键四连哦️寄语技术之路难免有困惑但同行的人会让前进更有方向结语Embedding的浪漫之处在于它把人类语言中最微妙的意思翻译成了数学中最刚硬的方向——从此语义可度量、可比较、可检索。理解了这层翻译RAG的每一环对你都将不再是黑盒。不要忘记给博主一键四连哦