Tensor 分解入门笔记:从基本记号到 CP、Tucker 与 PARAFAC2

这篇笔记主要根据 Kolda 与 Bader 的综述论文 Tensor Decompositions and Applications 整理,用来建立张量分解的基础概念。可以把它理解成从矩阵分解继续往高维数组推广:向量是一阶张量,矩阵是二阶张量,三维及以上数组就是高阶张量。

1. 基本记号

张量的 order,也叫 way 或 mode,指的是张量的维度个数。

  • 标量是 0 阶张量,通常用小写字母表示,例如 aa
  • 向量是 1 阶张量,通常用粗体小写字母表示,例如 a\mathbf{a}
  • 矩阵是 2 阶张量,通常用粗体大写字母表示,例如 A\mathbf{A}
  • 三阶及以上的张量通常用花体字母表示,例如 X\mathcal{X}

一些常见索引写法:

  • 向量 a\mathbf{a} 的第 ii 个元素写作 aia_i
  • 矩阵 A\mathbf{A} 的第 (i,j)(i,j) 个元素写作 aija_{ij}
  • 三阶张量 X\mathcal{X} 的第 (i,j,k)(i,j,k) 个元素写作 xijkx_{ijk}
  • NN 阶张量 X\mathcal{X} 的元素可以写作 xi1i2iNx_{i_1 i_2 \cdots i_N}

如果 XRI1×I2××IN\mathcal{X}\in \mathbb{R}^{I_1\times I_2\times\cdots\times I_N},一般约定第 nn 个 mode 的索引范围是 in=1,,Ini_n=1,\ldots,I_n

2. Fiber 与 Slice

张量里的子结构很重要,因为很多张量运算其实就是在某个 mode 上对 fiber 或 slice 做矩阵操作。

Fiber 可以理解成“张量中的一根线”。当固定所有索引,只保留一个索引变化时,得到的就是 fiber。

  • 对矩阵来说,列向量和行向量就是 mode-1 fiber 和 mode-2 fiber。
  • 对三阶张量来说,有三类 fiber:
    • mode-1 column fiber:X:jk\mathcal{X}_{:jk}
    • mode-2 row fiber:Xi:k\mathcal{X}_{i:k}
    • mode-3 tube fiber:Xij:\mathcal{X}_{ij:}

三阶张量的 fiber

Slice 可以理解成“张量中的一个切片”。当固定除两个索引外的其他索引时,得到的就是 slice。

对三阶张量来说,有三类 slice:

  • horizontal slice:Xi::\mathcal{X}_{i::}
  • lateral slice:X:j:\mathcal{X}_{:j:}
  • frontal slice:X::k\mathcal{X}_{::k},也常简写为 Xk\mathbf{X}_k

三阶张量的 slice

3. 范数与内积

张量的 Frobenius 范数可以看成矩阵 Frobenius 范数的高维推广。对

XRI1×I2××IN\mathcal{X}\in \mathbb{R}^{I_1\times I_2\times\cdots\times I_N}

它的范数定义为:

X=i1=1I1i2=1I2iN=1INxi1i2iN2\|\mathcal{X}\| = \sqrt{ \sum_{i_1=1}^{I_1} \sum_{i_2=1}^{I_2} \cdots \sum_{i_N=1}^{I_N} x_{i_1i_2\cdots i_N}^{2} }

两个同尺寸张量 X\mathcal{X}Y\mathcal{Y} 的内积定义为对应位置元素乘积之和:

X,Y=i1=1I1i2=1I2iN=1INxi1i2iNyi1i2iN\langle \mathcal{X},\mathcal{Y}\rangle = \sum_{i_1=1}^{I_1} \sum_{i_2=1}^{I_2} \cdots \sum_{i_N=1}^{I_N} x_{i_1i_2\cdots i_N}y_{i_1i_2\cdots i_N}

4. Rank-One Tensor

一个 NN 阶张量如果可以写成 NN 个向量的外积,就称为 rank-one tensor:

X=a(1)a(2)a(N)\mathcal{X} = \mathbf{a}^{(1)}\circ \mathbf{a}^{(2)}\circ \cdots \circ \mathbf{a}^{(N)}

其中 \circ 表示 outer product。元素级别写法是:

xi1i2iN=ai1(1)ai2(2)aiN(N)x_{i_1i_2\cdots i_N} = a^{(1)}_{i_1} a^{(2)}_{i_2} \cdots a^{(N)}_{i_N}

三阶 rank-one tensor 可以理解成三个向量 a,b,c\mathbf{a},\mathbf{b},\mathbf{c} 的外积:

X=abc\mathcal{X}=\mathbf{a}\circ \mathbf{b}\circ \mathbf{c}

三阶 rank-one tensor

这个概念是 CP 分解的核心,因为 CP 分解就是把一个复杂张量写成多个 rank-one tensor 的和。

5. 对称张量与对角张量

如果一个张量每个 mode 的尺寸都相同,例如

XRI×I××I\mathcal{X}\in \mathbb{R}^{I\times I\times\cdots\times I}

它叫 cubical tensor。

如果在任意索引置换下元素值都不变,那么它是 supersymmetric tensor。例如三阶张量满足:

xijk=xikj=xjik=xjki=xkij=xkjix_{ijk}=x_{ikj}=x_{jik}=x_{jki}=x_{kij}=x_{kji}

如果只在部分 mode 上对称,就叫 partially symmetric tensor。例如

XRI×I×K\mathcal{X}\in \mathbb{R}^{I\times I\times K}

如果每个 frontal slice 都是对称矩阵,即

Xk=XkT\mathbf{X}_k=\mathbf{X}_k^T

那么它就在前两个 mode 上部分对称。

对角张量类似矩阵里的对角矩阵。只有当

i1=i2==iNi_1=i_2=\cdots=i_N

时,元素 xi1i2iNx_{i_1i_2\cdots i_N} 才可能非零。

6. Vectorization 与 Matricization

Vectorization 是把一个张量按固定顺序重新排列成向量,记作 vec(X)\mathrm{vec}(\mathcal{X})

如果 ARn1×n2××nd\mathcal{A}\in\mathbb{R}^{n_1\times n_2\times\cdots\times n_d},一个常用的列优先位置映射是:

col(i,n)=i1+(i21)n1+(i31)n1n2++(id1)n1n2nd1\mathrm{col}(\mathbf{i},\mathbf{n}) = i_1 +(i_2-1)n_1 +(i_3-1)n_1n_2 +\cdots +(i_d-1)n_1n_2\cdots n_{d-1}

这里 i=[i1,,id]\mathbf{i}=[i_1,\ldots,i_d] 是元素坐标,n=[n1,,nd]\mathbf{n}=[n_1,\ldots,n_d] 是每个 mode 的尺寸。

Matricization 也叫 unfolding 或 flattening,是把张量按某个 mode 展开成矩阵。mode-nn matricization 记作 X(n)\mathbf{X}_{(n)},它会把 mode-nn fibers 排成矩阵的列。

对张量分解来说,matricization 很重要,因为许多更新公式都可以转化成矩阵最小二乘问题。

7. n-Mode Product

mode-nn product 表示沿着第 nn 个 mode 用矩阵或向量去乘张量。

XRI1×I2××IN,URJ×In\mathcal{X}\in \mathbb{R}^{I_1\times I_2\times\cdots\times I_N}, \quad \mathbf{U}\in\mathbb{R}^{J\times I_n}

则 mode-nn 矩阵乘法写作:

X×nU\mathcal{X}\times_n \mathbf{U}

新张量的尺寸为:

I1××In1×J×In+1××INI_1\times\cdots\times I_{n-1} \times J \times I_{n+1}\times\cdots\times I_N

元素级别写法是:

(X×nU)i1in1jin+1iN=in=1Inxi1iniNujin(\mathcal{X}\times_n \mathbf{U})_{i_1\cdots i_{n-1}j i_{n+1}\cdots i_N} = \sum_{i_n=1}^{I_n} x_{i_1\cdots i_n\cdots i_N}u_{j i_n}

直观理解:矩阵 U\mathbf{U} 会对 mode-nn fibers 做线性变换。

常用性质:

X×mA×nB=X×nB×mA,mn\mathcal{X}\times_m \mathbf{A}\times_n \mathbf{B} = \mathcal{X}\times_n \mathbf{B}\times_m \mathbf{A}, \quad m\ne n

X×nA×nB=X×n(BA)\mathcal{X}\times_n \mathbf{A}\times_n \mathbf{B} = \mathcal{X}\times_n(\mathbf{B}\mathbf{A})

如果乘的是向量 vRIn\mathbf{v}\in\mathbb{R}^{I_n},结果会降低一阶,因为第 nn 个 mode 被收缩掉。

8. Kronecker、Khatri-Rao 与 Hadamard 乘积

张量分解公式里经常出现三种矩阵乘积。

Kronecker product

AB\mathbf{A}\otimes \mathbf{B}

如果 ARI×J\mathbf{A}\in\mathbb{R}^{I\times J}BRK×L\mathbf{B}\in\mathbb{R}^{K\times L},则结果尺寸是 (IK)×(JL)(IK)\times(JL)

Khatri-Rao product 是按列做 Kronecker product:

AB=[a1b1,a2b2,,aRbR]\mathbf{A}\odot \mathbf{B} = [ \mathbf{a}_1\otimes\mathbf{b}_1, \mathbf{a}_2\otimes\mathbf{b}_2, \ldots, \mathbf{a}_R\otimes\mathbf{b}_R ]

它在 CP 分解的 matricized 形式中非常常见。

Hadamard product 是对应位置逐元素相乘:

(AB)ij=aijbij(\mathbf{A}*\mathbf{B})_{ij}=a_{ij}b_{ij}

几个常用性质:

(AB)T=ATBT(\mathbf{A}\otimes \mathbf{B})^T = \mathbf{A}^T\otimes \mathbf{B}^T

(AC)(BD)=ABCD(\mathbf{A}\otimes \mathbf{C})(\mathbf{B}\otimes \mathbf{D}) = \mathbf{A}\mathbf{B}\otimes \mathbf{C}\mathbf{D}

(AB)T(AB)=(ATA)(BTB)(\mathbf{A}\odot \mathbf{B})^T(\mathbf{A}\odot \mathbf{B}) = (\mathbf{A}^T\mathbf{A})*(\mathbf{B}^T\mathbf{B})

9. SVD 与 Moore-Penrose 伪逆

不是所有矩阵都能做特征值分解,但任意矩阵都可以做奇异值分解。对

ARm×n\mathbf{A}\in\mathbb{R}^{m\times n}

有:

A=UΣVT\mathbf{A}=\mathbf{U}\mathbf{\Sigma}\mathbf{V}^T

其中 U\mathbf{U}V\mathbf{V} 是正交矩阵,Σ\mathbf{\Sigma} 是对角矩阵,对角线上的 σ1,σ2,\sigma_1,\sigma_2,\ldots 是奇异值。

当线性方程

Ax=b\mathbf{A}\mathbf{x}=\mathbf{b}

中的 A\mathbf{A} 不可逆时,可以用 Moore-Penrose 伪逆:

x=A+b\mathbf{x}=\mathbf{A}^{+}\mathbf{b}

如果 A=UΣVT\mathbf{A}=\mathbf{U}\mathbf{\Sigma}\mathbf{V}^T,则:

A+=VΣ+UT\mathbf{A}^+ = \mathbf{V}\mathbf{\Sigma}^{+}\mathbf{U}^T

Σ+\mathbf{\Sigma}^{+} 的做法是把非零奇异值取倒数,零奇异值仍然保持为零。

10. CP Decomposition

CP,CANDECOMP/PARAFAC,分解的核心思想是:把一个张量近似表示成若干个 rank-one tensors 的和。

对三阶张量

XRI×J×K\mathcal{X}\in\mathbb{R}^{I\times J\times K}

CP 分解写作:

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

元素形式为:

xijkr=1Rairbjrckrx_{ijk} \approx \sum_{r=1}^{R} a_{ir}b_{jr}c_{kr}

如果把所有 ar,br,cr\mathbf{a}_r,\mathbf{b}_r,\mathbf{c}_r 分别拼成矩阵:

A=[a1,,aR],B=[b1,,bR],C=[c1,,cR]\mathbf{A}=[\mathbf{a}_1,\ldots,\mathbf{a}_R], \quad \mathbf{B}=[\mathbf{b}_1,\ldots,\mathbf{b}_R], \quad \mathbf{C}=[\mathbf{c}_1,\ldots,\mathbf{c}_R]

可以简写为:

X[[A,B,C]]\mathcal{X}\approx[[\mathbf{A},\mathbf{B},\mathbf{C}]]

CP 分解与 Tucker 分解

三阶张量的展开形式:

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

X(2)B(CA)T\mathbf{X}_{(2)} \approx \mathbf{B}(\mathbf{C}\odot \mathbf{A})^T

X(3)C(BA)T\mathbf{X}_{(3)} \approx \mathbf{C}(\mathbf{B}\odot \mathbf{A})^T

CP-ALS 的常见求解思路是:固定其他因子矩阵,轮流更新某一个因子矩阵,把问题变成最小二乘问题。目标函数可以写成:

minA(1),,A(N)X[[A(1),A(2),,A(N)]]F2\min_{\mathbf{A}^{(1)},\ldots,\mathbf{A}^{(N)}} \left\| \mathcal{X} -[[\mathbf{A}^{(1)},\mathbf{A}^{(2)},\ldots,\mathbf{A}^{(N)}]] \right\|_F^2

CP 分解的 rank 是能表示该张量所需的最少 rank-one tensors 数量。

11. CP 分解的唯一性

矩阵的低秩分解通常不唯一。例如:

X=ABT=(AW)(BWT)T\mathbf{X} = \mathbf{A}\mathbf{B}^T = (\mathbf{A}\mathbf{W})(\mathbf{B}\mathbf{W}^{-T})^T

只要 W\mathbf{W} 可逆,就能得到不同的因子。

张量 CP 分解在一定条件下反而可能唯一。三阶 CP 分解的一个经典充分条件是 Kruskal 条件:

kA+kB+kC2R+2k_{\mathbf{A}}+k_{\mathbf{B}}+k_{\mathbf{C}}\ge 2R+2

其中 kAk_{\mathbf{A}} 表示矩阵 A\mathbf{A} 的 k-rank,也就是任意 kk 列都线性无关时最大的 kk

CP 仍然存在两个不可避免的不确定性:

  • 列置换不确定性:因子矩阵的第 rr 列可以整体换顺序。
  • 缩放不确定性:只要 αrβrγr=1\alpha_r\beta_r\gamma_r=1,就有

arbrcr=(αrar)(βrbr)(γrcr)\mathbf{a}_r\circ\mathbf{b}_r\circ\mathbf{c}_r = (\alpha_r\mathbf{a}_r) \circ (\beta_r\mathbf{b}_r) \circ (\gamma_r\mathbf{c}_r)

12. Tucker Decomposition

Tucker 分解可以看作张量版 PCA。它把原张量分解成一个 core tensor 和每个 mode 上的 factor matrix。

对三阶张量:

XG×1A×2B×3C\mathcal{X} \approx \mathcal{G} \times_1 \mathbf{A} \times_2 \mathbf{B} \times_3 \mathbf{C}

也可以记作:

X[[G;A,B,C]]\mathcal{X} \approx [[\mathcal{G};\mathbf{A},\mathbf{B},\mathbf{C}]]

其中:

  • G\mathcal{G} 是 core tensor。
  • ARI×P\mathbf{A}\in\mathbb{R}^{I\times P}
  • BRJ×Q\mathbf{B}\in\mathbb{R}^{J\times Q}
  • CRK×R\mathbf{C}\in\mathbb{R}^{K\times R}

元素形式为:

xijkp=1Pq=1Qr=1Rgpqraipbjqckrx_{ijk} \approx \sum_{p=1}^{P} \sum_{q=1}^{Q} \sum_{r=1}^{R} g_{pqr}a_{ip}b_{jq}c_{kr}

CP 可以看作 Tucker 的特殊情况:core tensor 是超对角张量。

三阶 Tucker 的 matricized 形式:

X(1)AG(1)(CB)T\mathbf{X}_{(1)} \approx \mathbf{A}\mathbf{G}_{(1)}(\mathbf{C}\otimes\mathbf{B})^T

X(2)BG(2)(CA)T\mathbf{X}_{(2)} \approx \mathbf{B}\mathbf{G}_{(2)}(\mathbf{C}\otimes\mathbf{A})^T

X(3)CG(3)(BA)T\mathbf{X}_{(3)} \approx \mathbf{C}\mathbf{G}_{(3)}(\mathbf{B}\otimes\mathbf{A})^T

Tucker 分解通常不唯一,因为可以把一个可逆变换吸收到 core tensor,再用逆变换补偿 factor matrix:

[G;A,B,C]=[G×1U×2V×3W;AU1,BV1,CW1][\mathcal{G};\mathbf{A},\mathbf{B},\mathbf{C}] = [\mathcal{G}\times_1\mathbf{U}\times_2\mathbf{V}\times_3\mathbf{W}; \mathbf{A}\mathbf{U}^{-1}, \mathbf{B}\mathbf{V}^{-1}, \mathbf{C}\mathbf{W}^{-1}]

常见计算方法:

  • HOSVD:对每个 mode 的 unfolding 做 SVD。
  • HOOI:在 HOSVD 初始化后,交替优化每个 factor matrix。

13. n-Rank

张量 X\mathcal{X} 的 n-rank 指 mode-nn unfolding 矩阵 X(n)\mathbf{X}_{(n)} 的列秩:

rankn(X)=rank(X(n))\mathrm{rank}_n(\mathcal{X})=\mathrm{rank}(\mathbf{X}_{(n)})

如果

Rn=rankn(X)R_n=\mathrm{rank}_n(\mathcal{X})

那么 X\mathcal{X} 可以说是一个 rank-(R1,R2,,RN)(R_1,R_2,\ldots,R_N) 张量。

这个概念在 Tucker 分解中尤其常用,因为 Tucker rank 本质上就是每个 unfolding 的矩阵秩组合。

14. 其他分解:INDSCAL、CANDELINC、PARAFAC2

INDSCAL 是 CP 的一个特殊情况,适用于在两个 mode 上对称的三阶张量。例如:

XRI×I×K\mathcal{X}\in\mathbb{R}^{I\times I\times K}

并且 xijk=xjikx_{ijk}=x_{jik},则 INDSCAL 模型可写为:

X[[A,A,C]]=r=1Rararcr\mathcal{X} \approx [[\mathbf{A},\mathbf{A},\mathbf{C}]] = \sum_{r=1}^{R} \mathbf{a}_r\circ \mathbf{a}_r\circ \mathbf{c}_r

CANDELINC 可以看作带线性约束的 CP 分解。普通 CP 是:

X[[A,B,C]]\mathcal{X}\approx[[\mathbf{A},\mathbf{B},\mathbf{C}]]

而 CANDELINC 写作:

X[[ΦAA^,ΦBB^,ΦCC^]]\mathcal{X} \approx [[\mathbf{\Phi}_A\hat{\mathbf{A}}, \mathbf{\Phi}_B\hat{\mathbf{B}}, \mathbf{\Phi}_C\hat{\mathbf{C}}]]

其中 ΦA,ΦB,ΦC\mathbf{\Phi}_A,\mathbf{\Phi}_B,\mathbf{\Phi}_C 是约束矩阵或变换矩阵。当约束后维度更小,它可以减少计算量。

PARAFAC2 严格来说不是对一个固定尺寸三阶张量做分解,而是对一组矩阵做分解:

XkRIk×J,k=1,,K\mathbf{X}_k\in\mathbb{R}^{I_k\times J}, \quad k=1,\ldots,K

这里 IkI_k 可以随 kk 改变。模型形式为:

XkUkSkVT,k=1,,K\mathbf{X}_k \approx \mathbf{U}_k \mathbf{S}_k \mathbf{V}^T, \quad k=1,\ldots,K

其中:

  • UkRIk×R\mathbf{U}_k\in\mathbb{R}^{I_k\times R}
  • SkRR×R\mathbf{S}_k\in\mathbb{R}^{R\times R},通常是对角矩阵
  • VRJ×R\mathbf{V}\in\mathbb{R}^{J\times R},在所有 kk 上共享

PARAFAC2 模型

为了增强唯一性,PARAFAC2 通常会加入约束:

UkTUk\mathbf{U}_k^T\mathbf{U}_k

在不同 kk 上保持不变。

15. 总结

这篇笔记可以按下面这条线理解:

  1. 先掌握 tensor 的基本索引、fiber、slice、norm、inner product。
  2. 再理解 rank-one tensor,因为 CP 分解就是 rank-one tensor 的求和。
  3. Matricization 和 Khatri-Rao product 是 CP/ALS 公式的关键。
  4. Tucker 分解更像高阶 PCA:用 core tensor 表示不同 components 之间的交互。
  5. PARAFAC2 适合一组矩阵尺寸不完全一致,但仍希望共享某些潜在结构的场景。

从机器学习角度看,张量分解可以用于降维、缺失值补全、多视角数据建模、推荐系统、时序数据分析和多模态数据建模。后续如果要真正做实验,可以从 Python 的 tensorly 库开始,把 CP、Tucker、PARAFAC2 都跑一遍。

Tensor 分解入门笔记:从基本记号到 CP、Tucker 与 PARAFAC2

https://richardf123.github.io/2026/06/24/tensor-decomposition-notes/

作者

RichardF

发布于

2026-06-24

更新于

2026-06-24

许可协议