赞
踩
说起张量,大家比较熟悉的也许就是tensorflow中的tensor了吧,tensor作为tensorflow的基本数据结构能够代表各种各样复杂的数据,它是现代机器学习的基础,下面来一步步深入的了解张量国度。
Jacob Biamonte(美国物理学家)在《Lectures on Quantum Tensor Networks》中这样描述Tensors are a mathematical concept that encapsulates and generalizes the idea of multilinear maps, i.e. functions of multiple parameters that are linear with respect to every parameter.即张量是一个数学概念,它封装和概括了多线性映射的思想,即相对于每个参数呈线性的多个参数的函数。尽管这样的描述非常非常抽象,可是它的优点在于准确,而不仅仅是标量、向量及矩阵的一般化。多线性映射请看下图
也许你并不理解上面的说法,没关系,再来看看它的其他几种定义:
下面补充一种张量表示方法,由点和腿组成,有几条腿就是几阶张量,图中举例分别列出了常数、向量、矩阵对应的张量关系。
再来看更形象的一组图片
图中分为两行,第一行是单个样本的维度,第二行是多个样本,即增加了样本维度,所以第一行的维度+1=第二行的维度。图中告诉我们0维张量也就是一个数,1维张量也就是一个矢量,2维张量就是一个矩阵、3维张量就是多个矩阵组成的立体,以此类推…。下面通过几个例子来了解一下张量对生活中各类数据的映射。
图片被表示为4D张量,samples表示样本数、height表示样本高度、width表示样本宽度,channels表示通道数(彩色图为3,即RGB)。
视频被表示为5D张量,smaples表示样本数、frames表示帧序号、height表示每一帧的高度、width表示每一帧宽度、channels表示图片通道数。
再比如在建造一个小区的时,把一排砖头看作一阶张量,一堵墙看作二阶张量,一层楼看作三阶张量,一座楼看作四阶张量,一个小区看作五阶张量,多个小区就可以看作六阶张量,以此类推。通过这样的方式,我们就能通过这些索引定位到每一块砖头,也就意味着有了通过计算机批量操纵这些数据的能力,这就是为什么张量是机器学习的核心内容,因为机器学习对target function的求导、优化等操作,大多基于张量的表示和运算。
同时学过python的同学应该对numpy库并不陌生,numpy.array其实也可以理解为张量,它表示张量的维度可以理解成“ [”的深度(如上图)。即有下面的对应关系,当[深度为n,也就表示n维的张量。当然不同张量之间还有很多的运算(缩并、内积、点积等),为了使用方便Google在2019年开源了TensorNetwork,它使用 TensorFlow 作为后端,针对 GPU 进行优化,与 CPU 上的运行速度相比实现了 100 倍的加速。希望大家都能多多尝试,确实是一个非常方便的框架,推荐搭配GPU食用☆ ̄(>。☆)!
除了在机器上表示,那么当我们利用张量进行运算时,如何在纸上表示呢,当当当当!有三种记法,其含义一致。
其中
e
1
,
e
2
,
e
3
e_1, e_2, e_3
e1,e2,e3是单位基矢量,满足
e
i
⋅
e
j
=
{
1
i=j
0
i!=j
e_i\cdot e_j=
上面提到了张量的运算,包括和、差、数积、并积、内积、缩并、点积、双点积等操作。
和、差
两个同阶张量
A
=
A
i
j
e
i
e
j
A=A_{ij}e_i e_j
A=Aijeiej与
B
=
B
i
j
e
i
e
j
B=B_{ij}e_i e_j
B=Bijeiej之和(或差)是另一个同阶张量
T
=
T
i
j
e
i
e
j
T=T_{ij}e_i e_j
T=Tijeiej,即
T
=
A
±
B
T=A\pm B
T=A±B
其分量关系为
T
i
j
=
T
i
j
±
B
i
j
\color{grey}T_{ij}=T_{ij}\pm B_{ij}
Tij=Tij±Bij
数积
张量A和一个数
λ
\lambda
λ(或标量函数) 相乘得另一同维同阶张量T
T
=
λ
A
T=\lambda A
T=λA
其分量关系为
T
i
j
=
λ
A
i
j
T_{ij}=\lambda A_{ij}
Tij=λAij
并积
两个同维不同阶(或同阶)张量
A
A
A和
B
B
B的并积 T是一个阶数等于
A
A
A、
B
B
B阶数之和的高阶张量。设
A
=
A
i
j
k
e
i
e
j
e
k
A=A_{ijk}e_i e_j e_k
A=Aijkeiejek,
B
=
B
l
m
e
l
e
m
B=B_{lm}e_l e_m
B=Blmelem,则
T
=
A
B
=
T
i
j
k
l
m
e
i
e
j
e
k
e
l
e
m
\color{green}T=AB=T_{ijklm}e_i e_j e_k e_l e_m
T=AB=Tijklmeiejekelem
其分量关系为
T
i
j
k
l
m
=
A
i
j
k
B
l
m
T_{ijklm}=A_{ijk}B_{lm}
Tijklm=AijkBlm,千万注意:
A
B
≠
B
A
AB\neq BA
AB=BA
缩并
缩并可是张量的核心运算之一,后面的张量网络是建立在缩并运算的基础之上的。若对基张量中的任意两个基矢量求点积,在张量将缩并为低二阶的新张量。在基张量中取不同基矢量的点积,则缩并的结果也不同,算法描述公式如下
R
=
T
i
j
k
e
i
e
j
e
k
=
T
i
i
k
e
k
=
R
k
e
k
⇒
R
j
=
T
i
i
j
S
=
T
i
j
k
e
i
e
j
e
k
=
T
i
j
i
e
k
=
S
j
e
j
⇒
S
j
=
T
i
j
i
⇒
R
≠
S
\color{navy}R=T_{ijk}e_i e_j e_k=T_{iik}e_k =R_ke_k \Rightarrow R_j=T_{iij} \\ S=T_{ijk}e_i e_j e_k=T_{iji}e_k =S_je_j \Rightarrow S_j=T_{iji} \\ \Rightarrow R\neq S
R=Tijkeiejek=Tiikek=Rkek⇒Rj=TiijS=Tijkeiejek=Tijiek=Sjej⇒Sj=Tiji⇒R=S
再来看看几种典型的缩并情况
内积
并积加缩并运算称为内积。例如
A
=
A
i
j
k
e
i
e
j
e
k
A=A_{ijk}e_i e_j e_k
A=Aijkeiejek和
B
=
B
l
m
e
l
e
m
B=B_{lm}e_l e_m
B=Blmelem的一种内积是(这里将
e
i
e_i
ei和
e
m
e_m
em进行缩并)
S
=
A
i
j
k
e
i
e
j
e
k
B
l
m
e
l
e
m
=
A
i
j
k
B
l
j
e
i
e
k
e
l
\color{teal}S =A_{ijk}e_ie_je_kB_{lm}e_l e_m = A_{ijk}B_{lj}e_ie_ke_l
S=AijkeiejekBlmelem=AijkBljeiekel
其分量关系为
S
i
k
l
=
A
i
j
k
B
l
j
S_{ikl}=A_{ijk}B_{lj}
Sikl=AijkBlj
示例如图所示
点积
前张量 A 的最后基矢量与后张量 B 的第一基矢量缩并的结果,记为
A
⋅
B
A\cdot B
A⋅B,是最常用的一种内积
R
=
A
⋅
B
=
A
i
j
k
B
l
m
e
i
e
j
e
k
⋅
e
l
e
m
=
A
i
j
k
B
k
m
e
i
e
j
e
m
=
R
i
j
m
e
i
e
j
e
m
R = A\cdot B = A_{ijk}B_{lm}e_i e_j e_k\cdot e_l e_m \\ =A_{ijk}B_{km}e_i e_je_m=R_{ijm}e_ie_je_m
R=A⋅B=AijkBlmeiejek⋅elem=AijkBkmeiejem=Rijmeiejem
R
i
j
m
=
A
i
j
k
B
k
m
R_{ijm}=A_{ijk}B{km}
Rijm=AijkBkm
从上述公式可知两个二阶张量的点积相当于矩阵乘法。
双点积
对前、后张量中两对近挨着的基矢量缩并的结果称为双点积,共有两种:
总结
张量的各类运算总结起来如下图所示
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。