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分解

    CP分解 将高维的张量分解成为Rank-One Tensors的和。 这里的是指的外积。 上面的式子也可以展开成:...

  • 分解分解

    工作上究竟如何能够做的更好呢?在时间的安排上如何更加高效呢?我始终很难做到,做不到稻盛先生的,付出不亚于任何人的努...

  • 并行算法设计基础

    计算分解 数据分解 搜索分解 递归分解 混合分解方法 针对要处理的问题灵活运动数据分解、搜索分解和递归分解 任务映...

  • 12月第一周的总结

    cp 复制命令 cp src dest cp file1 file2 file 3 cp -r 递归复制目录 cp...

  • Linux 简单命令

    cp 复制命令 copy cp 复制 cp 【文件名】【复制的位置/文件名】 cp 复制-重命名 cp 【文件名】...

  • Linux 文件操作命令☞☞☞cp

    cp 命令 名称: cp —— copy files and directories 摘要 cp [options...

  • 又见"不得体CP" 许凯吴谨言在戏外升级为"时尚宠儿"

    说到组CP最多的清宫剧,估计要数火爆今年夏天的《延禧攻略》了,帝后CP、令后CP、纯后CP、卫龙CP、不得体CP、...

  • 学习笔记DL006:特征分解,奇异值分解

    特征分解。 整数分解质因素。 特征分解(eigendecomposition),使用最广,矩阵分解一组特征向量、特...

  • 亚马逊Coupons、Promotion是什么?它们的优势和区别

    这年头各路cp大行其道,综艺cp 影视剧cp 纸片人cp。作为亚马逊卖家,也有专属的CP喔:Coupons&Pro...

  • 分解

    有时候 你会觉得自己 就是一面旗帜 被风吹着 猎猎作响 然而 忽然间 就碎裂成 一缕缕 布条

网友评论

    本文标题:CP分解

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