张量分解算法(CP分解、Tucker分解、BTD分解)
基础知识
张量
在介绍张量分解算法(Tensor Decomposition Algorithms)之前,我们先介绍一下什么是张量(tensor)。张量是一个多维的数据存储形式(多维数组),数据的的维度被称为张量的阶。它可以看成是向量和矩阵在多维空间中的推广,更正式地说,一个N维或N阶张量是N个向量空间的张量积的一个元素,每个向量空间都有自己的坐标系。其中零阶张量是标量(scalar),一阶张量是一个向量(vector),二阶的张量是矩阵(matrix),三阶及三阶以上的就是我们通常所说的张量,也叫高阶张量。下图是一个三阶张量 X ∈ R I × J × K \mathcal{X}\in\R^{I\times{J}\times{K}} X∈RI×J×K,有三个指标。
应该注意的是,这里的张量不是物理和工程中的张量(如应力张量),后者在数学中通常被称为张量场。
秩一张量
若一个 N N N阶张量 X ∈ R I 1 × I 2 × ⋯ × I N \mathcal{X}\in\R^{I_{1}\times I_{2}\times \cdots \times I_{N}} X∈RI1×I2×⋯×IN能够被表示为 N N N个向量的外积,则称 X \mathcal{X} X为秩一张量,即 X = a ( 1 ) ⨂ a ( 2 ) ⋯ ⨂ a ( N ) \mathcal{X}=\bf{a}^{(1)}\bigotimes\bf{a}^{(2)} \cdots\bigotimes\bf{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 \cdots{i_N}}=a_{i_1}^{(1)}a_{i_2}^{(2)} \cdots a_{i_N}^{(N)} xi1i2⋯iN=ai1(1)ai2(2)⋯aiN(N)其中 1 ≤ i n ≤ I n 1\leq i_n\leq I_n 1≤in≤In 。下图是一个三阶的秩一张量 X = a ⨂ b ⨂ c \mathcal{X}=\bf{a}\bigotimes\bf{b} \bigotimes\bf{c} X=a⨂b⨂c
张量 X \mathcal{X} X的元素 ( i , j , k ) (i,j,k) (i,j,k)由 x i j k = a i b j c k x_{ijk}=a_i b_j c_k xijk=aibjck给出。
张量分解的意义
张量分解可以看作是矩阵奇异值分解(SVD)和主成分分析(PCA),即矩阵分解的高阶泛化。它能够解决维度灾难问题,而传统的方法(例如ICA、PCA、SVD和NMF)对于维数比较高的数据,一般将数据展成二维的数据形式(矩阵),从而进行降维处理、缺失数据填补(或者说成“稀疏数据填补”)和隐性关系挖掘。但是这种方式会使数据的结构信息丢失,而采用张量对数据进行存储,能够保留数据的结构信息,因此近些年在图像处理以及CV等领域得到了一些广泛的应用。
张量分解中常见的两种分解是CP分解(Canonical Polyadic Decomposition,CPD)和Tucker分解(Tucker Decomposition),下面将重点介绍这两种分解。
张量分解算法
CP分解
介绍
1927年Hitchcock基于秩一张量的定义,首次提出了将张量拆成有限个秩为1的张量相加的形式。后来在1970年Carrol和Chang将这个概念以CANDECOMP (canonical decomposition,标准分解)的形式在引入到心理测验学当中,与此同时 Harshman也提出了PARAFAC(parallel factors,平行因素) 的形式,该方法才得以流行,所以今天我们称这个将张量分解为有限个秩一张量和的形式的分解方法为CP分解,即是CANDECOMP/PARAFAC分解的缩写。
简单来说,CP分解就是将一个张量分解成多个秩为一的张量之和的形式。例如,一个三维张量 X ∈ R I × J × K \mathcal{X}\in\R^{I\times{J}\times{K}} X∈RI×J×K分解成 R R R个秩为一的张量和的形式为 X ≈ ∑ r = 1 R a r ⨂ b r ⨂ ⋯ c r \mathcal{X}\approx \sum \limits_{
{r} = 1}^{
{R}} a_{r}\bigotimes b_{r}\bigotimes \cdots c_{r} X≈r=1∑Rar⨂br⨂⋯cr其中 R R R是正整数, a r ∈ R I , b r ∈ R J , c r ∈ R K ( r = 1 , 2 , … , R ) a_r\in\R^I,b_r\in\R^J,c_r\in\R^K(r=1,2,\ldots,R) ar∈RI,br∈RJ,cr∈RK(r=1,2,…,R), X \mathcal{X} X中的元素为 x i j k ≈ ∑ r = 1 R a i r b j r c k r , i = 1 , 2 , … I , j = 1 , 2 , … J , k = 1 , 2 , … K . x_{ijk}\approx \sum \limits_{
{r} = 1}^{
{R}} a_{ir} b_{jr} c_{kr}\quad, i=1,2, \ldots I,j=1,2, \ldots J,k=1,2, \ldots K. xijk≈r=1∑Rairbjrckr,i=1,2,…I,j=1,2,…J,k=1,2,…K.它的CP分解示意图如下图所示
同时,我们也可以将张量 X \mathcal{X} X矩阵化(利用Khatri–Rao product进行转换,符号 ⨀ \bigodot ⨀,其实就是列元素匹配),并引入了权重向量 λ ∈ R R \lambda \in \R^R λ∈RR将A,B,C的列标准化长度为1,此时的CP分解模型可以简单地表示为 X ≈ ∑ r = 1 R λ r a r ⨂ b r ⨂ c r = [ [ λ ; A , B , C ] ] \mathcal{X}\approx\sum \limits_{r=1}^{R}\lambda_{r} a_{r} \bigotimes b_{r} \bigotimes c_{r}=\left [\left[ {\lambda ; A,B,C} \right]\right] X≈r=1∑Rλrar⨂br⨂cr=[[λ;A,B,C]]
对于一般的 N N N阶张量 X ∈ R I 1 × I 2 × ⋯ × I N \mathcal{X}\in\R^{I_{1}\times I_{2}\times \cdots \times I_{N}} X∈RI1×I2×⋯×IN分解成 R R <