CP分解

作者: hzb_ml | 来源:发表于2019-03-14 15:59 被阅读0次

    CP分解

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

    \mathbf{X} \approx \sum _ { r = 1 } ^ { R } \mathbf { a } _ { r } \circ \mathbf { b } _ { r } \circ \mathbf { c } _ { r }

    这里的\circ是指的外积。

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

    x _ { i j k } \approx \sum _ { r = 1 } ^ { R } a _ { i r } b _ { j r } c _ { k r } \text { for } i = 1 , \ldots , I , j = 1 , \ldots , J , k = 1 , \ldots , K

    定义因子矩阵(factor matrices)表示向量的组合。例如\mathbf { A } = \left[ \begin{array} {} { \mathbf { a } _ { 1 } } & { \mathbf { a } _ { 2 } } & { \cdots } & { \mathbf { a } _ { R } } \end{array} \right]。然后对三维的情况,我们可以将上面的表达式写成下面的形式:

    \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}

    其中的\odot表示KR积。然后\mathbf{X}_{(1)}表示张量\mathbf{X}的的mode-n unfolding。

    例如:\mathbf{X}\in\mathbb { R } ^ { 3 \times 4 \times 2 }

    \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 } \mathbf { a } _ { r } \circ \mathbf { b } _ { r } \circ \mathbf { c } _ { r }

    如果将\mathbf { A } , \mathbf { B } , \mathbf { C }标准化,然后提取出权重\lambda \in \mathbb { R } ^ { R },可以得到如下的表述:

    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 唯一性

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

    矩阵的分解是不唯一的。令\mathbf { X } \in \mathbb { R } ^ { I \times J }是一个秩为R的矩阵,它的分解为:

    \mathbf { X } = \mathbf { A } \mathbf { B } ^ { \top } = \sum _ { r = 1 } ^ { R } \mathbf { a } _ { r } \circ \mathbf { b } _ { r }

    如果\mathbf{X}的SVD分解是\mathbf { U } \Sigma \mathbf { V } ^ { \top }那么我们可以选择\mathbf { A } = \mathbf { U } \boldsymbol { \Sigma } ,\mathbf { B } = \mathbf { V },同时可以选择\mathbf { A } = \mathbf { U } \boldsymbol { \Sigma } \mathbf { W }, \mathbf { B } = \mathbf { V } \mathbf { W }

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

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

    k _ { \mathrm { A } } + k _ { \mathrm { B } } + k _ { \mathrm { C } } \geq 2 R + 2

    其中的k _ { \mathrm { A } }是矩阵的秩。

    将其扩展到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 ) } ]]

    充分条件为:

    \sum _ { n = 1 } ^ { N } k _ { \mathbf { A } ^ { ( n ) } } \geq 2 R + ( N - 1 )

    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 } )

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

    \min _ { n = 1 , \ldots , N } \left( \prod _ { m = 1,m \neq n } ^ { N } \operatorname { rank } \left( \mathbf { A } ^ { ( m ) } \right) \right) \geq R

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

    R \leq K \text { and } R ( R - 1 ) \leq I ( I - 1 ) J ( J - 1 ) / 2

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

    令R是矩阵\mathbf{A}的秩,假设\mathbf{A}的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近似可以写作:

    \mathbf { B } = \sum _ { r = 1 } ^ { k } \sigma _ { r } \mathbf { u } _ { r } \circ \mathbf { v } _ { r }

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

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

    \mathcal { X } \in \mathbb { R } ^ { I \times J \times 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张量的数量。大多数的程序选择好多个不同的值,直到其中一个表现比较好的时候。对于无噪声的理想数据,我们可以从\mathbf{R}=1,2,3,...依次选取,直到达到100\%合适的时候。但是在给定R的情况下,我们也没有完美的程序去计算CP分解。另外根据低秩近似,我们也知道可以通过低秩的张量近似表示高秩张量,这在实践中会引发一些问题。

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

    在三维情况下:令\mathcal { X } \in \mathbb { R } ^ { I \times J \times K },最终的计算目标是计算一个R个组件的CP分解能够最好的近似\mathcal{X}

    \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{B}\mathbf{C}去优化\mathbf{A},然后固定\mathbf{A}\mathbf{C}去优化\mathbf{B},最后固定\mathbf{A},\mathbf{B}优化\mathbf{C},持续迭代更新,直到收敛。

    \mathbf{B}\mathbf{C}固定的情况下,我们可以得到:

    \min _ { \hat { \mathbf { A } } } \left\| \mathbf { X } _ { ( 1 ) } - \hat { \mathbf { A } } ( \mathbf { C } \odot \mathbf { B } ) ^ { \top } \right\| _ { F }

    其中\hat { \mathbf { A } } = \mathbf { A } \cdot \operatorname { diag } ( \boldsymbol { \lambda } )

    优化的结果是:

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

    这里的\dagger表示矩阵的伪逆。\boldsymbol { A } \boldsymbol { G } \boldsymbol { A } = \boldsymbol { A }。又因为:( \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的矩阵的逆即可。然后对\hat { \mathbf { A } }标准化后可以得到\mathbf{A}

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

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

    相关文章

      网友评论

        本文标题:CP分解

        本文链接:https://www.haomeiwen.com/subject/unccmqtx.html