Artificial Neural Network - 經歷著人工智能寒冬和復興

ANN, Artificial Neural Network是模仿生物神經網路數學模型,也作為深度學習和人工智能十分重要的基礎,所以筆者會花很多的筆墨解釋其設計,運作,後來的演變過程,盡量用簡單易明的例子作闡釋。

在了解整個神經網絡(Neural Network)之前,我們先從一個獨立的神經元開始說起吧, 幻想每一個神經元是一個只懂吃喝玩樂的他媽哥池(台灣的朋友們會叫它塔麻可吉),在他的世界裡只有吃喝和玩樂,至於決定先吃還是先玩,那就要看看他先收到肚子餓的信號還是享樂的心癮;換個角度來說,一個較為貪玩的他媽哥池會容易心癮發作,較饞嘴刖對肚子餓特別敏感,他媽哥池會收集所有資訊,根據它自己對吃或玩的敏感度,並把它們轉化為相應的決定或行動。

信號就是進入神經元的Input,敏感度就是權重Weight,對某信號的敏感度愈高,Weight也會愈提高,每一個Input都會有屬於它自己的Weight,然後神經元把一連串的Input乘上對應的Weight,並加起來放進Activate Function來決定Output的值是什麼,也就是要作出什麼的決定。
$$y=f(w_0x_0+w_1x_1+...+w_nx_n)$$

當一個又一個的他媽哥池連接起來成為Artificial Neural Network,以一個完整的Network來說,結構以一層層的Layer造成,第一層被稱為Input Layer,最後的層為Output Layer,剩下的夾心階層就是Hidden Layer。



心水清的讀者們認該會意識到,如果沒有hidden layer的Network,activation function為Sigmoid Function的話,那麼它正正是最基礎的Logistics Regression,bias就等同於Intercept,把Input乘上對應的Weight再直接加起來,經Activation function 再決定Output是什麼。

當我們解釋哪一個Input (Factor)最影響預測結果,只要用上Wald Test就好了。但是當加上一層Hidden Layer,就不再簡單了。所以層數越多的網絡,預測結果便難以解釋,越來越像一個”黑盒”。再者,Hidden Layer裡的神經元的數量是決定參數Weight的數量,在筆者多篇文章也提過:過多的參數會導致Neural Network過度學習,造成Overfitting的問題。情況好比為了面對公開試,努力做歷年的試卷,甚至死記一些解難方法,到真正上戰場的時候,自信滿滿的踏入試場後,卻發現之前解難的方法,根本用不上新的題型,又因為不懂變通,最後雖然未至於GG,但要拿一個優秀的成績有一定難度。模型過度學習訓練數據,就算準確度有九成以上,當面對著新的測試數據,下場也是一樣。學者會把這種誤差量化並稱之為Generalization Error,愈低的誤差模型表示應付普遍數據的能力愈高。

Backpropagation誤差反向傳播,是用作訓練Forward型的Neural Network和最常用的監督式學習的方法,首先把所有Weights會隨機設定為某個數值,把訓練數據輸入在Neural Network,Output Node會輸出一個答案,由於我們已經有數據提供的答案,只要把兩者Compare起來,便可以量化兩者的誤差,並把結果以Backward的方式傳送上一層的神經元,基於誤差梯度的改變,神經元之間連接的Weight也得跟著改變,重覆這個原理並套用每一層的Layer,令整個Neural Network的參數便進行Fitting,從已知的答案中學習,最後得出訓練好的模型,只需輸入新的數據便可作預測或分類等工作。

這個訓練方法並不是萬能的,當遇上有很多Hidden Layer的Deep Neural Network,問題就自然找上門了。一旦遇上梯度太少的程況,隨著層數愈多,使得梯度不再顯著,由於Weight的量是根據梯度來不停地調整,因此Weight的值不再有變化,最終令這個神經網絡不再進行學習,在沉默中滅亡,這就是著名的Gradient Vanishing Problem,也即是梯度消失問題。 相反,梯度太大時,會令每次更新的時候以指數式增加,造成梯度爆炸(Gradient Exploding Problem)。要解決以上兩個問題,先要從根本原因出發,之所以會出現梯度太少的問題,都是因為Activation Function的Derivative值少於1,尤其是採用了Sigmoid Function,其Derivative的最大值只有0.25 ,梯度很快消失了,而Derivative值大於1又會發生梯度爆炸,到底要怎麽辦呢?

既然大於或少於1也不行,那麽就直接等於1吧!答案就是來得這麽直接,Relu (Rectified Linear Unit)這個activation function正正能解決梯度消失或爆炸的問題,除此之外,計算速度也較快,令整個網絡的訓練速度加快。Relu的Derivative只有兩個值1或0 ,當梯度落在0時會導致一些神經元無法activate,需要借助較少的Learning Rate來解決,但太少的Learning Rate會讓學習速度減慢。這也令Leakrelu和elu也粉墨登場,其Derivative值為1或者k,而k為大於0和少於1的數字,讓負數的區域也activate成為非零旳數字。






隨住技術一日千里,要實現一些早在數十年前發明的模型和算法也不再是夢,近年深度學習的算法跑出,其中人人皆知的AlphaGo,用上了Convolutional neural network (CNN)。CNN可接受多維度的Input,所以在圖像辦認方面作出很大的貢獻,它的設計可幻想為最原始的Neural Network,由每一層Layer由一串的神經元,均換上成了卷積層(Convolution Layer),即是一塊平面甚至是立體的容器,神經元像六合彩的球一樣由左至右,上至下排列,輸入的數據一輪的Convolution的運算,才經activation function輸出。而訓練方式跟ANN的原埋都是一樣,用上relu的activation function就可以了。


除此之外,Recurrent Neural Network (RNN)不同於ANN的是:RNN的下游神經元可以把輸出送回上游的神經元,形成了一個循環,所以這個設計能處理Sequence的數據和Time Series,從中學習動態時間的行為。其中的應用有:最貼近我們生活例子是手機上的語音辨識功能,或者是。訓練學習也不能避免梯度消失及爆炸的問題和則需要配合Long Short Term Memory (LSTM)解決。

深度學習的內容實在太多太多,這裡介紹只作一個十分簡單的介紹,希望在日後的文章能好好詳細講解CNN, RNN的設計,運作,難題等。ANN的話題就來到這理,也感謝讀者們的時間!



Comments