张量网络学习笔记[1]
0. 简介与前置知识
-
本笔记着重学习Zhao Qibin教授等发表的"关于利用张量网络缩减维度和大规模优化"(Tensor Networks for dimensionality Reduction and Large-Scale Optimization)等张量网络相关的内容. 就目前来看, 网上并没有公开资源, 而前述学术文章的官方中文据悉仍在制作中. 本笔记视作笔者自己的一个自学概要, 其目的为加深理解, 方便回顾. 同时, 也希望能用我自己的理解串联有关内容, 给大家呈现更清晰地知识布局. 本笔记将不是一个完整的翻译作品, 而是一个根据自己理解有选择性的, 摘要性的翻译与整理工作. 希望为互联网上, 特别是中文圈内学习张量领域的热情贡献自己的一份力量.
-
由于笔者写过关于张量综述的笔记, 很多入门内容就不重复记述. 若有必要, 会提及"笔记系列"以指代该系列.
-
如果读者不理解什么是张量(tensor) 不理解什么是CP, TUCKER, KRONECKER及KHATRI-RAO乘法, 以及张量秩, mode-n乘法以及低秩分解的基本知识, 欢迎查阅我的另外一个笔记系列, 张量学习笔记. (笔者也经常查阅, 如果不熟悉大可放心. 只要学过, 随学随查即可)
-
为了方便顺应原作对公式的引用及方便大家查阅原书, 会将公式在原书内的tag写出
0.1. 本文所用图表与符号
-
本文的一大中心, 是描述张量网络, 一种图形上和概念上都有具有优势的张量表达方式. 为此, 有诸多插图来辅助理解. 首先, 常规表达各种维度的张量时我们用如下的图:
-
然后我们介绍一下本书的标点符号 看图:
-
这里面着重强调几个容易搞混, 和其他文献(尤其是我的另一篇笔记)有所不同的地方.
-
首先是张量\(\underline{\mathrm{X}}\), 这里采用下划线而不是采用Kolda爱用的花体\(\mathcal{X}\)
-
其次, \(\mathrm{X}_{(n)}\)是mode-n的矩阵化, \(\mathrm{X}_{<n>}\)是 \(I_1\)乘到\(I_n \,\times\) \(I_{n+1}\)乘到\(I_N\) 的矩阵化.
- 虽然这可能是常识, 不过本书用大写的字母例如i也就是\(I\)来表示维度大小. \(I_k\)便是第k个维度的大小. 小\(i\)则被表示为具体的某个值, 所以\(i_k\)指的是第k个维度上我们固定的取了\(i_k\)这个值
-
看完基本符号后, 我认为有必要将某个概念的介绍提前, 否则将会难以理解张量网络的图示, 那就是tensor contraction (无对应翻译, 比较好的翻译可能是张量的缩约 但实际上的含义等同于矩阵中的trace 迹). 这是迹的一种张量上的一般化概念. (但不等同于张量的迹, 张量迹未来会讲, 可以看做这个contraction的特例)
0.2. Tensor Contraction 张量的缩约
-
这是一种在张量网络中最基本的操作, 可以被看做是更高维的矩阵乘法, 内积, 以及外积.
-
定义: 若对\(\underline{\mathrm{A}}\in \mathbb{R}^{I_1\times I_2\times\dots\times I_N}\), \(\underline{\mathrm{B}}\in \mathbb{R}^{J_1 \times J_2 \times \dots \times J_M}\)有\(I_n = J_m\), 则他们的contraction的结果为一个\((N+M-2)\) 阶的张量 \(\underline{\mathrm{C}} \in \mathbb{R}^{I_1 \times \dots \times I_{n-1}\times I_{n+1}\times \dots \times I_N \times J_1\times\dots\times J_{m-1}\times J_{m+1}\times \dots \times J_M}\) 且每个项的计算方式如下:
-
我们回忆矩阵中怎么计算迹的: 我们从(1,1)元素开始, 把这个索引对左右同时加一, 去寻找(2,2)元素, 重复的走到底, 然后将找到的所有元素求和, 便是迹. 在2维上, 这是个再简单不过的操作, 因为人们可以很直观的看到这是个对角线上的值求和.
-
在高维张量运算中, 这种直观的想象变为最奢侈的渴求, 但仔细观察contraction的定义便不难发现, 他只不过是和矩阵时一样, 找到了一对索引, 然后同步的从1开始增加到底, 将一路上遇到的除了这对索引外相同索引的元素加在一起, 汇总成一个新的张量. 因此, 其结果的每个元素都是顺着这种成对增加而汇总在一起的和.
-
上述运算被称为两个张量在单个相同mode下的contraction. 在多mode下, 这个定义也成立, 只要重复操作contraction即可.
-
我们赋予上述contraction操作以下符号, 下标代表了进行contraction操作的左侧张量的索引, 上标则为右侧. 上述例子可以写作:
- 在某些情况下上下标可以缩略不写. 例如, \(\underline{A}\in\mathbb{R}^{I_1 \times I_2 \times \dots \times I_N}\)和\(\underline{B}\in\mathbb{R}^{J_1 \times J_2 \times \dots \times J_M}\)并拥有共同mode\(I_N=J_1\)时, 他们的张量缩约可以写成:
- 在这种表达方式下, 矩阵的乘法也可以被写作为以下的形式(\(\underline{\times}\)表示对所有mode进行缩约(全缩约), 也就是最后会得到一个标量):
-
由于缩约计算的成本较高且目前没有像矩阵乘法那样有一个很好的并行计算方案, 我们在张量网络中通常选择估算而不是准确的计算缩约来避免算力不足.
-
此时, 扩充一些其他必要的计算符号表:
0.3. 张量网络简介
- 提前介绍了张量缩约后, 便可以此为基石构建张量网络. 首先上图. 若张量用传统3维图表示, 则其张量网络表达为:
-
上图中的每个node都代表了一个张量. 每个和node相连的线段都代表了他的一个维度, 大圈则展示了这个张量的内部结构.他并不一定是必要的. 例如, 最后一个图中圈上有3条线段,圈内有3条, 描述了左侧图中三维排布三维张量后所得到的6阶张量. 他们都可以简化成右侧的形式, 即, 直接表示该张量阶数的形式.
-
当张量用平面图表示时, 其替换法则如下. 原理相同, 不做赘述:
- 标量, 向量, 矩阵, 彼此之间的缩约运算等表示如下:
-
(a)部分理解比较直观, 唯独其对角张量的图例需要留意
-
(b)的部分则形容了矩阵向量乘法, 矩阵乘法及张量缩约, 通过对缩约的理解我们知道. 上述运算实际上都是缩约. 故都用线段互相连接来表示是合理的.
1. 张量网络的应用
1.0. 张量基本操作与概念回顾
1.0.0 multi-index 多重索引
-
对\(i_n = 1,2,\dots, I_n, \, n =1,2,\dots,N\), 且按照给定顺序排列时, 多重索引\(i = \overline{i_1i_2\dots i_N}\)定义为索引\(i_1,i_2,\dots,i_N\)各种可能的组合.
-
看似复杂, 道理很简单, 其实就是空间坐标转化为低维坐标. 试想把一个张量\(\underline{\mathrm{X}}\in\mathbb{R}^{I_1 \times I_2 \times I_3}\)向量化, 那么元素\(x_{i_1, i_2, i_3}\)对所应的向量的索引值就是, \(\overline{i_1i_2i_3}\)
-
换句话说, 计算坐标(3,2,4)的数据向量化后坐标是多少就是multi-index的主要工作
-
显然, 这会涉及到一些顺序上的问题
-
为了简单直观, 假设一个\(3\times 4\)的矩阵\(M\)
-
如果我们从最后往前数, 也就是优先以最后一个维度展开, 也就是在M中从第一行开始从左到右向下逐行扫描. 由于M一行有4个元素, 第二行的第一个的多重索引即为5. 我们称这种排序方式为大端序排序(Little-endian)
-
如果我们从前往后数, 也就是优先展开第一个维度. 由于第一个维度是行, 也就是在M中从左侧第一列开始由上到下向右逐列扫描. 我们称这种排序方式为小端序排序(Big-endien)
-
选择哪种排序都是无所谓的.
-
现状,大端序是数学意义上的正统方式,并在C语言当中被使用.
-
小端序是MATLAB和FORTRAN等语言采用的排序.
-
不同端序会导致张量的矩阵化, 向量化, Kronecker乘积等的定义发生变化. 因此这些方法必须与选择的端序保持一致.
-
-
本文将采用小端序方法.
-
-
虽然很不正式, 至少我是觉得这个符号就是个能够自己给出正确的变形后索引值的, 相当便利的一个工具. 你就当他是个黑盒子去用, 这样我们就可以不去思考到底坐标变换是如何计算的.
-
大端序算法:
- 小端序算法:
- 小端序下要注意的是, 两个向量的外积的向量化将等同于这两个向量的Kronecker乘积. 即
- 大端序下这个操作就必须反过来做, 或者选择左Kronecker乘积, 见1.0.2
1.0.1. mode-n 矩阵化 (matricization)
-
笔记系列已经介绍过这个概念. 大白话讲就是抽张量的所有mode-n的fiber出来按序组个矩阵.
-
组的顺序就按照multi-index给出即可
-
对一个固定的索引 \(n\in{1,2,\dots,N}\)来说, N阶张量\(\underline{\mathrm{X}}\in \mathbb{R}^{I_1 \times \dots \times I_N}\)的mode-n矩阵化定义为
- 其每一项的值为:
1.0.2. mode-{n}典范矩阵化 (canonical matricization)
-
这种矩阵化先选定一个固定索引\(n \in \{1,2,\dots, N\}\)
-
然后对张量\(\underline{\mathrm{X}}\in \mathbb{R}^{I_1\times\dots\times I_N}\)的典范mode-n矩阵化被定义为:
- 上个图来直观理解一下 (传统绘图法与张量网络法)
- 可以看到张量网络的表达非常简单也很有效. 3个点代表了中间还有很多按序排列的维的意思, 其余的都很直白, 不再赘述.
1.0.3. 矩阵的Kronecker, 强Kronecker 和 Khatri-Rao乘积
-
笔记系列中已经介绍过Kronecker乘积, 在此基础上我们在这引入一些变种
-
对于\(I\times J\)矩阵 \(\mathrm{A}\)和\(K\times L\)矩阵\(\mathrm{B}\)来说, 常规(右)Kronecker乘积\(A\otimes B\)与左Kronecker\(A\otimes_{L}B\)乘积均为\(IK\times JK\)的矩阵, 定义如下
-
注意, \(\mathrm{A}\otimes_L \mathrm{B} = \mathrm{B}\otimes\mathrm{A}\), 在这个小节中我们会使用左Kronecker乘积, 因为这与我们选择的小端序一致
-
令\(\mathrm{A}\in\mathbb{R}^{R_1I \times R_2J}\)和\(\mathrm{B}\in\mathbb{R}^{R_2K \times R_3L}\)为:
- 他们的强kronecker乘积写作:
-
\(\mathrm{C}\)的分块矩阵(block matrix)有 \(\mathrm{C}_{r_1,r_3} = \sum_{r_2=1}^{R_2} \mathrm{A}_{r_1,r_2} \otimes_L\) 和 \(\mathrm{B}_{r_2, r_3}\in \mathbb{R}^{IK\times JL}\), 其中 \(\mathrm{A}_{r_1,r_2}\in \mathbb{R}^{I\times J}\) 和 \(\mathrm{B}_{r_2, r_3}\in \mathbb{R}^{IK \times JL}\) 分别对应了\(\mathrm{A}\)和\(\mathrm{B}\)的分块矩阵.
-
注意的是, 这种强Kronecker乘法和标准的分块矩阵乘法类似, 只是乘法被改写为了Kronecker乘法.
-
下图为强Kronecker乘积示意图:
-
1.0.4. 张量的Kronecker乘积
-
其实张量的Kronecker乘积的概念和前者非常相似, 只是需要扩展至多个维度
-
对张量\(\underline{A}\in\mathbb{R}^{I_1 \times I_2 \times \dots \times I_N}\)和张量\(\underline{B}\in\mathbb{R}^{J_1\times J_2 \times \dots \times J_N}\)来说, 他们的Kronecker乘积\(\underline{C} = \underline{A} \otimes_L \underline{B} \in \mathbb{R}^{I_1J_1\times \dots \times I_NJ_N}\)和原来的张量同阶, 只是尺寸变大了. 其中每项\(c_{\overline{i_1j_1}, \dots, \overline{j_Nj_N}} = a_{i_1, \dots, i_N} b_{j_1,\dots, j_N}\)
-
张量网络下的Kronecker乘积如下, 很清晰, 不赘述. 不用记的很细, 随后随学随查即可.
1.0.5. 张量的mode-n Khatri-Rao乘积
- 令张量\(\underline{\mathrm{A}}\in \mathbb{R}^{I_1\times I_2 \times \dots \times I_n \times \dots \times I_N}\)和张量\(\underline{B} \in \mathbb{R}^{J_1\times J_2 \times \dots \times J_N}\), 及\(I_n = J_n\), 则
- 且他们的子张量符合
1.0.6. mode-2和mode-1 Khatri-Rao 矩阵乘积
-
矩阵乘积就是上述张量乘积的简化, 其中mode-2是逐列Kronecker乘积, mode-1为逐行.
-
如果没写mode, 我们则默认mode-2, 即标准Khatri-Rao乘积.
-
Kronecker分左右, 所以Khatri-Rao也分左右
-
我们快速的给出他们对应的定义, 以便读者查阅
-
当\(\mathrm{A} = [a_1,a_2,\dots,a_R]\in\mathbb{R}^{I\times R}\)及\(\mathrm{B}=[b_1,b_2,\dots,b_R]\in\mathbb{R}^{J\times R}\), 他们的左右mode-2 Khatri-Rao乘积为:
- 当\(\mathrm{A} = [a_1,a_2,\dots,a_R]\in\mathbb{R}^{I\times R}\)及\(\mathrm{B}=[b_1,b_2,\dots,b_R]\in\mathbb{R}^{I\times Q}\), 他们的mode-1 Khatri-Rao乘积为:
1.0.7. 张量的直和 Direct sum of tensors
- 对N阶向量\(\underline{\mathrm{A}} \in \mathbb{R}^{I_1 \times \dots \times I_N}\)和\(\underline{\mathrm{B}}\in \mathbb{R}^{J_1 \times \dots \times J_N}\)进行直和, 会得到张量\(\underline{\mathrm{C}} = \underline{\mathrm{A}}\oplus \underline{\mathrm{B}} \in \mathbb{R}^{(I_1+J_1) \times \dots \times (I_N+J_N)}\), 其每项定义为, 对所有的\(n\)来说:
- 示意图如下:
1.0.8. 张量的(mode-n)部分直和 Partial (mode-n) direct sum of tensors
-
对于张量\(\underline{\mathrm{A}}\in\mathbb{R}^{J_1 \times \dots \times J_N}\)且\(I_n = J_n\)来说, 其部分直和的结果\(\underline{\mathrm{C}} = \underline{\mathrm{A}} \oplus_{\bar{n}} \underline{\mathrm{B}}\in \mathbb{R}^{(I_1+J_1) \times \dots \times (I_{n-1}+ J_{n-1})\times I_n \times (I_{n+1} + J_{n+1})\times \dots \times (I_N+J_N)}\)满足\(\underline{\mathrm{C}}(:,\dots,:,i_n,:,\dots,:) = \underline{\mathrm{A}}(:,\dots ,:, i_n, :,\dots ,:) \oplus \underline{\mathrm{B}}(:,\dots ,:,i_n:,\dots,:)\)
-
大白话来说, 就是选中某个mode让他别管, 剩下的维度全属于A的就听A的, 剩下维度全属于B的就听B的, 其余情况就是0. 相当于这个mode上的体积没给他增加.
-
示意图如下:
1.0.9. n阶张量的串接 Concatenation of Nth-order tensors
-
串接就是通过维度相等的那部分把张量连起来, 相当于mode-n直和的时候只开了一个mode给你随便用, 用这个mode来判断到底属于A还是B. 他没有增加任何额外的数值为0的体积, 仅仅为这2个张量的体积和.
-
数学定义如下, 对张量\(\underline{\mathrm{A}} \in \mathbb{R}^{I_1\times \dots \times I_N}\)和张量\(\underline{\mathrm{B}}\in \mathbb{R}^{J_1\times \dots \times J_N}\)且\(I_m = J_m, \forall m \neq n\)来说, 其串接结果为张量\(\underline{\mathrm{C}} = \underline{\mathrm{A}}\boxplus_n \underline{\mathrm{B}} \in \mathbb{R}^{I1 \times \dots \times I_{n-1} \times (I_n+J_n) \times I_{n-1} \times \dots \times I_N}\)其中子张量满足\(\underline{\mathrm{C}} (i_1, \dots, i_{n-1}, : , i_{n+1}, \dots , i_N) = \underline{\mathrm{A}}(i_1,\dots,i_{n-1}, :, i_{n+1}, \dots, i_N) \oplus \underline{\mathrm{B}}(i_1, \dots, i_{n-1}, : , i_{n+1}, \dots, i_N)\)
-
对于两个适宜维度的张量的串联, 我们有时候使用对等的符号表示. \(\underline{\mathrm{C}} = \underline{\mathrm{A}} \boxplus_n \underline{\mathrm{B}} = \underline{\mathrm{A}}\frown_n \underline{\mathrm{B}}\).
-
串接长这样:
1.0.10. 3D 卷积 convolution
-
接触过CNN的朋友可以跳了, 基本一个意思, 整一个方块出来, 哈达玛积, 求和, 扫下一个. (虽然CNN一般情况下有一维的参数不变且这里的操作没有padding)
-
写个数学公式以便区分不同和日后查阅:
-
对\(\underline{A}\in \mathbb{R}^{I_1 \times I_2 \times I_3}\)以及\(\underline{\mathrm{B}}\in \mathbb{R}^{J_1 \times J_2 \times J_3}\), 他们的3D卷积结果为\(\underline{\mathrm{C}} = \underline{\mathrm{A}}*\underline{\mathrm{B}} \in \mathbb{R}^{(I_1+J_1-1)}\times (I_2 + J_2 -1) \times (I_3 + J_3 -1)\),其每项为\(\underline{\mathrm{C}}(k_1, k_2, k_3) = \sum_{j_1} \sum_{j_2} \sum_{j_3} \underline{\mathrm{B}}(j_1,j_2,j_3) \underline{\mathrm{A}}(k_1 - j_1, k_2-j_2, k_3 - j_3)\)
-
如图所示:
1.0.11. 部分(mode-n)卷积 Partial (mode-n) Convolution
- 为了简化说明, 试考虑2个3阶张量\(\underline{\mathrm{A}}\in\mathbb{R}^{I_1 \times I_2 \times I_3}\)和\(\underline{\mathrm{B}}\in \mathbb{R}^{J_1 \times J_2 \times J_3}\), 他们的mode-2部分卷积结果为\(\underline{\mathrm{C}} = \underline{\mathrm{A}}\boxdot_2 \underline{\mathrm{B}}\in \mathbb{R}^{I_1J_1 \times (I_2+J_2 - 1)}\times I_3J_3\) 其子张量(或向量)满足\(\underline{\mathrm{C}}(k_1,:,k_3) = \underline{\mathrm{A}}(i_1,:,i_3) * \underline{\mathrm{B}}(j_1,:,j_3) \in \mathbb{R}^{I_2+J_2-1}\)其中\(k_1 = \overline{i_1j_1}, \, k_3 = \overline{i_3j_3}\)
1.0.12. 外积(或张量积) Outer product (tensor product)
-
有读者肯定要犯迷糊, 矩阵的Kronecker乘积不就是外积的一般化? 怎么还来个外积? 其实很简单, 因为那只是矩阵的kronecker罢了. 他们虽然构建方式相似, 但张量的kronecker积是个维度和原始张量相同的张量, 每个维度上的尺寸增加了罢了.张量的外积则被定义为一个每个尺寸不变, 维度数量增加的张量. 即每项都有\(c_{i_1,\dots,i_N,j_1,\dots,j_M} = a_{i_1, \dots, i_N} b_{j_1, \dots, j_M}\)
-
对比下kronecker你就会发现, kronecker的定义是每项都有\(c_{\overline{i_1j_1},\dots,\overline{i_Nj_N}} = a_{i_1, \dots, i_N} b_{j_1, \dots, j_M}\)
-
从中还可看出, 张量的外积不要求阶相等, 而kronecker乘积则要求同为N阶.
1.0.13. Kruskal 张量, CP分解
-
读者肯定要嫌烦了, 什么年代了还cp分解, 不是笔记系列讲过了嘛. 不过张量网络下的cp分解还没讲过, 所以还是得简单介绍一下
-
首先Kruskal张量其实就是张量被分解为多个秩1张量和的形式, 也就是CP分解的结果, 所以他们俩是双胞胎.
-
数学定义: 任何张量都可以被有限个秩1张量(即向量的外积)之和来表示, 具体如下:
- 张量网络下的CP分解如下图
1.0.14. mode-n多线性乘积 mode-n multilinear product
- 这个就是之前笔记系列提过的mode-n乘积, 也叫张量乘以矩阵之乘积(tensor-times-matrix product) 因此也被简称为TTM.
- 令张量\(\underline{\mathrm{A}}\in \mathbb{R}^{I_1 \times \dots \times I_N}\), 以及矩阵\(\mathrm{B}\in\mathbb{R}^{J\times I_n}\), 他们的TTM结果为
- 其每项为:
-
等效的矩阵形式为\(\mathrm{C}_{(c)} = \mathrm{B}\mathrm{A}_{(n)}\)使得我们可以很方便的利用高速矩阵乘法等手段加速大规模的张量乘法.
-
传统示意图和张量网络示意图如下:
1.0.15. 全线性(Tucker)乘积
- 对张量\(\underline{\mathrm{G}}\in\mathbb{R}^{R_1 \times R_2 \times \dots \times R_N}\)来说, 全线性乘积, 也叫Tucker乘积, 被定义为该张量与\(N\)个矩阵进行从1到N不同mode的连乘. 其结果可写作:
1.0.16. 张量与向量的多线性乘积 Multilinear product of a tensor and a vector (TTV).
-
和笔记系列一样, 算法和上面的TTM差不多, 就是会移除相乘的那个维度, 因为大小最多也就1, 没有意义了.
-
其余的请自行参照笔记系列
1.0.17. 张量的迹 Tensor trace
- 回想一下一般的矩阵咋算迹的: 沿着矩阵的2个维度同步累进对经过的部分求和就是迹, 那张量也做类似的操作不就行了? 于是利用我们前面介绍的缩约概念, 我们定义张量的自我缩约就是他的迹.
- 对于一个张量\(\underline{\mathrm{A}}\in \mathbb{R}^{R\times I \times R}\)来说, 他有2个尺寸为\(R\)的内索引(inner indices), 也就是mode1和mode3, 以及一个尺寸为\(I\)的公开mode(open mode). 我们定义它的迹为:
- 其每个成分都可以写作他的侧切片(lateral slice) \(\mathrm{A}_i \in \mathbb{R\times R} \quad (i=1,2,\dots,I)\) ,换句话说, \(\mathrm{a}\)可以改写为:
-
张量网络示意图如下:
-
张量也可以拥有多个内索引来计算迹, 如果张量\(\underline{\mathrm{A}}\in\mathbb{R}^{R \times I \times S \times S \times I \times R}\)有两对外索引, 分别为mode1和6, 和mode3和4. 那么他的迹为一个$I \times I $的矩阵:
下期内容: 1.1 基础张量网络的图形表达 Graphical Representation of Fundamental Tensor Networks