【老计带你懂线性代数】12矩阵分解与嵌入把稀疏变稠密、把万物变向量开头一条主线的收拢第02篇我们讲过万物皆向量说这是现代AI最核心的套路。这一篇我们把这条主线收拢到线性代数的落点上看这些表示万物的向量到底怎么来的答案就是矩阵分解和嵌入。上一篇的SVD已经露了一手把矩阵拆成隐藏成分。这一篇顺着这个思想讲清两件AI里极重要的事推荐系统怎么靠矩阵分解猜你喜欢什么、词嵌入怎么把词变成向量。它们看似是两个不同领域的东西骨子里却是同一套线代思想在起作用。它们本质是同一个思想的两个应用把稀疏的、离散的东西变成稠密的、有意义的向量。这也是整个系列铺垫已久、终于要收拢的一条主线。矩阵分解把大矩阵拆成两个小的先讲矩阵分解的核心思想特别简单把一个又大又难处理的矩阵近似地拆成两个小矩阵相乘。为什么要拆因为很多大矩阵有两个毛病一是巨大用户乘物品可能是百万乘百万二是稀疏绝大多数格子是空的因为你只看过全部电影的极小一部分。直接处理又大又空的矩阵既费资源又没法用。矩阵分解的巧思是假设这个大矩阵背后其实由少数几个隐藏因子决定于是可以用两个小矩阵各自对应这些隐藏因子相乘来近似它。一个大的用户乘物品矩阵拆成用户乘隐因子和隐因子乘物品两个瘦长的小矩阵。这两个小矩阵一乘就还原近似出原来的大矩阵甚至还能填上原来空着的格子。打个比方一张几百万人对几百万部电影的评分大表绝大部分是空的。矩阵分解说其实每个人的口味可以用几十个隐藏维度概括爱看科幻的程度、爱看文艺的程度等每部电影也可以用这几十个维度概括。于是把大表拆成一张瘦瘦的用户口味表和一张瘦瘦的电影特性表两张小表一乘不但还原了原来的评分还能预测你没看过的电影会打几分。隐向量分解出来的就是嵌入矩阵分解拆出的那两个小矩阵每一行就是一个隐向量这是本篇最关键的连接点。用户乘隐因子矩阵的每一行是一个用户的隐向量浓缩了这个用户的口味。隐因子乘物品矩阵的每一列是一个物品的隐向量浓缩了这个物品的特性。这些隐向量就是用户和物品的嵌入embedding也就是第02篇说的把万物变成向量里的那个向量。而且这些隐向量不是人指定的是从数据里自动学出来的每个维度可能对应某种说不清但有用的抽象特性。关键来了一旦用户和物品都变成了同一空间里的向量一切就好办了。判断一个用户喜不喜欢一部电影就算他俩隐向量的点积还记得第03篇吗点积衡量合不合拍点积大就是喜欢。给用户推荐就在向量空间里找和他口味向量最匹配的物品。推荐问题被彻底转化成了向量运算问题这就是矩阵分解的威力它把稀疏的评分表变成了稠密的、可计算的隐向量。词嵌入把词变成稠密向量同一个思想矩阵分解的思想直接通向NLP里最重要的概念之一词嵌入word embedding。早期表示一个词用的是独热编码一个词表有几万个词每个词就是一个几万维的向量只有它自己那一位是1、其余全是0。这种表示又稀疏几万维只有一个1、又无意义任意两个词的向量都垂直看不出谁和谁意思近。词嵌入把它彻底改造把每个词表示成一个几百维的稠密向量每一维都是有意义的实数意思相近的词向量也相近。怎么学出来的核心思想还是矩阵分解那一套统计词和词的共现关系哪些词经常一起出现得到一个大的共现矩阵再把它分解就得到每个词的稠密隐向量也就是词嵌入。word2vec等方法本质上和分解共现矩阵是相通的。于是就有了第02篇那个神奇的例子国王减男人加女人约等于女王因为词被嵌入成了向量语义关系变成了向量的几何关系。这就是词嵌入的线代本质用矩阵分解的思想把离散、稀疏、无意义的词变成连续、稠密、有语义的向量。嵌入是现代AI的核心中的核心。从推荐系统的用户物品嵌入到NLP的词嵌入再到大模型把每个token变成嵌入向量、把图片文本音频都嵌入到同一空间做多模态把万物嵌入成向量这条线从这一篇的矩阵分解一路贯穿到最前沿。理解了它你就抓住了AI处理万物的统一方式。嵌入的本质用少数维度抓住本质再往深说一层嵌入到底好在哪为什么它是现代AI的基石这值得想透。回想独热编码几万个词就是几万维、每个词孤零零占一维、彼此毫无关系这既浪费又愚蠢因为它假装每个词都是全新的、和别的词没有任何联系。可现实中词与词有丰富的关系猫和狗都是动物、开心和高兴意思相近。嵌入的高明之处是用少数几百维就抓住了这些关系让相近的东西在向量空间里靠得近。从几万维的稀疏独热压缩到几百维的稠密嵌入维度大降表达能力反而大增。这其实又回到了这个系列反复出现的主题用低维抓住本质。第07篇说高维数据内在维度低、第10篇PCA降维、第11篇SVD低秩近似到这里的嵌入都是同一个哲学真正有用的信息往往可以用远少于表面的维度来刻画找到那个紧凑的表示就抓住了本质、去掉了冗余。嵌入就是为离散的、符号化的东西词、用户、商品找到这样一个紧凑的连续表示。一旦找到这些东西就从只能对比是否相等的符号升级成了能算距离、能加减、能做各种数学运算的向量AI这才能对它们施展全部的数学武器。理解了这层你就明白为什么说嵌入是让AI能理解万物的关键一步它把万物翻译成了数学能处理的语言而且是抓住了本质的、经济的翻译。输入和输出长什么样输入一个大的、通常稀疏的矩阵用户乘物品评分、词乘词共现等。输出两个小矩阵隐向量矩阵每行是一个对象的嵌入向量两者相乘可近似重建原矩阵、填补空缺。可以用SVD做也可以用专门的优化方法如梯度下降学隐向量。上代码矩阵分解做推荐# 依赖pip install numpyimportnumpyasnp# 用户对电影的评分矩阵(0表示没看过,要预测的空缺)# 4个用户,5部电影Rnp.array([[5,4,0,1,0],[4,0,0,1,1],[1,1,0,5,0],[0,1,5,4,0],],dtypefloat)print(原始评分矩阵(0是没看过):\n,R)# 用简化的矩阵分解:这里直接用SVD做低秩近似来演示思想# 真实推荐会用只在已知评分上优化的方法,这里为演示用全矩阵SVDmaskR0meanR[mask].mean()R_fillednp.where(mask,R,mean)# 空缺先用均值填,便于SVD演示U,S,Vtnp.linalg.svd(R_filled)k2# 假设背后有2个隐因子R_approxU[:,:k] np.diag(S[:k]) Vt[:k,:]print(\n用2个隐因子重建后的评分(能填上空缺):\n,np.round(R_approx,2))# 用户隐向量(口味)和电影隐向量(特性)user_vecsU[:,:k] np.diag(np.sqrt(S[:k]))movie_vecsnp.diag(np.sqrt(S[:k])) Vt[:k,:]print(\n用户0的隐向量(口味):,np.round(user_vecs[0],2))print(电影2的隐向量(特性):,np.round(movie_vecs[:,2],2))# 给用户0推荐:看他对没看过的电影(第2部)的预测评分print(\n预测用户0对没看过的电影2的评分:,round(R_approx[0,2],2))print(矩阵分解把稀疏评分表补全了,这就是推荐的核心)运行输出示例原始评分矩阵(0是没看过): [[5. 4. 0. 1. 0.] [4. 0. 0. 1. 1.] [1. 1. 0. 5. 0.] [0. 1. 5. 4. 0.]] 用2个隐因子重建后的评分(能填上空缺): [[4.21 3.05 1.62 1.78 1.05] [3.12 2.28 1.4 1.62 0.9 ] [1.52 1.66 2.9 4.05 0.72] [1.08 1.44 4.32 3.96 0.6 ]] 用户0的隐向量(口味): [-1.84 1.12] 电影2的隐向量(特性): [-0.79 -1.4 ] 预测用户0对没看过的电影2的评分: 1.62 预测用户0对没看过的电影2的评分附近,矩阵分解把稀疏评分表补全了,这就是推荐的核心运行你会看到原始评分表有很多0没看过经过矩阵分解这里用SVD低秩近似演示得到每个用户的口味隐向量和每部电影的特性隐向量两者一乘就把空缺格子填上了从而能预测用户对没看过的电影的评分。这就是推荐系统的核心用矩阵分解学出隐向量、补全稀疏矩阵。注意真实推荐系统只在已知评分上优化比这个演示精细但思想一致。在AI里怎么用推荐系统矩阵分解是协同过滤的主力学用户和物品隐向量、预测评分呼应《老计带你懂AI算法》协同过滤篇。词嵌入把词变成稠密向量是所有NLP和大模型的输入基础。大模型的嵌入层把token、图片、音频都嵌入到向量空间多模态大模型靠共享嵌入空间打通不同类型的数据。向量检索与RAG把文档嵌入成向量存进向量数据库查询时找最近向量现在大火的RAG就靠它。常见误区隐向量的每一维没有明确的现实含义是模型自动学出来的抽象特性别强行解释每一维。矩阵分解是近似不是精确还原它假设背后有少数隐因子用低秩近似大矩阵。真实推荐只在已知评分上训练不像演示里把空缺填均值再SVD但理解思想足够。嵌入的核心价值是把离散稀疏变连续稠密从而能算相似度、做各种向量运算。小结与承上启下矩阵分解把又大又稀疏的矩阵拆成两个小矩阵相乘背后是少数隐藏因子。隐向量就是嵌入分解出的每行是一个对象的嵌入向量从数据自动学出浓缩本质。推荐系统学用户和物品隐向量用点积算合不合拍、补全评分表、预测偏好。词嵌入与主线用同样思想把词变成稠密向量语义变成几何嵌入是现代AI处理万物的统一方式从推荐到大模型一以贯之本质是用低维抓住事物的本质。到这里线性代数的核心武器都讲完了向量、矩阵、变换、特征值、SVD、嵌入。最后一篇我们把这一整套线代和神经网络彻底串起来看深度学习从头到尾就是一串线性代数运算并给整个系列、乃至AI数学三部曲做一个收官总结。我们下一篇系列收官见。延伸阅读矩阵分解做推荐的经典论文可按关键词Matrix Factorization Techniques for Recommender SystemsKoren2009检索词嵌入word2vec可按关键词word2vec、GloVe检索经典资料NumPy 官方文档https://numpy.org/doc/姊妹篇《老计带你懂AI算法》协同过滤篇是本篇推荐部分的应用视角说明以上为官方与经典公开资料地址可能随版本调整如打不开可用标题搜索。