矩陣就是表格。
在高中對矩陣的數學意義有一點基本認識的我,第一次聽到高中數學老師這樣介紹矩陣的時候心中實在有點生氣,體、向量空間、基底、線性變換全部都沒說,就這樣一句介紹矩陣?
後來當然課綱該教的內容有教完,只不過沒有想到兩三年後成為資工小白,在第一次要理解張量(tensor)的場合,看得懂定義和符號但看不懂為什麼那樣定義和那種表示法有什麼用,於是最後只能先接受在機器學習領域常看到、也和高中數學老師不謀而合的說法:
張量就是有個格子的多維數字陣列(可以像矩陣一樣乘他ㄛ)。
標題說的東西這樣就算說完了,畢竟在 C 裡宣告一個 float A[2][3][4][5][6];
之後要對他做什麼都可以,跟數學無關的也行。但如果對體、向量空間、基底、線性變換有一點認識的話,應該就可以看我後來覺得怎麼認識 tensor 比較簡單的。
多線性變換 和 multilinear form
張量是一種多線性變換(multilinear map),算是線性變換的擴充。最基本的特例除了 linear transformation 之外就是雙線性變換(bilinear map):給定一個 field 和上的向量空間,函數是雙線性變換的意思是對中的向量「分別」是線性的,也就是:
第一眼看到會和的線性變換搞混,他們的差別就在「分別」線性的性質,假設是線性變換而是雙線性變換的話,將中的元素乘以一個常數代入中就能觀察到:
當而且就是原本的 field 的時候,這樣的 bilinear map 就會稱為 bilinear form
以此類推,對多個向量空間映射到一個向量空間的函數如果對每個變數都是單獨線性的,我們便稱之為多線性變換,又定義域如果又是同一個向量空間的笛卡爾積且對應域也是原本的 field ,也就是的話,這個多線性變換就會稱為 multilinear form ,也會稱為一個-tensor ,這裡就先把稱作精簡版的「階」(order)。終於在這裡看到名字有 tensor 的東西了,雖然不太準確,但下面的說法就比較感受得到張量和數學的關聯了:
張量就是將 field 上的向量空間中的多個變數以分別線性的方式映射到的函數。
為什麼是挑映射到的函數?
剛開始學線性代數應該會很常看到 linear operator 的定義是,又一開始看到張量的介紹的時候會看到「純量可以是一種張量、向量是張量、矩陣也是張量」,又看到 linear operator 給定基底後可以表示為矩陣(而且是方陣),所以看到張量的定義明明是長得不一樣就會感到疑惑。透過觀察讓純量、向量和矩陣符合張量定義的過程和構造新張量的方法,應該可以解答標題和這個段落產生的疑惑。
Scalar as tensor
Field 本身可以作為一個向量空間,對我們可以定義,按照上面的定義,我們好像可以將用定義的視為一個-tensor 了?但用同樣的方法我們也可以將這樣的函數當成-tensor ,也就是純量 是沒辦法透過上面的定義 well defined 的,為了世界的和平張量運算規則的方便性,我們把純量就這樣定義成 -tensor 。
Column vector as tensor
對 over 的 n 維向量空間(好的先當作有限維),取標準基底和一個由 field 的元素組成的行(column)向量。我們可以定義 為 ,這樣的話按照定義我們就可以說是一個 -tensor 。
Square matrix as tensor
用上面一段的向量空間和標準基底,可以取一個方陣,則對於中同樣基底的行向量可以將定義為,這樣就能將兩個向量變為實數,所以也符合了-tensor 的定義。我們也能從這裡看到把矩陣當作張量來用和當作線性變換來用的用法是有一點不一樣的,算是解答了本節一開始的疑惑。
我們接著就能注意到,把上一段的的算出來變成行向量之後其實也等於上上一段的,也就是-tensor代入其中一個中的變數之後會變成-tensor 。這個概念其實就像 functional programming 的 currying:多個變數的函數可以帶入其中一個變數成為另一個單獨的函數,這種概念下的其實就可以寫成,要產生函數值就把變數帶入其中的點記號。
Tensors produced by product
取一個-tensor 和一個-tensor ,因為兩者都是映射到的函數,所以可以利用上的乘法定義下面新的函數:
因為對各個變數是分別線性的,可以很容易驗證對各個變數也都是分別線性的,所以我們就這樣構造出了一個-tensor ,並且將這個符號的運算稱作 tensor product。
阿所以為什麼啊
說了這麽多,「為什麼這樣定義XXX」這類問題的回答通常就是「好用」,但上面的例子不需要實際上理論的應用,就大概展示到了把張量定義為映射到的函數有下面這些好處:
- 不依賴基底的選擇:也就是依照張量定義,對張量輸入多個向量,只要向量一樣,不論張量和向量本身的數值表示法選取什麼基底,產生的純量依然是相同的。
- 可以將純量、向量、和矩陣都視為張量的表示法:如果定義張量的方式是映射到或的函數,就會讓純量或向量變成特例,而且高階張量的階也會變得不太直覺(例如三維陣列實際上代表二階張量之類的)。
- 可以用低階張量構造高階張量:像 2. 一樣,如果定義張量的方式不是映射到,因為向量和矩陣要不沒辦法任意做乘法,要不就是通常乘法不可交換,我們就比較不容易用的乘法簡單的 well-define 新的高階張量。
接下來要說一件殘忍的事實:「上面對張量的定義其實不完整」,但因為篇幅感覺爆量了又感覺後面不知道怎麼自圓其說,就先發出來,剩下的以後再說。
References
Linear Algebra 4e, Stephen H. Friedberg
An Introduction to Manifolds, Loring Tu
Lorentz Transformation - Wikipedia
How is a (0,0) rank tensor a number? - Mathematics Stack Exchange