1. 张量的定义


       首先我们来了解一下什么是张量,张量有四个定义:

  1. 张量是多维数组
  2. 张量是一种不随坐标系的改变而改变的几何对象
  3. 张量是向量和余向量,不会随着坐标系的改变而改变
  4. 张量是多重线性映射,即
    所有张量必须在GPU上_数组

这里我们要学习的是张量与深度学习的相关知识,下面的几个定义是物理和工学领域内的张量定义,我们这里只考虑其在数学领域内的定义,也就是第一个:张量是一个多维数组

数组是有序的元素序列,我们将 不同维度的数组 定义为不同阶的张量:

  • 标量 (只有大小没有方向的数) 定义为 0 阶张量 ,如
  • 所有张量必须在GPU上_多维数组_02

  • 一维数组 定义为 一阶张量 ,如下所示
  • 所有张量必须在GPU上_数组_03

  • 将多个一维数组的拼接,即 矩阵 定义为 二阶张量
  • 所有张量必须在GPU上_数组_04

  • 将多个 矩阵的叠加 定义为 三阶张量
  • 所有张量必须在GPU上_数组_05

  • 下面我们类比一阶张量,将三阶张量排列为一个数组,数组的元素是三阶张量,如果我们将三阶张量记为
  • 所有张量必须在GPU上_数组_06

  • 那么多个元素组成的数组就定义为 四阶张量 ,如下所示
  • 所有张量必须在GPU上_张量_07

  • 同样,将四阶张量拼接,组成三阶张量的矩阵,称为 五阶张量 ,如下所示
  • 所有张量必须在GPU上_数组_08

  • 对上面的定义进行循环重复,我们就可以定义更高阶的张量了


有了对不同张量的理解后,我们看一下张量具体可以 描述的对象 有哪些。

  • 一阶张量是一个一维数组,即一组数,我们可以将一组数表示为一个矢量,二阶张量是一个矩阵,因此我们可以将张量作为矢量和矩阵概念的推广。
  • 三阶张量
           对于 RGB 图片,我们可以理解为由三张分别表示 R,G,B 分量的图片堆叠而成,如下
  • 所有张量必须在GPU上_一维数组_09

  • 对于每个分量图片,我们都可以看成一个矩阵,那么一张 RGB 图片就可以用三阶的张量进行表示。
  • 四阶张量
           对于多张 RGB 图片,我们可以用四阶张量进行表示,可以看作是三阶张量(单张RGB图像)的数组(多张 RGB 图片)。
  • 所有张量必须在GPU上_一维数组_10

  • 五阶张量
           视频是由多张图片组成的,因此每个视频可以用一个四阶张量表示,显然,多个视频可以用五阶张量表示。

2. 指标符号


       在张量的讨论中,我们对于分量的表示和区分都使用下表字母来表示,下面我们来了解一下用指标符号表示表达式。



2.1 自由指标

对于下面的一组数:
所有张量必须在GPU上_一维数组_11

我们可以用以下的表达项来简写:
所有张量必须在GPU上_所有张量必须在GPU上_12

即用 所有张量必须在GPU上_张量_13 (指标) 来表示将该项罗列,我们称这种在取值范围内对表达项进行罗列的指标为 自由指标,自由指标在表达项中只出现一次。



2.2 求和约定与哑指标

对于求和表达式:
所有张量必须在GPU上_一维数组_14

我们约定将其简写为
所有张量必须在GPU上_张量_15

求和约定的表达项 所有张量必须在GPU上_一维数组_16所有张量必须在GPU上_数组_17 出现两次,我们称在一个 表达项 中重复出现两次的指标为 哑指标 ,哑指标表示要对该表达项罗列后再求和只有在表达项中出现两次的才称为哑指标



现在,我们利用自由指标和哑指标来表示下式:
所有张量必须在GPU上_多维数组_18

所有张量必须在GPU上_数组_19

所有张量必须在GPU上_多维数组_20

因为一个自由指标表示将表达式的罗列,我们可以用自由指标将三个式子合并为一个:
所有张量必须在GPU上_张量_21

之后可以用哑指标将多个表达项合为一项:
所有张量必须在GPU上_多维数组_22

  • 所有张量必须在GPU上_多维数组_23
  • 所有张量必须在GPU上_一维数组_24

指标可以用任意的字母表示,我们约定

  • 拉丁指标 所有张量必须在GPU上_一维数组_25 为三维指标,即取值范围为 所有张量必须在GPU上_张量_26
  • 希腊指标 所有张量必须在GPU上_多维数组_27 为二维指标,取值范围为 所有张量必须在GPU上_张量_28

我们可以用一个表达式中出现多对哑指标来表示 多重求和 ,如
所有张量必须在GPU上_所有张量必须在GPU上_29



2.3 所有张量必须在GPU上_数组_30

所有张量必须在GPU上_数组_30 是张量中的一个基本符号,也称为单位张量,它的定义为
所有张量必须在GPU上_多维数组_32

特性:

  1. 所有张量必须在GPU上_数组_33 对于指标 所有张量必须在GPU上_多维数组_34所有张量必须在GPU上_一维数组_35 是对称的,即 所有张量必须在GPU上_所有张量必须在GPU上_36
  2. 所有张量必须在GPU上_数组_33 的分量集合是一个单位矩阵。在三维空间中
    所有张量必须在GPU上_所有张量必须在GPU上_38
  3. 所有张量必须在GPU上_数组_33 具有换标作用。如
    所有张量必须在GPU上_数组_40
    所有张量必须在GPU上_数组_33 的两个指标中,有一个和同项中其它因子的指标相同,则可以把该因子的那个相同指标换成 所有张量必须在GPU上_数组_33 的另一个指标,而 所有张量必须在GPU上_数组_33 自动消失。这是因为:
    所有张量必须在GPU上_张量_44
    根据上面 所有张量必须在GPU上_数组_33 的定义我们可以知道,只有 所有张量必须在GPU上_所有张量必须在GPU上_46 时,对应的项不为 所有张量必须在GPU上_张量_47 ,因此上式变为
    所有张量必须在GPU上_所有张量必须在GPU上_48
    类似的我们可以得到:
    所有张量必须在GPU上_一维数组_49
    所有张量必须在GPU上_多维数组_50
    所有张量必须在GPU上_一维数组_51
    所有张量必须在GPU上_张量_52

应用:

  • 三个相互正交的单位基矢量构成正交标准化基,它们具有如下的性质:
  1. 每个基矢的模为 所有张量必须在GPU上_张量_53 ,即 所有张量必须在GPU上_一维数组_54
  2. 不同的矢量相互正交,即 所有张量必须在GPU上_多维数组_55

上面的两个性质可以用 所有张量必须在GPU上_数组_33 的形式统一表示,即:
所有张量必须在GPU上_数组_57


  • 矢量的点积可以表示为:
    所有张量必须在GPU上_一维数组_58


2.4 所有张量必须在GPU上_张量_59

该符号在笛卡尔坐标系下的定义为
所有张量必须在GPU上_多维数组_60


所有张量必须在GPU上_一维数组_61

其中

  • 所有张量必须在GPU上_所有张量必须在GPU上_62 及其轮流换位得到的 所有张量必须在GPU上_所有张量必须在GPU上_63所有张量必须在GPU上_所有张量必须在GPU上_64
  • 所有张量必须在GPU上_一维数组_65 及其轮流换位得到的 所有张量必须在GPU上_张量_66所有张量必须在GPU上_多维数组_67

特性:

  1. 所有张量必须在GPU上_一维数组_68 共有 所有张量必须在GPU上_张量_69 个元素,其中三个元素为 所有张量必须在GPU上_多维数组_70 ,三个元素为 所有张量必须在GPU上_所有张量必须在GPU上_71 ,其余的都是 所有张量必须在GPU上_所有张量必须在GPU上_72
  2. 对其任意两个指标交换都是反对称的,即
    所有张量必须在GPU上_所有张量必须在GPU上_73
  3. 当三个指标循环移位时,所有张量必须在GPU上_一维数组_68 的值不发生改变
    所有张量必须在GPU上_张量_75


2.5 张量方程

每一项都是由张量组成的方程称为 张量方程 ,如:
所有张量必须在GPU上_张量_76

所有张量必须在GPU上_所有张量必须在GPU上_77

特性:张量方程具有与坐标选择无关的性质,可用于描述客观物理线性的固有特性和普遍规律。




3. 张量代数


在了解张量的各种代数运算之前,我们先来看一下张量的表示方法。

所有张量必须在GPU上_所有张量必须在GPU上_78,其表示 所有张量必须在GPU上_所有张量必须在GPU上_79 阶的张量,所有张量必须在GPU上_一维数组_80 表示第 所有张量必须在GPU上_多维数组_81 维的大小。所有张量必须在GPU上_所有张量必须在GPU上_79 阶张量 所有张量必须在GPU上_一维数组_83 中的元素可以记为 所有张量必须在GPU上_一维数组_84 。如 所有张量必须在GPU上_多维数组_85 ,表示大小为 所有张量必须在GPU上_所有张量必须在GPU上_86 的三维数组, 所有张量必须在GPU上_张量_87

3.1 几种矩阵的特殊乘法

  1. Kronecker 乘积(张量积)
           对于两个矩阵 所有张量必须在GPU上_所有张量必须在GPU上_88所有张量必须在GPU上_所有张量必须在GPU上_89 ,其 Kronecker 积被定义为如下的 所有张量必须在GPU上_数组_90 的矩阵,即将 所有张量必须在GPU上_多维数组_91 的每个元素乘以矩阵 所有张量必须在GPU上_一维数组_92 ,我们用符号 所有张量必须在GPU上_多维数组_93 来表示 Kronecker 乘积:
    所有张量必须在GPU上_一维数组_94
  2. Hadamard 乘积
           Hadamard 是对 相同大小的矩阵 进行的,它让相同位置的元素相乘,对矩阵 所有张量必须在GPU上_多维数组_95 ,其 Hadamard 乘积记作 所有张量必须在GPU上_张量_96
    所有张量必须在GPU上_多维数组_97
  3. Khatri - Rao 乘积
            Khatri - Rao 乘积是列对列的乘积,相乘的两个矩阵必须有相同的列数,矩阵 所有张量必须在GPU上_多维数组_98所有张量必须在GPU上_所有张量必须在GPU上_99 的 Khatri - Rao 乘积记为 所有张量必须在GPU上_所有张量必须在GPU上_100 ,即将矩阵 所有张量必须在GPU上_多维数组_91 的每一列和矩阵 所有张量必须在GPU上_一维数组_92 的对应列进行 Kronecker 积:
    所有张量必须在GPU上_多维数组_103
    如,对矩阵 所有张量必须在GPU上_张量_104所有张量必须在GPU上_所有张量必须在GPU上_105 的 Khatri - Rao 乘积为
    所有张量必须在GPU上_多维数组_106

3.2 特殊张量,主方向与主分量

  • 常用特殊张量
  1. 零张量
           若张量 所有张量必须在GPU上_张量_107 ,则
    所有张量必须在GPU上_所有张量必须在GPU上_108
  2. 单位张量
           笛卡尔坐标系中分量为 所有张量必须在GPU上_一维数组_109 的二阶张量 所有张量必须在GPU上_所有张量必须在GPU上_110 ,即:
    所有张量必须在GPU上_所有张量必须在GPU上_111
    所有张量必须在GPU上_多维数组_112
    单位张量和任意张量的点积就等于该张量本身。
  3. 转置张量
           对于二阶张量 所有张量必须在GPU上_多维数组_113 ,由对换分量指标而基矢量顺序保持不变所得到的新张量
    所有张量必须在GPU上_一维数组_114
    称为张量 所有张量必须在GPU上_一维数组_115
  4. 对称张量
           满足 所有张量必须在GPU上_所有张量必须在GPU上_116,即 所有张量必须在GPU上_所有张量必须在GPU上_117
  5. 反对称张量
           满足 所有张量必须在GPU上_数组_118,即 所有张量必须在GPU上_张量_119
  6. 加法分解
           任意二阶张量 所有张量必须在GPU上_一维数组_115 均可以分解为对称张量 所有张量必须在GPU上_张量_121 和反对称张量 所有张量必须在GPU上_张量_122 之和:
    所有张量必须在GPU上_多维数组_123
    其中 所有张量必须在GPU上_数组_124所有张量必须在GPU上_张量_125
  7. 置换张量
           笛卡尔系中以置换符号 所有张量必须在GPU上_数组_126 为分量的三阶张量为置换张量
    所有张量必须在GPU上_多维数组_127
  • 主方向与主分量
           二阶张量可以定义为一种由矢量 所有张量必须在GPU上_多维数组_128所有张量必须在GPU上_张量_129 的线性变换,即
    所有张量必须在GPU上_所有张量必须在GPU上_130
    一般来说,矢量 所有张量必须在GPU上_多维数组_128所有张量必须在GPU上_张量_129 并不同向。对于给定的任意二阶张量 所有张量必须在GPU上_张量_133 能否找到某个矢量 所有张量必须在GPU上_一维数组_134 ,它在线性变换后能保持方向不变,即:
    所有张量必须在GPU上_数组_135
    根据上式,类比矩阵的特征向量的求法可以得到:
    所有张量必须在GPU上_所有张量必须在GPU上_136
    其中 所有张量必须在GPU上_所有张量必须在GPU上_137 是标量 ,所有张量必须在GPU上_数组_33 是单位矩阵,该问题就转换为求 所有张量必须在GPU上_一维数组_139 的线性齐次代数方程组,其存在非零解的充分必要条件是系数行列式为零,即:
    所有张量必须在GPU上_所有张量必须在GPU上_140
    将左边行列式展开可得:
    所有张量必须在GPU上_所有张量必须在GPU上_141
    这是关于 所有张量必须在GPU上_所有张量必须在GPU上_137 的特征方程,我们可以求出特征方程的三个解,是三个特征值,称为张量 所有张量必须在GPU上_多维数组_143主分量 。当 所有张量必须在GPU上_多维数组_143 是是对称张量时,存在三个实特征值 所有张量必须在GPU上_数组_145 ,根据每个特征值,我们带入上面的等式,可以求出每个特征值对应的特征向量 所有张量必须在GPU上_张量_146,通过该方法求得的三个单位矢量 所有张量必须在GPU上_所有张量必须在GPU上_147 称为 张量 所有张量必须在GPU上_张量_148
    所有张量必须在GPU上_所有张量必须在GPU上_149 的正交坐标系称为张量 所有张量必须在GPU上_多维数组_143主坐标系 。在主坐标系中,有
    所有张量必须在GPU上_所有张量必须在GPU上_151



4. 张量展开

       首先我们对于一个如下的三阶张量,来了解几个概念。

所有张量必须在GPU上_数组_152

  • 纤维(fiber)
           纤维是从张量中抽取向量的操作。对于上面的张量来说,如果固定其中的两个维度,只保留一个维度可以变换,可以得到一个向量。
    所有张量必须在GPU上_张量_153 个下标度可以改变,则我们称为张量的 mode-k fiber ,我们记为 所有张量必须在GPU上_数组_154,也就是将第 k 维的下标用 所有张量必须在GPU上_一维数组_155 代替,表示其可以变化。对于三阶张量,其各维的 mode fiber 如下所示:
  • 切片(slice)
    所有张量必须在GPU上_所有张量必须在GPU上_156 ,分别表示水平切片、侧面切片和正面切片,如下所示:

4.1 张量展开(张量的矩阵化)

  • 所有张量必须在GPU上_张量_157 阶张量 所有张量必须在GPU上_一维数组_158 沿 mode - n 展开成一个矩阵 所有张量必须在GPU上_所有张量必须在GPU上_159 的过程,也就是张量的矩阵化,它可以将高维的张量拆解为 2 阶的矩阵,基本操作 为:把张量 所有张量必须在GPU上_一维数组_158

对于一个三维的张量如下:

所有张量必须在GPU上_所有张量必须在GPU上_161


我们可以用数据表示为:

所有张量必须在GPU上_数组_162如果我们对张量的每个维度进行索引,如下图所示:

所有张量必须在GPU上_多维数组_163

那么我们可以用索引表示每个元素,如下:
所有张量必须在GPU上_张量_164

对于张量
所有张量必须在GPU上_多维数组_165

其 mode - 1 矩阵 所有张量必须在GPU上_数组_166

所有张量必须在GPU上_多维数组_167


mode - 2 矩阵 所有张量必须在GPU上_多维数组_168 可以表示如下:

所有张量必须在GPU上_所有张量必须在GPU上_169


mode - 3 矩阵 所有张量必须在GPU上_一维数组_170

所有张量必须在GPU上_所有张量必须在GPU上_171


注意:同一个 mode 下的矩阵化时,如果选择对 mode-n fiber 按不同的排列顺序组成矩阵,可能会得到不同的结果,但是只要这些排序方法时前后统一的,一般来说不会对计算带来影响。

例:假设某张量 所有张量必须在GPU上_所有张量必须在GPU上_172

所有张量必须在GPU上_数组_173

根据上面的矩阵化,我们可以得到三个 mode 下的矩阵化结果如下:
所有张量必须在GPU上_一维数组_174

所有张量必须在GPU上_所有张量必须在GPU上_175

所有张量必须在GPU上_数组_176

4.2 张量乘以矩阵

       张量和矩阵相乘就是先将张量矩阵化,然后用矩阵乘以矩阵化的张量,就转变为了矩阵和矩阵的乘积。两个矩阵相乘得到一个矩阵,再按照原来的方式将矩阵还原为张量就得到了结果张量。

       根据不同 mode 的矩阵化方式,我们可以计算张量在不同 mode 下和矩阵的乘积。

所有张量必须在GPU上_所有张量必须在GPU上_177


       我们直接来看例子,如果我们有一个张量

所有张量必须在GPU上_张量_178

和一个矩阵
所有张量必须在GPU上_所有张量必须在GPU上_179

先对张量进行 mode - 1 矩阵化,得到如下结果:
所有张量必须在GPU上_多维数组_180

则张量和矩阵相乘可以表示为:
所有张量必须在GPU上_一维数组_181

之后将还原为张量:
所有张量必须在GPU上_所有张量必须在GPU上_182

注意,并不是任意 mode - n 的矩阵化的张量都是可以和矩阵相乘的,必须要保证 mode - n 的张量的行数等于要相乘矩阵的列数。