Seachaos 拍攝於日本

手刻 Deep Learning — 第零章 — 矩陣入門 (與簡單 ML 神經元 概念介紹 )

矩陣的概念常常讓人霧煞煞,本文會做矩陣的白話文基本概念與教學,當我們需要很多資料一起運算的時候,矩陣就是很好的幫手,本文也介紹一下簡單的 Neuron 概念

--

前言

(本文系列接續上一篇 微分觀念入門
如果直接講矩陣,一定很無聊,所以本文會分成上下兩部分

第一我們先說為什麼矩陣在 Deep Learning 很重要,他是怎麼來的,還有相關概念

第二再來說明矩陣是如何計算,並且有些簡單的影片與範例,包含 Dot Product 視覺化解說,幫助大家理解

矩陣與 Deep Learning 的關係

相信對 Deep Learning / Machine Learning 有興趣的人應該很常聽到,Neural Network 是模仿神經元的運作方式,而這個過程數學化後會需要大量的計算,我們來看看圖片:

生物神經元轉成數學化的概念

如上圖,左邊是概念化自然界中的神經元(概念),我們再把神經元抽象成符合數學公式 (右邊)

上圖的左右是相等的概念,所以我用相同顏色將他們左右對應起來

綠色:接收資訊,又稱 輸入,數學上常常標記為 X ,然後因為可能很多個輸入所以又有 X1, X2, X3 ….

藍色:有人稱為 權重 ,其實就是敏感度,因為每個 X 所以又分別對應 W1, W2, W3 …

棕色:加總,把所有接腳資訊整合

黃色:又稱閥值,決定要不要反應訊號(輸出 / 數值)

今天主題,我們要講的矩陣主要就是 綠色 藍色 部分
( 我們暫且稱它為 腳腳 ,雖然有人稱 樹突 ,但本文就是要叫他 腳腳 )

另外神經元為什麼有用,這說來話長,概念可以看看以下影片
(影片中的五顏六色表示不同的 訊號/數據 輸入 )

我們日後文章會慢慢說明如何用數學來表達神經元…

回到主題,不難發現神經元有很多的 “腳腳”(手手?) ,這些是用來接受 訊號 的,然後每個 腳腳 都有不同的敏感度 (搔癢!?)

  • 訊號:在 Machine Learning / Deep Learning 中,訊號就是輸入的數值,數學上我們常常表示 X
  • 敏感度: 訊號經過這個 腳腳 會被放大或是減弱,數學上我們標示為 W

所以我們可以看做每個 腳腳 都是 訊號 敏感度 的組合,就是將他們相乘(訊號 *敏感度 ),數學上我們表示 X * W

也就是說一大堆的 腳腳 在一個神經元上面,就會有一大堆的 X * W,例如:
(我們這邊 腳腳 用 Y 表達 )

可以看到這是一堆的相乘計算,這剛好就是數學上矩陣計算,所以我們才會看到為什麼 Deep Learning 很需要矩陣計算

矩陣與電腦的關係

電腦架構(計算機架構)很早就有專門運算矩陣的指令,其實不止 GPU ,許多 CPU 也有專門的計算單元
(https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms)
不過我們今天重點不在這邊,我們只是要說電腦計算矩陣的速度會比我們寫程式用迴圈快 (另外 本人文章也提過 ),只要善用矩陣,就可以事倍功半

矩陣計算

numpy 與 矩陣計算 概念

如果看不懂上圖,不要理上圖,繼續往下看,如果你看得懂,表示你已經知道矩陣計算了 XD

矩陣基本觀念

我們假設,今天我們開了一個冰店,然後我們有賣綜合冰淇淋
其中 成份夏天 的水果時價如下:

  • 蘋果 3 顆,成本 2 元
  • 橘子 5 顆,成本 3 元
  • 香蕉 6 顆,成本 4 元

這樣綜合冰淇淋的成本會是多少 ?

最直接的計算就是如上圖左邊,傳統數學去相乘再相加,得到成本 45
右邊的是 Python 使用 numpy 計算方式
右上 :是 a * b 乘法運算,就單純的每個元素相乘(沒有得到我們要的答案)
右下 :是 a @ b 運算(dot product, 矩陣運算,這是 numpy 支援的 )
本文我們之後都會用 @ 運算

回到我們的冰店問題,如果今天水果在 冬天 價格變了 :

  • 蘋果 成本 6 元
  • 橘子 成本 7元
  • 香蕉 成本 8元

我們把資訊整合一下

  • 蘋果 成本「夏天 2 元」「冬天 6 元」
  • 橘子 成本「夏天 3 元」「冬天 7 元」
  • 香蕉 成本「夏天 4 元」「冬天 8 元」

然後我們想要知道夏天與冬天的價格怎麼辦?
當然可以慢慢去算… 不過你懂矩陣與 numpy 的話,有更好的方法

a = np.array([3,5,6])   # <-- 成分表 ---
b = np.array([ # <-- 價格表 ---
[2, 6], # 蘋果: [夏天, 冬天]
[3, 7], # 橘子: [夏天, 冬天]
[4, 8], # 香蕉: [夏天, 冬天]
])
print(a @ b)

上面程式碼看起來不是很直觀,可以看下圖

這邊有影片版本

從上面的影片可以發現,矩陣的計算非常注重長與寬 ( shape )
這是有原因的, a (綠色矩陣) 與 b (藍色矩陣 ) 的項目要互相對應

再回來看看我們的冰店,假設今天多了新的品項,所有品項成分如下

  • 冰淇淋:蘋果 3 顆,橘子5 顆,香蕉 6根
  • 餅乾 : 蘋果 2 顆,橘子2 顆,香蕉 2 根
  • 果汁 : 蘋果 5顆,橘子 4 顆,香蕉 3根

我們想要知道 冬天,夏天 所有品項的成本呢?
視覺化一下

用 Python 與 Numpy 程式碼可以計算 :

a = np.array([
[3,5,6], # 冰淇淋: [蘋果, 橘子, 香蕉]
[2,2,2], # 餅乾: [蘋果, 橘子, 香蕉]
[5,4,3], # 果汁: [蘋果, 橘子, 香蕉]
])
b = np.array([
[2, 6], # 蘋果: [夏天, 冬天]
[3, 7], # 橘子: [夏天, 冬天]
[4, 8], # 香蕉: [夏天, 冬天]
])
print(a @ b)

得到

[[ 45 101]    # 冰淇淋成本: [夏天, 冬天]
[ 18 42] # 餅乾成本: [夏天, 冬天]
[ 34 82]] # 果汁成本: [夏天, 冬天]

這邊要再次強調,矩陣的計算非常注重長與寬 ( shape )
可以用 numpy.shape 來觀察

print(a.shape)   # (3, 3)
print(b.shape) # (3, 2)

我們畫一下重點

print(a.shape)   # (3, 要相同 )
print(b.shape) # (要相同, 2)

再解釋一下

print(a.shape)   # (品項, 原料數量 )
print(b.shape) # (原料價格, 季節)

原料 數量 x 價格 才會得到 成本
這就是為什麼矩陣相乘很注重長寬問題

回到 Deep Learning

從上面的範例可以看到,矩陣就是大量的乘法與加法組合
這也就是為什麼 Machine Learning 會要了解矩陣的原因,不管是 線性回歸、卷積網路、模仿神經元… 都會需要大量的乘法與加法計算

結語

今天介紹了簡單的神經元與矩陣概念,實際上矩陣是電腦圖學中也很重要的應用,這也就是為什麼使用 GPU 運算會有巨大的幫助,但是礙於篇幅這邊就不多做介紹了

要知道矩陣的計算概念,需要大量練習去熟悉,不是本文三言兩語就可以道盡的,其中 transpose ,reshape 也是 Machine Learning 中很常用到的概念,如果各位有空可以多多研究 線性代數

希望本篇文章有幫助到不了解矩陣原理的人

--

--