上一篇 Robust PCA 展示了 nuclear 范数与 ℓ1 范数的组合如何将低秩信号和稀疏异常值精确分离。至此,Part 1 的所有矩阵分解方法——从 SVD 的无约束最优到 PCA 的正交降维、NMF 的非负部件、矩阵补全的采样恢复、Robust PCA 的低秩+稀疏分离——都是在二维矩阵上操作的。
但现实世界的数据往往不止两个维度。用户-物品-时间(谁在什么时候评价了什么)、主语-谓语-宾语(知识图谱中的三元组)、像素行-像素列-颜色通道——这些数据天然是三维甚至更高维的。强行把它们”压扁”成二维矩阵会丢失维度间的交互结构。
张量分解(Tensor Decomposition)是矩阵分解的高阶推广:矩阵是二阶张量,向量是一阶张量,三维”数据立方体”是三阶张量,以此类推。Part 1 建立的所有分解直觉——低秩近似、外积展开、因子矩阵——都可以自然地推广到张量。本文聚焦两种最经典的张量分解(CP 分解和 Tucker 分解),然后展示它们在知识图谱嵌入中的应用(DistMult、ComplEx)。
从矩阵到张量:基本概念
什么是张量?
在本文的语境下,张量(tensor)就是多维数组——矩阵的高阶推广。
| 阶 | 数学对象 | 例子 | 符号 |
|---|
| 0 | 标量 | 温度 t=25 | a |
| 1 | 向量 | 特征向量 x∈Rn | x |
| 2 | 矩阵 | 评分矩阵 A∈Rm×n | A |
| 3 | 三阶张量 | 用户×物品×时间 | X∈RI×J×K |
| N | N 阶张量 | 高阶数据 | X∈RI1×I2×⋯×IN |
我们用花体字母 X 表示张量,遵循 Kolda & Bader (2009) 的符号约定。三阶张量 X∈RI×J×K 的元素记为 xijk,其中 i=1,…,I,j=1,…,J,k=1,…,K。
术语注意:这里的”张量”是数值分析和机器学习中的用法——多维数组。它与微分几何/物理学中”张量”的定义(满足特定坐标变换规则的多线性映射)相关但不完全相同。ML 中的用法更具体:一个三阶张量就是一个三维数组。
模态与切片
张量的每个维度称为一个模态(mode)。三阶张量 X∈RI×J×K 有三个模态:
- 模态 1(mode-1):沿第一个维度(I 行),大小为 I
- 模态 2(mode-2):沿第二个维度(J 列),大小为 J
- 模态 3(mode-3):沿第三个维度(K 层),大小为 K
切片(slice)是固定一个模态索引后得到的矩阵。三阶张量有三种切片方式:
| 切片类型 | 固定维度 | 结果 |
|---|
| 前切片(frontal slice) | k 固定 | X::k∈RI×J,k=1,…,K |
| 侧切片(lateral slice) | j 固定 | X:j:∈RI×K,j=1,…,J |
| 水平切片(horizontal slice) | i 固定 | Xi::∈RJ×K,i=1,…,I |
直觉上,把三阶张量想象成一叠矩阵:K 个 I×J 的”前切片”堆叠在一起。
外积与秩一张量
回忆矩阵分解中的关键概念——外积(outer product)和秩一矩阵:
秩一矩阵=abT,(abT)ij=aibj
SVD 的外积展开 A=∑r=1RσrurvrT 将矩阵表示为秩一矩阵之和(Art. 3 SVD)。
对张量,外积推广为:
秩一张量=a∘b∘c,(a∘b∘c)ijk=aibjck
其中 a∈RI、b∈RJ、c∈RK,∘ 表示外积。一个秩一张量的每个元素是三个向量对应分量的乘积——它的结构完全由三个向量决定。
张量秩
矩阵的秩定义为将矩阵表示为秩一矩阵之和所需的最小项数。张量秩的定义完全类比:
定义:张量 X 的秩(tensor rank)是将 X 精确表示为秩一张量之和所需的最小项数 R:
rank(X)=min{R:X=∑r=1Rar∘br∘cr}
但这里有一个与矩阵截然不同的情况:张量秩的计算是 NP-hard 的(Håstad, 1990)。矩阵的秩可以通过 SVD 轻松求得(数正的奇异值个数),但张量没有这样的”万能工具”。此外,张量没有 Eckart-Young 定理的直接类比——最佳秩 R 近似不一定存在(下一节详述)。
这些差异使得张量分解在数学上比矩阵分解复杂得多,但也更加丰富。
CP 分解
定义与直觉
CP 分解(CANDECOMP/PARAFAC decomposition)是 SVD 外积展开的直接高阶推广。它将三阶张量分解为秩一张量的加权和:
X≈∑r=1Rλrar∘br∘cr
其中:
- R 是 CP 秩(分解的成分数,类比矩阵分解中的截断秩 k)
- λr>0 是第 r 个成分的权重(类比奇异值 σr)
- ar∈RI、br∈RJ、cr∈RK 是三个模态的因子向量
- 通常约定因子向量为单位向量 ∥ar∥=∥br∥=∥cr∥=1,权重 λr 吸收缩放
在实际应用中,权重 λr 常常被吸收进因子向量中,简写为:
X≈∑r=1Rar∘br∘cr
逐项理解:
- 每个 ar∘br∘cr:一个秩一张量——它的元素 (ar)i(br)j(cr)k 完全由三个向量在各模态上的值决定。如果把张量想象成”数据立方体”,每个秩一成分是一个特定的”模式”,在三个模态上各有一个特征轮廓。
- 求和 ∑r=1R:原始张量被近似为 R 个这样的模式的叠加,完全类似 SVD 中 A≈∑r=1kσrurvrT。
- CP 秩 R:控制近似的精度,R 越大近似越好,但也越复杂。
因子矩阵表示
将所有因子向量组织成矩阵是更紧凑的表达:
A=[a1a2⋯aR]∈RI×R
B=[b1b2⋯bR]∈RJ×R
C=[c1c2⋯cR]∈RK×R
其中 A、B、C 分别称为三个模态的因子矩阵(factor matrices)。CP 分解可以用因子矩阵简洁地写为:
X≈[[A,B,C]]即xijk≈∑r=1Rairbjrckr
这里 [[A,B,C]] 是 Kruskal 记号(Kruskal notation),表示由因子矩阵 A,B,C 定义的 CP 分解。
与 SVD 的类比
CP 分解与 SVD 的关系可以精确对照:
| SVD(矩阵) | CP 分解(张量) |
|---|
| 对象 | A∈Rm×n | X∈RI×J×K |
| 分解形式 | A=∑r=1RσrurvrT | X=∑r=1Rλrar∘br∘cr |
| 秩一成分 | urvrT(两个向量的外积) | ar∘br∘cr(三个向量的外积) |
| 因子矩阵 | U∈Rm×R, V∈Rn×R | A∈RI×R, B∈RJ×R, C∈RK×R |
| 权重 | 奇异值 σr(有序) | λr(不一定有序) |
| 正交性 | UTU=I, VTV=I | 不保证正交 |
| 存在性 | 总是存在 | 精确分解总是存在,但最佳低秩近似不一定存在 |
| 计算秩 | O(mnmin(m,n)) | NP-hard |
最后两行的差异值得强调:
没有 Eckart-Young 定理:对矩阵,截断 SVD 给出 Frobenius 范数下的最佳秩 k 近似(Art. 3 SVD,Eckart-Young 定理)。但对三阶及更高阶张量,最佳低秩近似可能不存在——存在张量序列可以无限逼近目标精度但永远达不到(De Silva & Lim, 2008)。这意味着 CP 分解的优化问题可能没有最优解,只有逼近序列。实际中,这通过添加正则化或约束来避免。
不保证正交:SVD 的左/右奇异向量构成正交基,CP 分解的因子向量一般不正交。
CP 分解的可视化
下面的图展示了一个简单的 3×3×3 张量的 CP 分解(R=2)。原始张量被近似为两个秩一张量之和,每个秩一张量由三个向量的外积定义。颜色深浅表示元素大小。
CP 分解:三阶张量 = 秩一张量之和
将 I×J×K 张量分解为 R 个外积之和
CP 分解的算法:交替最小二乘(ALS)
CP 分解的标准算法是交替最小二乘(Alternating Least Squares, ALS),思路与 NMF 的交替优化一致。
目标函数:
minA,B,C∥X−[[A,B,C]]∥F2=minA,B,C∑i,j,k(xijk−∑r=1Rairbjrckr)2
其中 ∥⋅∥F 是张量的 Frobenius 范数(所有元素平方和的平方根),直接推广自矩阵的 Frobenius 范数。
同时优化三个因子矩阵 A,B,C 是非凸问题。ALS 的策略是固定两个,优化第三个——每个子问题都是标准的最小二乘,有封闭解。
ALS 迭代:
步骤 1:固定 B,C,更新 A。
为了理解这一步,我们需要展开(unfold/matricize)操作。将三阶张量 X∈RI×J×K 沿模态 1 展开为矩阵 X(1)∈RI×JK——把 J×K 个”纤维”排成列。
在这个展开下,CP 分解变为矩阵分解:
X(1)≈A(C⊙B)T
其中 ⊙ 表示 Khatri-Rao 乘积(column-wise Kronecker product):
(C⊙B)(k−1)J+j,r=ckr⋅bjr
C⊙B∈RJK×R 的每一列是 C 和 B 对应列的 Kronecker 乘积。
固定 B,C 后,对 A 的优化变为标准最小二乘:
minA∥X(1)−A(C⊙B)T∥F2
封闭解:
A←X(1)(C⊙B)[(CTC)∗(BTB)]−1
其中 ∗ 表示 Hadamard 乘积(逐元素乘法)。注意 (C⊙B)T(C⊙B)=(CTC)∗(BTB)(Khatri-Rao 乘积的重要性质),所以括号内是一个 R×R 的小矩阵——计算量可控。
步骤 2:固定 A,C,更新 B。 对称地:
B←X(2)(C⊙A)[(CTC)∗(ATA)]−1
步骤 3:固定 A,B,更新 C。 对称地:
C←X(3)(B⊙A)[(BTB)∗(ATA)]−1
重复步骤 1-2-3 直到收敛(重建误差变化小于阈值)。
收敛性:与 NMF 的乘法更新类似,ALS 的目标函数在每一步单调不增,保证收敛到驻点。但由于问题非凸,不保证全局最优——实践中多次随机初始化,选最优结果。
Tucker 分解
定义
Tucker 分解(Tucker decomposition, Tucker 1966)是 CP 分解的推广——它引入了一个核心张量(core tensor)来允许不同模态的因子之间有交互。
X≈G×1U(1)×2U(2)×3U(3)
逐项理解:
- U(1)∈RI×R1:模态 1 的因子矩阵(R1 个基向量)
- U(2)∈RJ×R2:模态 2 的因子矩阵(R2 个基向量)
- U(3)∈RK×R3:模态 3 的因子矩阵(R3 个基向量)
- G∈RR1×R2×R3:核心张量,编码三个模态因子之间的交互强度
- ×n 表示模态-n 乘积(mode-n product)
模态乘积
模态-n 乘积 Y=X×nU 将张量 X 在第 n 个模态上与矩阵 U 相乘。对三阶张量,模态-1 乘积的元素为:
(X×1U)ijk=∑p=1Iuipxpjk
直觉上,模态乘积就是”沿一个维度做线性变换”——它把原始模态的 I 个坐标变换为新的 R1 个坐标,类似矩阵乘法 Y=UA 把 A 的行空间投影到 U 的列空间。
Tucker 分解写成元素形式:
xijk≈∑p=1R1∑q=1R2∑s=1R3gpqsuip(1)ujq(2)uks(3)
与 CP 分解对比:
| CP 分解 | Tucker 分解 |
|---|
| 核心张量 | 超对角:gpqs=λpδpqs(只有 p=q=s 时非零) | 一般的 G∈RR1×R2×R3 |
| 各模态秩 | 相同:R1=R2=R3=R | 可以不同:R1,R2,R3 独立选择 |
| 参数量 | R(I+J+K) | R1R2R3+R1I+R2J+R3K |
| 灵活性 | 更紧凑,但约束更强 | 更灵活,但参数更多 |
CP 是 Tucker 的特例:当核心张量 G 是”超对角”的(只有 grrr=λr 非零),Tucker 分解退化为 CP 分解。这完全类似 SVD(Σ 是对角矩阵)与更一般的矩阵分解 A=UMVT(M 是一般矩阵)的关系。
CP 分解 vs Tucker 分解
CP:超对角核心张量(类似 SVD) | Tucker:一般核心张量(更灵活)
高阶 SVD(HOSVD)
Tucker 分解的一种重要特例是高阶奇异值分解(Higher-Order SVD, HOSVD),由 De Lathauwer, De Moor & Vandewalle (2000) 提出。
HOSVD 的算法非常简洁:
- 对每个模态 n=1,2,3:将张量沿模态 n 展开为矩阵 X(n),对 X(n) 做标准 SVD,取前 Rn 个左奇异向量作为 U(n)
- 计算核心张量:G=X×1U(1)T×2U(2)T×3U(3)T
这给出了因子矩阵 U(n) 各自正交(U(n)TU(n)=I)的 Tucker 分解。HOSVD 不是最优的 Tucker 分解(它不最小化重建误差),但作为初始化很好,也提供了张量的”奇异值”概念。
数值例子:3×3×2 张量的 CP 分解
让我们对一个小张量手动演示 CP 分解的过程。
构造张量
考虑一个 3×3×2 的三阶张量 X,有两个前切片(k=1 和 k=2):
X::1=120240000,X::2=000000003
观察这个张量的结构:
- 前切片 X::1 是秩一矩阵:X::1=120[120]
- 前切片 X::2 也是秩一矩阵:X::2=3⋅001[001]
这提示 X 可以用 R=2 的 CP 分解精确表示。
手动构造 CP 分解
成分 1:对应 X::1 的模式
a1=120,b1=120,c1=[10]
成分 2:对应 X::2 的模式
a2=001,b2=001,c2=[03]
验证
对每个元素 xijk,检查 xijk=∑r=12(ar)i(br)j(cr)k:
当 k=1(第一个前切片):
∑r=12(ar)i(br)j(cr)1=(a1)i(b1)j⋅1+(a2)i(b2)j⋅0=(a1)i(b1)j
所以 (xij1)=a1b1T=120[120]=120240000=X::1 ✓
当 k=2(第二个前切片):
∑r=12(ar)i(br)j(cr)2=(a1)i(b1)j⋅0+(a2)i(b2)j⋅3=3(a2)i(b2)j
所以 (xij2)=3⋅a2b2T=3001[001]=000000003=X::2 ✓
因子矩阵:
A=120001,B=120001,C=[1003]
这个例子展示了 CP 分解如何将张量拆解为独立的”模式”:成分 1 捕捉了第一层中元素 (1,1),(1,2),(2,1),(2,2) 的模式,成分 2 捕捉了第二层中元素 (3,3) 的模式。
知识图谱嵌入:张量分解的核心应用
知识图谱 = 三阶张量
知识图谱(Knowledge Graph, KG)存储的是实体之间的关系,以三元组 (h,r,t) 的形式:
- h(head):头实体,如”爱因斯坦”
- r(relation):关系,如”出生地”
- t(tail):尾实体,如”乌尔姆”
一个知识图谱可以自然地表示为三阶二元张量 X∈{0,1}Ne×Nr×Ne:
xhrt={10如果三元组 (h,r,t) 存在于 KG 中否则(未知或不成立)
其中 Ne 是实体数,Nr 是关系数。这个张量通常极度稀疏——已知的三元组远少于所有可能的组合 Ne2×Nr。
链接预测(link prediction)的目标是:给定不完整的知识图谱,预测缺失的三元组。这本质上是张量补全问题——与矩阵补全(Art. 8)完全类比,只是维度从二维升到了三维。
知识图谱嵌入(KG embedding)方法的核心思想是:学习每个实体和每个关系的低维向量表示,使得存在的三元组得到高分,不存在的三元组得到低分。从张量分解的角度看,这就是对稀疏三阶张量做低秩近似。
RESCAL:全矩阵双线性模型
在介绍更高效的模型之前,先看一个直接使用 Tucker 分解思想的方法——RESCAL(Nickel et al., 2011)。
RESCAL 为每个实体学习一个向量 ei∈Rd,为每个关系学习一个矩阵 Wr∈Rd×d。三元组 (h,r,t) 的评分函数为:
f(h,r,t)=ehTWret
这是一个双线性(bilinear)模型:评分是头实体向量、关系矩阵、尾实体向量的双线性组合。
从张量分解的角度看,RESCAL 等价于对 KG 张量做 Tucker 分解:实体矩阵 E=[e1,…,eNe]T∈RNe×d 是共享的因子矩阵(头和尾共享),关系矩阵 Wr 编码核心张量在不同关系切片上的值。
RESCAL 的问题是:每个关系需要 d2 个参数。当维度 d 较大或关系数 Nr 较多时,参数量巨大,容易过拟合。
DistMult:对角双线性模型
DistMult(Yang et al., 2015)是对 RESCAL 的一个优雅简化:将关系矩阵 Wr 限制为对角矩阵。
每个实体学习一个向量 ei∈Rd,每个关系学习一个向量 wr∈Rd(而不是矩阵)。评分函数为:
f(h,r,t)=ehTdiag(wr)et=∑i=1d(eh)i⋅(wr)i⋅(et)i
逐项理解:
- (eh)i:头实体在第 i 个潜在维度上的表示
- (wr)i:关系 r 在第 i 个潜在维度上的权重——它控制头实体和尾实体在这个维度上的交互强度
- (et)i:尾实体在第 i 个潜在维度上的表示
- 求和:d 个维度上的交互累加为最终评分
与 CP 分解的精确对应:DistMult 就是对 KG 张量做 CP 分解。将 eh、wr、et 视为三个因子矩阵的行,评分 ∑i(eh)i(wr)i(et)i 恰好是 CP 分解中元素 xhrt 的近似公式。
DistMult 的参数量从 RESCAL 的 Ned+Nrd2 降到 Ned+Nrd——大幅减少,但模型表达力也相应受限。
DistMult 的局限:对称性。注意评分函数对 h 和 t 是对称的:
f(h,r,t)=∑i(eh)i(wr)i(et)i=∑i(et)i(wr)i(eh)i=f(t,r,h)
这意味着 DistMult 无法区分 (h,r,t) 和 (t,r,h)——它隐含地假设所有关系都是对称的(如”是同事”)。但很多关系是反对称的(如”是…的父亲”、“位于”),DistMult 在这些关系上表现不佳。
ComplEx:复数域扩展
ComplEx(Trouillon et al., 2016)用一个简单而优美的方法解决了 DistMult 的对称性限制:将嵌入从实数域扩展到复数域。
每个实体学习一个复数向量 eh∈Cd,每个关系学习一个复数向量 wr∈Cd。评分函数为:
f(h,r,t)=Re(∑i=1d(eh)i⋅(wr)i⋅(et)i)
其中 z 表示复数 z 的共轭(conjugate),Re(⋅) 取实部。
为什么复数打破了对称性? 关键在于尾实体取了共轭 (et)i。对于复数 z=a+bi,共轭 zˉ=a−bi。这引入了头实体和尾实体之间的不对称性:
f(h,r,t)=Re(∑i(eh)i(wr)i(et)i)=Re(∑i(et)i(wr)i(eh)i)=f(t,r,h)
一般来说 f(h,r,t)=f(t,r,h),除非所有嵌入恰好是实数(此时退化为 DistMult)。
展开到实数:将复数向量写为实部和虚部 eh=Re(eh)+i⋅Im(eh),评分函数可以完全用实数运算表达:
f(h,r,t)=∑i=1d[Re(eh)i⋅Re(wr)i⋅Re(et)i+Re(eh)i⋅Im(wr)i⋅Im(et)i
+Im(eh)i⋅Re(wr)i⋅Im(et)i−Im(eh)i⋅Im(wr)i⋅Re(et)i]
这可以用标准的实数张量运算实现——不需要复数运算库。实际参数量是 DistMult 的两倍(每个实体和关系需要 2d 个实数参数),但模型能处理非对称关系。
方法谱系总结
| 模型 | 评分函数 f(h,r,t) | 关系矩阵 | 对称性 | 参数量 |
|---|
| RESCAL | ehTWret | 一般矩阵 Wr∈Rd×d | 可非对称 | Ned+Nrd2 |
| DistMult | ∑i(eh)i(wr)i(et)i | 对角 diag(wr) | 对称 | Ned+Nrd |
| ComplEx | Re(∑i(eh)i(wr)i(et)i) | 复对角 | 可非对称 | 2Ned+2Nrd |
从张量分解的角度:
- RESCAL ≈ Tucker 分解(关系矩阵是核心张量的切片)
- DistMult ≈ CP 分解(核心张量退化为超对角)
- ComplEx ≈ 复数域的 CP 分解
这条从 RESCAL → DistMult → ComplEx 的演化线恰好对应了 Tucker → CP → 复数 CP 的张量分解谱系,每一步都在表达力和参数效率之间寻找更好的平衡。
Part 1 总结:从矩阵到张量的分解弧线
本文是 Part 1 “拆”的收官之作。让我们回顾整条弧线。
工具链
Part 1 前四篇建立了四件核心工具:
| 工具 | 文章 | 核心内容 |
|---|
| 特征分解 | Art. 2 特征分解 | A=QΛQ−1,方阵的对角化 |
| SVD | Art. 3 SVD | A=UΣVT,任意矩阵的分解,Eckart-Young 定理 |
| 范数 | Art. 4 范数与条件数 | ∥⋅∥F, ∥⋅∥∗, ∥⋅∥2,衡量近似质量 |
| 微积分 | Art. 5 矩阵微积分 | Jacobian, Hessian,分析变化敏感性 |
方法谱系
后八篇用这套工具解决了不同约束下的分解问题:
SVD(无约束最优)
↙↓↘
PCA(正交)矩阵补全(采样)NMF(非负)
↓↓↓
随机化 SVD(大规模)Robust PCA(低秩+稀疏)MF/FM(预测)
↘↙
Word2Vec(隐式分解)
↓
张量分解(高阶推广)
每种方法都可以理解为在 SVD 的基础上添加了不同的约束或推广:
核心主题
整个 Part 1 围绕一个核心主题:矩阵是数据的容器,分解它就是提取隐藏的低维结构。 不同的数据结构和不同的约束需要不同的分解方法,但它们共享同一套数学工具——特征分解、SVD、范数、微积分。
张量分解将这条线索从二维自然推广到高阶:数据不止两个维度时,CP 分解和 Tucker 分解提供了类似的”因子化”框架,而知识图谱嵌入展示了这个框架在结构化数据上的威力。
从”拆”到”传”
但到目前为止,矩阵始终扮演的是数据容器的角色——我们把数据装进矩阵(或张量),然后拆开它看结构。Part 2 将完成一个认知转换:
矩阵不再只是数据的容器——它本身就是一个过程。乘一次矩阵 = 执行一步操作。
转移矩阵(乘一次 = 状态转移一步)、图 Laplacian(乘一次 = 信号扩散一步)、kernel 矩阵(内积 = 相似度度量)——这些矩阵编码的不是数据,而是规则。Part 1 的工具——特征分解、SVD——仍然是核心武器,但现在它们揭示的不是”数据里藏着什么结构”,而是”反复执行这个过程会发生什么”。
下一篇进入 Part 2 的全景:算子矩阵的三大族系——随机矩阵、图结构矩阵、相似度矩阵——以及它们共享的核心定理。