目录

0. 概要

1. 张量 Tensor

2. 张量的阶数 与 向量维(度)数

3. 外积

4. 张量积的直观例子

5. 张量积的定义

6. 张量积的性质

7. 加餐1:向量,线性变换 vs 列向量,行向量,矩阵

8. 加餐2:张量积的阶数变化


0. 概要

        量子计算、量子信息、量子编程自学笔记系列。

        用自己能看懂的方式来表述对于量子计算基础知识的理解。

        不求体系完备和逻辑严谨、但求通俗易懂。或能顺便给路过的小伙伴一些参考和启发那是纯属巧合概不认账^-^。当然,这里仅限于轮廓的勾勒和要点的连接,对细节感兴趣的话还是要正儿八经地啃正经的参考书。

        本节介绍张量以及张量积,为下一节介绍多量子系统的状态表示、量子纠缠和作用于两个或多个量子比特的门做一些数学准备。

1. 张量 Tensor

        简而言之,张量是向量和矩阵向高维空间的扩展(一般化、generalization)。

        标量称为0阶张量

        向量称为1阶张量

        矩阵称为2阶张量

        3阶张量可以想象成数字构成的长方体(cuboid),更高阶的张量就无法借助于几何去想象。3阶或以上的张量也没有俗称,就直接称k(>=3)阶张量了。

       Numpy中的多维数组可以看作是对张量的实现。当前所有机器学习系统都使用张量作为基本数据结构。张量对于机器学习领域非常重要,重要到什么程度呢?重要到Google的神经网络编程框架Tensorflow就是得名于张量(Tensor)。

2. 张量的阶数 与 向量维(度)数

        在英语中,张量的阶数和向量的维数都是用dimensionality来表示(?),很容易搞混淆。在本文中,将张量的dimensionality翻译成阶数,把向量的dimensionality翻译成维数。

        在线性代数中谈论向量的时候通常会说这个向量是多少多少维的,意思是说某个向量含有多少个元素。比如说,\mathbb{R}^3中的一个向量通常表示为\vec{v} = [x,y,z]^T,我们通常说这个向量是3维的向量。但是,上节中我们又说了向量是1阶张量。

        张量的阶数可以理解维是轴的个数,或者是向量空间的维数(向量空间的维数与向量的维数不相同!确实很容易搞混)。比如说,我们有一个3D张量(3阶张量)和一个3D向量(3维)。3D向量的例子如[1,2,3].T,但是它其实只有一个轴,因此是1D张量;而3D张量要举出一个例子就比较麻烦,比如说,一个Tensor(2,3,4)可以以嵌套的方式理解为由两个相同大小的2阶张量构成,然后每个2阶张量又由3个1阶张量构成,以下是一例(其中最内层矩阵每以上还加了"[ ]",这是故意的,其理由下面会解释):

                \begin{bmatrix} \begin{bmatrix} [1 & 2 & 3 & 4]\\ [5 & 6 & 7 & 8]\\ [9 & 10 & 11 & 12] \end{bmatrix} & \begin{bmatrix} [1 & 2 & 3 & 4]\\ [5 & 6 & 7 & 8]\\ [9 & 10 & 11 & 12] \end{bmatrix} \end{bmatrix}

        其中总的元素个数为2*3*4=24个。(2,3,4)称为该张量的形状(shape),分别表示每个轴的维度大小,该张量的第1个轴是2维,第2个轴是3维,第3个轴是4维。。。确实很混乱。

        更高阶的张量就越来越难写出来了,但是并非不可能。至少不像要画4维图形那么不可思议。在numpy中表达多维数组(前面说了它就是张量的实现)时就是以上这种嵌套方式表达。用这种方式表达出来的张量的阶数很好确定,就是数嵌套的[]的层数即可。

3. 外积

        考虑复数域\mathbb{C}的两个向量\bold{v}\bold{u},两者的外积(也称叉乘,因为通常用“\times”作为对应运算符)定义为(注意,是第一个向量与第二个向量的共轭转置--即列向量(右矢)与行向量(左矢)之间的矩阵运算!):

                \bold{u} \times\bold{v} = |\bold{u}\rangle \langle \bold{v}| = \bold{u}\bold{v}^{\dagger}

        作为对比,两者的内积定义为: \left \langle \bold{u}, \bold{v} \right \rangle = \langle \bold{v}|\bold{u}\rangle = \bold{u}^{\dagger} \bold{v}

        注意,外积实际上是一种矩阵运算,得到的结果为一个矩阵;而内积运算结果是一个标量。

        两个向量的外积是张量积(tensor product)的一种特殊情况下的运算。

        例:考虑\bold{u} = \begin{bmatrix} u_1\\ u_2 \end{bmatrix}, \bold{v} = \begin{bmatrix} v_1\\ v_2 \end{bmatrix},则有:

                \bold{u} \times \bold{v} = \begin{bmatrix} u_1\\ u_2 \end{bmatrix} \times \begin{bmatrix} v_1^{\dagger} & v_2^{\dagger} \end{bmatrix} = \begin{bmatrix} u_1 v_1^{\dagger} & u_1 v_2^{\dagger}\\ u_2 v_1^{\dagger} & u_2 v_2^{\dagger} \end{bmatrix}

4. 张量积的直观例子

        张量积可以看作是两个向量之间的外积的一种推广、一般化运算。外积可以看作是两个一阶张量(第一个是右矢/列向量,第二个是左矢/行向量,顺序不可互换,也即是说外积不满足交换律)相乘(张量积)得到二阶张量的特殊运算。但是,两个左矢/行向量的张量积、两个右矢/列向量的张量积仍然得到是一阶张量!如下为基于向量或者矩阵的几个张量积运算例(用于获得直观上的认识):

                \begin{bmatrix} a \\ b \end{bmatrix} \otimes \begin{bmatrix} c & d & e \end{bmatrix} = \begin{bmatrix} ac & ad & ae\\ bc & bd & be \end{bmatrix}

                \begin{bmatrix} a\\ b \end{bmatrix} \otimes \begin{bmatrix} c\\ d \end{bmatrix} = \begin{bmatrix} ac\\ ad\\ bc\\ bd \end{bmatrix}

                [a b] \otimes [c d] = [ac \ ad \ bc \ bd]

        很显然,一个大小是(n1,n2)的矩阵A与一个大小是(m1,m2)的矩阵B的张量的大小为(n1*m1, n2*m2)。

        矩阵之间的张量积的计算可以用如下方式实现,这个对应于软件编程的递归式实现方式。假定A和B均为大小为(2,2)的矩阵,则两者之间的张量积为:

                \bold{A} \otimes \bold{B} = \begin{bmatrix} a_{11} \bold{B} & a_{12} \bold{B}\\ a_{21} \bold{B} & a_{22} \bold{B} \end{bmatrix} = \begin{bmatrix} a_{11}b_{11} & a_{11}b_{12} & a_{12}b_{11} & a_{12}b_{12}\\ a_{11}b_{21} & a_{11}b_{22} & a_{12}b_{21} & a_{12}b_{22}\\ a_{21}b_{11} & a_{21}b_{12} & a_{22}b_{11} & a_{22}b_{12}\\ a_{21}b_{21} & a_{21}b_{22} & a_{22}b_{21} & a_{22}b_{22} \end{bmatrix}

         这个例子中两个2阶张量的张量积仍然是一个2阶张量,虽然结果的2阶张量的大小确实变大了,但是作为张量的阶数并没有变得更高!考虑到上面的例子中两个1阶张量的张量积有可能仍然是1阶,也有可能变成2阶,所以,张量积的阶数的变化并不是那么直观!这一点一开始学习张量是比较容易搞混淆的(没错,说得就是在下~笑哭😂~)。作为张量积的阶数的变化的普遍性规律还有待在进一步学习慢慢总结发掘。

        顺便说一句,张量积也称为直积(Direct Product. 注意,不是直和!),张量表示为矩阵形式时的张量积的表现形式就是克罗内克积(Knonecker Product,得名于德国数学家克罗内克)。

5. 张量积的定义

        令\bold{V}\bold{W}为基于\mathbb{F}的两个有限维度(维度分别为n,m)的向量空间,定义\bold{V} \otimes \bold{W}为一个新的基于\mathbb{F}的向量空间,这个新的向量空间是通过全体\bold{v} \otimes \bold{w}对象的加法和乘法生成的。 

        令\{\vec{e_1}, \vec{e_2}, ..., \vec{e_n} \}\bold{V}的(一组)标准正交基底,\{\vec{f_1}, \vec{f_2}, ..., \vec{f_m} \}\bold{W}的(一组)标准正交基底。则nm个形式\vec{e_i} \otimes \vec{f_j}\vec{e_i} \otimes \vec{f_j}的向量组构成\bold{V} \otimes \bold{W}的一组正交基底。

        打住。。。这不是循环定义了吗?\otimes到底是什么鬼嘛?确实。嗯。。。数学概念的定义就是这么折磨人,这么着吗,先就把\otimes当作一个符号来看吧(代数代数。。。就是用符号来代替数字进行运算。),关键的不是符号长啥样,关键是符号所代表的运算到底是个啥(上一节的例子看完后以为明白了张量积是啥回事,来个形式化定义反而懵逼了,我经常这样。。。所以抽象代数的学习看实例非常重要)。

        借助向量的坐标表示形式(即列向量)来看一个实际的例子。

        考虑n=2, m=3,则新的向量空间的维数为n*m=6,则\vec{e_1} \otimes \vec{f_1}\vec{e_1} \otimes \vec{f_2}\vec{e_1} \otimes \vec{f_3}\vec{e_2} \otimes \vec{f_1}\vec{e_2} \otimes \vec{f_2}\vec{e_2} \otimes \vec{f_3}构成新的向量空间的标准正交基。由于是标准正交基,所以各基向量在原向量空间中的坐标(列向量)表示分别为:

                \vec{e_1} = \begin{bmatrix} 1\\ 0 \end{bmatrix},\vec{e_2} = \begin{bmatrix} 0\\ 1 \end{bmatrix},

                \vec{f_1} = \begin{bmatrix} 1\\ 0\\ 0 \end{bmatrix},\vec{f_2} = \begin{bmatrix} 0\\ 1\\ 0 \end{bmatrix},\vec{f_3} = \begin{bmatrix} 0\\ 0\\ 1 \end{bmatrix}

        由此可得新的基底的坐标(列向量)表示为:

\vec{e_1}\otimes\vec{f_1} = \begin{bmatrix} 1\\ 0\\ 0\\ 0\\ 0\\ 0 \end{bmatrix},\vec{e_1}\otimes\vec{f_2} = \begin{bmatrix} 0\\ 1\\ 0\\ 0\\ 0\\ 0 \end{bmatrix},\vec{e_1}\otimes\vec{f_3} = \begin{bmatrix} 0\\ 0\\ 1\\ 0\\ 0\\ 0 \end{bmatrix},\vec{e_2}\otimes\vec{f_1} = \begin{bmatrix} 0\\ 0\\ 0\\ 1\\ 0\\ 0 \end{bmatrix},\vec{e_2}\otimes\vec{f_2} = \begin{bmatrix} 0\\ 0\\ 0\\ 0\\ 1\\ 0 \end{bmatrix},\vec{e_2}\otimes\vec{f_3} = \begin{bmatrix} 0\\ 0\\ 0\\ 0\\ 0\\ 1 \end{bmatrix}

               

        考虑\bold{v} \in \bold{V}\bold{w} \in \bold{W}, and

                \bold{v} = v_1 \vec{e_1} + v_2 \vec{e_2} = \begin{bmatrix} v_1\\ v_2 \end{bmatrix}

                \bold{w} = w_1 \vec{f_1} + w_2 \vec{f_2} + w_3 \vec{f_3} = \begin{bmatrix} w_1\\ w_2\\ w_3 \end{bmatrix}

        这样,我们就可以得到两者的张量积为:

                \begin{align} \bold{v} \otimes \vec{w} &= (v_1 \vec{e_1} + v_2 \vec{e_2}) \otimes (w_1 \vec{f_1} + w_2 \vec{f_2} + w_3 \vec{f_3})\\ &= v_1 w_1 (\vec{e_1}\otimes x\vec{f_1})+v_1 w_2 (\vec{e_1}\otimes \vec{f_2})+v_1 w_3 (\vec{e_1}\otimes \vec{f_3} + v_2 w_1 (\vec{e_2}\otimes \vec{f_1})+v_2 w_2 (\vec{e_2}\otimes x\vec{f_2})+v_2 w_3 (\vec{e_2}\otimes \vec{f_3})) \\ &= \begin{bmatrix} v_1 w_1\\ v_1 w_2\\ v_1 w_3\\ v_2 w_1\\ v_2 w_2\\ v_2 w_3 \end{bmatrix} \end{}

6. 张量积的性质

        继承以上的符号表示, 考虑\bold{v} \in \bold{V}\bold{w} \in \bold{W}, and a, b \in \mathbb{F},张量积有以下性质:

        (1) a(\bold{v} \otimes \bold{w}) = (a\bold{v}) \otimes \bold{w} = \bold{v} \otimes (a\bold{w})

        (2) \bold{v_1} \otimes (\bold{w_1} + \bold{w_2}) = \bold{v_1} \otimes \bold{w_1} + \bold{v_1} \otimes \bold{w_2}, 对加法的分配律

        (3) (\bold{v_1} + \bold{v_2})\otimes \bold{w_1} = \bold{v_1} \otimes \bold{w_1} + \bold{v_2} \otimes \bold{w_1}, 对加法的分配律

        以上三条性质事实上说明张量积是一个双线性映射。


        (4) (\bold{v} \otimes \bold{w})^{\dagger} = \bold{v}^{\dagger} \otimes \bold{w}^{\dagger}

        (5) \bold{v} \otimes \bold{w} \otimes {u} = \bold{v} \otimes (\bold{w} \otimes {u}) = (\bold{v} \otimes \bold{w} ) \otimes {u}, 即张量积的推导与取值顺序无关,满足结合律
        (5) 如果A是一个m×n的矩阵,B是一个p×q的矩阵,则它们的张量积为一个mp×nq的矩阵
        (6) 如果A、B、C和D都为矩阵,则(A⊗B)(C⊗D)=(AC)⊗(BD), 对满足对矩阵乘法分配律
        (7) 对于\mathbb{F}上的向量空间\bold{V},\bold{W}\bold{X},\bold{Y},如果f: \bold{V} \rightarrow \bold{X}g: \bold{W} \rightarrow \bold{Y}都是线性映射,定义一个新的映射f \otimes g: \bold{V}\otimes\bold{W} \rightarrow \bold{X}\otimes\bold{Y}(f \otimes g )(\bold{v} \otimes \bold{w}) = f(\bold{v}) \otimes g(\bold{w}),该映射也是线性映射

        (8) 如果\bold{A}\bold{B}是幺正矩阵,则\bold{A} \otimes \bold{B}也是幺正矩阵

        (9) 如果\bold{V}\bold{W}有欧几里得范数,考虑\bold{v} \in \bold{V}\bold{w} \in \bold{W}, 两者张量积的范数等于两者的范数之积,即:\left \| \bold{v} \otimes \bold{w} \right \|^2 = \left \| \bold{v} \right \|^2 \left \| \bold{w} \right \|^2

        【问题1】试证明以上性质(8)

        【问题2】试证明以上性质(9)

7. 加餐1:向量,线性变换 vs 列向量,行向量,矩阵

        顺便说一下,在线性代数中向量和线性变换是抽象的定义,但是落实到具体的计算都是需要基于某个基底来进行。

        向量基于于特定基底的表示称为坐标,表示为列向量(所以,通常来说,只是“向量”的话是指抽象的向量对象,而说“列向量”或者“行向量”的话,则是指基于于特定基底的坐标表示)

        同理,线性变换基于特定基底的表示对应于矩阵。

        所以,落实到具体的计算中时,向量的张量积对应于具体的行向量或者列向量之间的张量积。线性变换的张量积则对应的矩阵之间的张量积。

8. 加餐2:张量积的阶数变化

        上文提到张量积的变化的问题,这里进一步聊一聊。

        一个行向量与一个列向量的张量积得到2阶张量,而两个行向量的张量积或者两个列向量的张量积仍然为1阶张量。关键在于“方向”。行向量与列向量的“方向”时相互垂直的,所以张量积运算会使得阶数提升。但是两个相同“方向”的行向量之间或者列向量之间的张量积则不会使张量积提升。

        同理,两个矩阵(2阶张量)之间的张量积得到的仍然是2阶张量。矩阵与向量之间的普通的张量积也是得到2阶张量,但是如果让这个向量以与矩阵“垂直方向”摆放然后与矩阵进行张量积的话则得到3阶张量(相当于让矩阵得到深度方向的扩展)。

        总之,张量积是否使阶数提升关键在于进行运算的两个张量的相对“方向”。但是,这个相对方向,如何用数学语言进行描述呢?

相关博文参见:

量子笔记:量子计算祛魅https://chenxiaoyuan.blog.csdn.net/article/details/127251274

【参考文献】

[1] 人人可懂的量子计算,克里斯.伯恩哈特著,邱道文等译,机械工业出版社

[2] 量子计算:一种应用方法,杰克.希德里著,姚彭晖等译,人民邮电出版社

[3] 与量子比特共舞,罗伯特.S.苏托尔著,吴攀译,人民邮电出版社

[4] 图解量子计算机,宇津木健著,胡屹译,人民邮电出版社

[5] Python深度学习,弗朗索瓦.肖莱著,张亮译,人民邮电出版社
 

   

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐