张量分解基础

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文主要对张量的基于pytorch的基础操作以及张量的CP分解、Tucker分解的关键知识点总结。


张量变换基础

1.Reshape

torch.reshape()可以对张量的各个维度的大小进行变换,但总的维度大小需保存不变。

import torch
a = torch.arange(4.)
b = torch.arange(4.)
##用法一
a = torch.reshape(a, (2, 2))
print(a.shape)
print(a)
##用法二
b = b.reshape(2,2)
print(b.shape)
print(b)

在ipython上做的实验(用法一)
用法二

2.permute

对矩阵维度之间的交换。
torch.permute(input, dims) → Tensor

import torch
c=torch.arange(24)
c=c.reshape(2,3,4)
print('c:\n',c)
print('c.shape',c.shape)
d = torch.permute(c,(2,0,1)) #index 0和index 2交换
e = c.permute(2,0,1) #也可以这么用
print('d.shape',d.shape)
print('d\n',d)
print('e.shape',e.shape)
print('e\n',e)

输出结果如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.einsum

这是张量计算非常强大非常重要的一个函数
torch.einsum(equation, *operands) → Tensor

(1)计算 trace(迹)

"ii"表示对角线,这里与用的字母无关,例如你可以用“aa"

(2)计算diagonal,返回对角线

要求必须为方阵

(3)计算外积(outer product)

在这里插入图片描述
在这里插入图片描述

(4)张量相乘

在这里插入图片描述

在这里插入图片描述
->右边消失的维度即时沿着该维度累加,例如‘abc,cde->abe’
例如在神经网络中,我们想进行batch计算
在这里插入图片描述

二、张量矩阵化

可以参考b站课程【张量网络PyThon编程:1.4 张量网络图形表示】
实际上就是把张量变成矩阵。对于三维张量,有张量按模式展开成矩阵,假设原来张量维度(i,j,k)。
模一张开即为(i,j,k)->(i,jk)
模二展开即为(i,j,k)->(j,ik)
模三展开即为(i,j,k)->(k,ij)
来自知乎
可参考如何简单地理解和实现「张量展开」

我们可以借助torch.reshape()函数实现。

三、张量分解

关于这部分的知识点来自于张量网络PyThon编程

1、单秩分解

将K阶张量分解为K个向量的直积。

T = ζ ∏ ⊗ k = 0 K − 1 v ( k ) \boldsymbol{T}=\zeta \prod_{\otimes k=0}^{K-1} \boldsymbol{v}^{(k)} T=ζk=0K1v(k)

其中 ζ \zeta ζ是一个标量系数。
由于大多数张量不存在严格的单秩分解,于是便有了最优单秩近似问题。

min ⁡ ζ , { ∣ v [ k ] ∣ = 1 } ∣ T − ζ ∏ ⊗ k = 0 K − 1 v ( k ) ∣ \min _{\zeta,\left\{\left|v^{[k]}\right|=1\right\}}\left|\boldsymbol{T}-\zeta \prod_{\otimes k=0}^{K-1} \boldsymbol{v}^{(k)}\right| minζ,{v[k]=1} Tζk=0K1v(k)

通过对张量进行单秩分解,我们可以达到对参数进行压缩的目的。

2、CP分解(Canonical polyadic decomposition)

CP分解,是将张量分解为一系列秩一张量之和。
将单秩张量的形式稍作扩展,定义CP积,设N阶张量𝑇为𝑅 个单秩张量的求和:

T = ∑ r = 0 R − 1 T ( r − 1 ) = ∑ r = 0 R − 1 ζ ( r ) ∏ ⊗ k = 0 K − 1 v ( r , k ) \mathcal{T}=\sum_{r=0}^{R-1}{T^{(r-1)}}=\sum_{r=0}^{R-1}\zeta^{(r)} \prod_{\otimes k=0}^{K-1} \boldsymbol{v}^{(r,k)} T=r=0R1T(r1)=r=0R1ζ(r)k=0K1v(r,k)

ζ ( r ) \zeta^{(r)} ζ(r)看成向量, v ( r , k ) \boldsymbol{v}^{(r,k)} v(r,k)看成矩阵,则上式的CP形式也可写成如下的形式:

T = ∑ r = 0 R − 1 ζ r ∏ ⊗ k = 0 K − 1 V ( r , a n ) ( k ) \mathcal{T}=\sum_{r=0}^{R-1}\boldsymbol\zeta_r \prod_{\otimes k=0}^{K-1} \boldsymbol{V}_{(r,{a_n})}^{(k)} T=r=0R1ζrk=0K1V(r,an)(k)

其中, ζ \boldsymbol\zeta ζ为R维向量, V ( n ) V^{(n)} V(n)为对应于第n个指标的矩阵,由R个列向量组成。

例如给定一个三维张量 T ∈ R I × J × K \mathcal{T} \in \mathbb{R}^{I \times J \times K} TRI×J×K,CP分解就是将其分解为

T = ∑ r = 1 R v r 1 ∘ v r 2 ∘ v r 3 \mathcal{T}=\sum_{r=1}^R \mathbf{v}_r^1 \circ \mathbf{v}_r^2 \circ \mathbf{v}_r^3 T=r=1Rvr1vr2vr3

(在此 ζ \zeta ζ没有提取出来)其中 v r 1 ∘ v r 2 ∘ v r 3 \mathbf{v}_r^1 \circ \mathbf{v}_r^2 \circ \mathbf{v}_r^3 vr1vr2vr3对应一个秩一张量, v r 1 ∈ R I \mathbf{v}_r^1 \in \mathbb{R}^I vr1RI v r 2 ∈ R J \mathbf{v}_r^2 \in \mathbb{R}^J vr2RJ, v r 3 ∈ R K \mathbf{v}_r^3 \in \mathbb{R}^K vr3RK是第r个分量的三种模态的分解向量。
CP分解示意图,图源于网络
建议想进一步了解可以参考知乎-矩阵分析

3、Tucker分解

Tucker分解,又称高阶奇异值分解(Higher-order singular value decomposition,简称HOSVD),是主成分分析(PCA)的高阶形式。

(1)PCA

它的目的是为了用k个主分量概况表达统计相关的n个特征,即,主分量分析就是要在 C n C^n Cn空间中寻找 k个正交基,这k个正交基构成了我们想要的低维子空间。它的做法为对原数据矩阵X的协方差矩阵C进行特征分解,并将特征向量按行排列降序排列得到变换矩阵PY=PX 便是是要求的低维矩阵,其中P中的特征向量并不是全部特征向量,我们选取特征值较大的前几个特征向量组成P以达到降维效果。知乎-[PCA分解]

(2)Tucker分解

Tucker分解是将高阶张量分解为一个和它同阶的核心张量以及若干变换矩阵。
T i 0 … i N − 1 = ∑ j 0 … j N − 1 G j 0 … j N − 1 ∏ n = 0 N − 1 U i n j n ( n ) T_{i_0 \ldots i_{N-1}}=\sum_{j_0 \ldots j_{N-1}} G_{j_0 \ldots j_{N-1}} \prod_{n=0}^{N -1} U_{i_n j_n}^{(n)} Ti0iN1=j0jN1Gj0jN1n=0N1Uinjn(n)

约束条件

①G称为核心张量,其各个指标的约化矩阵(reduced matrix)必须为非负实对角矩阵。
在这里插入图片描述
G [ n ] G_[n] G[n]模n展开。

②变换矩阵{ U ( n ) U^{(n)} U(n)}满足幺正条件 U ( n ) U ( n ) ∗ = U ( n ) ∗ U ( n ) = I U^{(n)}U^{(n)*}=U^{(n)*}U^{(n)}=I U(n)U(n)=U(n)U(n)=I

求解方法

①对 T [ n ] T_{[n]} T[n]通过奇异值分解获得变换矩阵: U ( n ) S ( n ) V ( n ) ∗ U^{(n)}S^{(n)}V^{(n)*} U(n)S(n)V(n)

②核张量满足: G i 0 … i N − 1 = ∑ j 0 … j N − 1 T j 0 … j N − 1 ∏ n = 0 N − 1 U j n i n ( n ) ∗ G_{i_0 \ldots i_{N-1}}=\sum_{j_0 \ldots j_{N-1}} T_{j_0 \ldots j_{N-1}} \prod_{n=0}^{N -1} U_{j_n i_n}^{(n)*} Gi0iN1=j0jN1Tj0jN1n=0N1Ujnin(n)

T [ n ] T_{[n]} T[n]的秩构成的Tucker秩(所以Tucker秩应该有N-1个)
如果我们对Tucker秩们取低秩近似的话,就实现了压缩。

回顾单秩分解,可知单秩张量的Tucker秩为(1, 1, …, 1)
(建议参考【知乎-CP分解与Tucker分解详解】)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在进行张量CP分解之后,要进行低秩近似,可以使用秩选择方法来快速确定最小秩。秩选择方法是基于近似误差的收敛速度来选择秩的一种方法。通常,我们会计算出不同秩对应的近似误差,然后从中选择最小的秩使得近似误差达到预定的阈值即可。另外,还可以使用交叉验证的方法来选择最优的秩。 ### 回答2: 张量CP分解是一种常用的高维数据降维技术,将一个高维张量分解成一组低秩矩阵的乘积形式。在进行低秩近似时,我们需要确定最小秩。 确定最小秩的方法有很多,以下是一些常用的方法: 1. 根据累计贡献率确定秩:对于张量CP分解,每个矩阵的秩都代表了数据中具有重要信息的维度数量。我们可以计算每个矩阵的奇异值,并按照奇异值的大小进行排序。然后,根据累计奇异值贡献率来确定最小秩。一种常用的确定累计贡献率阈值的方法是选择累计贡献率超过总和的70-80%的奇异值。 2. 利用信息准则确定秩:信息准则是一种用来衡量模型拟合优度的数学准则。常用的信息准则有AIC和BIC。在张量CP分解中,可以根据模型的AIC或BIC值来确定最小秩。较小的AIC或BIC值表示模型拟合效果较好,因此对应的秩就是最小秩。 3. 交叉验证确定秩:交叉验证是一种常用的模型选择方法,可以用于确定最小秩。通过将数据集划分为训练集和验证集,我们可以利用交叉验证选取不同秩对应的模型进行训练和验证,并选择在验证集上表现最好的秩作为最小秩。 需要注意的是,确定最小秩并不是一个准确的任务,而是一个选择性问题。不同的方法可能会给出不同的最小秩,因此,根据具体的数据和应用场景选择合适的方法来确定最小秩。 ### 回答3: 张量CP分解是一种常用的高维数据降维方法,可以把一个张量表示为多个低秩张量之和。在进行低秩近似时,我们希望找到一个最小的秩,以尽可能准确地近似原始张量。 确定最小秩的方法通常是使用截断方法,即通过逐渐增加秩的方式,计算近似张量与原始张量的差异,直到差异满足预设的阈值为止。具体步骤如下: 1. 初始化秩为1,得到一个低秩近似的张量。 2. 计算近似张量与原始张量的差异,例如使用均方根误差(RMSE)或其他适当的距离度量。 3. 比较差异与预设阈值的大小。 4. 如果差异小于阈值,则认为当前秩是最小秩;如果差异大于阈值,则增加秩,回到第1步。 5. 最终得到最小秩的近似张量。 在实际操作中,为了加快确定最小秩的速度,可以采用以下策略: - 使用递增的秩增加幅度,例如从1开始每次增加2或3。 - 对于每个秩的近似张量,可以使用快速矩阵运算方法,如ALS算法等,来加速计算过程。 - 可以根据之前的经验或领域知识,估计一个可能较接近最小秩的初始秩,以减少搜索空间。 - 采用多种近似方法进行对比,如截断SVD、基于核的方法等,以便根据不同方法得到的结果进行选择。 综上所述,通过逐渐增加秩并计算近似张量与原始张量的差异,可以快速确定最小秩的近似。通过使用适当的策略,可以进一步加快计算速度,提高确定最小秩的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值