张量(Tensor)可以理解为广义的矩阵,其主要特点在于将数字化的矩阵用图形化的方式来表示,这就使得我们可以将一个大型的矩阵运算抽象化成一个具有良好性质的张量图。由一个个张量所共同构成的运算网络图,就称为张量网络(Tensor Network)。让我们用几个常用的图来看看张量网络大概长什么样子(下图转载自参考链接1):
上面这个图从左到右分别表示:一阶张量、二阶张量以及三阶张量,我们可以看出,一个张量的阶数在图像化的表示中被抽象称为了张量的腿
的数量,而中间的方形或者圆形则表示张量本身。实际上,一阶张量代表的一个矢量,比如我们平时用python所定义的一个数组变量:
1
2
3
x = [1, 0]
y = [0, 1, 0]
z = [1, 2, 3, 4]
那么这里的x,y,z
都是一阶的张量。而二阶张量所表示的含义是一个二维的矩阵,如我们常见的python多维数组:
1
2
M = [[1, -1], [-1, 1]]
N = [[1, 3], [2, 4], [5, 6]]
这里定义的M, N
都是二阶的张量。通过观察这些示例中的一阶和二阶的张量我们可以得到一个规律:能够用形如var[i]
的形式读取和遍历var
中的标量元素的就可以称之为一阶张量,能够用形如var[i][j]
的形式读取和遍历var
中的标量元素的可以称之为二阶张量。显然,属于几阶的张量,跟张量内所包含的元素个数是无关的。那么根据这个客观规律,我们可以再推广到零阶张量和更加高阶的张量:
1
2
3
pi = 3.14
P = [[[1]]]
Q = [[[1, 1, 1], [1, 1, 1], [1, 1, 1]]]
在上述的python变量定义中,pi
就是一个零阶的张量,零阶张量实际上就等同于一个标量,而P, Q
都是三阶的张量。需要注意的是,虽然张量P
只有一个元素,但是如果我们需要读取这个标量元素,我们必须使用如下的python指令来执行:
print (P[0][0][0])
因此P
也是一个有三条腿
的张量。在使用张量的形式来表示单个矩阵的同时,我们需要考虑如果有多个矩阵的乘法运算,我们该如何表示?我们先以两种形式的python矩阵运算来说明张量计算的表示方法:
1
2
3
4
5
6
7
import numpy as np
M = np.random.rand(2, 2)
v = np.random.rand(2)
w = np.dot(M, v)
print (M)
print (v)
print (w)
这一串python代码表示的计算过程为:w2×1=M2×2⋅v2×1w2×1=M2×2⋅v2×1,为了不失广泛有效性,这里使用随机的张量来进行计算,这里的M
表示二阶张量,v,w
表示一阶张量。如果从矩阵运算的角度来理解,实际上就是一个2×22×2的矩阵乘以一个2×12×1的矢量,并且得到了一个新的2×12×1的矢量。计算所得到的结果如下所示:
1
2
3
4
[[0.09660039 0.55849787]
[0.93007524 0.32329559]]
[0.74966152 0.59573188]
[0.40513259 0.88983912]
同时我们也考虑下另外一种张量运算的场景,一个高阶的张量与另外一个高阶的张量进行运算:
1
2
3
4
5
6
7
import numpy as np
A = np.random.rand(1, 2, 2, 2)
B = np.random.rand(2, 2, 2)
C = np.einsum('ijkl,klm->ijm', A, B)
print ('A:', A)
print ('B:', B)
print ('C:', C)
这一串python代码表示的计算过程为:C1×2×2=A1×2×2×2⋅B2×2×2C1×2×2=A1×2×2×2⋅B2×2×2,由于这里的多维张量运算已经不能使用普通的numpy.dot
来处理,因此我们还是适用了专业的张量计算函数numpy.einsum
来进行处理,计算结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
A: [[[[0.85939221 0.43684494]
[0.71895754 0.31222944]]
[[0.49276976 0.13639093]
[0.04176578 0.14400289]]]]
B: [[[0.21157005 0.58052674]
[0.59166167 0.21243451]]
[[0.11420572 0.98995349]
[0.1145634 0.97101076]]]
C: [[[0.5581652 1.60661377]
[0.20621996 0.49621469]]]
以上的两个案例,从张量理论的角度来理解,相当于分别将张量w
和张量C
表示成了多个张量组合运算的结果。由多个张量构成的组合运算,我们可以使用张量网络来表示:
上图所示的(a)(a)和(b)(b)就分别表示张量w
和张量C
的张量网络图。而这个将张量网络的所有张量进行计算,最终得到一个或一系列的新的张量的矩阵乘加过程,我们也称之为张量缩并
,英文叫Tensor Contraction
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有