学完了SVD算法之后,我们继续回到张量几大分解的学习上来,本期学习的主要内容是张量的 Tucker 分解 以及 前面的CP分解还留下一点没有说完,正好一并补齐!后面的公式我将采用颜色标记,红色代表必须掌握,蓝色尽量掌握!
在这之前先附一张图,包含了各种运算符号的名称含义,大部分是前面说过或者使用过的:
Tensor decomposition
一 . Tucker 分解公式介绍和原理
我们先来看一张被使用过很多次的Trucker 分解图片,这是在三阶张量上的分解形式!过程貌似可能应该差不多 肯定有点枯燥无味,坚持一下,本人已经被张量学习掏空了!
如上图所示:对于一个三阶张量
X
∈
R
I
×
J
×
K
\mathcal{X} \in \mathbb{R}^{I \times J \times K}
X∈RI×J×K而言,经过Tucker分解可以得到:三个因子矩阵
A
∈
R
I
×
P
,
B
∈
R
J
×
Q
,
C
∈
R
K
×
R
A \in \mathbb{R}^{I \times P}, B \in \mathbb{R}^{J \times Q}, C \in \mathbb{R}^{K \times R}
A∈RI×P,B∈RJ×Q,C∈RK×R和一个核张量
G
∈
R
P
×
Q
×
R
\mathcal{G} \in \mathbb{R}^{P \times Q \times R}
G∈RP×Q×R ,每个mode上的因子矩阵称为张量在每个mode上的基矩阵或者是主成分,因此Tucker 分解又称为高阶PCA, 高阶SVD等。
在三阶张量形式中,,我们有如下分解:
X
=
G
×
1
A
×
2
B
×
3
C
=
∑
p
=
1
P
∑
q
=
1
Q
∑
r
=
1
R
g
p
q
r
a
p
∘
b
q
∘
c
r
=
[
[
G
;
A
,
B
,
C
]
]
\mathcal{X}=\mathcal{G} \times_{1} A \times_{2} B \times_{3} C=\sum_{p=1}^{P} \sum_{q=1}^{Q} \sum_{r=1}^{R} g_{p q r} a_{p} \circ b_{q} \circ c_{r}=[[\mathcal{G} ; A, B, C]]
X=G×1A×2B×3C=p=1∑Pq=1∑Qr=1∑Rgpqrap∘bq∘cr=[[G;A,B,C]]
显然,矩阵 A , B , C \boldsymbol{A},\boldsymbol{B},\boldsymbol{C} A,B,C 就是因子矩阵了,他们通常可以被作每个mode下的主成分,同样也是相互正交的!那么图中的长方体张量 G ∈ R P × Q × R \mathcal{G} \in \mathbb{R}^{P \times Q \times R} G∈RP×Q×R 就是核心张量了,它其中的每一个数字元素都代表了不同成分之间的互动程度!
那么对于原始张量的每一个元素来说,Tucker 分解法 可以写作:
x i j k ≈ ∑ p = 1 P ∑ q = 1 Q ∑ r = 1 R g p q r a i p b j q c k r for i = 1 , … , I , j = 1 , … , J , k = 1 , … , K x_{i j k} \approx \sum_{p=1}^{P} \sum_{q=1}^{Q} \sum_{r=1}^{R} g_{p q r} a_{i p} b_{j q} c_{k r} \quad \text { for } \quad i=1, \ldots, I, j=1, \ldots, J, k=1, \ldots, K xijk≈p=1∑Pq=1∑Qr=1∑Rgpqraipbjqckr for i=1,…,I,j=1,…,J,k=1,…,K
需要注意:这里的 P , Q , R \boldsymbol{P},\boldsymbol{Q},\boldsymbol{R} P,Q,R 为对应的因子矩阵 A , B , C \boldsymbol{A},\boldsymbol{B},\boldsymbol{C} A,B,C的成分数目(例如列向量的数目),如果 P , Q , R \boldsymbol{P},\boldsymbol{Q},\boldsymbol{R} P,Q,R 均小于 i , j , k \boldsymbol{i},\boldsymbol{j},\boldsymbol{k} i,j,k,我们可以将核心张量 G \mathcal{G} G 视作是原张量 X \mathcal{X} X 的一个压缩版本,一般情况下,它所占用的空间是被压缩了的!
除此之外,我们应当还需要知道三阶张量的矩阵张来:
突然跳出来个
G
G
G ,它代表的是核心张量的三个切片,公式中对应的X也是与其对应的原张量切片。你完全可以举个小例子去验证 ,对帮助理解有好处!
这些公式当然不限制于更高阶的张量分解,其公式按照上面这个两个依葫芦画瓢即可,就不多赘述了。
对于三阶张量固定一个因子矩阵为单位阵,就得到Tucker分解一个重要的特例:Tucker2:
X
=
G
×
1
A
×
2
B
=
[
G
;
A
,
B
,
I
]
\mathcal{X}=\mathcal{G} \times_{1} A \times_{2} B=[\mathcal{G} ; A, B, I]
X=G×1A×2B=[G;A,B,I]
进一步,如果固定两个因子矩阵
C
=
I
,
B
=
I
C=I, B=I
C=I,B=I,就得到了Tucker1,那么此时Tucker 分解就退化成了普通的二维PCA:
X
=
G
×
1
A
=
[
G
;
A
,
I
,
I
]
\mathcal{X}=\mathcal{G} \times_{1} A=[\mathcal{G} ; A, I, I]
X=G×1A=[G;A,I,I]
这也证实了张量的Tucker 分解就是高阶PCA!
二 . 张量的 n-Rank
n-Rank秩又称为多线性秩,一个N阶张量 X \mathcal{X} X 的 n-mode秩定义如下:
rank n ( X ) = rank ( X ( n ) ) \operatorname{rank}_{n}(\mathcal{X})=\operatorname{rank}\left(X_{(n)}\right) rankn(X)=rank(X(n))
特别要注意,这两个X不一样 我刚开始看成一样的,后面怎么看也没看懂。。。。
先令 rank n ( X ) = R n , n = 1 , ⋯ , N \operatorname{rank}_{n}(\mathcal{X})=R_{n}, n=1, \cdots, N rankn(X)=Rn,n=1,⋯,N,那么 X \mathcal{X} X 就叫做 秩- ( R 1 , R 2 , ⋯ , R n ) \left(R_{1}, R_{2}, \cdots, R_{n}\right) (R1,R2,⋯,Rn) 的张量(这只是一种表示高阶张量秩的方法,莫奇怪!), R n R_{n} Rn 可以看做是 张量 X \mathcal{X} X 在各个切片上的 所构成空间的维度,说白了,张量的秩直接不好表示,就用其切片矩阵的秩来表示。。。。
n-rank切记不能与秩(rank), 也就是最小的秩1成分数目, 所混淆. 这两个不是一个东西!
对于一个给定的张量 X \mathcal{X} X, 我们可以很轻易地找到一个秩为 R 1 , R 2 , … , R N R_{1}, R_{2}, \ldots, R_{N} R1,R2,…,RN where R n = rank n ( X ) R_{n}=\operatorname{rank}_{n}(\mathcal{X}) Rn=rankn(X) 的精确 Tucker 分解, 但如果我们计算的Tucker分解的秩低于这组值, 也就是对某些n来说 R n < rank n ( X ) R_{n}<\operatorname{rank}_{n}(\mathcal{X}) Rn<rankn(X),那么, 我们将必然无法获得精确的结果并且其计算会变得更为困难!
下图展示了一个三阶张量的低秩近似:
该分解将不能精确地还原
X
\mathcal{X}
X
三 . Tucker分解法的计算
计算Tucker分解的一个可行的方法来自于前面所述的Tucker1算法, 即,舍去一个矩阵来最大程度的捕捉其mode-n fiber的分布变化(variation). 由于后人的研究和分析, 此法后来又被称之为higher-order SVD(HOSVD),它通过张量的每一个mode上做SVD分解对各个mode上的因子矩阵进行求解,最后计算张量在各个mode上的投影之后的张量作为核张量。它的算法过程如下图所示:
我们来大概的推导一下,假设有一个
N
N
N 阶张量
X
∈
R
I
1
×
I
2
×
⋯
×
I
N
\mathcal{X} \in \mathbb{R}^{I_{1} \times I_{2} \times \cdots \times I_{N}}
X∈RI1×I2×⋯×IN 那么对
X
\mathcal{X}
X 的分解就可以转化为对下列问题的求解:
∣ X − [ [ G ; A ( 1 ) , ⋯ , A ( N ) ] ] ∣ = ∣ vec ( X ) − ( A ( N ) ⊗ ⋯ ⊗ A ( 1 ) ) vec ( G ) ∣ \left|\mathcal{X}-\left[\left[\mathcal{G} ; \mathbf{A}^{(1)}, \cdots, \mathbf{A}^{(N)}\right]\right]\right|=\left|\operatorname{vec}(\mathcal{X})-\left(\mathbf{A}^{(N)} \otimes \cdots \otimes \mathbf{A}^{(1)}\right) \operatorname{vec}(\mathcal{G})\right| ∣∣∣X−[[G;A(1),⋯,A(N)]]∣∣∣=∣∣∣vec(X)−(A(N)⊗⋯⊗A(1))vec(G)∣∣∣
再整体平方化简得:
∥
X
−
[
G
;
A
(
1
)
,
⋯
,
A
(
N
)
]
∥
2
=
∥
X
∥
2
−
2
⟨
X
,
[
G
;
A
(
1
)
,
⋯
,
A
(
N
)
∥
⟩
+
∥
G
;
A
(
1
)
,
⋯
,
A
(
N
)
]
∥
2
=
∥
X
∥
2
−
2
⟨
X
×
1
A
(
1
)
⊤
…
×
N
A
(
N
)
T
,
G
⟩
+
∥
G
∥
2
=
∥
X
∥
2
−
2
⟨
G
,
G
⟩
+
∥
G
∥
2
=
∥
X
∥
2
−
∥
X
×
1
A
(
1
)
T
⋯
×
N
A
(
N
)
T
∥
2
\begin{aligned} &\left\|\mathcal{X}-\left[\mathcal{G} ; \mathbf{A}^{(1)}, \cdots, \mathbf{A}^{(N)}\right]\right\|^{2} \\ =&\|\mathcal{X}\|^{2}-2\left\langle\mathcal{X},\left[\mathcal{\mathcal{G}}; \mathbf{A}^{(1)}, \cdots, \mathbf{A}^{(N)} \|\right\rangle+\| \mathcal{G} ; \mathbf{A}^{(1)}, \cdots, \mathbf{A}^{(N)}\right] \|^{2} \\ =&\|\mathcal{X}\|^{2}-2\left\langle\mathcal{X} \times_{1} \mathbf{A}^{(1) \top} \ldots \times_{N} \mathbf{A}^{(N) \mathrm{T}}, \mathcal{G}\right\rangle+\|\mathcal{G}\|^{2} \\ =&\|\mathcal{X}\|^{2}-2\langle \mathcal{G}, \mathcal{G}\rangle+\|\mathcal{G}\|^{2} \\ =&\|\mathcal{X}\|^{2}-\left\|\mathcal{X} \times_{1} \mathbf{A}^{(1) \mathrm{T}} \cdots \times_{N} \mathbf{A}^{(N) \mathrm{T}}\right\|^{2} \end{aligned}
====∥∥∥X−[G;A(1),⋯,A(N)]∥∥∥2∥X∥2−2⟨X,[G;A(1),⋯,A(N)∥⟩+∥G;A(1),⋯,A(N)]∥2∥X∥2−2⟨X×1A(1)⊤…×NA(N)T,G⟩+∥G∥2∥X∥2−2⟨G,G⟩+∥G∥2∥X∥2−∥∥∥X×1A(1)T⋯×NA(N)T∥∥∥2
而
G
\mathcal{G}
G 满足:
G
=
X
×
1
A
(
1
)
T
…
×
N
A
(
N
)
T
\mathcal{G}=\mathcal{X} \times_{1} \mathbf{A}^{(1) \mathrm{T}} \ldots \times_{N} \mathbf{A}^{(N) \mathrm{T}}
G=X×1A(1)T…×NA(N)T
由于 ∥ X ∥ \|\mathcal{X}\| ∥X∥是一个常数,最小化上面的式子相当于最大化后面的: max ∥ X × 1 A ( 1 ) T ⋯ × N A ( N ) T ∥ \max \left\|\mathcal{X} \times_{1} \mathbf{A}^{(1) \mathrm{T}} \cdots \times_{N} \mathbf{A}^{(N) \mathrm{T}}\right\| max∥∥X×1A(1)T⋯×NA(N)T∥∥
最终得到:
max
∥
A
(
n
)
T
W
∥
s.t.
W
=
X
(
n
)
(
A
(
N
)
⊗
…
⊗
A
(
n
+
1
)
⊗
A
(
n
−
1
)
⋯
⊗
A
(
1
)
)
\begin{array}{l} \max \left\|\mathbf{A}^{(n) \mathrm{T}} \mathbf{W}\right\| \\ \text { s.t. } \mathbf{W}=\mathbf{X}_{(n)}\left(\mathbf{A}^{(N)} \otimes \ldots \otimes \mathbf{A}^{(n+1)} \otimes \mathbf{A}^{(n-1)} \cdots \otimes \mathbf{A}^{(1)}\right) \end{array}
max∥∥A(n)TW∥∥ s.t. W=X(n)(A(N)⊗…⊗A(n+1)⊗A(n−1)⋯⊗A(1))
个人感觉算法的思路懂了就行,上面的推导能熟悉的理解更好,看不懂迷迷糊糊的也没大事,因为后面编程真正求解的时候,有python包为我们提供强大的算法,直接导入张量就好了!
四 . Tucker 与CP 分解的区别联系
(1)主要区别:核张量:
CP分解,就是将一个张量分解为若干个秩1张量的和的形式,图形化如下(新图 需要掌握 和上期CP分解博客里面的原理一模一样):
R
R
R 表示CP分解的秩,
G
\mathcal{G}
G 表示核张量,只不过这里的核张量是三阶对角张量,A表示一系列的因子矩阵。
顺便回顾一下:CP分解的问题就是不知道分解为多少个若干个秩1张量的和的形式,处理的话一般都是先假设一个值,接下来就是确定核张量和因子矩阵,一般都是用交替最小二乘法或者梯度下降法。
而Tucker 分解示意图如下:
核张量并没有是对角的要求!
(2)Tucker分解需要的是n-秩与低秩近似,而CP分解是秩与低秩近似
具体参考上面的内容和上上期CP分解的博客!
(3)应用领域不同
Tucker分解可以看作是一个PCA的多线性版本,因此可以用于数据降维,特征提取,张量子空间学习等。比如说一个低秩的张量近似可以做一些去噪的操作等。Tucker分解同时在高光谱图像中也有所应用,如用低秩Tucker分解做高光谱图像的去噪,用张量子空间做高光谱图像的特征选择,用Tucker分解做数据的压缩等!
这期博客学习就到这里了,下期,我们将正式进入张量网络的学习!大家加油!