张量 CP 分解
1. 张量的几个概念
- 张量的内积
相同大小的两个张量X , Y ∈ R I 1 × I 2 × ? × I N \mathcal{X},\mathcal{Y} \in \mathbb{R}^{I_1 \times I_2 \times \dots \times I_N} X,Y∈RI1?×I2?×?×IN? ,其内积为对应位置的元素相乘后,将所有位置的乘积累加,可以用公式表示为:
? X , Y ? = ∑ i 1 = 1 I 1 ∑ i 2 = 1 I 2 ? ∑ i N = 1 I N x i 1 i 2 … i N y i 1 i 2 … i N \langle\mathcal{X}, \mathcal{Y} \rangle = \sum_{i_1=1}^{I_1}\sum_{i_2=1}^{I_2} \dots \sum_{i_N=1}^{I_N} x_{i_1i_2\dots i_N} y_{i_1i_2\dots i_N} ?X,Y?=i1?=1∑I1??i2?=1∑I2???iN?=1∑IN??xi1?i2?…iN??yi1?i2?…iN??
- 张量的范数
张量的范数可以类比矢量的模,它表示为张量自身的内积再开平方,对张量X ∈ R I 1 × I 2 × ? × I N \mathcal{X} \in\mathbb{R}^{I_1 \times I_2 \times \dots \times I_N} X∈RI1?×I2?×?×IN? 其范数为:
∣ ∣ X ∣ ∣ = ∑ i 1 = 1 I 1 ∑ i 2 = 1 I 2 ? ∑ i N = 1 I N x i 1 i 2 … i N 2 ||\mathcal{X}|| = \sqrt{\sum_{i_1=1}^{I_1}\sum_{i_2=1}^{I_2}\dots\sum_{i_N=1}^{I_N}x^2_{i_1i_2\dots i_N}} ∣∣X∣∣=i1?=1∑I1??i2?=1∑I2???iN?=1∑IN??xi1?i2?…iN?2? ?
- 矢量的外积
两个矢量的外积是一个矩阵,三个矢量的外积是一个三阶矩阵。计算三个矢量的外积,我们可以用前两个矢量外积的矩阵,分别乘以第三个矢量的每个元素,得到第若干个矩阵按照正面切片拼接为新的张量。
对矢量a ? = ( 1 , 2 ) T , b ? = ( 3 , 4 ) T , c ? = ( 5 , 6 , 7 ) T \vec{a}=(1,2)^T,\vec{b}=(3,4)^T,\vec{c}=(5,6,7)^T a =(1,2)T,b =(3,4)T,c =(5,6,7)T 其外积记为
X = a ? ° b ? ° c ? \mathcal{X}=\vec{a} \circ \vec{b} \circ \vec{c} X=a °b °c
先来看a ? ° b ? \vec{a} \circ \vec{b} a °b ,可以得到
a ? ° b ? = [ 1 2 ] [ 3 4 ] = [ 3 4 6 8 ] \vec{a} \circ \vec{b}= \begin{bmatrix} 1 \\ 2 \end{bmatrix} \begin{bmatrix} 3 & 4 \end{bmatrix}= \begin{bmatrix} 3 & 4 \\ 6 & 8 \end{bmatrix} a °b =[12?][3?4?]=[36?48?]
我们用c ? \vec{c} c的第一个元素和上面的矩阵相乘,得到第一个切片,即
X : : 1 = 5 [ 3 4 6 8 ] = [ 15 20 30 40 ] \mathcal{X}_{::1}=5 \begin{bmatrix} 3 & 4 \\ 6 & 8 \end{bmatrix}=\begin{bmatrix} 15 & 20 \\ 30 & 40 \end{bmatrix} X::1?=5[36?48?]=[1530?2040?]
X : : 2 = 6 [ 3 4 6 8 ] = [ 18 24 36 48 ] \mathcal{X}_{::2}=6 \begin{bmatrix} 3 & 4 \\ 6 & 8 \end{bmatrix}=\begin{bmatrix} 18 & 24 \\ 36 & 48 \end{bmatrix} X::2?=6[36?48?]=[1836?2448?]
X : : 3 = 7 [ 3 4 6 8 ] = [ 21 28 42 56 ] \mathcal{X}_{::3}=7 \begin{bmatrix} 3 & 4 \\ 6 & 8 \end{bmatrix}=\begin{bmatrix} 21 & 28 \\ 42 & 56 \end{bmatrix} X::3?=7[36?48?]=[2142?2856?]
- 秩一张量
【二、张量 CP 分解】对于一个N N N 阶张量X ∈ R I 1 × I 2 × ? × I N \mathcal{X} \in\mathbb{R}^{I_1 \times I_2 \times \dots \times I_N} X∈RI1?×I2?×?×IN? ,如果可以被写成N N N 个向量的外积,则这个张量的秩为 1 ,这个张量称为秩一张量,记为:
X = a ( 1 ) ° a ( 2 ) ° ? ° a ( N ) \mathcal{X} = a^{(1)} \circ a^{(2)} \circ \dots \circ a^{(N)} X=a(1)°a(2)°?°a(N)
每个张量的元素都可以写成这些向量对应位置元素之积:
x i 1 i 2 … i N = a i 1 ( 1 ) ° a i 2 ( 2 ) ° ? ° a i N ( N ) x_{i_1i_2\dots i_N} = a^{(1)}_{i_1} \circ a^{(2)}_{i_2} \circ \dots \circ a^{(N)}_{i_N} xi1?i2?…iN??=ai1?(1)?°ai2?(2)?°?°aiN?(N)?
- 张量的秩
张量X \mathcal{X} X 的秩定义为用秩一张量之和来精确表示X \mathcal{X} X 所需要的秩一张量的最少个数,记为r a n k ( X ) rank(\mathcal{X}) rank(X) 。
- 对称和对角
立方张量:各 mode 的长度相等的张量。
对称张量:如果一个立方张量的各元素再下标的任意排列下是常数,称该张量是对称的。
超对称张量:当立方张量中的任何一个元素的索引被置换后元素值不变时,称这个张量为超对称的。如,对于一个三阶张量,如果各元素满足以下等式,则被称之为超对称。
x i j k = x i k j = x j i k = x j k i = x k i j = x k j i i , j , k = 1 , … , I x_{ijk} = x_{ikj} = x_{jik} = x_{jki} = x_{kij} = x_{kji} \quad i, j, k = 1,\dots,I xijk?=xikj?=xjik?=xjki?=xkij?=xkji?i,j,k=1,…,I
对角张量:如果一个张量X ∈ R I 1 × I 2 × ? × I N \mathcal{X} \in\mathbb{R}^{I_1 \times I_2 \times \dots \times I_N} X∈RI1?×I2?×?×IN? 的任何元素只有在i 1 = i i = ? = i N i_1 = i_i= \cdots =i_N i1?=ii?=?=iN? 的时候不为零,被称为对角张量。
2. 矩阵的分解 矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积。这里我们先介绍几种矩阵分解的方式。
2.1 非负矩阵分解
定义:对于矩阵X ∈ R D × N X \in R^{D \times N} X∈RD×N ,非负矩阵分解的目的是找到两个非负U D × R , V R × N U^{D \times R},V^{R \times N} UD×R,VR×N ,使得它们的乘积近似等于X X X 即:
X ≈ U V T X \approx UV^T X≈UVT
可以看出,非负矩阵的目的就是找到U , V U,V U,V 使得U V T UV^T UVT 最大可能的和X X X 相等。这里我们定义一种方式来衡量U V T UV^T UVT 与X X X 接近的程度,称为代价函数。如果两个非负矩阵A A A 和B B B ,我们定义它们之间的代价函数为
∥ A ? B ∥ 2 = ∑ i j ( A i j ? B i j ) 2 \|A-B\|^2=\sum_{ij}(A_{ij}-B_{ij})^2 ∥A?B∥2=ij∑?(Aij??Bij?)2
那么非负矩阵的分解的目的就可以演变为求
m i n { ∥ X ? U V T ∥ } min\{\|X-UV^T\|\} min{∥X?UVT∥}
即使以上等式最接近 0 的U , V U,V U,V的最优解。
上述关于U , V U,V U,V 的代价函数是非凸的,基本的做法是交替优化 U 和 V 从而得到 一个局部最优解。
2.2 本征值分解(EVD)
给定一个m × m m \times m m×m 的矩阵A A A 设m m m 维归一向量v \pmb{v} vvv 与标量λ \lambda λ ,当其满足A v = λ v A\pmb{v}=\lambda\pmb{v} Avvv=λvvv 时,称v \pmb{v} vvv 与λ \lambda λ 分别为A A A 的本征值和本征向量,我们可以通过线性代数中求特征值和特征向量的方式求出所有的本征值和本征向量。
本征值分解就是对于一个m × m m \times m m×m 的矩阵A A A (即A = A T A=A^T A=AT) ,可以将其分解为如下的形式
A = Q Λ Q T A = Q \Lambda Q^T A=QΛQT
其中Q Q Q 是A A A 的本征向量组成的正交矩阵, Λ \Lambda Λ 是本征值为对角线元素构成的对角矩阵,也称为本征谱。
在特征值分解中有一个 最大本征值问题 :假设矩阵本征值为实数,求解给定矩阵的最大本征值及其对应的本征向量。该问题可以转化为如下问题,给定矩阵A A A ,求解归一化向量v \pmb{v} vvv ,使得函数
f = ∣ v T M v ∣ f=|v^TMv| f=∣vTMv∣
的值极大化。
从线性代数可以证明,该问题的解为A A A 的绝对值最大的本征向量,而且对应的f f f 的值为该本征向量对应的本征值,也是最大的一个本征值。
最大本征值问题有一种求解方法为幂级数法,通过证明我们可以得到如下等式:
lim ? K → ∞ M K = Γ 0 K u ( 0 ) u ( 0 ) T \lim_{K\rightarrow\infty} M^K=\Gamma_0^K u_{(0)}u_{(0)}^T K→∞lim?MK=Γ0K?u(0)?u(0)T?
其中, Γ 0 \Gamma_0 Γ0? 与u ( 0 ) u_{(0)} u(0)? 是绝对值最大的本征值与对应的本征向量。
用 python 求解本征值和本征向量 我们可以用 numpy 库中的函数来求解本征值和本征向量,代码如下:
import numpy as np
dim = 4#设置矩阵的维数
M = np.random.randn(dim, dim)#随机化一个 dim × dim 大小的矩阵
M = M + M.T# 对称化以保证本征分解存在;
.T 是对矩阵进行转置
print(M)lm, u = np.linalg.eig(M)#该函数计算矩阵 M 的本征值和本征向量,并将本征值组成列表返回给 lm ,将每个本征向量作为 u 的一列,组成矩阵
print('\n Eigenvalues:')
print(lm)
print('\n Eigenvectors:')
print(u)
输出结果如下
文章图片
2.3 奇异值分解(SVD)
特征值分解对矩阵有着较高的要求,它需要被分解的矩阵A A A 为实对称矩阵,但是现实中,我们所遇到的问题一般不是实对称矩阵,奇异值分解就是将一个一般性的m × n m \times n m×n 的矩阵A A A ,分解为
A = U Σ V T A = U\Sigma V^T A=UΣVT
的形式,其中U , V U,V U,V 均为单位正交矩阵,即有U U T = I UU^T=I UUT=I 和V V T = I VV^T=I VVT=I , U U U 称为 左奇异矩阵, V V V 称为 右奇异矩阵, Σ \Sigma Σ 是将A A A 的特征值降序排列在主对角线上的对角矩阵,对角线上的值称为 奇异值 。其中矩阵U ∈ R m × m ,Σ ∈ R m × n ,V ∈ R n × n U \in R^{m\times m},\ \Sigma \in R^{m\times n},\ V \in R^{n\times n} U∈Rm×m, Σ∈Rm×n, V∈Rn×n 。
文章图片
我们如何对奇异值和奇异矩阵求解呢?通过上面的式子,我们可以得到如下的等式:
A A T = U Σ V T V Σ T U T = U Σ Σ T U T AA^T =U\Sigma V^TV\Sigma^TU^T =U\Sigma \Sigma^TU^T AAT=UΣVTVΣTUT=UΣΣTUT
A T A = V Σ T U T U Σ V T = V Σ T Σ V T A^TA=V\Sigma^TU^TU\Sigma V^T=V\Sigma^T\Sigma V^T ATA=VΣTUTUΣVT=VΣTΣVT
因为A A T AA^T AAT 和A A T AA^T AAT 是对称矩阵,则通过对上面两个等式求它们的特征值和特征向量,就可以求出U , V , Σ U,V,\Sigma U,V,Σ 。
奇异值分解的性质:
- 奇异值分解可以降维
如果A A A 表示n n n 个m m m 维向量,可以通过奇异值分解表示成m + n m+n m+n 个r r r 维向量。若A的秩远远小于m m m 和n n n ,则通过奇异值分解可以降低A A A 的维数。可以计算出,当r < m n m + n + 1 r < \frac{mn}{m+n+1} r- 奇异值对矩阵的扰动不敏感
特征值对矩阵的扰动是敏感的。在数学上可以证明,奇异值的变化不会超过相应矩阵的变化,即对任何的相同阶数的实矩阵A 、 B A、B A、B 按从大到小排列的奇异值α i \pmb{\alpha}_i αααi? 和ω i \pmb{\omega}_i ωωωi? 有
∑ ∣ α i ? ω i ∣ ≤ ∥ A ? B ∥ 2 \sum |\pmb{\alpha}_i - \pmb{\omega}_i| \leq \|A-B\|_2 ∑∣αααi??ωωωi?∣≤∥A?B∥2?- 奇异值具有比例不变性。
即α A \alpha A αA 的奇异值是A A A 的奇异值的∣ α ∣ |\alpha| ∣α∣ 倍。- 奇异值具有旋转不变性。
若P P P 是正交矩阵, P A PA PA 的奇异值与A A A 的奇异值相同。 - 奇异值对矩阵的扰动不敏感
矩阵的低秩近似问题 首先我们来定义矩阵的秩,在奇异值分解中,非零奇异值的个数称为该矩阵的秩。那么我们便可以引出矩阵的低秩近似问题,该问题可以描述为:对于给定的m × n m×n m×n 的矩阵A A A ,设其秩为R R R ,求解秩为R ′ R^{'} R′ 的矩阵M ′ M^{'} M′ ,其中R > R ′ > 0 R>R^{'}>0 R>R′>0 ,使两矩阵之间的范数最小,即求尽可能小的ε \varepsilon ε
ε = ∥ M ? M ′ ∥ = ∑ i j ( M i j ? M i j ′ ) 2 ~ ∥ Σ R ′ : R ? 1 ∥ \varepsilon=\|M-M^{'}\|=\sqrt{\sum_{ij}(M_{ij} - M_{ij}^{'})^2 } \sim \| \Sigma_{R^{'}:R-1}\| ε=∥M?M′∥=ij∑?(Mij??Mij′?)2 ?~∥ΣR′:R?1?∥
该ε \varepsilon ε 又称为裁剪误差,上式后面的式子为Σ \Sigma Σ 的后面几个奇异值的范数,我们可以直接求出裁剪误差。
该低秩问题的最优解为:
M ′ = U [ : , 0 : R ′ ? 1 ]Σ [ 0 : R ′ ? 1 , 0 : R ′ ? 1 ]V [ : , 0 : R ′ ? 1 ] M^{'}=U[:,0:R^{'}-1] \ \Sigma [0:R^{'}-1,0:R^{'}-1] \ V[:,0:R^{'}-1] M′=U[:,0:R′?1] Σ[0:R′?1,0:R′?1] V[:,0:R′?1]
即取U U U 的前R ′ R^{'} R′ 个列向量组成的矩阵, Σ \Sigma Σ 的前R ′ R^{'} R′ 个特征值组成的对角阵, V V V 的前R ′ R^{'} R′ 个列向量组成的矩阵的转置,它们的乘积得到的矩阵就是M ′ M^{'} M′ 。即下图所示:
文章图片
用 python 实现奇异值分解 奇异值分解我们可以直接使用 np.linalg.svd 函数来实现,具体代码如下:
import numpy as np
M=M = np.random.randn(5, 5)
U, S, V = np.linalg.svd(M)#返回三个矩阵使得 M=USV
print(U)
print(S)
print(V)
运行结果为:
文章图片
通过奇异值的低秩近似可以用来压缩图片,一张图片可以视为一个矩阵M M M,我们对该矩阵进行奇异值分解,用上面的低秩近似的方法求秩为R ′ R^{'} R′ ( R ′ R^{'} R′ 的大小可以自由选择, R ′ R^{'} R′ 越大,图片越清晰,但是压缩率越小)的矩阵,也就是对求得的U , Σ , V U,\Sigma ,V U,Σ,V 取前R ′ R^{'} R′ 个向量和值的乘积构成新的图片,也就是压缩后的图片。下面的代码展示了这个应用:
import numpy as np
import cv2
import matplotlib.pyplot as plt
import scipy.sparse.linalg as laimg = cv2.imread('./Imgs/example2.jpg')# 读取RGB图片
img = np.sum(img, axis=2) / 3#将RGB图片的三张分量R,G,B矩阵相加后每个元素除以三,得到灰度图def img_compress(img, k):
u, lm, v = la.svds(img, k=k)#该函数可以直接求出取k个特征值和特征向量时的奇异值分解
img1 = u.dot(np.diag(lm)).dot(v)#将奇异值分解得到的矩阵相乘得到压缩后的图片
return img1img1 = img_compress(img, 20)#取前 20 个特征值进行压缩后的图片
img2 = img_compress(img, 200)#取前 200 个特征值进行压缩后的图片plt.subplot(1,3,1)#用 1 × 3 的排列方式在第一个位置显示图片
plt.imshow(img)
plt.subplot(1,3,2)#用 1 × 3 的排列方式在第二个位置显示图片
plt.imshow(img1)
plt.subplot(1,3,3)#用 1 × 3 的排列方式在第三个位置显示图片
plt.imshow(img2)plt.show()#显示整张图
得到的结果图片如下,可以发现,随着选取特征值个数的增多,图片更加清晰,但是压缩率会更小。
文章图片
3. CP 分解 CP 分解是一种对张量进行拆分的方法,其核心思想是用有限个秩一张量的和来 近似 地表示该张量。
文章图片
如上图所示,如果要把一个三阶张量X ∈ R I × J × K \mathcal{X}\in\mathbb{R}^{I \times J \times K} X∈RI×J×K 进行分解,我们期望结果如下:
X ≈a 1 ° b 1 ° c 1 + a 2 ° b 2 ° c 2 + ? + a R ° b R ° c R = ∑ r = 1 R a r ° b r ° c r \begin{aligned} \mathcal{X} \approx & \ a_1 \circ b_1 \circ c_1 + a_2 \circ b_2 \circ c_2 + \cdots + a_R \circ b_R \circ c_R \\ = &\sum_{r=1}^R a_r \circ b_r \circ c_r \end{aligned} X≈=? a1?°b1?°c1?+a2?°b2?°c2?+?+aR?°bR?°cR?r=1∑R?ar?°br?°cr??
如果我们记
A = [ a 1 a 2 … a R ] \mathrm{A} = \begin{bmatrix} a_1 & a_2 & \dots & a_R \end{bmatrix} A=[a1??a2??…?aR??]
B = [ b 1 b 2 … b R ] \mathrm{B} = \begin{bmatrix} b_1 & b_2 & \dots & b_R\end{bmatrix} B=[b1??b2??…?bR??]
C = [ c 1 c 2 … c R ] \mathrm{C} = \begin{bmatrix} c_1 & c_2 & \dots &c_R\end{bmatrix} C=[c1??c2??…?cR??]
我们称A , B , C A,B,C A,B,C 为因子矩阵,则张量可以表示为
X ≈ [ ?? [ A , B , C ] ?? ] ≡ ∑ r = 1 R a r ° b r ° c r \mathcal{X} \approx [\![\mathrm{A,B,C}]\!] \equiv \sum_{r=1}^R \mathrm{a}_r \circ \mathrm{b}_r \circ \mathrm{c}_r X≈[[A,B,C]]≡r=1∑R?ar?°br?°cr?
这个公示就是张量的 CP 分解。
这里有个性质: R a n k ( A ) + R a n k ( B ) + R a n k ( C ) ≥ 2 R + 2 Rank(A)+Rank(B)+Rank(C) \geq 2R+2 Rank(A)+Rank(B)+Rank(C)≥2R+2 。
通常为了计算便利,我们假设A , B A,B A,B 和C C C 的列向量都是归一化的,我们引入一个权重向量λ ∈ R R \lambda\in\mathbb{R}^R λ∈RR,来表示每个秩一矩阵所占权重,则分解可以记为如下形式:
X ≈ [ ?? [ λ ? ; ? A , B , C ] ?? ] ≡ ∑ r = 1 R λ r ? a r ° b r ° c r \mathcal{X} \approx [\![\lambda \, ; \, \mathrm{A,B,C}]\!] \equiv \sum_{r=1}^R \lambda_r \: \mathrm{a}_r \circ \mathrm{b}_r \circ \mathrm{c}_r X≈[[λ; A,B,C]]≡r=1∑R?λr?ar?°br?°cr?
三阶张量是应用当中最为广泛也往往是足够满足我们需求的张量。但是对于一个N阶的张量X ∈ R I 1 × I 2 × ? × I N \mathcal{X}\in\mathbb{R}^{I_1\times I_2 \times \dots \times I_N} X∈RI1?×I2?×?×IN? ,其 CP 分解可以被写为:
X ≈ [ ?? [ λ ? ; A ( 1 ) , A ( 2 ) , … , A ( N ) ] ?? ] ≡ ∑ r = 1 R λ r ? a r ( 1 ) ° a r ( 1 ) ° ? ° a r ( N ) \mathcal{X} \approx [\![\lambda \:; \mathrm{A}^{(1)}, \mathrm{A}^{(2)},\dots,\mathrm{A}^{(N)}]\!] \equiv \sum_{r=1}^R \lambda_r \: \mathrm{a}_r^{(1)} \circ \mathrm{a}_r^{(1)}\circ \dots \circ \mathrm{a}_r^{(N)} X≈[[λ; A(1),A(2),…,A(N)]]≡r=1∑R?λr?ar(1)?°ar(1)?°?°ar(N)?
其中λ ∈ R R \lambda \in \mathbb{R}^R λ∈RR 且A ( n ) ∈ R I n ? ×R \mathrm{A}^{(n)}\in \mathbb{R}^{I_n\,\times \ R} A(n)∈RIn?× R 。
分解的切片表示
利用因子矩阵,一个三阶张量的 CP 分解可以被等价写作以下矩阵形式,其左侧都是张量的对应的 mode 的矩阵化:
X ( 1 ) ≈ A ( C ⊙ B ) T X ( 2 ) ≈ B ( C ⊙ A ) T X ( 3 ) ≈ C ( B ⊙ A ) T \mathrm{X}_{(1)} \approx \mathrm{A}(\mathrm{C}\odot \mathrm{B})^\mathsf{T}\\ \mathrm{X}_{(2)} \approx \mathrm{B}(\mathrm{C}\odot \mathrm{A})^\mathsf{T}\\ \mathrm{X}_{(3)} \approx \mathrm{C}(\mathrm{B}\odot \mathrm{A})^\mathsf{T} X(1)?≈A(C⊙B)TX(2)?≈B(C⊙A)TX(3)?≈C(B⊙A)T
以上的模型还可以用张量的正面切片方式表示为:
X ( k ) ≈ A D ( k ) B T \mathcal{X}_{(k)} \approx \mathrm{A}\mathrm{D}^{(k)}\mathrm{B}^\mathsf{T} X(k)?≈AD(k)BT
其中D ( k ) ≡ diag ( c k : ) , k = 1 , . . . , K \mathrm{D}^{(k)} \equiv \text{diag}(c_{k:}),k=1,...,K D(k)≡diag(ck:?),k=1,...,K ,整个表示可以用下图表示:
文章图片
对于高维的张量,其 mode - n 矩阵化可以写为:
X ( n ) ≈ A ( n ) Λ ( A ( N ) ° ? ° A ( n + 1 ) ° A ( n ? 1 ) ? ? ? A ( 1 ) ) T \mathrm{X}_{(n)}\approx \mathrm{A}^{(n)}\Lambda(\mathrm{A}^{(N)}\circ \dots \circ \mathrm{A}^{(n+1)} \circ \mathrm{A}^{(n-1)} \cdot \dots \cdot \mathrm{A^{(1)})^\mathsf{T}} X(n)?≈A(n)Λ(A(N)°?°A(n+1)°A(n?1)???A(1))T
其中Λ = d i a g ( λ ) \Lambda = diag(\lambda) Λ=diag(λ) 。
张量的秩分解
上面我们已经介绍了张量的秩,其值为为表示张量所需秩一张量的最小数目,精确确定表示张量的每个秩一张量就是 秩分解 。CP 分解是对张量的近似表示,因此可以将秩分解视为 CP 分解的特例。
虽然张量秩的定义和矩阵类似,但他们的性质之间存在很多不同。其中一个不同便是在R \R R 和C \mathbb{C} C 之下, 张量可以存在不同的秩。如,对于正面切片如下的张量:
X 1 = [ 1 0 0 1 ] , X 2 = [ 0 1 ? 1 0 ] \mathrm{X}_1 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \quad ,\quad \mathrm{X}_2 = \begin{bmatrix} 0 & 1 \\ -1 & 0\end{bmatrix} X1?=[10?01?],X2?=[0?1?10?]
这个张量在R \R R 下的秩为 3 ,但是在C \mathbb{C} C 下的秩为 2 。其R \R R 下的秩分解X = [ ?? [ A , B , C ] ?? ] \mathcal{X} = [\![\mathrm{A}, \mathrm{B}, \mathrm{C}]\!] X=[[A,B,C]] 为:
A = [ 1 0 1 0 1 ? 1 ] , B = [ 1 0 1 0 1 1 ] , C = [ 1 1 0 ? 1 1 1 ] \mathrm{A} = \begin{bmatrix}1 & 0 & 1 \\ 0 & 1 & -1 \end{bmatrix}, \quad \mathrm{B} = \begin{bmatrix}1 & 0 & 1 \\ 0 & 1 & 1 \end{bmatrix}, \quad \mathrm{C} = \begin{bmatrix}1 & 1 & 0 \\ -1 & 1 & 1 \end{bmatrix} A=[10?01?1?1?],B=[10?01?11?],C=[1?1?11?01?]
在C \mathbb{C} C 之下的秩分解为:
A = 1 2 [ 1 1 ? i i ] , B = 1 2 [ 1 1 i ? i ] , C = 1 2 [ 1 1 i ? i ] \mathrm{A} = \frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\ -i & i \end{bmatrix}, \quad \mathrm{B} = \frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\ i & -i \end{bmatrix}, \quad \mathrm{C} = \frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\ i & -i \end{bmatrix} A=2 ?1?[1?i?1i?],B=2 ?1?[1i?1?i?],C=2 ?1?[1i?1?i?]
注意:张量的秩没有一个简单直接的求法,直接求秩本身已被证明是 NP - hard 问题。
CP 分解的计算
张量的秩没有直接的求法,但是如果想要进行 CP 分解,必须要知道张量的值,那么我们怎么计算 CP 分解呢?从理想上说,如果数据是没有噪音的而且在确定了张量的秩后,其 CP 分解的计算方法是已知的,那么我们可以假设张量的秩依次为R = 1 , 2 , 3 , ? R=1,2,3,\cdots R=1,2,3,? ,用该秩去计算 CP 分解,当直到得到分解的拟合精度达到 100%。
那么如果我们假设了张量的秩为 R ,那么计算方法是什么样的呢?现在在给定秩之后计算 CP 分解的方法有很多,其中的一种方法 ALS(alternating least squares)(交替最小方差法),是一类比较有效的算法。
在数学最优化问题中,拉格朗日乘数法是用来寻找多元函数的极值的方法。这种方法将一个有n n n 个变量与k k k 个约束条件的最优化问题转换为一个有n + k n + k n+k 个变量的方程组的极值问题,其变量不受任何约束。这种方法引入了一种新的标量未知数,即拉格朗日乘数:即形成方程的线性组合里每个矢量的系数。CP 分解的计算可以转换为 ALS 的一个子问题。
我们用非负矩阵里面的代价函数来衡量 CP 分解得到结果的相似度,以三阶张量为例,我们令
X ^ = [ ?? [ λ ? ; ? A , B , C ] ?? ] ≡ ∑ r = 1 R λ r ? a r ° b r ° c r \hat{\mathcal{X}}= [\![\lambda \, ; \, \mathrm{A,B,C}]\!] \equiv \sum_{r=1}^R \lambda_r \: \mathrm{a}_r \circ \mathrm{b}_r \circ \mathrm{c}_r X^=[[λ; A,B,C]]≡r=1∑R?λr?ar?°br?°cr?
那么 CP 分解的计算就转变为求
min ? ∥ X ? X ^ ∥ \min \| \mathcal{X}-\hat{\mathcal{X}}\| min∥X?X^∥
求使上式尽可能小的X ^ \hat{\mathcal{X}} X^ 就能得到最终的结果。
上面的问题可以作为 ALS 的一个子问题,因为分解可以表示为
X ( 1 ) ≈ A ( C ⊙ B ) T \mathrm{X}_{(1)} \approx \mathrm{A}(\mathrm{C}\odot \mathrm{B})^\mathsf{T} X(1)?≈A(C⊙B)T
则问题可以转变为固定B , C B,C B,C ,求解
min ? ∥ X ( 1 ) ? Adiag ( λ ) ( C ⊙ B ) T ∥ \min \| \mathrm{X}_{(1)}-A \ \text{diag}(\lambda)(C \odot B)^T \| min∥X(1)??A diag(λ)(C⊙B)T∥
可以得到
Adiag ( λ ) = X ( 1 ) [ ( C ⊙ B ) T ] H = X ( 1 ) ( C ⊙ B ) ( C T C ? B T B ) H A \ \text{diag}(\lambda)= \mathrm{X}_{(1)}\big[(\mathrm{C}\odot \mathrm{B})^{\mathsf{T}}\big]^H = \mathrm{X}_{(1)}(\mathrm{C} \odot \mathrm{B})(\mathrm{C}^{\mathsf{T}}\mathrm{C} * \mathrm{B}^{\mathsf{T}}\mathrm{B})^H A diag(λ)=X(1)?[(C⊙B)T]H=X(1)?(C⊙B)(CTC?BTB)H
再通过归一化分别求出A A A 和λ \lambda λ 。
推荐阅读
- 论文|利用树结构的张量网络进行机器学习
- 六、物理中的张量问题
- 七、矩阵乘积态
- 张量网络算法基础|张量网络算法基础(五、TEBD算法和DMRG算法)
- 张量网络算法基础|张量网络算法基础(三、格点模型)
- 张量网络算法基础|张量网络算法基础(一、张量和线性代数基础)
- 张量网络算法基础|张量网络基础算法(四、TT分解和矩阵乘积态)