何為張量(Tensor)?三分鐘圖解類神經網路基本資料結構

工欲善其事,必先利其器,若想做好人工智慧的研究,就必須對其資料結構的組成有一定的了解。本文會以圖文、程式參雜的方式講解張量的架構及其資料儲存的方式。

Photo by Hunter Harritt on Unsplash

19世紀末 G.Ricci 提出了張量的概念,其對幫助現代數學、物理奠定了非常好的基礎,很多以前看似無法完成的成就,就是靠這概念加以推演而成功的。而今天的主題就是基於人工智慧的資料架構所下去延伸的。

筆者的論文主要是做深度學習的研究,所以本篇文章可以算是個人的學習記錄。在我研究的過程中發現張量(Tensor)一直都是初學者無法跨過的坎,所以趁寫論文的空檔,我就將這篇文章產出,希望對不知道張量是什麼的讀者能有很大的幫助。

註:本文是個人對張量的主觀理解,若有錯誤的地方也歡迎指正。以下解析不會以數學改念為基礎,主要會著重在理解架構為主。

以下正文開始~

What’s a Tensor

對於想進入到人工智慧這塊領域的朋友,就算沒聽過張量(Tensor)應該也聽過 TensorFlow 吧?沒錯,目前最常用到的機器學習框架就是以此命名的,Keras 大神 François Chollet 也提到 “目前已知所有機器學習的系統都使用張量作為其基本的資料結構”,可見張量在機器學習的重要性是如此的大。

TensorFlow Logo

張量實際上看似很複雜,但其實它就和 list 一樣,也是儲存資料的容器,數學上可理解為多維數組(Multidimensional Array)

但要注意的是,不同階的張量所呈現的資料型態也都不一樣,根據維基百科的解析,可以知道0階張量為純量、1階張量為向量、2階張量為矩陣、3階張量則是由多個矩陣所組成的,其實際上這些資料都是一層一層疊上去的,其較直觀的理解如下:

Difference between a scalar, a vector, a matrix and a tensor | 來源

張量深究下去就會是數學、物理的領域,而本文只會聚焦在機器學習的基礎解說。而以下我會從0D張量開始依序介紹到3D張量,不同階段的張量也會以nidm語法呈現其階數。

0D 張量

0D 張量又稱純量(scalar),其資料內只會包含一個數值。通過下圖建立一但一數值的 array,並透過 nidm 語法查看階數。結果為0就是一0階張量。

因為階數為0的關係,所以呼叫shape時,會呈現 ()

1D 張量

1D張量即為向量(vector),資料內容是由一組數值排列而組成的陣列。藉由生成一包含4個元素的 array,查看其階數後,得到的結果為 1。

呼叫shape的結果會顯示為(4, ),內容指得的是4個元素。

2D 張量

2D張量就是矩陣(matrix),其是由數個向量所組成的陣列。透過下圖可知矩陣有2個軸,分別是 rows 和 columns。

呼叫shape的結果為 (3, 4),直觀為 (samples, feature), 代表其中有3個樣本,每個樣本中均有4個元素。

2D張量圖例

實際舉例,模擬一人口資料集,其中包含4種特徵,依序是性別、年齡、身高、體重,而該資料一共採集了100個人作為樣本。

向量資料(2D張量)示意圖

3D 張量、4D張量

若是將多個矩陣包裝在一新陣列中,就會得到一3D張量,如下圖。該資料內容就是由3個3X4的矩陣所組成的。

大多數3D張量都用來表示時間序列資料,下面案例呼叫shape後的結果為 (3, 3, 4),直觀為 (samples, timesteps, feature)

3D張量圖例

實際舉例,現有一加熱爐內溫度變化的資料,每分鐘須記錄三項資料,分別為最高溫、平均溫、最低溫,且一天共記錄99次(分鐘),並整整紀錄了一年365天,其資料實際架構如下:

時間序列資料(3D張量)示意圖

基本上將數個3D張量放到一陣列中就是所謂的4D張量,通常代表影像的資料,其shape可直觀理解為 (samples, height, width, channels)

而依次類推就可以得到5D張量、6D張量等,故筆者就用下圖簡單介紹,這張圖是我網路上看到的,解釋的非常貼切,因原版解析度太低,故我又重新畫了一次。

詳解 Tensor
  • 注意:Deep learning 深度學習必讀:Keras 大神帶你用 Python 實作一書的作者提到區分 “向量”“張量” 的重點:一個向量若有3個元素,會稱之為3維向量,而不是3D張量。千萬不要將兩者搞混。一3D向量只有一個軸,軸上有3個維度,而一3D張量有3個軸。維度(dimensionality)是指特定軸上的元素數量或張量中的軸數量,所以容易造成混淆。若是怕搞混,可以將後者說成3階張量,因為張量的階就是軸的數量。

結語

本篇大概算是筆者開啟機器學習文章撰寫的第一篇吧,先從基礎開始打起,日後也會補上機器學習、深度學習等文章,謝謝大家。

References

  1. Deep learning 深度學習必讀:Keras 大神帶你用 Python 實作
  2. https://hadrienj.github.io/posts/Deep-Learning-Book-Series-2.1-Scalars-Vectors-Matrices-and-Tensors/
  3. https://zh.wikipedia.org/wiki/%E5%BC%B5%E9%87%8F
  4. https://zhuanlan.zhihu.com/p/48982978

--

--