1. 程式人生 > >詳解深度學習感知機原理

詳解深度學習感知機原理

大家好,歡迎閱讀深度學習專題。

我們之前的機器學習專題已經結束了,我們把機器學習領域當中常用的演算法、模型以及它們的原理以及實現都過了一遍。雖然還有一些技術,比如馬爾科夫、隱馬爾科夫、條件隨機場等等沒有涉及到。但是這些內容相比來說要弱一些,使用頻率並不是非常高,我們就不一一敘述了,感興趣的同學可以自行研究一下。我想像是GBDT、SVM這些模型都能理解的話,那些模型想必也不在話下。

深度學習簡介

深度學習最近幾年非常火,很多人會把它和人工智慧扯上聯絡。這裡的深入並不是指學習深入,也不是指概念很深入,只是單純地指多層神經網路組成的“深度”神經網路。

其實無論是神經網路還是深度神經網路或者是深度學習當中的演算法,其實至今都已經有好幾十年的歷史了。比如眾所周知的深度學習核心演算法反向傳播演算法最早提出在1989年,距今已經三十多年了。雖然歷史並不短,但是這門領域之前起起伏伏,雖然也曾輝煌過,但一直到最近幾年才強勢崛起,成為了幾乎家喻戶曉的概念。

其中的原因也很簡單,因為訓練神經網路的複雜度是在是太大了,以之前的計算資源根本扛不住這麼大規模的運算。所以在之前那個年代,深度學習還是一個偏小眾的領域。研究的人不多,經費也有限。直到最近幾年,由於計算資源飛速發展,再加上通過GPU加速神經網路訓練的黑科技被髮明出來,使得原本不可能做到的變成了可能。再加上阿爾法狗戰勝了李世石這種劃時代的事件發生,導致了深度學習一時間吸引了大量的資源與關注,那麼這個行業自然也就蒸蒸日上發展起來了。

既然深度學習是有關於神經網路的技術,那麼我們這個專題文章講解的內容自然也不會脫離神經網路的範疇。今天我們就從神經網路最基礎的神經元——感知機開始說起。

感知機

感知機的英文是perceptron,我們可以把它理解成神經網路的最小構成單位。我們知道在自然界的生物體當中,神經的最小單位是神經元,一個神經元是一個細胞,它大概長成下面這個樣子。我想絕大多數同學都應該曾經在生物課的課本上看到過神經元的圖片。

感知機可以理解成神經元的仿生結構,我們都知道一個神經元細胞可以連線多個神經細胞,這些神經元之間彼此連線形成了一張巨大的網路。神經元之間可以互相傳遞電訊號以及化學物質,從而形成了一系列複雜的反應。人類的大腦就可以理解成一張極其巨大且複雜的神經網路,但是關於人類的大腦以及生物的神經元網路究竟是如何起作用的,目前還沒有定論。

但計算學家模擬神經元以及神經網路搭建了深度學習的模型,的確在一些問題上取得了非凡的結果。感知機就可以認為是一個神經元細胞的抽象,我們都知道一個神經元細胞會從其他若干個神經元當中獲取訊號,也會向另一個神經元細胞傳遞訊號。我們把傳入的訊號當成是輸入,傳出的訊號當做是輸出,這樣就得到了感知機的結構。

這裡我們把結構做到了最簡,我們把輸入的訊號都看成是浮點數,每一個訊號都有一個自己的權重,所有的訊號會累加在一起,最後通過一個對映函式輸出訊號。

我們來看最簡單的感知機來做個例子:

這個感知機只有兩個輸入,我們很容易得到 。這裡的y是一個浮點數,我們可以在y上套一個sign函式。所謂的sign函式,即使根據閾值來進行分類。比如我們設定一個閾值 ,如果 ,那麼 ,否則的話

說起來又是神經元又是感知機什麼的,但它的原理很簡單,我們把公式寫出來就是: ,這裡的 叫做啟用函式(activate function)。我們上面列舉的例子當中的啟用函式是sign函式,也就是根據閾值進行分類的函式。在神經網路當中常用的啟用函式主要有三種,一種是我們之前就非常熟悉的sigmoid函式,一種是relu函式,另外一種是tanh函式。我們來分別看下他們的影象。

relu函式的方程很簡單: 。但是它的效果非常好,也是神經網路當中最常用的啟用函式之一。使用它的收斂速度要比sigmoid更快,原因也很簡單,因為sigmoid函式影象兩邊非常非常光滑,導致我們求導得出的結果非常接近0,這樣我們梯度下降的時候自然收斂速度就慢了。這一點我們之前在介紹sigmoid函式的時候曾經提到過。

從影象上來看tanh函式和sigmoid函式非常相似,一點細微的差別是他們的值域不同,sigmoid函式的值域是0到1,而tanh是-1到1。雖然看起來只是值域不同,但是區別還是挺大的,一方面是兩者的敏感區間不同。tanh的敏感區間相比來說更大,另外一點是,sigmoid輸出的值都是正值,在一些場景當中可能會產生問題。

相信大家看出來了,感知機其實就是一個線性方程再套上一個啟用函式。某種程度上來說邏輯迴歸模型也可以看成是一個感知機。有一個問題大家可能感到很疑惑,為什麼線性方程後面需要加上一個啟用函式呢?如果不加行不行?

答案是不行,原因也很簡單,因為當我們把多個神經元組織在一起形成了一張網路之後。如果每一個神經元的計算都是這樣純線性的,那麼整個神經網路其實也等價於一個線性的運算。這個是可以在數學上得到證明的,所以我們需要在感知機當中增加一點東西,讓它的計算結果不是純線性的。

感知機和邏輯電路

最後我們來看一個實際一點的例子,最簡單的例子當然是邏輯電路當中的與或門。與門、或門、非門其實都差不多,都是有兩個輸入和一個輸出。

我們以與門為例:

二進位制的與操作我們都很熟悉了,只有兩個數都為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

同樣我們也可以寫出或門或者是非門,這也並不困難。但是也會發現有一種情況我們無法解決,就是異或的情況。我們先來看下異或的真值表:

我們是沒有辦法通過一個感知機來實現異或資料的分割,這個問題我們之前在SVM模型當中曾經介紹過,因為異或的資料不是線性可分的,也就是說我們沒辦法通過一條分割線將它分割。

但是異或問題並非是不可解決的,我們用單獨的感知機不能夠分割,但是我們可以將感知機串聯起來,形成一張簡單的神經網路,這個問題就變得可解了。假設我們已經把與門、或門、非門都實現了一遍。我們可以這樣來實現異或門:

def XOR(x1, x2):
    # 非門
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    return AND(s1, s2)

整個感知機的結構是這樣的:

TensorFlow官網提供了一個叫做playground的網頁應用,可以讓我們自己直觀地感受神經網路的組成以及它的訓練過程。比如剛才的異或問題,我們就可以自己來設定神經網路的層數以及每一層包含的神經元的數量。並且還可以設定神經元的啟用函式,可以非常直觀地體會神經網路的訓練過程以及各種引數的作用。

大家可以點選下方連結跳轉過去自行實驗一下,也就是說單純的感知機當然擬合能力很弱,但是當多個神經元組合起來組成神經網路就會變得非常得強大,可以深入學習到資料當中的非線性關係。非線性關係的學習一直是機器學習時代很令人頭疼的問題,通過神經網路這一點得到了很好的解決。神經網路之所以厲害比普通的機器學習模型效果更好,一方面除了它的引數更多擬合能力更強之外,很重要的一點就是它能夠很好地學習資料當中的非線性關係。

TensorFlow-Playground

到這裡,關於感知機的介紹就差不多結束了。感知機是神經網路的基礎,其實也沒有太多的內容,無論是結構上還是形式上都和之前機器學習介紹過的邏輯迴歸很近似,也沒有太多技術難點和要點,大家只需要直觀地感受就可以了。

衷心祝願大家每天都有所收穫。如果還喜歡今天的內容的話,請來一個三連支援吧~(點贊、關注、轉發)

原文連結,求個關注

本文使用 mdnice 排版

- END -
![](https://img2020.cnblogs.com/blog/1906483/202010/1906483-20201013102101854-13725208