狹義的解釋深度學習,便是指多層的類神經網絡。迄今,類神經網絡的架構愈來愈複雜,包括在傳統一層一層的架構上,添加一到多個模組。這個模組可以單純如多個不同大小的平行卷積層或複雜如小型的
Attention 網絡。類神經網絡的表現,仰賴著一個適宜的架構和一個最佳化的演算法。在這一系列介紹類神經網絡的文章中,我們會先從架構切入,在未來的文章中,再對演算法深入介紹。
感知器(Perceptron)
就如同所有自然生物的起源,都可追溯源頭至單細胞生物。現在最火熱的機械學習演算法,以類神經為主的深度學習,也從一個單一的神經元開始。
在1943年McCulloch 和Pitts 仿造人類的神經細胞結構,設計了第一個以軟體實現的人工神經元。此時的神經元就如同數位邏輯電路里的邏輯閘一樣, 所有的輸入都依照神經元的計算邏輯,輸出相對應的計算結果。
只不過這個輸出結果,比較近似於房間使用的開關:若計算的結果超過某一個給定值後,神經元的輸出就會等於1(on 的狀態),若沒有超過這個給定值,則為零(off 的狀態)。
這個神經元並沒有任何學習的方法,直到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。藍色實線為該步驟所計算得到的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 網絡,並沒有足夠的模型能力來對非線性分佈的實例進行分類。
多層感知分類器
一個最簡單的類神經網絡,可被稱為多層感知分類器(Multiple Layer Perceptron ),又多以簡寫MLP 出現在文件。名稱是對應的一開始所介紹的感知器(Perceptron )而取的名字,但實際上,兩者除了使用具有激發功能(activation function )的神經元外,並沒有太大的關係。
類神經網絡的架構中,多層感知分類器,是屬於Feed Forward 網絡的一種。Feed Forward 類神經網絡,每一層中包含許多各自獨立的神經元,這些位於同一層的神經元彼此之間並沒有任何連結,但對位於上下兩層的每一個神經元,都有相對應的連結。也就是,下層的每一個神經元,對上層的每一個神經元,都會學習到一個權重值,來表達上下兩層神經元連結的強度。這個連結的強度,對於分類任務而言,可能是屬於某一類別的獨有特徵。
因為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 的方法,將訓練例子映射到新的特徵向量空間,在此空間,維度會增加而使所有的訓練例子皆是可分的。
同樣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 的方式來建立與原輸入建立起線性關係。
實際上,類神經網絡其實有一陣子相當沒落,那些執意進行類神經網絡相關研究的學者,包括現在被人所廣知的Geoffrey Hinton ,都被主流的研究學者稱呼為傻瓜。
但當時堅持研究類神經網絡,包括之前提到的Geoffrey Hinton ,Yann LeCun 和Yoshua Bengio 都得到相當於計算機科學的諾貝爾獎,圖靈獎的殊榮了!那麼,當時主流的研究都在做些什麼呢?原來就是SVM 最為熱門。反觀今日,因為大數據興起,造成類神經網絡的熱門,但也沒有造成SVM 式微。只能說「天下沒有免費的午餐」吧!
當然這對吃了一頓完全免費晚餐,賭注的見證人例外。
閱讀更多 碎語閒言 的文章