詳解深度學(xué)習(xí)感知機原理
我們之前的機器學(xué)習(xí)專題已經(jīng)結(jié)束了,我們把機器學(xué)習(xí)領(lǐng)域當(dāng)中常用的算法、模型以及它們的原理以及實現(xiàn)都過了一遍。雖然還有一些技術(shù),比如馬爾科夫、隱馬爾科夫、條件隨機場等等沒有涉及到。但是這些內(nèi)容相比來說要弱一些,使用頻率并不是非常高,我們就不一一敘述了,感興趣的同學(xué)可以自行研究一下。我想像是GBDT、SVM這些模型都能理解的話,那些模型想必也不在話下。
深度學(xué)習(xí)簡介
深度學(xué)習(xí)最近幾年非?;穑芏嗳藭阉腿斯ぶ悄艹渡下?lián)系。這里的深入并不是指學(xué)習(xí)深入,也不是指概念很深入,只是單純地指多層神經(jīng)網(wǎng)絡(luò)組成的“深度”神經(jīng)網(wǎng)絡(luò)。
其實無論是神經(jīng)網(wǎng)絡(luò)還是深度神經(jīng)網(wǎng)絡(luò)或者是深度學(xué)習(xí)當(dāng)中的算法,其實至今都已經(jīng)有好幾十年的歷史了。比如眾所周知的深度學(xué)習(xí)核心算法反向傳播算法最早提出在1989年,距今已經(jīng)三十多年了。雖然歷史并不短,但是這門領(lǐng)域之前起起伏伏,雖然也曾輝煌過,但一直到最近幾年才強勢崛起,成為了幾乎家喻戶曉的概念。
其中的原因也很簡單,因為訓(xùn)練神經(jīng)網(wǎng)絡(luò)的復(fù)雜度實在是太大了,以之前的計算資源根本扛不住這么大規(guī)模的運算。所以在之前那個年代,深度學(xué)習(xí)還是一個偏小眾的領(lǐng)域。研究的人不多,經(jīng)費也有限。直到最近幾年,由于計算資源飛速發(fā)展,再加上通過GPU加速神經(jīng)網(wǎng)絡(luò)訓(xùn)練的黑科技被發(fā)明出來,使得原本不可能做到的變成了可能。再加上阿爾法狗戰(zhàn)勝了李世石這種劃時代的事件發(fā)生,導(dǎo)致了深度學(xué)習(xí)一時間吸引了大量的資源與關(guān)注,那么這個行業(yè)自然也就蒸蒸日上發(fā)展起來了。
既然深度學(xué)習(xí)是有關(guān)于神經(jīng)網(wǎng)絡(luò)的技術(shù),那么我們這個專題文章講解的內(nèi)容自然也不會脫離神經(jīng)網(wǎng)絡(luò)的范疇。今天我們就從神經(jīng)網(wǎng)絡(luò)最基礎(chǔ)的神經(jīng)元——感知機開始說起。
感知機
感知機的英文是perceptron,我們可以把它理解成神經(jīng)網(wǎng)絡(luò)的最小構(gòu)成單位。我們知道在自然界的生物體當(dāng)中,神經(jīng)的最小單位是神經(jīng)元,一個神經(jīng)元是一個細胞,它大概長成下面這個樣子。我想絕大多數(shù)同學(xué)都應(yīng)該曾經(jīng)在生物課的課本上看到過神經(jīng)元的圖片。

感知機可以理解成神經(jīng)元的仿生結(jié)構(gòu),我們都知道一個神經(jīng)元細胞可以連接多個神經(jīng)細胞,這些神經(jīng)元之間彼此連接形成了一張巨大的網(wǎng)絡(luò)。神經(jīng)元之間可以互相傳遞電信號以及化學(xué)物質(zhì),從而形成了一系列復(fù)雜的反應(yīng)。人類的大腦就可以理解成一張極其巨大且復(fù)雜的神經(jīng)網(wǎng)絡(luò),但是關(guān)于人類的大腦以及生物的神經(jīng)元網(wǎng)絡(luò)究竟是如何起作用的,目前還沒有定論。
但計算學(xué)家模擬神經(jīng)元以及神經(jīng)網(wǎng)絡(luò)搭建了深度學(xué)習(xí)的模型,的確在一些問題上取得了非凡的結(jié)果。感知機就可以認為是一個神經(jīng)元細胞的抽象,我們都知道一個神經(jīng)元細胞會從其他若干個神經(jīng)元當(dāng)中獲取信號,也會向另一個神經(jīng)元細胞傳遞信號。我們把傳入的信號當(dāng)成是輸入,傳出的信號當(dāng)做是輸出,這樣就得到了感知機的結(jié)構(gòu)。

這里我們把結(jié)構(gòu)做到了最簡,我們把輸入的信號都看成是浮點數(shù),每一個信號都有一個自己的權(quán)重,所有的信號會累加在一起,最后通過一個映射函數(shù)輸出信號。
我們來看最簡單的感知機來做個例子:

這個感知機只有兩個輸入,我們很容易得到

這里的y是一個浮點數(shù),我們可以在y上套一個sign函數(shù)。所謂的sign函數(shù),即使根據(jù)閾值來進行分類。比如我們設(shè)置一個閾值

如果

那么

否則的話

說起來又是神經(jīng)元又是感知機什么的,但它的原理很簡單,我們把公式寫出來就是:

這里的

叫做激活函數(shù)(activate function)。我們上面列舉的例子當(dāng)中的激活函數(shù)是sign函數(shù),也就是根據(jù)閾值進行分類的函數(shù)。在神經(jīng)網(wǎng)絡(luò)當(dāng)中常用的激活函數(shù)主要有三種,一種是我們之前就非常熟悉的sigmoid函數(shù),一種是relu函數(shù),另外一種是tanh函數(shù)。我們來分別看下他們的圖像。

relu函數(shù)的方程很簡單:

。但是它的效果非常好,也是神經(jīng)網(wǎng)絡(luò)當(dāng)中最常用的激活函數(shù)之一。使用它的收斂速度要比sigmoid更快,原因也很簡單,因為sigmoid函數(shù)圖像兩邊非常非常光滑,導(dǎo)致我們求導(dǎo)得出的結(jié)果非常接近0,這樣我們梯度下降的時候自然收斂速度就慢了。這一點我們之前在介紹sigmoid函數(shù)的時候曾經(jīng)提到過。

從圖像上來看tanh函數(shù)和sigmoid函數(shù)非常相似,一點細微的差別是他們的值域不同,sigmoid函數(shù)的值域是0到1,而tanh是-1到1。雖然看起來只是值域不同,但是區(qū)別還是挺大的,一方面是兩者的敏感區(qū)間不同。tanh的敏感區(qū)間相比來說更大,另外一點是,sigmoid輸出的值都是正值,在一些場景當(dāng)中可能會產(chǎn)生問題。
相信大家看出來了,感知機其實就是一個線性方程再套上一個激活函數(shù)。某種程度上來說邏輯回歸模型也可以看成是一個感知機。有一個問題大家可能感到很疑惑,為什么線性方程后面需要加上一個激活函數(shù)呢?如果不加行不行?
答案是不行,原因也很簡單,因為當(dāng)我們把多個神經(jīng)元組織在一起形成了一張網(wǎng)絡(luò)之后。如果每一個神經(jīng)元的計算都是這樣純線性的,那么整個神經(jīng)網(wǎng)絡(luò)其實也等價于一個線性的運算。這個是可以在數(shù)學(xué)上得到證明的,所以我們需要在感知機當(dāng)中增加一點東西,讓它的計算結(jié)果不是純線性的。
感知機和邏輯電路
最后我們來看一個實際一點的例子,最簡單的例子當(dāng)然是邏輯電路當(dāng)中的與或門。與門、或門、非門其實都差不多,都是有兩個輸入和一個輸出。
我們以與門為例:

二進制的與操作我們都很熟悉了,只有兩個數(shù)都為1才能得到1。我們要寫出這樣一個感知機來也非常簡單:
- def AND(x1, x2):
- x = np.array([x1, x2]) w = np.array([0.5, 0.5])
- theta = 0.7
- return w.dot(x) > theta
同樣我們也可以寫出或門或者是非門,這也并不困難。但是也會發(fā)現(xiàn)有一種情況我們無法解決,就是異或的情況。我們先來看下異或的真值表:

我們是沒有辦法通過一個感知機來實現(xiàn)異或數(shù)據(jù)的分割,這個問題我們之前在SVM模型當(dāng)中曾經(jīng)介紹過,因為異或的數(shù)據(jù)不是線性可分的,也就是說我們沒辦法通過一條分割線將它分割。

但是異或問題并非是不可解決的,我們用單獨的感知機不能夠分割,但是我們可以將感知機串聯(lián)起來,形成一張簡單的神經(jīng)網(wǎng)絡(luò),這個問題就變得可解了。假設(shè)我們已經(jīng)把與門、或門、非門都實現(xiàn)了一遍。我們可以這樣來實現(xiàn)異或門:
- def XOR(x1, x2):
- # 非門
- s1 = NAND(x1, x2)
- s2 = OR(x1, x2)
- return AND(s1, s2)
整個感知機的結(jié)構(gòu)是這樣的:

TensorFlow官網(wǎng)提供了一個叫做playground的網(wǎng)頁應(yīng)用,可以讓我們自己直觀地感受神經(jīng)網(wǎng)絡(luò)的組成以及它的訓(xùn)練過程。比如剛才的異或問題,我們就可以自己來設(shè)置神經(jīng)網(wǎng)絡(luò)的層數(shù)以及每一層包含的神經(jīng)元的數(shù)量。并且還可以設(shè)置神經(jīng)元的激活函數(shù),可以非常直觀地體會神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程以及各種參數(shù)的作用。

到這里,關(guān)于感知機的介紹就差不多結(jié)束了。感知機是神經(jīng)網(wǎng)絡(luò)的基礎(chǔ),其實也沒有太多的內(nèi)容,無論是結(jié)構(gòu)上還是形式上都和之前機器學(xué)習(xí)介紹過的邏輯回歸很近似,也沒有太多技術(shù)難點和要點,大家只需要直觀地感受就可以了。