1. 前置知识
秩为 1 1 1 的张量是指由一个向量的外积所生成的张量。对于一个向量 v ∈ R n \mathbf{v} \in \mathbb{R}^n v∈Rn,它的秩为 1 1 1 的张量【张量习惯性使用欧拉粗体字母表示】可以表示为 T = v ∘ v \mathcal{T} = \mathbf{v} \circ \mathbf{v} T=v∘v。这个张量的维度是 n × n n \times n n×n,其中每个元素 T i j \mathcal{T}_{ij} Tij 都等于 v i ⋅ v j \mathbf{v}_i \cdot \mathbf{v}_j vi⋅vj,即向量 v \mathbf{v} v 的第 i i i 个分量和第 j j j 个分量的乘积。秩为1的张量表示了向量 v \mathbf{v} v 在多个维度上的线性关系,它可以用于描述一些特定的模式或结构。
假设我们有 3 3 3 个秩为 1 1 1 的张量:
张量 A A A : a = [ 1 , 2 ] T \mathbf{a} = [1, 2]^T a=[1,2]T
张量 B B B : b = [ 3 , 4 ] T \mathbf{b} = [3, 4]^T b=[3,4]T
张量 C C C : c = [ 5 , 6 ] T \mathbf{c} = [5,6]^T c=[5,6]T
它们的外积可以通过求乘积和组合得到。外积的结果是一个 3 3 3 维张量,其维度为 2 × 2 × 2 2\times 2\times 2 2×2×2 。
外积计算如下:
X = a ∘ b ∘ c \mathcal{X} = \mathbf{a} \circ \mathbf{b} \circ \mathbf{c} X=a∘b∘c
其中, ∘ \circ ∘ 表示张量的外积运算。
张量的外积(tensor outer product)是一种张量运算,用于将两个张量相乘生成一个新的张量。它涉及对两个张量的每个元素进行乘积运算,并将结果按照一定规则组合形成新的张量。外积的结果张量的维度是原始张量维度的乘积
最终得到的三阶张量 X \mathcal{X} X 的元素为:
X i j k = a i ⋅ b j ⋅ c k X = [ [ [ 1 × 3 × 5 , 1 × 3 × 6 ] [ 1 × 4 × 5 , 1 × 4 × 6 ] ] [ [ 2 × 3 × 5 , 2 × 3 × 6 ] [ 2 × 4 × 5 , 2 × 4 × 6 ] ] ] [ [ [ 15 , 18 ] [ 20 , 24 ] ] [ [ 30 , 36 ] [ 40 , 48 ] ] ] \mathcal{X}_{ijk} = a_i \cdot b_j \cdot c_k\\ \mathcal{X}= \begin{bmatrix} \begin{bmatrix} \begin{bmatrix} 1\times3\times5,1\times3\times6 \end{bmatrix}\\ \begin{bmatrix} 1\times4\times5,1\times4\times6 \end{bmatrix} \end{bmatrix}\\ \begin{bmatrix} \begin{bmatrix} 2\times3\times5,2\times3\times6 \end{bmatrix}\\ \begin{bmatrix} 2\times4\times5,2\times4\times6 \end{bmatrix} \end{bmatrix} \end{bmatrix} \begin{bmatrix} \begin{bmatrix} \begin{bmatrix} 15,18 \end{bmatrix}\\ \begin{bmatrix} 20,24 \end{bmatrix} \end{bmatrix}\\ \begin{bmatrix} \begin{bmatrix} 30,36 \end{bmatrix}\\ \begin{bmatrix} 40,48 \end{bmatrix} \end{bmatrix} \end{bmatrix} Xijk=ai⋅bj⋅ckX= [[1×3×5,1×3×6][1×4×5,1×4×6]][[2×3×5,2×3×6][2×4×5,2×4×6]] [[15,18][20,24]][[30,36][40,48]]
在这个例子中,外积结果的维度是 2 × 2 × 2 2\times 2\times 2 2×2×2 ,每个元素是对应位置上张量 A , B , C A,B,C A,B,C 对应元素的乘积。
2. CP分解介绍
CP(Canonical Polyadic)分解,也称为PARAFAC(Parallel Factors)分解,是一种常用的高阶张量分解方法。它的基本思想是将一个 N N N 阶张量表示为若干个秩为 1 1 1 的张量之和的形式。
具体来说,对于一个 N N N 阶张量 X \mathcal{X} X ,CP
分解将它表示为 N N N 个秩为 1 1 1 的张量的线性组合,即:
X ≈ ∑ r = 1 R u r ∘ v r ∘ w r ∘ ⋯ ∘ z r \mathcal{X} \approx \sum_{r=1}^{R} \mathbf{u}_r \circ \mathbf{v}_r \circ \mathbf{w}_r \circ \dots \circ \mathbf{z}_r X≈r=1∑Rur∘vr∘wr∘⋯∘zr
其中, u r , v r , w r , … , z r \mathbf{u}_r, \mathbf{v}_r, \mathbf{w}_r, \dots, \mathbf{z}_r ur,vr,wr,…,zr 是秩为 1 1 1 的张量, R R R 是分解的秩(或称为因子个数,即拆分为几个张量)。
假设我们有一个三阶张量 χ \boldsymbol{\chi} χ,其维度为 I × J × K I \times J \times K I×J×K。通过CP分解,我们得到了三个因子矩阵 A \boldsymbol{A} A、 B \boldsymbol{B} B 和 C \boldsymbol{C} C,分别具有维度 I × R I \times R I×R、 J × R J \times R J×R 和 K × R K \times R K×R。
CP分解的目标是找到一组最优的秩为 1 1 1 的张量,使得它们的线性组合与原始张量 X \mathcal{X} X 的逼近误差最小。通过CP分解,我们可以将原始的 N N N 阶张量转化为一组低秩张量的叠加,从而实现对高阶数据的降维和表示。
因此,CP分解的思想是将一个 N N N 阶张量分解为若干个秩为 1 1 1 的张量之和的形式,以此来表示和近似原始张量。这种分解方式可以提取出张量的特定模式和结构信息,并广泛应用于高阶数据的分析和处理领域。
χ ≈ [ A , B , C ] ≈ ∑ r = 1 R λ r a r ∘ b r ∘ c r \boldsymbol{\chi} \approx[\boldsymbol{A}, \boldsymbol{B}, \boldsymbol{C}] \approx \sum_{r=1}^{R} \boldsymbol{\lambda}_{r} \boldsymbol{a}_{r}\circ \boldsymbol{b}_{r} \circ\boldsymbol{c}_{r} χ≈[A,B,C]≈r=1∑Rλrar∘br∘cr
这个数学公式是关于CP分解(CANDECOMP/PARAFAC分解)的表示方式。CP分解是一种用于对张量进行低秩近似的方法。
在该公式中,我们有一个原始张量 χ \boldsymbol{\chi} χ,它被近似表示为三个因子矩阵 A \boldsymbol{A} A, B \boldsymbol{B} B 和 C \boldsymbol{C} C 的叠加。符号 ≈ \approx ≈ 表示近似关系。
公式右侧的第一个近似项 [ A , B , C ] [\boldsymbol{A}, \boldsymbol{B}, \boldsymbol{C}] [A,B,C] 表示将因子矩阵 A \boldsymbol{A} A, B \boldsymbol{B} B 和 C \boldsymbol{C} C 直接叠加在一起。这相当于在原始张量的每个位置上进行了一次张量积(outer product),得到一个低秩张量的近似。
公式右侧的第二个近似项 ∑ r = 1 R λ r a r ∘ b r ∘ c r \sum_{r=1}^{R} \boldsymbol{\lambda}_{r} \boldsymbol{a}_{r}\circ \boldsymbol{b}_{r} \circ\boldsymbol{c}_{r} ∑r=1Rλrar∘br∘cr 表示对于每个秩 r r r,我们有一个系数 λ r \boldsymbol{\lambda}_{r} λr 和三个向量 a r \boldsymbol{a}_{r} ar, b r \boldsymbol{b}_{r} br 和 c r \boldsymbol{c}_{r} cr,代表因子矩阵 A \boldsymbol{A} A, B \boldsymbol{B} B 和 C \boldsymbol{C} C 的第 r r r 列,将张量外积配合权重计算得到重构张量 X recon \mathcal{X}_\text{recon} Xrecon
总之,这个公式表示了将原始张量近似表示为多个秩为 1 1 1 的张量的线性组合,其中每个秩为 1 1 1 的张量由一个系数和三个因子向量的逐元素相乘得到。CP分解通过调整因子矩阵和系数来找到最佳的近似结果。
上边式子是以一维张量为单位进行的操作,若是不好理解可以看如下👇公式,二者等价:
χ i , j , k = ∑ r = 1 R λ r ⋅ a i r ⋅ b j r ⋅ c k r \chi_{i,j,k} = \sum_{r=1}^{R} \lambda_{r} \cdot a_{ir} \cdot b_{jr} \cdot c_{kr} χi,j,k=r=1∑Rλr⋅air⋅bjr⋅ckr
其中, a i r a_{ir} air 表示因子矩阵 A \boldsymbol{A} A 在第 i i i 行、第 r r r 列的元素, b j r b_{jr} bjr 表示因子矩阵 B \boldsymbol{B} B 在第 j j j 行、第 r r r 列的元素, c k r c_{kr} ckr 表示因子矩阵 C \boldsymbol{C} C 在第 k k k 行、第 r r r 列的元素, λ r \lambda_{r} λr 表示权重向量 λ \boldsymbol{\lambda} λ 的第 r r r 个元素。
按照上述公式,我们可以依次计算重构张量 X recon \mathcal{X}_{\text{recon}} Xrecon 中的每个元素。最终,得到的重构张量 χ recon \boldsymbol{\chi}_{\text{recon}} χrecon 的维度应与原始张量 χ \boldsymbol{\chi} χ 的维度相同。
请注意,由于CP分解是一种近似方法,重构张量 χ recon \boldsymbol{\chi}_{\text{recon}} χrecon 可能无法完全恢复原始张量 χ \boldsymbol{\chi} χ 中的所有信息。分解的准确性取决于 R R R 的值和分解算法的性能。
3. CP分解例子
因子矩阵的求法通常交由计算机完成,也不是此处的重点,这里的重点在于已知因子矩阵,如何求重构张量 χ recon \boldsymbol{\chi}_{\text{recon}} χrecon
假设我们有一个三阶张量 χ \boldsymbol{\chi} χ,维度为 2 × 3 × 4 2 \times 3 \times 4 2×3×4,进行 CP 分解,选择 R = 2 R = 2 R=2。那么我们得到三个因子矩阵 A \boldsymbol{A} A、 B \boldsymbol{B} B 和 C \boldsymbol{C} C,它们的维度分别为 2 × 2 2 \times 2 2×2、 3 × 2 3 \times 2 3×2 和 4 × 2 4 \times 2 4×2。
假设得到的因子矩阵如下:
A = [ 0.7 0.2 0.4 0.6 ] , B = [ 0.1 0.9 0.3 0.7 0.5 0.5 ] , C = [ 0.7 0.3 0.2 0.8 0.9 0.1 1.0 1.0 ] . \boldsymbol{A} = \begin{bmatrix} 0.7 & 0.2 \\ 0.4 & 0.6 \end{bmatrix}, \quad \boldsymbol{B} = \begin{bmatrix} 0.1 & 0.9 \\ 0.3 & 0.7 \\ 0.5 & 0.5 \end{bmatrix}, \quad \boldsymbol{C} = \begin{bmatrix} 0.7 & 0.3 \\ 0.2 & 0.8 \\ 0.9 & 0.1 \\ 1.0 & 1.0 \end{bmatrix}. A=[0.70.40.20.6],B= 0.10.30.50.90.70.5 ,C= 0.70.20.91.00.30.80.11.0 .
现在我们可以根据 CP 分解的公式计算重构后的张量 χ recon \boldsymbol{\chi}_{\text{recon}} χrecon。计算过程如下:
χ recon , i , j , k = ∑ r = 1 R λ r ⋅ a i , r ⋅ b j , r ⋅ c k , r \boldsymbol{\chi}_{\text{recon}, i, j, k} = \sum_{r=1}^{R} \lambda_r \cdot a_{i, r} \cdot b_{j, r} \cdot c_{k, r} χrecon,i,j,k=r=1∑Rλr⋅ai,r⋅bj,r⋅ck,r
其中, λ r \lambda_r λr 是因子权重, a i , r a_{i, r} ai,r、 b j , r b_{j, r} bj,r 和 c k , r c_{k, r} ck,r 是因子矩阵的元素。
假设我们选择 λ 1 = 0.5 \lambda_1 = 0.5 λ1=0.5 和 λ 2 = 0.8 \lambda_2 = 0.8 λ2=0.8。
现在,我们可以计算重构后的张量 χ recon \boldsymbol{\chi}_{\text{recon}} χrecon 的元素。
3.1 计算方法1
若是一个一个元素求,则有:
χ recon , 1 , 1 , 1 = 0.5 ⋅ 0.7 ⋅ 0.1 ⋅ 0.7 + 0.8 ⋅ 0.2 ⋅ 0.9 ⋅ 0.3 = 0.0677 χ recon , 1 , 1 , 2 = 0.5 ⋅ 0.7 ⋅ 0.1 ⋅ 0.2 + 0.8 ⋅ 0.2 ⋅ 0.9 ⋅ 0.8 = 0.1222 ⋮ χ recon , 2 , 3 , 4 = 0.5 ⋅ 0.4 ⋅ 0.5 ⋅ 1.0 + 0.8 ⋅ 0.6 ⋅ 0.5 ⋅ 1.0 = 0.34 \boldsymbol{\chi}_{\text{recon}, 1, 1, 1} = 0.5 \cdot 0.7 \cdot 0.1 \cdot 0.7 + 0.8 \cdot 0.2 \cdot 0.9 \cdot 0.3 = 0.0677\\ \boldsymbol{\chi}_{\text{recon}, 1, 1, 2} = 0.5 \cdot 0.7 \cdot 0.1 \cdot 0.2 + 0.8 \cdot 0.2 \cdot 0.9 \cdot 0.8 = 0.1222\\ \vdots\\ \boldsymbol{\chi}_{\text{recon}, 2, 3, 4} = 0.5 \cdot 0.4 \cdot 0.5 \cdot 1.0 + 0.8 \cdot 0.6 \cdot 0.5 \cdot 1.0 = 0.34 χrecon,1,1,1=0.5⋅0.7⋅0.1⋅0.7+0.8⋅0.2⋅0.9⋅0.3=0.0677χrecon,1,1,2=0.5⋅0.7⋅0.1⋅0.2+0.8⋅0.2⋅0.9⋅0.8=0.1222⋮χrecon,2,3,4=0.5⋅0.4⋅0.5⋅1.0+0.8⋅0.6⋅0.5⋅1.0=0.34
以此类推,可以计算其他元素的值,最后进行组合即可。
3.2 计算方法2
X recon = λ 1 ⋅ ( 0.7 0.4 ) ∘ ( 0.1 0.3 0.5 ) ∘ ( 0.7 0.2 0.9 1 ) + λ 2 ⋅ ( 0.2 0.6 ) ∘ ( 0.9 0.7 0.5 ) ∘ ( 0.3 0.8 0.1 1 ) \mathcal{X}_{\text{recon}}= \lambda_1\cdot \begin{pmatrix} 0.7\\0.4 \end{pmatrix} \circ \begin{pmatrix} 0.1\\0.3\\0.5 \end{pmatrix} \circ \begin{pmatrix} 0.7\\0.2\\0.9\\1 \end{pmatrix}+ \lambda_2\cdot \begin{pmatrix} 0.2\\0.6 \end{pmatrix} \circ \begin{pmatrix} 0.9\\0.7\\0.5 \end{pmatrix} \circ \begin{pmatrix} 0.3\\0.8\\0.1\\1 \end{pmatrix} Xrecon=λ1⋅(0.70.4)∘ 0.10.30.5 ∘ 0.70.20.91 +λ2⋅(0.20.6)∘ 0.90.70.5 ∘ 0.30.80.11
此两种方法都可以实现张量分解后的重构,至于评判张量分解效果的好坏则需要将重构后的张量与原始张量进行对比,常用的方法是重构误差,当然还有许多其他方法。
本篇博客涉及的内容是自己在学习过程中所整理的笔记,不一定特别严谨【比如数学符号,各种数学名词的使用等】,因此读者在阅读时也要有自己的思考,也欢迎各位直接与我进行交流。