CP分解

CP分解

将高维的张量分解成为Rank-One Tensors的和。

这里的是指的外积。

上面的式子也可以展开成:

定义因子矩阵(factor matrices)表示向量的组合。例如。然后对三维的情况,我们可以将上面的表达式写成下面的形式:

\begin{array} { l } { \mathbf { X } _ { ( 1 ) } \approx \mathbf { A } ( \mathbf { C } \odot \mathbf { B } ) ^ { \top } } ,\\ { \mathbf { X } _ { ( 2 ) } \approx \mathbf { B } ( \mathbf { C } \odot \mathbf { A } ) ^ { \top } } ,\\ { \mathbf { X } _ { ( 3 ) } \approx \mathbf { C } ( \mathbf { B } \odot \mathbf { A } ) ^ { \top } } .\end{array}

其中的表示KR积。然后表示张量的的mode-n unfolding。

例如:,

\mathbf { X } _ { 1 } = \left[ \begin{array} { } { 1 } & { 4 } & { 7 } & { 10 } \\ { 2 } & { 5 } & { 8 } & { 11 } \\ { 3 } & { 6 } & { 9 } & { 12 } \end{array} \right] , \quad \mathbf { X } _ { 2 } = \left[ \begin{array} { } { 13 } & { 16 } & { 19 } & { 22 } \\ { 14 } & { 17 } & { 20 } & { 23 } \\ { 15 } & { 18 } & { 21 } & { 24 } \end{array} \right]

那么

\mathbf { X } _ { ( 1 ) } = \left[ \begin{array} {} { 1 } & { 4 } & { 7 } & { 10 } & { 13 } & { 16 } & { 19 } & { 22 } \\ { 2 } & { 5 } & { 8 } & { 11 } & { 14 } & { 17 } & { 20 } & { 23 } \\ { 3 } & { 6 } & { 9 } & { 12 } & { 15 } & { 18 } & { 21 } & { 24 } \end{array} \right]

\mathbf { X } _ { ( 2 ) } = \left[ \begin{array} { } { 1 } & { 2 } & { 3 } & { 13 } & { 14 } & { 15 } \\ { 4 } & { 5 } & { 6 } & { 16 } & { 17 } & { 18 } \\ { 7 } & { 8 } & { 9 } & { 19 } & { 20 } & { 21 } \\ { 10 } & { 11 } & { 12 } & { 22 } & { 23 } & { 24 } \end{array} \right]

\mathbf { X } _ { ( 3 ) } = \left[ \begin{array} { } { 1 } & { 2 } & { 3 } & { 4 } & { 5 } & { \cdots } & { 9 } & { 10 } & { 11 } & { 12 } \\ { 13 } & { 14 } & { 15 } & { 16 } & { 17 } & { \cdots } & { 21 } & { 22 } & { 23 } & { 24 } \end{array} \right]

我们可以把它展开后验证一下式子的正确性,当然肯定是对的。也可以从维度的角度去进行验证。

CP分解可以简明的表述为:

如果将标准化,然后提取出权重,可以得到如下的表述:

x \approx[[\mathbf { A } , \mathbf { B } , \mathbf { C } ]] \equiv \sum _ { r = 1 } ^ { R } \lambda _ { r } \mathbf { a } _ { r } \circ \mathbf { b } _ { r } \circ \mathbf { c } _ { r }

对于N维的情况,

x \approx \mathbb { [[ } \lambda ; \mathbf { A } ^ { ( 1 ) } , \mathbf { A } ^ { ( 2 ) } , \ldots , \mathbf { A } ^ { ( N ) } \mathbb { ]] } \equiv \sum _ { r = 1 } ^ { R } \lambda _ { r } \mathbf { a } _ { r } ^ { ( 1 ) } \circ \mathbf { a } _ { r } ^ { ( 2 ) } \circ \cdots \circ \mathbf { a } _ { r } ^ { ( N ) }

Tensor Rank

当取等号的时候,R的最小取值,就是该张量的秩。

对张量的秩的定义和对矩阵的张量的定义类似。但是存在一些不同。

  1. 张量的秩在实数域和复数域可以不同。
  2. 没有直接的算法去计算给定张量的秩。这是一个NP-hard问题。

张量集合的最大秩和典型秩。对一个张量的集合,所能取到的最大的秩成为最大秩(maximum rank),发生概率大于0的秩成为典型秩typical rank

对于不同形状的张量有不同的最大秩和典型秩,可以通过查表获得。

Uniqueness 唯一性

高阶张量的一个特性是他们的分解通常是唯一的,但是矩阵分解通常不是唯一的。

矩阵的分解是不唯一的。令是一个秩为R的矩阵,它的分解为:

如果的SVD分解是那么我们可以选择,同时可以选择

张量分解的唯一性是指排除简单的重新组合和缩放的情况后,只存在一种可能的分解。

三维情况下,CP分解唯一性的充分条件是:

其中的是矩阵的秩。

将其扩展到N维情况为:

x = \sum _ { r = 1 } ^ { R } \mathbf { a } _ { r } ^ { ( 1 ) } \circ \mathbf { a } _ { r } ^ { ( 2 ) } \circ \cdots \circ \mathbf { a } _ { r } ^ { ( N ) } = [[ \mathbf { A } ^ { ( 1 ) } , \mathbf { A } ^ { ( 2 ) } , \ldots , \mathbf { A } ^ { ( N ) } ]]

充分条件为:

CP分解唯一性的必要条件为:

\min \{ \operatorname { rank } ( \mathbf { A } \odot \mathbf { B } ) , \operatorname { rank } ( \mathbf { A } \odot \mathbf { C } ) , \operatorname { rank } ( \mathbf { B } \odot \mathbf { C } ) \} = R

对N维的情况,

\min _ { n = 1 , \ldots , N } \operatorname { rank } \left( \mathbf { A } ^ { ( 1 ) } \odot \cdots \odot \mathbf { A } ^ { ( n - 1 ) } \odot \mathbf { A } ^ { ( n + 1 ) } \odot \cdots \odot \mathbf { A } ^ { ( N ) } \right) = R

然后,因为:

\operatorname { rank } ( \mathbf { A } \odot \mathbf { B } ) \leq \operatorname { rank } ( \mathbf { A } \otimes \mathbf { B } ) \leq \operatorname { rank } ( \mathbf { A } ) \cdot \operatorname { rank } ( \mathbf { B } )

所以,更一般的必要条件为:

三维张量在以下的条件下,CP分解通常是唯一的。

低秩近似和边界秩Low-Rank Approximations and the Border Rank

令R是矩阵的秩,假设的SVD为:

\mathbf { A } = \sum _ { r = 1 } ^ { R } \sigma _ { r } \mathbf { u } _ { r } \circ \mathbf { v } _ { r } \quad \text { with } \sigma _ { 1 } \geq \sigma _ { 2 } \geq \cdots \geq \sigma _ { R } > 0

然后他的rank-k近似可以写作:

但是这种结果不适用于高阶张量。

存在低阶近似不是高阶近似的因子的情况。导致最佳秩近似的分量不能够按照顺序一个个的求解,必须同时找到所有的因子。

令是一个rank-three张量,被定义为:

\mathbf{X} = \mathbf { a } _ { 1 } \circ \mathbf { b } _ { 1 } \circ \mathbf { c } _ { 2 } + \mathbf { a } _ { 1 } \circ \mathbf { b } _ { 2 } \circ \mathbf { c } _ { 1 } + \mathbf { a } _ { 2 } \circ \mathbf { b } _ { 1 } \circ \mathbf { c } _ { 1 }

然后这个张量可以被下面的rank-two张量任意的近似:

\mathbf{Y} = \alpha \left( \mathrm { a } _ { 1 } + \frac { 1 } { \alpha } \mathrm { a } _ { 2 } \right) \circ \left( \mathrm { b } _ { 1 } + \frac { 1 } { \alpha } \mathrm { b } _ { 2 } \right) \circ \left( \mathrm { c } _ { 1 } + \frac { 1 } { \alpha } \mathrm { c } _ { 2 } \right) - \alpha \mathrm { a } _ { 1 } \circ \mathrm { b } _ { 1 } \circ \mathrm { c } _ { 1 }

然后:

\| \mathbf{X} - \mathbf{Y} \| = \frac { 1 } { \alpha } \left\| \mathbf { a } _ { 2 } \circ \mathbf { b } _ { 2 } \circ \mathbf { c } _ { 1 } + \mathbf { a } _ { 2 } \circ \mathbf { b } _ { 1 } \circ \mathbf { c } _ { 2 } + \mathbf { a } _ { 1 } \circ \mathbf { b } _ { 2 } \circ \mathbf { c } _ { 2 } + \frac { 1 } { \alpha } \mathbf { a } _ { 2 } \circ \mathbf { b } _ { 2 } \circ \mathbf { c } _ { 2 } \right\|

但是在某些情况下,低秩近似是不存在的,并且这不是一个少见的情况。在不存在低秩近似的时候,引入边界秩的概念。他被定义为等于一个张量的最小数量,其足以近似给定张量且具有任意小的非零值。

计算CP分解

没有明确的算法去计算张量的秩,因此计算CP分解的第一个问题是如何去选取rank-one张量的数量。大多数的程序选择好多个不同的值,直到其中一个表现比较好的时候。对于无噪声的理想数据,我们可以从依次选取,直到达到合适的时候。但是在给定R的情况下,我们也没有完美的程序去计算CP分解。另外根据低秩近似,我们也知道可以通过低秩的张量近似表示高秩张量,这在实践中会引发一些问题。

假设组件的数量已经确定,有很多方法去计算CP分解,我们关注ALS(交替最小二乘法)算法去计算CP分解。

在三维情况下:令,最终的计算目标是计算一个R个组件的CP分解能够最好的近似。

\min _ { \hat { x } } \| x - \hat { x } \| \ \ \text{with}\ \hat { \boldsymbol { X } } = \sum _ { r = 1 } ^ { R } \lambda _ { r } \mathbf { a } _ { r } \circ \mathbf { b } _ { r } \circ \mathbf { c } _ { r } = [[\boldsymbol { \lambda } ; \mathbf { A } , \mathbf { B } , \mathbf { C } ]]

ALS的步骤是固定和去优化,然后固定和去优化,最后固定优化,持续迭代更新,直到收敛。

在和固定的情况下,我们可以得到:

其中。

优化的结果是:

这里的表示矩阵的伪逆。。又因为:( \mathbf { C } \odot \mathbf { B } ) ^ { \dagger } = \left( \left( \mathbf { C } ^ { \top } \mathbf { C } \right) * \left( \mathbf { B } ^ { \top } \mathbf { B } \right) \right) ^ { \dagger } ( \mathbf { C } \odot \mathbf { B } ) ^ { \top },所以得到:

\hat { \mathbf { A } } = \mathbf { X } _ { ( 1 ) } ( \mathbf { C } \odot \mathbf { B } ) \left( \mathbf { C } ^ { \top } \mathbf { C } * \mathbf { B } ^ { \top } \mathbf { B } \right) ^ { \dagger }

这个地方有一步没想清楚。

通过上面的变化,我们就不用计算一个JK×R的矩阵的伪逆了,只需要计算一个R×R的矩阵的逆即可。然后对标准化后可以得到。

N维张量CP分解的完整的步骤如上图所示。

ALS方法易于理解和扩展,但是需要花费比较多的迭代次数使它收敛。同时,它不能够保证一定能够收敛到全局最小值,仅保证目标函数不再减小。

你可能感兴趣的:(CP分解)