基于张量网络的机器学习(二)

   在前面的学习中,已经大致了解到了张量怎么来的,也学习到了一些张量的代数运算,本次对张量分解进行初步的学习。

一.张量分解的知识铺垫

   开始学习CP分解知识,我们有必要了解一些基础知识。

1.纤维和切片

前面的学习已经提到,张量是多维数组:
在这里插入图片描述
这有利于接下来新知识的学习。

  • 纤维(fiber)
       纤维是指从张量中抽取向量的操作,只保留一个维度变化,固定其它维度,可以得到向量,这个向量即为张量的纤维。比如对于1个3阶张量,分别只保留i,j,k维度的变化,可以得到:
    在这里插入图片描述

  • 切片(slice)
        切片操作是指在张量中抽取矩阵的操作。在张量中如果保留两个维度变化,其它的维度变化可以得到一个矩阵,这个矩阵即为张量的切片。 对一个三阶张量分别按照i,j,k三个方向进行操作可以得到如下图所示的三个维度的切片。

在这里插入图片描述
以上这两个概念是便于理解且直观的。

2.张量的展开(矩阵化)

   有看过刘慈欣的《三体》吗?在《三体》中,展开这一概念有了我所认为很好的描述。三体人将十一维的质子展开成二维球面,包裹整个三体星,然后用飞船在上面蚀刻电路,完成后再缩回十一维,质子就有了智能;再比如二向箔,在未激活状态下由特制力场束缚,看起来就像是一张完全无害的二维薄膜。但当二向箔抵达目标空间后,束缚力场就会消失,此武器不可逆地发动,将接触到的三维空间中的一个维度无限蜷缩,导致三维立体空间塌陷,变成二维平面空间并不断扩展。需要注意的是,无论是将一个物体怎么展开,信息始终没有消失,你不能说把一个三维的实心球二维展开得到的仅仅是这个实心球的表面的那部分,还应该包含了实心球的内部结构。
   类比张量,将一个N阶张量矩阵化就类似二维化,展开后得到的张量包含的信息也并未消失,再联系到在前面学习中我所描述的张量可以表示万物,竟感觉有点奇妙(我有一个大胆的想法,但是我不说😏),接着进入这一小节的正题,就是张量的展开以及如何展开
   将一个N阶张量 χ \chi χ沿着某一个维度展开成矩阵,这就是张量的展开,你可以想象不断从一个高阶张量沿着某一个维度抽取向量,然后将其平铺,这样得到的就是一个高阶张量的一种展开方式,现在以一个三阶张量为例(不要混淆张量的阶、维数和维,张量的阶等价于维但不等价于维数),毕竟在前面用抽向量并平铺这种说法对于三阶张量是比较准确的,对于更高阶的张量来说可能就不是对的了。
下面的是一个(二维)三阶张量
在这里插入图片描述
采用数据可以表示为:
在这里插入图片描述
若要用数据来更直观的表示一个三阶张量,可以使用三个索引,就像是面包切片切出一个个面包片,比如下面这个表示是固定了第三个索引得来的,它切出了两片(一片4个数据),分别是前面和后面
在这里插入图片描述
类比一下,固定第一个索引,切出的是上面和下面,固定第二个索引,切出的是左面和右面, 这是比较好理解的。
还有一个地方需要注意,对于下面这两个张量,
在这里插入图片描述
前者固定第三个索引为1,后者固定了第三个索引为2,现在看到的这种表示方法很重要。

3.超对称和超对角

  • 超对称
    对于一个立方张量(阶数和维数均为3),如果其元素在下标的任意排列下,都有
    在这里插入图片描述
    那么这个立方张量是超对称的。

  • 超对角
    对于一个立方张量(阶数和维数均为3),如果
    在这里插入图片描述
    那么么这个立方张量是超对角的。

4.张量的秩以及秩一张量/可和张量

下面是秩一张量的定义:
在这里插入图片描述
   如果一个张量可以由n个秩一张量的和表示,那么这个张量的秩为n,因此,如果一个张量能够以三个秩一张量的和表示,那么其秩为3,下面这张图展示的就是一个秩为3的张量的分解:
在这里插入图片描述
其中,图中的每一个量都是向量,这为CP分解的张量形式作了铺垫。
   目前还没有方法能够直接求解一个任意给定张量的秩,这被证明是一个NP-hard问题,而且张量的秩是指所需秩一张量的最小个数。

二.CP分解

1.CP分解

  • 张量形式

CP分解的张量形式见下图:在这里插入图片描述表示成公式就是:
在这里插入图片描述
其中:
在这里插入图片描述
其中 A,B,C 都是矩阵,每一项里的圈是外积符号。

  • 矩阵形式
       上面的矩阵 A,B,C 又称为该张量的因子矩阵,通过因子矩阵可以将一个张量的CP分解展开成相应的投影矩阵:
    在这里插入图片描述
    其中那个长相怪异的符号(圈里有个点)是我没有介绍过的Khatri-Rao积,张量的下标1,2,3代表3阶张量的三个维度。
    在装了tensor toolbox后举个例子:
    在这里插入图片描述
    在这里插入图片描述
    上面的三个矩阵是3个因子矩阵,还可以看到后面那个引号不可以省略,否则会报错。
  • 切片形式
    3阶张量有时会按照正面进行切片,并写成如下形式:
    在这里插入图片描述
    并以下图作为参考:
    在这里插入图片描述
  • CP带权分解形式
    这种形式理解起来也简单,假设因子矩阵的列是单位长度,然后引入一个权重向量 ****,
    使得:
    在这里插入图片描述
    上面叙述仅仅是针对三阶张量,对于更高阶的张量,增加因子矩阵即可。
  • CP分解的秩分解
    张量CP分解的秩分解是指在张量的秩最小的情况下的CP分解,见下图:
    在这里插入图片描述
    需要注意的是,这里的分解是在实数域进行分解的,如果在复数域进行分解,结果又可能会有所不同。
  • CP分解的 低秩近似
       顾名思义,低秩近似即 用最少的秩一张量去逼近一个高阶张量(注意不是等于,因为一般情况下只能做到尽量去逼近或是无限逼近,很难等于),或者说所需因子矩阵个数最少,从而有了一种描述:张量的秩-n近似,其中n为选取的秩。

2.CP分解的计算

   CP分解的计算又可以视为CP分解的求解,如何求解?首先,我们需要确定秩一张量的个数,通常我们通过迭代的方法从1开始遍历直到找到一个合适的解,之后再通过交替最小二乘方法(ALS)对CP分解进行求解。
   对于一个三阶张量
在这里插入图片描述
给定目标表达式或者说限制条件,
在这里插入图片描述
然后通过ALS先固定矩阵 B,C 找到 A,接着固定矩阵 A,C 找到 B,然后固定矩阵 A,B 找到 C,分别得到最优矩阵 A,B,C 以及对应的 λ \lambda λ值。
下面是matlab的实现:
在这里插入图片描述
在这里插入图片描述

第一行代码:随机生成一个345的稀疏3维张量,且具有近似25个非零项,代表张量里面存的不一定是25个非零项,但一定不超过25个非零项。
第二行代码:使用ALS算法求解,其中2表示将该张量通过CP分解分解为两个秩一张量。

3.CP分解的应用

  • 语音分析
  • 网络压缩
  • 独立成分分析
  • 视频处理
  • 去噪

以网络压缩和去噪为例:

  • 网络压缩
       通过CP分解将一个4D张量分解成多个低维度的张量,小幅降低识别精度,大幅提高识别效率。
  • 去噪
       高光谱图像(HSI)是上个世纪80年代以来新兴的一种新型成像技术,它包括了可见光和不可见光范围的几十到几百个连续光谱窄波段构成,形成了一种数据立方体结构的图像。高光谱图像可以看作是一个三阶张量,图像的空间域和光谱域构成了数据的三个维度。采用低秩CP分解对高光谱图像去噪认为低秩的部分是无噪声的部分,剩下的部分认为是噪声数据,见图:
    在这里插入图片描述
    由此,一个高光图谱的数据张量可以分解为两部分:低秩干净的部分和高秩噪声多的部分。

三.matlab tensor toolbox的安装

下载地址:https://www.sandia.gov/~tgkolda/TensorToolbox/downloads/tensor_toolbox_2.6.zip
下载完压缩包就解压,注意解压路径。
matlab命令:
在这里插入图片描述
查看帮助文档输入命令:
在这里插入图片描述
在这里插入图片描述
这个专栏的下一篇我会讲解其他张量分解,并对各种张量分解进行整理。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个基于Python的示例代码,使用了TensorFlow和Keras库。假设你已经有了一些用于训练和测试神经网络的数据集,并且已经建立了一个适当的神经网络模型。 首先,导入所需的库和模块: ```python import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras.layers.experimental import preprocessing import numpy as np import pandas as pd import matplotlib.pyplot as plt ``` 接下来,加载和准备数据集。假设你已经有了一个CSV文件,其中包含用于训练和测试神经网络的数据。使用Pandas库将数据加载到一个DataFrame中: ```python dataframe = pd.read_csv("data.csv") ``` 然后,将DataFrame中的数据分成训练集和测试集: ```python train_dataset = dataframe.sample(frac=0.8, random_state=0) test_dataset = dataframe.drop(train_dataset.index) ``` 接下来,将数据集转换为张量(Tensor)格式: ```python train_features = train_dataset.copy() test_features = test_dataset.copy() train_labels = train_features.pop('label') test_labels = test_features.pop('label') train_features = np.array(train_features) test_features = np.array(test_features) train_labels = np.array(train_labels) test_labels = np.array(test_labels) ``` 然后,对数据进行标准化处理: ```python normalizer = preprocessing.Normalization() normalizer.adapt(train_features) train_features = normalizer(train_features) test_features = normalizer(test_features) ``` 接下来,建立神经网络模型: ```python model = keras.Sequential([ layers.Dense(64, activation='relu', input_shape=[len(train_features[0])]), layers.Dense(64, activation='relu'), layers.Dense(1) ]) model.compile( optimizer=tf.keras.optimizers.Adam(0.001), loss='mse', metrics=['mae', 'mse'] ) ``` 然后,训练神经网络模型: ```python history = model.fit( train_features, train_labels, validation_split=0.2, verbose=0, epochs=100) ``` 最后,使用Matplotlib库绘制训练和验证的损失和精度曲线: ```python plt.plot(history.history['mse'], label='mse') plt.plot(history.history['val_mse'], label='val_mse') plt.xlabel('Epoch') plt.ylabel('mse') plt.legend() plt.show() ``` 以上是一个简单的示例代码,可以帮助你开始分析神经网络的性能。当然,具体实现还需要根据你的数据集和任务需求进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值