狹義的解釋深度學習,便是指
多層的類神經網路。迄今,類神經網路的架構愈來愈複雜,包括在傳統一層一層的架構上,添加一到多個模組。這個模組可以單純如多個不同大小的平行卷積層或複雜如小型的
Attention 網路。
類神經網路的表現,仰賴著一個適宜的架構和一個最佳化的演算法。在這一系列介紹類神經網路的文章中,我們會先從架構切入,在未來的文章中,再對演算法深入介紹。
感知器(Perceptron)
就如同所有自然生物的起源,都可追溯源頭至單細胞生物。現在最火熱的機械學習演算法,以類神經為主的深度學習,也從一個單一的神經元開始。
在 1943年 McCulloch 和 Pitts 仿造人類的神經細胞結構,設計了第一個以軟體實現的人工神經元。此時的神經元就如同數位邏輯電路裡的邏輯閘一樣, 所有的輸入都依照神經元的計算邏輯,輸出相對應的計算結果。
只不過這個輸出結果,比較近似於房間使用的開關:若計算的結果超過某一個給定值後,神經元的輸出就會等於1(on 的狀態),若沒有超過這個給定值,則為零(off 的狀態)。
左圖影像來源:https://hackernoon.com/jump-start-to-artificial-intelligence-f6eb30d624ec
這個神經元並沒有任何學習的方法,直到 1950 年, Rosenblatt 才提出了一個名為感知器(Perceptron)的學習演算法,將神經元帶入了人工智慧的領域中,也造就今日深度學習的廣泛應用。
在這篇的源起篇,我們就來看看這個只能輸出 0 和 1 的神經元,在結合了感知器的學習方法後,如何進行模式辨認並完成分類工作,以及它如何啟發之後的類神經網路(Neural Network)方法和它的遠房兄弟 Support Vector Machine (SVM)。
一個簡單的 Perceptron 網路的架構如下:
左圖:一個二維二元 Perceptron 分類器。右圖:一個多維(R)輸入的 Perception 分類器。圖中使用 hardlim 當作 activation function,該 function 即是一個 step function,輸入值在給定 threshold 值以上,輸出 1。
這個架構可以看成一個只擁有一個輸出神經元,且不含有隱藏層的 Feed Forward 類神經網路。Perceptron 和僅有輸入和輸出層的 Feed Forward 類神經網路結構相比較:除了 activation function 換成了擁有 hard threshold ,只能輸出 0 和 1,或 -1 和 1 的函式外,並沒有太大的差異。
坦白而言,一個感知器網路,其實只是一個線性的分類器,比起深度類神經網路,如多個隱藏層的 Feed Forward 類神經網路,感知器所能表示的函式範圍卻遠遠少於 Feed Forward 深度類神經網路。就能表示各種複雜函式的能力,感知器簡直是差多了!
雖然架構簡單,但感知器,卻蘊含了兩個類神經重要的觀念,一是非線性的 activation function,以及透過糾錯學習的方式,習得最佳分類直線。感知器學習演算法會藉著迭代的方式,逐一改變線性方程式的權重值,最終(希望)找到能夠正確分類所有訓練例子的線性函式,此函式又被稱為 decision line 或 decision plane。
接下來就是感知學習器演算法的圖解步驟解說,為了方便視覺呈現,這裡用二維的例子來做說明:
上圖中,黑點的分類標籤被標註為 1,而白點的分類標籤被標註為 -1[1]。藍色實線為該步驟所計算得到的 decision line 和它的法線(藍色箭頭)。
在這個簡單的例子,我們不考慮 bias。當 bias 為零, decision line 就必須通過原點。一個能夠正確分類這三點,且通過原點的 decision line,其法線,或與 decision line 正交的向量,w,必須要和黑點的座標向量同向,或內積為正(夾角小於 90度),和白點的座標向量反向,或內積為負(夾角大於 90 度)。
現將該演算法的步驟簡述如下:
步驟 1. 任意初始化 decision line 的法線向量(normal vector)。(對應上圖為 Step 1 )
步驟 2. 開始對所有的訓練例子,以下面的原則,逐一比較 decision line 的輸出後,更新 decision line 的正交向量:
步驟 2a. 若訓練例子為黑點,且分類錯誤,則將 decision line 的正交向量往靠近分類錯誤的訓練例子的方向移動。在此是利用向量加法的方式移往黑點所在方向(對應上圖為 Step 2)。
步驟 2b. 若訓練例子為白點,且分類錯誤,則將 decision line 的正交向量往遠離分類錯誤的訓練例子的方向移動。在此是利用向量減法的方式遠離白點所在方向(對應上圖為 Step 3-4)。
步驟 2c. 若沒有分類錯誤,則 decision line 的正交向量維持不動。
步驟 3. 重複步驟二,直到所有的訓練實例都已經分類正確,或超過最大迭代數目。
這個簡單的學習方法,有一個致命的缺點:由 Minsky 指出,那就是感知器無法學習過於線性不可分的例子,如兩種類別呈 XOR 的分佈。下圖,就是根據線性可分和不可分(XOR)所構建的兩個例子。
左上圖為線性可分的訓練實例(紅點為分類標註為 1,藍點為分類標註為 -1)。右上圖為線性不可分的訓練實例。下圖則利用 Least-square 方法,計算出的 decision line 的正交向量(綠實線)和 decision line (黑實線)
XOR (上圖右)的例子分佈像棋盤格,上圖下方則是用迴歸分析或
least square 方法得到的
decision line(黑線)和其法線(綠色箭頭)。而下圖,則是使用
scikit-learn 的 Perceptron 來進行分類。從圖中可以看到,只能做線性分類的
Perceptron 網路,並沒有足夠的模型能力來對非線性分佈的實例進行分類。
使用 Scikit-learn 的 Perceptron 對同樣的例子做分類。
多層感知分類器
一個最簡單的類神經網路,可被稱為多層感知分類器(Multiple Layer Perceptron ),又多以簡寫 MLP 出現在文件。名稱是對應的一開始所介紹的感知器(Perceptron)而取的名字,但實際上,兩者除了使用具有激發功能(activation function)的神經元外,並沒有太大的關係。
類神經網路的架構中,多層感知分類器,是屬於 Feed Forward 網路的一種。 Feed Forward 類神經網路,每一層中包含許多各自獨立的神經元,這些位於同一層的神經元彼此之間並沒有任何連結,但對位於上下兩層的每一個神經元,都有相對應的連結。也就是,下層的每一個神經元,對上層的每一個神經元,都會學習到一個權重值,來表達上下兩層神經元連結的強度。這個連結的強度,對於分類任務而言,可能是屬於某一類別的獨有特徵。
一個僅有兩層隱藏層的多重感知器,或 Feed Foward 類神經網路。
因為 Feedforward 類神經網路中,上下兩層之間中的神經元具有全連結性質,所以這樣的網路有經常被稱為 Fully-Connected Layer,又因為像三明治被輸入和輸出層夾在中間,所以又可稱為隱藏層(Hidden Layer);相對於,影像識別中經常使用的卷積層(Convolution Layer),Feedforward Layer 中的連結分佈更為緊密,所以又常被稱為 Dense layer。關於卷積類神經網路和 Feedforward 類神經網路的差別,會在往後的文章中更深入的討論。
相較感知器而言,能夠在輸入和輸出層,堆積多層 Feedforward Layer 的類神經網路,藉由多層的非線性 activation function 疊加,並透過學習而得到一個非線性的 decision boundary,具有能力去表示各種複雜函示,亦能將幾乎所有訓練例子正確地分類。知道何為多重感知器(MLP)我們現在可以應用一個真正的類神經網路來解決線性不可分的 XOR 問題了。
下圖擷取自由 Ian Goodfellow, Yoshua Bengio 和 Aaron Courville 共同撰寫的深度學習的教科書。在第六章,Deep Feedforward Networks 特別以一個簡單的實例表示一個簡單的類神經網路如何解決 XOR 問題。
如下圖左下所示,現在正向的訓練例子被分配到 1 的值,而 0 的值則分配給負向的訓練例子。相較於,之前從 XOR 的分佈取樣,圖中 Original x space 只有四個例子,例子位於第一,三象限被標註為 0,而在二,四象限則為 1 (亦可對應 XOR 的輸出來看)。類神經網路的結構,則如下圖左上所示,只具有一層 hidden layer,該層只具有兩個 hidden units: h1 和 h2(下圖右上則是左上網路架構的簡圖)。
該類神經網路的 hidden layer,可將位在斜對角,具同分類標籤的子區域內的訓練實例,映射到新的特徵維度中。在這個新的特徵維度中,分類標籤為 1 的點,會映射到相同的座標位置(見下圖右下,Learned h space)。也就是說,hidden layer 藉由多重映射非線性函式,學到新的特徵向量,此新組合的特徵向量足以代表該分類的獨特之處,而能分辨其他類別。
建構一個僅有一層的 Feed foward 類神經網路,在 hidden layer 使用兩個神經元(圖上方),便可將原來線性不可分的 XOR 訓練例子(圖左下方),映射到新的特徵空間,而成為可分(圖右下方)。
藉由學習分類函式本身,而達到精準分類的結果,是類神經網路的中心思想。在往後的文章,我們會看到,如何加深網路的層級以期達到 decision function 本身複雜度,以致於能學習更複雜,更高維的訓練例子分佈。
感知器學習演算法,雖然是個古老又簡單的方法,但在大多數的實際應用上,仍舊有它的一席之地。由於該演算法的簡易快速,在超級巨量資料的學習,有時還是會應用上簡單又快速的感知器來做 Online 的學習(一次餵進一個訓練資料),而類神經網路就像隻慢工出細活的烏龜般,軟體業推崇的 fast fail 在這方面目前就完全使不上力了。
不過,談到這裏,讓我們先稍微提及類神經網路的遠親,SVM,其理論同樣也是架構在 Perceptron 線性分類器之上發展出來,但以不同的方法來解決線性不可分的問題?
支持向量機器(Support Vector Machine)
SVM 是一個線性方法,但會透過一種稱為 Kernel 的方法,將訓練例子映射到新的特徵向量空間,在此空間,維度會增加而使所有的訓練例子皆是可分的。
使用不同 Kernel (左為最高次為三次的多項式函數,右則為 radial kernel)的SVM產生的 decision boundary
同樣 XOR 的訓練分佈中,SVM 會藉由加入描述 hyperbolic 函式的新變數,建構成較高維的特徵空間,而變得可分。SVM 自己也是一門廣大精深的學問,已經超出了此系列的範圍,有興趣的人可以找相關領域的專家或書籍來學習。
談完了類神經網路的源起,我們還得提到另外一個線性模型分類器,才能真正的開始進入深度學習的領域中 。這個線性模型分類器,就是邏輯迴歸(Logistic Regression)。
邏輯迴歸分類器(Logistic Regression)
分類器和迴歸的最大不同處,在於迴歸的 response variable,或 y 值若給定線性方程式為,y = Wx,為沒有限制的實數值。所以在迴歸中,誤差表示可以考慮 mean squared error,因為希望結果能離真實的實數值愈接近愈好,無論是多出或少於真實的值(因此取平方)。但,若是要訓練一個分類器,就必須考慮此時的 response variable 是離散的值,線性迴歸的 mean squared error 損失,因為分類標籤的離散性和使用 log 函式的緣故就不適用了,因為我們現在在乎的是預測的不確定性,並不在意離真正的值有多近。
邏輯迴歸(Logistic Regression) 也是一個線性模型,但這個線性的關係是建立在透過 log 函式對預測結果做轉換上。在這個線性關係上,原本應該是連續數值的 response variable 則為兩分類預測機率的 log-odds ratio(log-odds ratio 可看做預測為 1 對預測為 0 的比例,再取 log 值)。可看到下圖右下角方程式,線性迴歸的 y’,則為兩分類預測機率的比,也是線性迴歸中的輸出(方程式右方)。而原來線性迴歸的輸出 y (下圖右上角方程式),則透過非線性轉換輸入,z,得到近於機率的輸出。
相較於線性迴歸上使用的 mean squared error 的損失函式,cross-entropy 是更佳的選擇。因為這種近似於線性回歸的特性,對 mean squared error 損失函式做最佳化的演算法都能使用在 Logistic Regression 上。
從另外一個觀點來看,Logistic Regression 可以看做一個沒有 hidden layer 的類神經網路,其輸出則是藉由非線性的 sigmoid function 來限制在 0 與 1 之間,以符合機率值的數值域。在過去類神經網路,廣泛使用 sigmoid function 作為 activation function,在那個架構深度達到兩三層就能算是深度網路的時代,都會遭遇到所謂 gradient vanishing 或 gradient explosion 問題。
這是因為 sigmoid function 本身的特性,會將輸入位於兩端的極值,壓縮到相當相當靠近於 0 或 1 的值,而造成沒有 gradient 或極小 gradient 的結果。這類具有極限值的函式特性,在英文文獻中通常被稱為 “saturate”,中文則用“飽和”這個翻譯,可捕捉到因為達到極限值而無法繼續訓練的性質。
左方是一個 sigmoid function,右方則是 sigmoid function 的數學式子。可以看到,sigmoid function 在靠近 0 的地方(輸出為 0.5)近似於線性,然而在兩側,遠離 0 的數值,輸出皆為平緩的直線,並近似於 0 或 1。圖右方上方數學式是 sigmoid function 的方程式,而下方的方程式則是以 log odds-ratio 的方式來建立與原輸入建立起線性關係。
那些年關於類神經網路和支持向量的小事:
在這篇長文的最後,就來輕鬆一下,談一個小趣聞。這在卷積網路的主要作者之一,在 2017 年來台灣演講趣聞的當事人,Yann LeCun,演講中亦有提及此事。
事情是這樣的,當時和 LeCun 同在 AT&T 的貝爾實驗室工作的三人,另外兩位是專精統計學且孕育 SVM 理論的 Vladmir Vapnik,和當時為實驗室的主管的 Larry Jackel,分別在 1995 年在 LeCun 的見證下兩個賭,這兩個賭注內容和類神經網路的未來預測有關,賭注都是一個昂貴的晚餐。
第一個是 Jackel 向 Vapnik 打賭認為到了 2000 年,大型的類神經網路將會被應用在巨量資料酷的。然而類神經的發展要比 Jackel 所想的晚了兩年。第二個賭注則是由 Vapnik 向 Jackel 打賭,在 2005 完全無人使用類神經網路作為學習演算法。
LeCun 保存當年兩位大師的打賭的單據正本(影像來源:延伸閱讀 3)
實際上,類神經網路其實有一陣子相當沒落,那些執意進行類神經網路相關研究的學者,包括現在被人所廣知的 Geoffrey Hinton,都被主流的研究學者稱呼為傻瓜。
但當時堅持研究類神經網路,包括之前提到的
Geoffrey Hinton,
Yann LeCun 和
Yoshua Bengio 都
得到相當於計算機科學的諾貝爾獎,圖靈獎的殊榮了!那麼,當時主流的研究都在做些什麼呢?原來就是
SVM 最為熱門。反觀今日,因為大數據興起,造成類神經網路的熱門,但也沒有造成
SVM 式微。只能說「天下沒有免費的午餐」[3] 吧!
當然這對吃了一頓完全免費晚餐,賭注的見證人例外。
註釋:
[1] 在這裡分類的標籤給 1 和 -1,是因為該點位置與
decision line 的法線
(normal vector)的內積值為正或負相關。若該點與法線同方向,則該點語法線的內積為正,反之亦然。通常,在計算
Perceptron 的點內積時,不考慮內積的大小,只知正負號即可。要注意的是,當點在
decision line 上時,與法線的內積為零,因為呈 90 度。
[2] 讀者若有興趣,可以前往
Tensorflow Playground ,該網站提供了建構一到多層的
Feedforward layer,除此之外還可以調整許多參數,包括輸入資料集(包括
XOR)等,有興趣的讀者可以前往把玩一番,可助於了解訓練一個類神經網路是個怎麼樣的經驗。
[3]
No Free Lunch Theorem:這個「沒有免費的午餐定理」講的是一個以證明數學定理,說明一個通用的機械學習演算法是不存在的。詳細的內容可以閱讀
《機器學習裡不存在的免費午餐:NO FREE LUNCH THEOREM》這篇文章。
參考資料:
- Neural Network Design:Perceptron 的圖解都來自於本書第四章。
- Deep Learning :MLP 解 XOR 問題的圖解來自於一書。第六章 Fig 6-1 和 Fig 6.2
- Introduction to Statistical Learning: SVM 的圖出自於第九章,Support Vector Machines。
延伸閱讀:
- McCulloch-Pitts Neuron — Mankind’s First Mathematical Model Of A Biological Neuron (英):詳細解說如何使用 activation function 搭配單一神經元架構,得到不同的邏輯閘(如,AND 或 OR)。
- [魔法陣系列] Artificial Neural Network (ANN) 之術式解析 (中):這篇文章中將以 step function 作為 activation function 很詳細的用圖解說。若不了解 step function 可以前往該網站閱讀。
- ONLINE LEARNING PERCEPTRON (英):MLWave 在 2015 年發表的文章,文章內容包括了 Perceptron 教學,文中包括用 python 寫成的 Online Perceptron。在該文亦提到 Perceptron 曾成功用於 Kaggle 競賽。
- 深度学學大神 Yann LeCun:我曾見証過一個偉大的賭局,當時神經網絡並不被看好 (簡中):搜狐科技新聞,對 LeCun 見證大師的賭局有詳細的介紹。