本站内容由 AI 生成,可能存在错误。如发现问题,欢迎到 GitHub Issues 反馈。

张量分解与知识图谱嵌入:从二维到高阶

张量分解与知识图谱嵌入:从二维到高阶

更新于 2026-04-23

上一篇 Robust PCA 展示了 nuclear 范数与 1\ell_1 范数的组合如何将低秩信号和稀疏异常值精确分离。至此,Part 1 的所有矩阵分解方法——从 SVD 的无约束最优到 PCA 的正交降维、NMF 的非负部件、矩阵补全的采样恢复、Robust PCA 的低秩+稀疏分离——都是在二维矩阵上操作的。

但现实世界的数据往往不止两个维度。用户-物品-时间(谁在什么时候评价了什么)、主语-谓语-宾语(知识图谱中的三元组)、像素行-像素列-颜色通道——这些数据天然是三维甚至更高维的。强行把它们”压扁”成二维矩阵会丢失维度间的交互结构。

张量分解(Tensor Decomposition)是矩阵分解的高阶推广:矩阵是二阶张量,向量是一阶张量,三维”数据立方体”是三阶张量,以此类推。Part 1 建立的所有分解直觉——低秩近似、外积展开、因子矩阵——都可以自然地推广到张量。本文聚焦两种最经典的张量分解(CP 分解和 Tucker 分解),然后展示它们在知识图谱嵌入中的应用(DistMult、ComplEx)。

从矩阵到张量:基本概念

什么是张量?

在本文的语境下,张量(tensor)就是多维数组——矩阵的高阶推广。

数学对象例子符号
0标量温度 t=25t = 25aa
1向量特征向量 xRn\mathbf{x} \in \mathbb{R}^nx\mathbf{x}
2矩阵评分矩阵 ARm×nA \in \mathbb{R}^{m \times n}AA
3三阶张量用户×物品×时间XRI×J×K\mathcal{X} \in \mathbb{R}^{I \times J \times K}
NNNN 阶张量高阶数据XRI1×I2××IN\mathcal{X} \in \mathbb{R}^{I_1 \times I_2 \times \cdots \times I_N}
从标量到张量:维度的推广
标量0阶a向量1阶x ∈ ℝⁿ矩阵2阶A ∈ ℝᵐˣⁿ三阶张量3阶𝒳 ∈ ℝᴵˣᴶˣᴷ

我们用花体字母 X\mathcal{X} 表示张量,遵循 Kolda & Bader (2009) 的符号约定。三阶张量 XRI×J×K\mathcal{X} \in \mathbb{R}^{I \times J \times K} 的元素记为 xijkx_{ijk},其中 i=1,,Ii = 1, \ldots, Ij=1,,Jj = 1, \ldots, Jk=1,,Kk = 1, \ldots, K

术语注意:这里的”张量”是数值分析和机器学习中的用法——多维数组。它与微分几何/物理学中”张量”的定义(满足特定坐标变换规则的多线性映射)相关但不完全相同。ML 中的用法更具体:一个三阶张量就是一个三维数组。

模态与切片

张量的每个维度称为一个模态(mode)。三阶张量 XRI×J×K\mathcal{X} \in \mathbb{R}^{I \times J \times K} 有三个模态:

  • 模态 1(mode-1):沿第一个维度(II 行),大小为 II
  • 模态 2(mode-2):沿第二个维度(JJ 列),大小为 JJ
  • 模态 3(mode-3):沿第三个维度(KK 层),大小为 KK

切片(slice)是固定一个模态索引后得到的矩阵。三阶张量有三种切片方式:

切片类型固定维度结果
前切片(frontal slice)kk 固定X::kRI×JX_{::k} \in \mathbb{R}^{I \times J}k=1,,Kk = 1, \ldots, K
侧切片(lateral slice)jj 固定X:j:RI×KX_{:j:} \in \mathbb{R}^{I \times K}j=1,,Jj = 1, \ldots, J
水平切片(horizontal slice)ii 固定Xi::RJ×KX_{i::} \in \mathbb{R}^{J \times K}i=1,,Ii = 1, \ldots, I

直觉上,把三阶张量想象成一叠矩阵:KKI×JI \times J 的”前切片”堆叠在一起。

三阶张量的三种切片前切片 X_{::k}固定 k → I × J 矩阵侧切片 X_{:j:}固定 j → I × K 矩阵水平切片 X_{i::}固定 i → J × K 矩阵I × J × K固定一个模态的索引 → 得到二维矩阵"切片",三阶张量可看作一叠矩阵

外积与秩一张量

回忆矩阵分解中的关键概念——外积(outer product)和秩一矩阵

秩一矩阵=abT,(abT)ij=aibj\text{秩一矩阵} = \mathbf{a} \mathbf{b}^T, \quad (\mathbf{a} \mathbf{b}^T)_{ij} = a_i b_j

SVD 的外积展开 A=r=1RσrurvrTA = \sum_{r=1}^{R} \sigma_r \mathbf{u}_r \mathbf{v}_r^T 将矩阵表示为秩一矩阵之和(Art. 3 SVD)。

对张量,外积推广为:

秩一张量=abc,(abc)ijk=aibjck\text{秩一张量} = \mathbf{a} \circ \mathbf{b} \circ \mathbf{c}, \quad (\mathbf{a} \circ \mathbf{b} \circ \mathbf{c})_{ijk} = a_i b_j c_k

其中 aRI\mathbf{a} \in \mathbb{R}^IbRJ\mathbf{b} \in \mathbb{R}^JcRK\mathbf{c} \in \mathbb{R}^K\circ 表示外积。一个秩一张量的每个元素是三个向量对应分量的乘积——它的结构完全由三个向量决定。

外积:从秩一矩阵到秩一张量二阶(矩阵)abᵀ=abᵀ(abᵀ)ᵢⱼ = aᵢ · bⱼ三阶(张量)abc=a◦b◦c(a◦b◦c)ᵢⱼₖ = aᵢ · bⱼ · cₖSVD 的外积展开 A = Σ σᵣuᵣvᵣᵀ 自然推广为 CP 分解 X ≈ Σ λᵣaᵣ◦bᵣ◦cᵣ

张量秩

矩阵的秩定义为将矩阵表示为秩一矩阵之和所需的最小项数。张量秩的定义完全类比:

定义:张量 X\mathcal{X}(tensor rank)是将 X\mathcal{X} 精确表示为秩一张量之和所需的最小项数 RR

rank(X)=min{R:X=r=1Rarbrcr}\text{rank}(\mathcal{X}) = \min\left\{R : \mathcal{X} = \sum_{r=1}^{R} \mathbf{a}_r \circ \mathbf{b}_r \circ \mathbf{c}_r\right\}

但这里有一个与矩阵截然不同的情况:张量秩的计算是 NP-hard 的(Håstad, 1990)。矩阵的秩可以通过 SVD 轻松求得(数正的奇异值个数),但张量没有这样的”万能工具”。此外,张量没有 Eckart-Young 定理的直接类比——最佳秩 RR 近似不一定存在(下一节详述)。

这些差异使得张量分解在数学上比矩阵分解复杂得多,但也更加丰富。

CP 分解

定义与直觉

CP 分解(CANDECOMP/PARAFAC decomposition)是 SVD 外积展开的直接高阶推广。它将三阶张量分解为秩一张量的加权和:

Xr=1Rλrarbrcr\mathcal{X} \approx \sum_{r=1}^{R} \lambda_r \, \mathbf{a}_r \circ \mathbf{b}_r \circ \mathbf{c}_r

其中:

  • RR 是 CP 秩(分解的成分数,类比矩阵分解中的截断秩 kk
  • λr>0\lambda_r > 0 是第 rr 个成分的权重(类比奇异值 σr\sigma_r
  • arRI\mathbf{a}_r \in \mathbb{R}^IbrRJ\mathbf{b}_r \in \mathbb{R}^JcrRK\mathbf{c}_r \in \mathbb{R}^K 是三个模态的因子向量
  • 通常约定因子向量为单位向量 ar=br=cr=1\|\mathbf{a}_r\| = \|\mathbf{b}_r\| = \|\mathbf{c}_r\| = 1,权重 λr\lambda_r 吸收缩放

在实际应用中,权重 λr\lambda_r 常常被吸收进因子向量中,简写为:

Xr=1Rarbrcr\mathcal{X} \approx \sum_{r=1}^{R} \mathbf{a}_r \circ \mathbf{b}_r \circ \mathbf{c}_r

逐项理解:

  • 每个 arbrcr\mathbf{a}_r \circ \mathbf{b}_r \circ \mathbf{c}_r:一个秩一张量——它的元素 (ar)i(br)j(cr)k(a_r)_i (b_r)_j (c_r)_k 完全由三个向量在各模态上的值决定。如果把张量想象成”数据立方体”,每个秩一成分是一个特定的”模式”,在三个模态上各有一个特征轮廓。
  • 求和 r=1R\sum_{r=1}^R:原始张量被近似为 RR 个这样的模式的叠加,完全类似 SVD 中 Ar=1kσrurvrTA \approx \sum_{r=1}^k \sigma_r \mathbf{u}_r \mathbf{v}_r^T
  • CP 秩 RR:控制近似的精度,RR 越大近似越好,但也越复杂。

因子矩阵表示

将所有因子向量组织成矩阵是更紧凑的表达:

A=[a1a2aR]RI×RA = \begin{bmatrix} \mathbf{a}_1 & \mathbf{a}_2 & \cdots & \mathbf{a}_R \end{bmatrix} \in \mathbb{R}^{I \times R}

B=[b1b2bR]RJ×RB = \begin{bmatrix} \mathbf{b}_1 & \mathbf{b}_2 & \cdots & \mathbf{b}_R \end{bmatrix} \in \mathbb{R}^{J \times R}

C=[c1c2cR]RK×RC = \begin{bmatrix} \mathbf{c}_1 & \mathbf{c}_2 & \cdots & \mathbf{c}_R \end{bmatrix} \in \mathbb{R}^{K \times R}

其中 AABBCC 分别称为三个模态的因子矩阵(factor matrices)。CP 分解可以用因子矩阵简洁地写为:

X[ ⁣[A,B,C] ⁣]xijkr=1Rairbjrckr\mathcal{X} \approx [\![ A, B, C ]\!] \quad \text{即} \quad x_{ijk} \approx \sum_{r=1}^{R} a_{ir} b_{jr} c_{kr}

这里 [ ⁣[A,B,C] ⁣][\![ A, B, C ]\!] 是 Kruskal 记号(Kruskal notation),表示由因子矩阵 A,B,CA, B, C 定义的 CP 分解。

与 SVD 的类比

CP 分解与 SVD 的关系可以精确对照:

SVD(矩阵)CP 分解(张量)
对象ARm×nA \in \mathbb{R}^{m \times n}XRI×J×K\mathcal{X} \in \mathbb{R}^{I \times J \times K}
分解形式A=r=1RσrurvrTA = \sum_{r=1}^{R} \sigma_r \mathbf{u}_r \mathbf{v}_r^TX=r=1Rλrarbrcr\mathcal{X} = \sum_{r=1}^{R} \lambda_r \mathbf{a}_r \circ \mathbf{b}_r \circ \mathbf{c}_r
秩一成分urvrT\mathbf{u}_r \mathbf{v}_r^T(两个向量的外积)arbrcr\mathbf{a}_r \circ \mathbf{b}_r \circ \mathbf{c}_r(三个向量的外积)
因子矩阵URm×RU \in \mathbb{R}^{m \times R}, VRn×RV \in \mathbb{R}^{n \times R}ARI×RA \in \mathbb{R}^{I \times R}, BRJ×RB \in \mathbb{R}^{J \times R}, CRK×RC \in \mathbb{R}^{K \times R}
权重奇异值 σr\sigma_r(有序)λr\lambda_r不一定有序
正交性UTU=IU^TU = I, VTV=IV^TV = I不保证正交
存在性总是存在精确分解总是存在,但最佳低秩近似不一定存在
计算秩O(mnmin(m,n))O(mn\min(m,n))NP-hard

最后两行的差异值得强调:

没有 Eckart-Young 定理:对矩阵,截断 SVD 给出 Frobenius 范数下的最佳秩 kk 近似(Art. 3 SVD,Eckart-Young 定理)。但对三阶及更高阶张量,最佳低秩近似可能不存在——存在张量序列可以无限逼近目标精度但永远达不到(De Silva & Lim, 2008)。这意味着 CP 分解的优化问题可能没有最优解,只有逼近序列。实际中,这通过添加正则化或约束来避免。

不保证正交:SVD 的左/右奇异向量构成正交基,CP 分解的因子向量一般不正交。

CP 分解的可视化

下面的图展示了一个简单的 3×3×3 张量的 CP 分解(R=2R = 2)。原始张量被近似为两个秩一张量之和,每个秩一张量由三个向量的外积定义。颜色深浅表示元素大小。

CP 分解:三阶张量 = 秩一张量之和
将 I×J×K 张量分解为 R 个外积之和
原始张量 (3×3×3) 成分 1: a₁ ∘ b₁ ∘ c₁ 2.0 1.0 0.0 a₁ 1.0 2.0 0.0 b₁ 2.0 1.0 0.0 c₁+成分 2: a₂ ∘ b₂ ∘ c₂ 0.0 1.0 2.0 a₂ 0.0 1.0 2.0 b₂ 0.0 1.0 2.0 c₂𝒳 ≈ Σᵣ aᵣ ∘ bᵣ ∘ cᵣ每个秩一成分 aᵣ ∘ bᵣ ∘ cᵣ 是三个向量的外积,构成一个"薄片"张量

CP 分解的算法:交替最小二乘(ALS)

CP 分解的标准算法是交替最小二乘(Alternating Least Squares, ALS),思路与 NMF 的交替优化一致。

目标函数

minA,B,CX[ ⁣[A,B,C] ⁣]F2=minA,B,Ci,j,k(xijkr=1Rairbjrckr)2\min_{A, B, C} \left\| \mathcal{X} - [\![ A, B, C ]\!] \right\|_F^2 = \min_{A, B, C} \sum_{i,j,k} \left( x_{ijk} - \sum_{r=1}^R a_{ir} b_{jr} c_{kr} \right)^2

其中 F\|\cdot\|_F 是张量的 Frobenius 范数(所有元素平方和的平方根),直接推广自矩阵的 Frobenius 范数。

同时优化三个因子矩阵 A,B,CA, B, C 是非凸问题。ALS 的策略是固定两个,优化第三个——每个子问题都是标准的最小二乘,有封闭解。

ALS 迭代

步骤 1:固定 B,CB, C,更新 AA

为了理解这一步,我们需要展开(unfold/matricize)操作。将三阶张量 XRI×J×K\mathcal{X} \in \mathbb{R}^{I \times J \times K} 沿模态 1 展开为矩阵 X(1)RI×JKX_{(1)} \in \mathbb{R}^{I \times JK}——把 J×KJ \times K 个”纤维”排成列。

在这个展开下,CP 分解变为矩阵分解:

X(1)A(CB)TX_{(1)} \approx A (C \odot B)^T

其中 \odot 表示 Khatri-Rao 乘积(column-wise Kronecker product):

(CB)(k1)J+j,r=ckrbjr(C \odot B)_{(k-1)J+j, \, r} = c_{kr} \cdot b_{jr}

CBRJK×RC \odot B \in \mathbb{R}^{JK \times R} 的每一列是 CCBB 对应列的 Kronecker 乘积。

固定 B,CB, C 后,对 AA 的优化变为标准最小二乘:

minAX(1)A(CB)TF2\min_A \| X_{(1)} - A (C \odot B)^T \|_F^2

封闭解:

AX(1)(CB)[(CTC)(BTB)]1A \leftarrow X_{(1)} (C \odot B) \left[ (C^T C) * (B^T B) \right]^{-1}

其中 * 表示 Hadamard 乘积(逐元素乘法)。注意 (CB)T(CB)=(CTC)(BTB)(C \odot B)^T(C \odot B) = (C^TC) * (B^TB)(Khatri-Rao 乘积的重要性质),所以括号内是一个 R×RR \times R 的小矩阵——计算量可控。

步骤 2:固定 A,CA, C,更新 BB 对称地:

BX(2)(CA)[(CTC)(ATA)]1B \leftarrow X_{(2)} (C \odot A) \left[ (C^T C) * (A^T A) \right]^{-1}

步骤 3:固定 A,BA, B,更新 CC 对称地:

CX(3)(BA)[(BTB)(ATA)]1C \leftarrow X_{(3)} (B \odot A) \left[ (B^T B) * (A^T A) \right]^{-1}

重复步骤 1-2-3 直到收敛(重建误差变化小于阈值)。

收敛性:与 NMF 的乘法更新类似,ALS 的目标函数在每一步单调不增,保证收敛到驻点。但由于问题非凸,不保证全局最优——实践中多次随机初始化,选最优结果。

Tucker 分解

定义

Tucker 分解(Tucker decomposition, Tucker 1966)是 CP 分解的推广——它引入了一个核心张量(core tensor)来允许不同模态的因子之间有交互。

XG×1U(1)×2U(2)×3U(3)\mathcal{X} \approx \mathcal{G} \times_1 U^{(1)} \times_2 U^{(2)} \times_3 U^{(3)}

逐项理解:

  • U(1)RI×R1U^{(1)} \in \mathbb{R}^{I \times R_1}:模态 1 的因子矩阵(R1R_1 个基向量)
  • U(2)RJ×R2U^{(2)} \in \mathbb{R}^{J \times R_2}:模态 2 的因子矩阵(R2R_2 个基向量)
  • U(3)RK×R3U^{(3)} \in \mathbb{R}^{K \times R_3}:模态 3 的因子矩阵(R3R_3 个基向量)
  • GRR1×R2×R3\mathcal{G} \in \mathbb{R}^{R_1 \times R_2 \times R_3}核心张量,编码三个模态因子之间的交互强度
  • ×n\times_n 表示模态-nn 乘积(mode-nn product)

模态乘积

模态-nn 乘积 Y=X×nU\mathcal{Y} = \mathcal{X} \times_n U 将张量 X\mathcal{X} 在第 nn 个模态上与矩阵 UU 相乘。对三阶张量,模态-1 乘积的元素为:

(X×1U)ijk=p=1Iuipxpjk(\mathcal{X} \times_1 U)_{ijk} = \sum_{p=1}^{I} u_{ip} \, x_{pjk}

直觉上,模态乘积就是”沿一个维度做线性变换”——它把原始模态的 II 个坐标变换为新的 R1R_1 个坐标,类似矩阵乘法 Y=UAY = UAAA 的行空间投影到 UU 的列空间。

Tucker 分解写成元素形式:

xijkp=1R1q=1R2s=1R3gpqsuip(1)ujq(2)uks(3)x_{ijk} \approx \sum_{p=1}^{R_1} \sum_{q=1}^{R_2} \sum_{s=1}^{R_3} g_{pqs} \, u^{(1)}_{ip} \, u^{(2)}_{jq} \, u^{(3)}_{ks}

与 CP 分解对比:

CP 分解Tucker 分解
核心张量超对角:gpqs=λpδpqsg_{pqs} = \lambda_p \delta_{pqs}(只有 p=q=sp=q=s 时非零)一般的 GRR1×R2×R3\mathcal{G} \in \mathbb{R}^{R_1 \times R_2 \times R_3}
各模态秩相同:R1=R2=R3=RR_1 = R_2 = R_3 = R可以不同:R1,R2,R3R_1, R_2, R_3 独立选择
参数量R(I+J+K)R(I + J + K)R1R2R3+R1I+R2J+R3KR_1 R_2 R_3 + R_1 I + R_2 J + R_3 K
灵活性更紧凑,但约束更强更灵活,但参数更多

CP 是 Tucker 的特例:当核心张量 G\mathcal{G} 是”超对角”的(只有 grrr=λrg_{rrr} = \lambda_r 非零),Tucker 分解退化为 CP 分解。这完全类似 SVD(Σ\Sigma 是对角矩阵)与更一般的矩阵分解 A=UMVTA = UMV^TMM 是一般矩阵)的关系。

CP 分解 vs Tucker 分解
CP:超对角核心张量(类似 SVD) | Tucker:一般核心张量(更灵活)
CP 分解𝒳a_1b_1c_1+a_2b_2c_2+a_3b_3c_3核心张量 = 超对角(只有 g_rrr ≠ 0)参数:R(I + J + K)Tucker 分解𝒳𝒢×₁ U⁽¹⁾×₂ U⁽²⁾×₃ U⁽³⁾核心张量 = 一般的 R₁×R₂×R₃ 张量参数:R₁R₂R₃ + R₁I + R₂J + R₃KCP 是 Tucker 的特例:当核心张量为超对角时 Tucker → CP类比:SVD(Σ 对角)是一般分解 UMVᵀ(M 一般矩阵)的特例

高阶 SVD(HOSVD)

Tucker 分解的一种重要特例是高阶奇异值分解(Higher-Order SVD, HOSVD),由 De Lathauwer, De Moor & Vandewalle (2000) 提出。

HOSVD 的算法非常简洁:

  1. 对每个模态 n=1,2,3n = 1, 2, 3:将张量沿模态 nn 展开为矩阵 X(n)X_{(n)},对 X(n)X_{(n)} 做标准 SVD,取前 RnR_n 个左奇异向量作为 U(n)U^{(n)}
  2. 计算核心张量:G=X×1U(1)T×2U(2)T×3U(3)T\mathcal{G} = \mathcal{X} \times_1 U^{(1)T} \times_2 U^{(2)T} \times_3 U^{(3)T}

这给出了因子矩阵 U(n)U^{(n)} 各自正交(U(n)TU(n)=IU^{(n)T}U^{(n)} = I)的 Tucker 分解。HOSVD 不是最优的 Tucker 分解(它不最小化重建误差),但作为初始化很好,也提供了张量的”奇异值”概念。

数值例子:3×3×2 张量的 CP 分解

让我们对一个小张量手动演示 CP 分解的过程。

构造张量

考虑一个 3×3×23 \times 3 \times 2 的三阶张量 X\mathcal{X},有两个前切片(k=1k=1k=2k=2):

X::1=[120240000],X::2=[000000003]X_{::1} = \begin{bmatrix} 1 & 2 & 0 \\ 2 & 4 & 0 \\ 0 & 0 & 0 \end{bmatrix}, \quad X_{::2} = \begin{bmatrix} 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 3 \end{bmatrix}

观察这个张量的结构:

  • 前切片 X::1X_{::1} 是秩一矩阵:X::1=[120][120]X_{::1} = \begin{bmatrix}1\\2\\0\end{bmatrix}\begin{bmatrix}1&2&0\end{bmatrix}
  • 前切片 X::2X_{::2} 也是秩一矩阵:X::2=3[001][001]X_{::2} = 3 \cdot \begin{bmatrix}0\\0\\1\end{bmatrix}\begin{bmatrix}0&0&1\end{bmatrix}

这提示 X\mathcal{X} 可以用 R=2R = 2 的 CP 分解精确表示。

手动构造 CP 分解

成分 1:对应 X::1X_{::1} 的模式

a1=[120],b1=[120],c1=[10]\mathbf{a}_1 = \begin{bmatrix}1\\2\\0\end{bmatrix}, \quad \mathbf{b}_1 = \begin{bmatrix}1\\2\\0\end{bmatrix}, \quad \mathbf{c}_1 = \begin{bmatrix}1\\0\end{bmatrix}

成分 2:对应 X::2X_{::2} 的模式

a2=[001],b2=[001],c2=[03]\mathbf{a}_2 = \begin{bmatrix}0\\0\\1\end{bmatrix}, \quad \mathbf{b}_2 = \begin{bmatrix}0\\0\\1\end{bmatrix}, \quad \mathbf{c}_2 = \begin{bmatrix}0\\3\end{bmatrix}

验证

对每个元素 xijkx_{ijk},检查 xijk=r=12(ar)i(br)j(cr)kx_{ijk} = \sum_{r=1}^{2} (a_r)_i (b_r)_j (c_r)_k

k=1k = 1(第一个前切片):

r=12(ar)i(br)j(cr)1=(a1)i(b1)j1+(a2)i(b2)j0=(a1)i(b1)j\sum_{r=1}^{2} (a_r)_i (b_r)_j (c_r)_1 = (a_1)_i (b_1)_j \cdot 1 + (a_2)_i (b_2)_j \cdot 0 = (a_1)_i (b_1)_j

所以 (xij1)=a1b1T=[120][120]=[120240000]=X::1(x_{ij1}) = \mathbf{a}_1 \mathbf{b}_1^T = \begin{bmatrix}1\\2\\0\end{bmatrix}\begin{bmatrix}1&2&0\end{bmatrix} = \begin{bmatrix}1&2&0\\2&4&0\\0&0&0\end{bmatrix} = X_{::1}

k=2k = 2(第二个前切片):

r=12(ar)i(br)j(cr)2=(a1)i(b1)j0+(a2)i(b2)j3=3(a2)i(b2)j\sum_{r=1}^{2} (a_r)_i (b_r)_j (c_r)_2 = (a_1)_i (b_1)_j \cdot 0 + (a_2)_i (b_2)_j \cdot 3 = 3(a_2)_i (b_2)_j

所以 (xij2)=3a2b2T=3[001][001]=[000000003]=X::2(x_{ij2}) = 3 \cdot \mathbf{a}_2 \mathbf{b}_2^T = 3\begin{bmatrix}0\\0\\1\end{bmatrix}\begin{bmatrix}0&0&1\end{bmatrix} = \begin{bmatrix}0&0&0\\0&0&0\\0&0&3\end{bmatrix} = X_{::2}

因子矩阵:

A=[102001],B=[102001],C=[1003]A = \begin{bmatrix}1&0\\2&0\\0&1\end{bmatrix}, \quad B = \begin{bmatrix}1&0\\2&0\\0&1\end{bmatrix}, \quad C = \begin{bmatrix}1&0\\0&3\end{bmatrix}

这个例子展示了 CP 分解如何将张量拆解为独立的”模式”:成分 1 捕捉了第一层中元素 (1,1),(1,2),(2,1),(2,2)(1,1), (1,2), (2,1), (2,2) 的模式,成分 2 捕捉了第二层中元素 (3,3)(3,3) 的模式。

知识图谱嵌入:张量分解的核心应用

知识图谱 = 三阶张量

知识图谱(Knowledge Graph, KG)存储的是实体之间的关系,以三元组 (h,r,t)(h, r, t) 的形式:

  • hh(head):头实体,如”爱因斯坦”
  • rr(relation):关系,如”出生地”
  • tt(tail):尾实体,如”乌尔姆”

一个知识图谱可以自然地表示为三阶二元张量 X{0,1}Ne×Nr×Ne\mathcal{X} \in \{0, 1\}^{N_e \times N_r \times N_e}

xhrt={1如果三元组 (h,r,t) 存在于 KG 中0否则(未知或不成立)x_{hrt} = \begin{cases} 1 & \text{如果三元组 } (h, r, t) \text{ 存在于 KG 中} \\ 0 & \text{否则(未知或不成立)} \end{cases}

其中 NeN_e 是实体数,NrN_r 是关系数。这个张量通常极度稀疏——已知的三元组远少于所有可能的组合 Ne2×NrN_e^2 \times N_r

链接预测(link prediction)的目标是:给定不完整的知识图谱,预测缺失的三元组。这本质上是张量补全问题——与矩阵补全(Art. 8)完全类比,只是维度从二维升到了三维。

知识图谱嵌入(KG embedding)方法的核心思想是:学习每个实体和每个关系的低维向量表示,使得存在的三元组得到高分,不存在的三元组得到低分。从张量分解的角度看,这就是对稀疏三阶张量做低秩近似。

知识图谱 → 三阶二元张量三元组 (h, r, t)(爱因斯坦, 出生地, 乌尔姆)(牛顿, 出生地, 林肯郡)(爱因斯坦, 职业, 物理学家)110头实体 (Nₑ)尾实体 (Nₑ)关系 (Nᵣ)𝒳 ∈ {0,1}^{Nₑ×Nᵣ×Nₑ}链接预测 = 张量补全:预测缺失的 1,与矩阵补全(Art. 8)完全类比

RESCAL:全矩阵双线性模型

在介绍更高效的模型之前,先看一个直接使用 Tucker 分解思想的方法——RESCAL(Nickel et al., 2011)。

RESCAL 为每个实体学习一个向量 eiRd\mathbf{e}_i \in \mathbb{R}^d,为每个关系学习一个矩阵 WrRd×dW_r \in \mathbb{R}^{d \times d}。三元组 (h,r,t)(h, r, t) 的评分函数为:

f(h,r,t)=ehTWretf(h, r, t) = \mathbf{e}_h^T W_r \, \mathbf{e}_t

这是一个双线性(bilinear)模型:评分是头实体向量、关系矩阵、尾实体向量的双线性组合。

从张量分解的角度看,RESCAL 等价于对 KG 张量做 Tucker 分解:实体矩阵 E=[e1,,eNe]TRNe×dE = [\mathbf{e}_1, \ldots, \mathbf{e}_{N_e}]^T \in \mathbb{R}^{N_e \times d} 是共享的因子矩阵(头和尾共享),关系矩阵 WrW_r 编码核心张量在不同关系切片上的值。

RESCAL 的问题是:每个关系需要 d2d^2 个参数。当维度 dd 较大或关系数 NrN_r 较多时,参数量巨大,容易过拟合。

DistMult:对角双线性模型

DistMult(Yang et al., 2015)是对 RESCAL 的一个优雅简化:将关系矩阵 WrW_r 限制为对角矩阵

每个实体学习一个向量 eiRd\mathbf{e}_i \in \mathbb{R}^d,每个关系学习一个向量 wrRd\mathbf{w}_r \in \mathbb{R}^d(而不是矩阵)。评分函数为:

f(h,r,t)=ehTdiag(wr)et=i=1d(eh)i(wr)i(et)if(h, r, t) = \mathbf{e}_h^T \text{diag}(\mathbf{w}_r) \, \mathbf{e}_t = \sum_{i=1}^d (e_h)_i \cdot (w_r)_i \cdot (e_t)_i

逐项理解:

  • (eh)i(e_h)_i:头实体在第 ii 个潜在维度上的表示
  • (wr)i(w_r)_i:关系 rr 在第 ii 个潜在维度上的权重——它控制头实体和尾实体在这个维度上的交互强度
  • (et)i(e_t)_i:尾实体在第 ii 个潜在维度上的表示
  • 求和:dd 个维度上的交互累加为最终评分

与 CP 分解的精确对应:DistMult 就是对 KG 张量做 CP 分解。将 eh\mathbf{e}_hwr\mathbf{w}_ret\mathbf{e}_t 视为三个因子矩阵的行,评分 i(eh)i(wr)i(et)i\sum_i (e_h)_i (w_r)_i (e_t)_i 恰好是 CP 分解中元素 xhrtx_{hrt} 的近似公式。

DistMult 的参数量从 RESCAL 的 Ned+Nrd2N_e d + N_r d^2 降到 Ned+NrdN_e d + N_r d——大幅减少,但模型表达力也相应受限。

DistMult 的局限:对称性。注意评分函数对 hhtt 是对称的:

f(h,r,t)=i(eh)i(wr)i(et)i=i(et)i(wr)i(eh)i=f(t,r,h)f(h, r, t) = \sum_i (e_h)_i (w_r)_i (e_t)_i = \sum_i (e_t)_i (w_r)_i (e_h)_i = f(t, r, h)

这意味着 DistMult 无法区分 (h,r,t)(h, r, t)(t,r,h)(t, r, h)——它隐含地假设所有关系都是对称的(如”是同事”)。但很多关系是反对称的(如”是…的父亲”、“位于”),DistMult 在这些关系上表现不佳。

ComplEx:复数域扩展

ComplEx(Trouillon et al., 2016)用一个简单而优美的方法解决了 DistMult 的对称性限制:将嵌入从实数域扩展到复数域

每个实体学习一个复数向量 ehCd\mathbf{e}_h \in \mathbb{C}^d,每个关系学习一个复数向量 wrCd\mathbf{w}_r \in \mathbb{C}^d。评分函数为:

f(h,r,t)=Re(i=1d(eh)i(wr)i(et)i)f(h, r, t) = \text{Re}\left( \sum_{i=1}^d (e_h)_i \cdot (w_r)_i \cdot \overline{(e_t)_i} \right)

其中 z\overline{z} 表示复数 zz 的共轭(conjugate),Re()\text{Re}(\cdot) 取实部。

为什么复数打破了对称性? 关键在于尾实体取了共轭 (et)i\overline{(e_t)_i}。对于复数 z=a+biz = a + bi,共轭 zˉ=abi\bar{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) = \text{Re}\left( \sum_i (e_h)_i (w_r)_i \overline{(e_t)_i} \right) \neq \text{Re}\left( \sum_i (e_t)_i (w_r)_i \overline{(e_h)_i} \right) = f(t, r, h)

一般来说 f(h,r,t)f(t,r,h)f(h, r, t) \neq f(t, r, h),除非所有嵌入恰好是实数(此时退化为 DistMult)。

展开到实数:将复数向量写为实部和虚部 eh=Re(eh)+iIm(eh)\mathbf{e}_h = \text{Re}(\mathbf{e}_h) + i \cdot \text{Im}(\mathbf{e}_h),评分函数可以完全用实数运算表达:

f(h,r,t)=i=1d[Re(eh)iRe(wr)iRe(et)i+Re(eh)iIm(wr)iIm(et)if(h, r, t) = \sum_{i=1}^d \Big[ \text{Re}(e_h)_i \cdot \text{Re}(w_r)_i \cdot \text{Re}(e_t)_i + \text{Re}(e_h)_i \cdot \text{Im}(w_r)_i \cdot \text{Im}(e_t)_i +Im(eh)iRe(wr)iIm(et)iIm(eh)iIm(wr)iRe(et)i]+ \text{Im}(e_h)_i \cdot \text{Re}(w_r)_i \cdot \text{Im}(e_t)_i - \text{Im}(e_h)_i \cdot \text{Im}(w_r)_i \cdot \text{Re}(e_t)_i \Big]

这可以用标准的实数张量运算实现——不需要复数运算库。实际参数量是 DistMult 的两倍(每个实体和关系需要 2d2d 个实数参数),但模型能处理非对称关系。

方法谱系总结

模型评分函数 f(h,r,t)f(h,r,t)关系矩阵对称性参数量
RESCALehTWret\mathbf{e}_h^T W_r \mathbf{e}_t一般矩阵 WrRd×dW_r \in \mathbb{R}^{d \times d}可非对称Ned+Nrd2N_e d + N_r d^2
DistMulti(eh)i(wr)i(et)i\sum_i (e_h)_i (w_r)_i (e_t)_i对角 diag(wr)\text{diag}(\mathbf{w}_r)对称Ned+NrdN_e d + N_r d
ComplExRe(i(eh)i(wr)i(et)i)\text{Re}(\sum_i (e_h)_i (w_r)_i \overline{(e_t)_i})复对角可非对称2Ned+2Nrd2N_e d + 2N_r d

从张量分解的角度:

  • RESCAL ≈ Tucker 分解(关系矩阵是核心张量的切片)
  • DistMult ≈ CP 分解(核心张量退化为超对角)
  • ComplEx ≈ 复数域的 CP 分解

这条从 RESCAL → DistMult → ComplEx 的演化线恰好对应了 Tucker → CP → 复数 CP 的张量分解谱系,每一步都在表达力和参数效率之间寻找更好的平衡

DistMult vs ComplEx:实数域 vs 复数域DistMultf(h,r,t) = Σᵢ (eₕ)ᵢ(wᵣ)ᵢ(eₜ)ᵢeₕ, wᵣ, eₜ ∈ ℝᵈ(实数向量)⚠ f(h,r,t) = f(t,r,h) — 只能建模对称关系复数化ComplExf(h,r,t) = Re(Σᵢ (eₕ)ᵢ(wᵣ)ᵢ(ēₜ)ᵢ)eₕ, wᵣ, eₜ ∈ ℂᵈ(复数向量)✓ 共轭 ēₜ 打破对称性 → 可建模非对称关系DistMult ≈ 实数 CP 分解 | ComplEx ≈ 复数 CP 分解 | 参数量翻倍,但能处理非对称关系

Part 1 总结:从矩阵到张量的分解弧线

本文是 Part 1 “拆”的收官之作。让我们回顾整条弧线。

工具链

Part 1 前四篇建立了四件核心工具:

工具文章核心内容
特征分解Art. 2 特征分解A=QΛQ1A = Q\Lambda Q^{-1},方阵的对角化
SVDArt. 3 SVDA=UΣVTA = U\Sigma V^T,任意矩阵的分解,Eckart-Young 定理
范数Art. 4 范数与条件数F\|\cdot\|_F, \|\cdot\|_*, 2\|\cdot\|_2,衡量近似质量
微积分Art. 5 矩阵微积分Jacobian, Hessian,分析变化敏感性

方法谱系

后八篇用这套工具解决了不同约束下的分解问题:

SVD(无约束最优)\text{SVD(无约束最优)} \swarrow \quad \downarrow \quad \searrow PCA(正交)矩阵补全(采样)NMF(非负)\text{PCA(正交)} \quad \text{矩阵补全(采样)} \quad \text{NMF(非负)} \downarrow \quad \quad \downarrow \quad \quad \downarrow 随机化 SVD(大规模)Robust PCA(低秩+稀疏)MF/FM(预测)\text{随机化 SVD(大规模)} \quad \text{Robust PCA(低秩+稀疏)} \quad \text{MF/FM(预测)} \quad \quad \searrow \quad \quad \swarrow Word2Vec(隐式分解)\text{Word2Vec(隐式分解)} \downarrow 张量分解(高阶推广)\text{张量分解(高阶推广)}

Part 1 "拆" 的完整弧线SVD无约束最优PCA正交矩阵补全采样NMF非负随机化SVD大规模RPCA低秩+稀疏MF/FM预测Word2Vec隐式分解张量分解高阶推广核心主题:矩阵是数据容器,分解它就是提取隐藏的低维结构

每种方法都可以理解为在 SVD 的基础上添加了不同的约束或推广:

  • PCAArt. 6 PCA):SVD + 中心化 + 正交投影 → 方差最大化的降维
  • 随机化 SVDArt. 7 随机化 SVD):随机投影 + 小矩阵 SVD → 大规模数据的高效近似
  • 矩阵补全Art. 8 矩阵补全):nuclear 范数松弛 + 采样约束 → 从部分观测恢复低秩矩阵
  • NMFArt. 9 NMF):非负约束 → 只加不减的 parts-based 表示
  • MF/FMArt. 10 MF/FM):低秩因子 + 偏置 + 特征交叉 → 预测任务中的交互建模
  • Word2VecArt. 11 Word2Vec):隐式分解偏移 PMI 矩阵 → 词向量
  • Robust PCAArt. 12 Robust PCA):nuclear 范数 + 1\ell_1 范数 → 低秩信号与稀疏异常值的分离
  • 张量分解(本文):CP/Tucker + 知识图谱嵌入 → 高阶数据的分解

核心主题

整个 Part 1 围绕一个核心主题:矩阵是数据的容器,分解它就是提取隐藏的低维结构。 不同的数据结构和不同的约束需要不同的分解方法,但它们共享同一套数学工具——特征分解、SVD、范数、微积分。

张量分解将这条线索从二维自然推广到高阶:数据不止两个维度时,CP 分解和 Tucker 分解提供了类似的”因子化”框架,而知识图谱嵌入展示了这个框架在结构化数据上的威力。

从”拆”到”传”

但到目前为止,矩阵始终扮演的是数据容器的角色——我们把数据装进矩阵(或张量),然后拆开它看结构。Part 2 将完成一个认知转换:

矩阵不再只是数据的容器——它本身就是一个过程。乘一次矩阵 = 执行一步操作。

转移矩阵(乘一次 = 状态转移一步)、图 Laplacian(乘一次 = 信号扩散一步)、kernel 矩阵(内积 = 相似度度量)——这些矩阵编码的不是数据,而是规则。Part 1 的工具——特征分解、SVD——仍然是核心武器,但现在它们揭示的不是”数据里藏着什么结构”,而是”反复执行这个过程会发生什么”。

下一篇进入 Part 2 的全景:算子矩阵的三大族系——随机矩阵、图结构矩阵、相似度矩阵——以及它们共享的核心定理。