学完了SVD算法之后,我们继续回到张量几大分解的学习上来,本期学习的主要内容是张量的 Tucker 分解 以及 前面的CP分解还留下一点没有说完,正好一并补齐!后面的公式我将采用颜色标记,红色代表必须掌握,蓝色尽量掌握!

在这之前先附一张图,包含了各种运算符号的名称含义,大部分是前面说过或者使用过的:

判断张量是否在GPU 张量分析公式_判断张量是否在GPU


Tensor decomposition

  • 一 . Tucker 分解公式介绍和原理
  • 二 . 张量的 n-Rank
  • 三 . Tucker分解法的计算
  • 四 . Tucker 与CP 分解的区别联系


一 . Tucker 分解公式介绍和原理

我们先来看一张被使用过很多次的Trucker 分解图片,这是在三阶张量上的分解形式!过程貌似可能应该差不多 肯定有点枯燥无味,坚持一下,本人已经被张量学习掏空了!

判断张量是否在GPU 张量分析公式_判断张量是否在GPU_02


如上图所示:对于一个三阶张量判断张量是否在GPU 张量分析公式_线性代数_03而言,经过Tucker分解可以得到:三个因子矩阵 判断张量是否在GPU 张量分析公式_张量分解_04和一个核张量 判断张量是否在GPU 张量分析公式_张量分解_05

在三阶张量形式中,,我们有如下分解:
判断张量是否在GPU 张量分析公式_张量分解_06

显然,矩阵判断张量是否在GPU 张量分析公式_线性代数_07 就是因子矩阵了,他们通常可以被作每个mode下的主成分,同样也是相互正交的!那么图中的长方体张量 判断张量是否在GPU 张量分析公式_张量分解_05

那么对于原始张量的每一个元素来说,Tucker 分解法 可以写作:

判断张量是否在GPU 张量分析公式_机器学习_09

需要注意:这里的判断张量是否在GPU 张量分析公式_人工智能_10 为对应的因子矩阵判断张量是否在GPU 张量分析公式_线性代数_07的成分数目(例如列向量的数目),如果 判断张量是否在GPU 张量分析公式_人工智能_10 均小于判断张量是否在GPU 张量分析公式_张量分解_13,我们可以将核心张量 判断张量是否在GPU 张量分析公式_机器学习_14 视作是原张量判断张量是否在GPU 张量分析公式_判断张量是否在GPU_15

除此之外,我们应当还需要知道三阶张量的矩阵张来:

判断张量是否在GPU 张量分析公式_张量分解_16


突然跳出来个判断张量是否在GPU 张量分析公式_张量分解_17

这些公式当然不限制于更高阶的张量分解,其公式按照上面这个两个依葫芦画瓢即可,就不多赘述了。

对于三阶张量固定一个因子矩阵为单位阵,就得到Tucker分解一个重要的特例:Tucker2:
判断张量是否在GPU 张量分析公式_张量分解_18

进一步,如果固定两个因子矩阵 判断张量是否在GPU 张量分析公式_判断张量是否在GPU_19,就得到了Tucker1,那么此时Tucker 分解就退化成了普通的二维PCA:
判断张量是否在GPU 张量分析公式_判断张量是否在GPU_20

这也证实了张量的Tucker 分解就是高阶PCA!

二 . 张量的 n-Rank

n-Rank秩又称为多线性秩,一个N阶张量 判断张量是否在GPU 张量分析公式_判断张量是否在GPU_15

判断张量是否在GPU 张量分析公式_人工智能_22

特别要注意,这两个X不一样 我刚开始看成一样的,后面怎么看也没看懂。。。。

先令判断张量是否在GPU 张量分析公式_张量分解_23,那么 判断张量是否在GPU 张量分析公式_判断张量是否在GPU_15 就叫做 秩-判断张量是否在GPU 张量分析公式_判断张量是否在GPU_25 的张量(这只是一种表示高阶张量秩的方法,莫奇怪!),判断张量是否在GPU 张量分析公式_张量分解_26 可以看做是 张量 判断张量是否在GPU 张量分析公式_判断张量是否在GPU_15

n-rank切记不能与秩(rank), 也就是最小的秩1成分数目, 所混淆. 这两个不是一个东西!

对于一个给定的张量判断张量是否在GPU 张量分析公式_判断张量是否在GPU_15, 我们可以很轻易地找到一个秩为判断张量是否在GPU 张量分析公式_张量分解_29 where 判断张量是否在GPU 张量分析公式_判断张量是否在GPU_30 的精确 Tucker 分解, 但如果我们计算的Tucker分解的秩低于这组值, 也就是对某些n来说判断张量是否在GPU 张量分析公式_机器学习_31,那么, 我们将必然无法获得精确的结果并且其计算会变得更为困难!

下图展示了一个三阶张量的低秩近似:

判断张量是否在GPU 张量分析公式_判断张量是否在GPU_32


该分解将不能精确地还原 判断张量是否在GPU 张量分析公式_判断张量是否在GPU_15

三 . Tucker分解法的计算

计算Tucker分解的一个可行的方法来自于前面所述的Tucker1算法, 即,舍去一个矩阵来最大程度的捕捉其mode-n fiber的分布变化(variation). 由于后人的研究和分析, 此法后来又被称之为higher-order SVD(HOSVD),它通过张量的每一个mode上做SVD分解对各个mode上的因子矩阵进行求解,最后计算张量在各个mode上的投影之后的张量作为核张量。它的算法过程如下图所示:

判断张量是否在GPU 张量分析公式_机器学习_34


我们来大概的推导一下,假设有一个 判断张量是否在GPU 张量分析公式_判断张量是否在GPU_35 阶张量 判断张量是否在GPU 张量分析公式_机器学习_36 那么对 判断张量是否在GPU 张量分析公式_判断张量是否在GPU_15

判断张量是否在GPU 张量分析公式_判断张量是否在GPU_38

再整体平方化简得:
判断张量是否在GPU 张量分析公式_线性代数_39

判断张量是否在GPU 张量分析公式_机器学习_14 满足:
判断张量是否在GPU 张量分析公式_张量分解_41

由于判断张量是否在GPU 张量分析公式_张量分解_42是一个常数,最小化上面的式子相当于最大化后面的: 判断张量是否在GPU 张量分析公式_线性代数_43

最终得到:
判断张量是否在GPU 张量分析公式_机器学习_44

个人感觉算法的思路懂了就行,上面的推导能熟悉的理解更好,看不懂迷迷糊糊的也没大事,因为后面编程真正求解的时候,有python包为我们提供强大的算法,直接导入张量就好了!

四 . Tucker 与CP 分解的区别联系

(1)主要区别:核张量:

CP分解,就是将一个张量分解为若干个秩1张量的和的形式,图形化如下(新图 需要掌握 和上期CP分解博客里面的原理一模一样):

判断张量是否在GPU 张量分析公式_人工智能_45


判断张量是否在GPU 张量分析公式_人工智能_46 表示CP分解的秩, 判断张量是否在GPU 张量分析公式_机器学习_14 表示核张量,只不过这里的核张量是三阶对角张量,A表示一系列的因子矩阵。

顺便回顾一下:CP分解的问题就是不知道分解为多少个若干个秩1张量的和的形式,处理的话一般都是先假设一个值,接下来就是确定核张量和因子矩阵,一般都是用交替最小二乘法或者梯度下降法。

而Tucker 分解示意图如下:

判断张量是否在GPU 张量分析公式_人工智能_48


核张量并没有是对角的要求!

(2)Tucker分解需要的是n-秩与低秩近似,而CP分解是秩与低秩近似

具体参考上面的内容和上上期CP分解的博客!

(3)应用领域不同

Tucker分解可以看作是一个PCA的多线性版本,因此可以用于数据降维,特征提取,张量子空间学习等。比如说一个低秩的张量近似可以做一些去噪的操作等。Tucker分解同时在高光谱图像中也有所应用,如用低秩Tucker分解做高光谱图像的去噪,用张量子空间做高光谱图像的特征选择,用Tucker分解做数据的压缩等!

这期博客学习就到这里了,下期,我们将正式进入张量网络的学习!大家加油!