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