张量分解浅谈(二 CP NMF 张量秩)

欢迎大家来到这一期的张量分解博客学习,本期博客的主要内容就是标题,难度会加大,本人也有写的错误的地方,烦请大家不吝赐教!

一. CANDECOMP/PARAFAC分解法

CANDECOMP(canonical decomposition)和PARAFAC(parallel factors)是一种对高维张量进行拆分的方法, 其核心思想是用有限个的秩1张量的和来(近似地)表示该张量. 这种方法被很多人独立的发现, 不考虑历史上的因素, 我们将其称为CP分解法 (CP decomposition) !

其实你可以这么理解:

CP分解是将一个高维的张量,分解成多个核的和,每个核是由向量的外积组成;通过这样的分解,我们可以大大地降低参数的维度。其实,不止CP分解,其他的张量分解算法都是同个道理,只是所采用的分解方法不同而已。当然,这样的分解只是原来张量的近似,没办法保证完全复原。从以上角度来说,张量分解的目的跟矩阵分解是相同的,只是一个是在二维上的分解,另一个是在高维上的分解而已!

这就要陆续的结合我们之前铺垫的相关知识了,检测前几期博客是否认真学习的时候到了,我们先看定义:

在这里插入图片描述
小伙伴们千万别把它想得有多复杂,且听我一步一步的慢慢道来:

如果我们要把一个3阶张量 X ∈ R I × J × K \mathcal{X} \in \mathbb{R}^{I\times J\times K} XRI×J×K 进行CP分解, 其结果如下:

X ≈ ∑ r = 1 R a r ∘ b r ∘ c r \mathcal{X} \approx \sum_{r=1}^{R} a_{r}\circ b_{r} \circ c_{r} Xr=1Rarbrcr
这里的 ∘ \circ 是外积的意思!

根据上面的图,我们知道这里的 a r a_{r} ar 之类的都是向量,通过三者之间的外积,组成一个新的矩阵,之后将新得到的矩阵求和,就是新的矩阵了, 通过外积的定义, 对张量中的每个元素都有:

x i j k ≈ ∑ r = 1 R a i r b j r c k r  for  i = 1 , … , I , j = 1 , … , J , k = 1 , … , K 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 xijkr=1Rairbjrckr for i=1,,I,j=1,,J,k=1,,K
(这一步知道就行)

我们称那些上式中通过外积组成秩1张量元素的向量集合为 因子矩阵(factor matrices),图片理解如下:
在这里插入图片描述
例如, A = [ a 1 a 2 … a R ] \mathbf{A}=\left[\begin{array}{llll}a_{1} & a_{2} & \ldots & a_{R}\end{array}\right] A=[a1a2aR] ,类似的,我们构造 B \mathbf{B} B C \mathbf{C} C ,利用这些定义, CP分解可以被等价写作以下矩阵形式. 注意, 其左侧都是张量的对应mode的矩阵化:
在这里插入图片描述
这个的小圆圈里面还有一点的符号代表的是 Khatri−Rao 积!

接下来通过例子,帮助大家理解:

在这里插入图片描述
仔细观察这个例子,相信你很快就会发现它们的规律。

我们也可以将前面的张量式子改写为horizontal slices和lateral slices的形式, 需要注意的是, 这种以slice切片为主体的表达很难延伸到超过3维的张量之中. 利用Kolda的命名方式, 也可以进一步简化CP模型:
X ≈ [ A , B , C ] ≡ ∑ r = 1 R a r ∘ b r ∘ c r \mathcal{X} \approx[\mathrm{A}, \mathrm{B}, \mathrm{C}] \equiv \sum_{r=1}^{R} \mathrm{a}_{r} \circ \mathrm{b}_{r} \circ \mathrm{c}_{r} X[A,B,C]r=1Rarbrcr

为了便利, 我们通常假设 A \mathbf{A} A B \mathbf{B} B C \mathbf{C} C s的列向量都是归一化的(normalized). 而原本的比重(weights)则被对应的向量所吸收, 写作以下形式:
在这里插入图片描述
到现在为止, 我们都把注意力放在了3维张量上. 这是因为3维张量恰恰是应用当中最为广泛也是足够满足我们需求的张量. 对于一个N阶的张量 X ∈ R I 1 × I 2 × ⋯ I N \mathcal{X} \in \mathbb{R}^{I_{1}\times I_{2} \times \cdots I_{N}} XRI1×I2×IN来说,他的CP分解可以被写为:
在这里插入图片描述
CP分解并未结束,后面的知识逐渐完善之后我们再看!

二. 张量的秩

前面说过一个张量能够被写成N个向量的外积就是秩为一的,我们举个例子让大家看一下:
在这里插入图片描述
大家应该能猜到这里的 | 表示有重叠的那种意思!那么显然,这就是一个秩为一的张量!

张量的秩,记作 r a n k ( X ) rank(\mathcal{X}) rank(X) , 我们可以将它 “拆开” ,拆成秩为一的张量之和,那么新张量的数目之和就是这原张量的秩:

在这里插入图片描述
显然,这个张量的秩就是2!
故:

如果一个张量能够以一个秩一张量的和表示,那么其秩则为1。
如果一个张量能够以两个秩一张量的和表示,那么其秩则为2。
如果一个张量能够以三个秩一张量的和表示,那么其秩为3。
以此类推…

虽然理论上是这样,但是在真正的高维张量求秩的时候还是非常棘手的,目前木有特定的算法可以直接得到某给定张量的秩,一般的时候都是像上面一下用cp分解尝试!

三. 非负矩阵分解 (NMF)

通常的矩阵分解会把一个大的矩阵分解为多个小的矩阵,但是这些矩阵的元素有正有负。而在现实世界中,比如图像,文本等形成的矩阵中负数的存在是没有意义的,所以如果能把一个矩阵分解成全是非负元素是很有意义的。在NMF中要求原始的矩阵的所有元素的均是非负的,那么矩阵可以分解为两个更小的非负矩阵的乘积,这个矩阵有且仅有一个这样的分解,即满足存在性和唯一性

NMF的基本思想:
NMF的基本思想可以简单描述为:对于任意给定的一个非负矩阵A,NMF算法能够寻找到一个非负矩阵U和一个非负矩阵V,使得满足 ,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积!

对于给定矩阵 V ∈ R + F × N \boldsymbol{V}\in \boldsymbol{R_{+}^{F \times N}} VR+F×N,我们需要寻找 非负矩阵 W ∈ R + F × K \boldsymbol{W}\in \boldsymbol{R_{+}^{F \times K}} WR+F×K H ∈ R + K × N \boldsymbol{H}\in \boldsymbol{R_{+}^{K \times N}} HR+K×N使得:
V ≈ W H \boldsymbol{V}\approx \boldsymbol{W}\boldsymbol{H} VWH

如下图:
在这里插入图片描述
需要注意的是,这里用了约等于,和CP分解是一个道理:当前解法并非精确解,只是数值上的近似解!

分解前后可理解为:原始矩阵 V \boldsymbol{V} V的列向量是对左矩阵 W \boldsymbol{W} W中所有列向量的加权和,而权重系数就是右矩阵对应列向量的元素,故称 W \boldsymbol{W} W为基矩阵, H \boldsymbol{H} H为系数矩阵。一般情况下 K \boldsymbol{K} K的选择要比 N \boldsymbol{N} N小,即满足 ( F × N ) K ⩽ F N (F\times N)K\leqslant FN (F×N)KFN,这时用系数矩阵代替原始矩阵,就可以实现对原始矩阵进行降维,得到数据特征的降维矩阵,从而减少存储空间,减少计算机资源!
在这里插入图片描述
其实说到这里,肯定还有小白不知道这个非负矩阵到底是干什么的,我用电影评分举一个简单的例子:

比如:
一个电影里如果只考虑爱情和动作两个因素。
一个用户也一定会有给爱情打分多一点还是喜欢动作多一点。在这里插入图片描述
期望就是我们已知下面的矩阵,而期望分解出比较合理的上面两个矩阵。这样就可以用来预测别的用户对别的电影的看法了!当然我这样举例其实是非常不严谨的,但是好理解!

那么了解的这些东西之后,最大的问题就来了,我们如何能够求解这分解的非负矩阵呢??

NMF求解问题实际上是一个最优化问题,利用乘性迭代的方法求解和,非负矩阵分解是一个NP问题。NMF 问题的目标函数有很多种,应用最广泛的就是欧几里得距离KL散度.

在这里插入图片描述

第一个式子我们可以理解为损失函数,需要我们求解其最小值是对应的各个矩阵,如果你用编程实现的话使用的是:乘法更新发展的迭代更新算法,其将矩阵分解算法转化为如下的优化问题,即最小化两个矩阵之间的欧几里得距离的优化问题:
在这里插入图片描述
感兴趣的同学可以了解一下上面的这个迭代跟新算法,其实非常好理解!

上面都是理论部分,看不懂也莫慌,时间是检验真理的唯一标准,我们玩个小游戏:
在这里插入图片描述
这个图我们刚刚见过,但是显然其包含的信息远不止上面那么简单,我们更多的是看它内在蕴含的规律;

游戏规则是这样的,任何图形乘以黑圆是它本身,任意图形加上圆形是它本身。举个例子, W \boldsymbol{W} W矩阵中的第二行(图中红笔圈起来的一个白圆,一个红三角)乘上H矩阵中四列,由于:
白圆 × \times ×黑圆=白圆
红三角 × \times ×黑圆=红三角
白圆+红三角=红三角
因此在V矩阵中,第二行第四列的元素为红三角;
但同时我们也应该关注到, W \boldsymbol{W} W H \boldsymbol{H} H相乘并不能完全还原矩阵V.依然举例说明, V \boldsymbol{V} V矩阵中,第六行(也即是倒数第二行),第一列是一个白圆.
由于W第六行是一个白圆,一个红三角. H第一列是两个白圆。
白圆 × \times × 白圆=白圆;
红三角 × \times ×白圆=红三角;
白圆+红三角= 红三角;
而原矩阵中的对应结果显然不符我们推测的结果,这也间接说明我们为什么要用约等于号 !

这样的处理方法会让我直接想到神经网络中的示意图也是类似于这样的感觉,看下面这个图:

在这里插入图片描述
这个图非常好理解,通过前面定义的系数矩阵和基(特征)矩阵,将系数矩阵的每一列 h 1 , h 2 , ⋯ h n \boldsymbol{h_{1},h_{2},\cdots h_{n}} h1,h2,hn 排成上面蓝色的小球球,一次乘以矩阵 W \boldsymbol{W} W 原矩阵的 每一列 v \boldsymbol{v} v 就求出来了,它将原矩阵,权重矩阵以及特征矩阵的关系更加清晰的展现出来了,我们可以看到系数与特征进行线性操作之后可以得到原矩阵,其和神经网络的本质也是一样的,神经网络靠着对特征的学习,得出权重,也是以权重乘以特征的方式去得到最终的答案.NMEE理上等性方程组,这个理解了上面的示意图就非常简单了!

NMF算法在是真正实现的是时候还有一个特别的地方,就是分解新矩阵的参数K的选择,这就像神经网络里面的调参一样,是个玄学,其中不同的K对于不同模型情况如下:

  • 数据拟合:K越大那么对于数据拟合更好。
  • 模型复杂性:一个更小的K模型更简单(易于预测、少输入参数等)

下面为声频处理时候不同K的表现:

在这里插入图片描述

本期的博客学习就到这里了,下一期我会向大家详细的介绍 张量的另一种分解方法—— 压缩与Tucker分解法,并简单的看一下奇异值分解的相关内容,大家加油!

  • 25
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
CP张量分解算法是一种常用的高维数据分析方法,用于将一个高维张量分解为多个低维张量的乘积形式。这种分解可以帮助我们理解和挖掘数据中的潜在结构和模式。在Python中,可以使用Tensorly库来实现CP张量分解算法。 Tensorly是一个用于张量操作和分解的Python库,它提供了丰富的功能和工具来处理高维数据。下面是使用Tensorly库进行CP张量分解的基本步骤: 1. 安装Tensorly库:可以使用pip命令在Python环境中安装Tensorly库,命令如下: ``` pip install tensorly ``` 2. 导入Tensorly库:在Python代码中导入Tensorly库,命令如下: ```python import tensorly as tl ``` 3. 加载数据:将需要进行CP张量分解的高维张量加载到Python中,可以使用NumPy数组或Tensorly库提供的张量对象。 4. 进行CP张量分解:使用`tl.decomposition.parafac`函数进行CP张量分解,该函数接受一个高维张量作为输入,并返回分解后的低维张量。 5. 获取分解结果:根据需要,可以获取分解后的低维张量,以及对应的权重和模式矩阵。 下面是一个简单的示例代码,演示了如何使用Tensorly库进行CP张量分解: ```python import tensorly as tl # 加载数据 tensor = tl.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) # 进行CP张量分解 factors = tl.decomposition.parafac(tensor, rank=2) # 获取分解结果 weights = factors[0] mode_matrices = factors[1:] # 打印分解结果 print("权重:", weights) for i, mode_matrix in enumerate(mode_matrices): print("模式矩阵", i+1, ":", mode_matrix) ``` 这是一个简单的示例,实际应用中可以根据具体需求进行参数设置和数据处理。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值