
神經網絡是目前最流行的機器學習算法之一。隨著時間的推移,證明了神經網絡在精度和速度方面,比其他的算法性能更好。并且形成了很多種類,像CNN(卷積神經網絡),RNN,自編碼,深度學習等等。神經網絡對于數據科學和或者機器學習從業者,就像線性回歸對于統計學家一樣。因此,對神經網絡是什么有一個基本的理解是有必要的,比如,它是怎么構成的,它能處理問題的范圍以及它的局限性是什么。這篇文章嘗試去介紹神經網絡,從一個最基礎的構件,即一個神經元,深入到它的各種流行的種類,像CNN,RNN等。
正如其名字所表明,神經網絡的靈感來源于人類大腦的神經結構,像在一個人類大腦中,最基本的構件就叫做神經元。它的功能和人的神經元很相似,換句話說,它有一些輸入,然后給一個輸出。在數學上,在機器學習中的神經元就是一個數學函數的占位符,它僅有的工作就是對輸入使用一個函數,然后給一個輸出。
這種神經元中使用的函數,在術語上通常叫做激活函數。主要的激活函數有5種,date,step,sigmoid,tanh和ReLU。這些都將在接下來進行詳細地描述。
階躍函數
階躍函數定義為
其中,如果x的值大于等于零,則輸出為1;如果x的值小于零,則輸出為0。我們可以看到階躍函數在零點是不可微的。目前,神經網絡采用反向傳播法和梯度下降法來計算不同層的權重。由于階躍函數在零處是不可微的,因此它并不適用于梯度下降法,并且也不能應用在更新權重的任務上。
為了克服這個問題,我們引入了sigmoid函數。
Sigmoid函數
一個Sigmoid函數或者logistic函數的數學定義如下:
當z或自變量趨于負無窮大時,函數的值趨于零;當z趨于正無窮大時,函數的值趨于1。需要記住的是,該函數表示因變量行為的近似值,并且是一個假設。現在問題來了,為什么我們要用Sigmoid函數作為近似函數之一。這有一些簡單的原因。
1. 它在可以捕獲數據的非線性。雖然是一個近似的形式,但非線性的概念是模型精確的重要本質。
2. sigmoid函數在整個過程中是可微的,因此可以與梯度下降和反向傳播方法一起使用,以計算不同層的權重。
3. 假設一個因變量服從一個sigmoid函數的固有假設的高斯分布的自變量,這是一個一般分布,我們可以獲得許多隨機發生的事件,這是一個好的的一般分布開始。
然而,sigmoid函數也面臨著梯度消失的問題。從圖中可以看出,一個sigmoid函數將其輸入壓縮到一個非常小的輸出范圍[0,1],并具有非常陡峭的漸變。因此,輸入空間中仍然有很大的區域,即使是很大的變化也會在輸出中產生很小的變化。這被稱為梯度消失問題。這個問題隨著層數的增加而增加,從而使神經網絡的學習停留在一定的水平上。
Tanh函數
Tanh(z)函數是sigmoid函數的縮放版本,它的輸出范圍變成了[-1,1],而不是[0,1].
在某些地方使用Tanh函數代替sigmoid函數的原因,通常是因為當數據分布在0周圍時,其導數值更高。一個更高的梯度對于更好的學習速率更有幫助。下圖展示了兩個函數Tanh和sigmoid的梯度值圖像。
對于Tanh函數,當輸入在[-1,1]之間時,得到導數值在[0.42,1]之間。
另一方面,對于sigmoid函數,當輸入在[-1,1]之間時,得到導數值在[0.20,0.25]之間。
正如我們從上圖看到的,Tanh函數比Sigmoid函數具有更大范圍的導數,因此具有一個更好的學習速率。然而在Tanh函數中,依然會出現梯度消失的問題。
ReLU函數
在深度學習模型中,修正線性單元(ReLU)是最常用的激活函數。當函數輸入負數時,函數輸出0,對于任意正數x,函數輸出本身。因此它可以寫成f(x)=max(0,x)
其圖像看起來如下:
Leaky ReLU是一個其中最出名的一種變形,對于正數輸入,其輸出和ReLU一樣,但是對于所有負數輸出,不再是0,而是具有一個常數斜率(小于1).
- 這個斜率是在構建模型時,需要使用者設置的參數。它通常被叫做alpha,例如,使用者設置alpha=0.3.這個激活函數則表示為f(x)=max(0.3x,x)。這具有一個理論優點,通過x在所有值處都能有一個影響,使得在x中包含的信息被充分利用。
激活函數還有有其他可以替代的選擇,但是對于從業者和研究人員,發現一般情況通過改變使用其他激活函數代替ReLU,并不能帶來足夠的收益。在平常實踐中,ReLU比Sigmoid或者tanh函數表現的更好。
神經網絡
到目前為止,我們已經介紹完了神經元和激活函數,它們一起是構建任意神經網絡的基本構件。現在,我們更深入的了解什么是神經網絡,以及它們不同的種類。我強烈的建議你,如果對于神經元和激活函數有任何的疑惑,回過頭去復習一下它們。
在理解一個神經網絡之前,有必要去理解神經網絡中的Layer(層),一層Layer是一組有輸入輸出的神經元。每一個神經元的輸入通過其所屬的激活函數處理,例如,這是一個小型神經網絡。
網絡的最左邊的layer叫做輸入層,最右邊的layer叫做輸出層(在這個例子中,只有一個節點)。中間的layer叫做隱藏層,因為其值不能在訓練集中觀察到。我們也可以說,我們的神經網絡例子,具有3個輸入單元(不包括偏置單元),3個隱藏單元,1個輸出單元。
任何神經網絡都至少包含1個輸入層和1個輸出層。隱藏層的數量在不同的網絡中不同,取決于待解決問題的復雜度。
另一個需要做筆記的重點是每一個隱藏層可以有一個不同的激活函數,例如,在同一個神經網絡中,隱藏層layer1可能使用sigmoid函數,隱藏層layer2可能使用ReLU,后續的隱藏層layer3使用Tanh。激活函數的選擇取決于待解決的問題以及使用的數據的類型。
現在對于一個可以做精確預測的神經網絡,在其中每一層的每一個神經元都學習到了確定的權值。學習權值的算法叫做反向傳播,其中的細節超過了本文的范圍。
具有超過一個隱藏層的神經網絡通常被叫做深度神經網絡。
卷積神經網絡(CNN)
卷積神經網絡(CNN)是神經網絡的一種,在計算機視覺領域應用非常廣泛。它的名字來源于組成其隱藏層的種類。CNN的隱藏層通常包含卷積層,池化層,全連接層,以及歸一化層。這些層的名字簡潔的表明了,使用了卷積和池化函數等作為激活函數,而不是使用之前定義的普通激活函數。
想要詳細的了解CNN,需要先理解什么是卷積和池化。這些概念都來源于計算機視覺領域,定義如下:
- 卷積:卷積作用在兩個信號(1維)或者兩張圖片(2維)上:你可以認為其中一個作為"輸入"信號(或圖片),另一個作為一個"濾波器"(也叫作kernel,核),然后生成第三個信號作為輸出。
- 用非專業的表述,就是在輸入信號上使用一個濾波器。本質上,使用一個kernel(核)乘以輸入信號,得到調整后的輸出信號。數學上,兩個函數f和g的卷積定義如下:
這就是輸出函數和kernel(核)函數的點乘運算。
在圖像處理案例中,可視化一個卷積核在整個圖片上滑動是非常簡單的,每個像素的值都是在這個過程中改變的。
池化(pooling):池化是一個基于采樣的離散化處理。它的目標是對輸入(圖片,隱藏層,輸出矩陣等)進行下采樣,來減小輸入的維度,并且包含局部區域的特征。
- 有兩個主要的池化種類,max和min pooling。正如其名字表明的,max pooling是在選擇區域選擇中最大值,min pooling是在選擇區域中選擇最小值。
因此,正如我們所看到的,卷積神經網絡CNN是一個基本的深度神經網絡,它包含多個隱藏層,除之前介紹的非線性激活函數之外,這些層還使用了卷積和池化函數。
循環神經網絡(RNN)
循環神經網絡RNN,正如其名,是一個非常重要的神經網絡種類,在自然語言處理領域應用非常廣泛。在一個普通的神經網絡中,一個輸入通過很多層的處理后,得到一個輸出,假設了兩個連續的輸入是互相獨立不相關的。
然而這個假設在許多生活中的情節并不成立。例如,如果一個人相應預測一個給定時間的股票的價格,或者相應預測一個句子中的下一個單詞,考慮與之前觀測信息的依賴是有必要的。
RNNs被叫做循環,因為它們對于一個序列中的每一個元素執行相同的任務,它們的輸出依賴于之前的計算。另一個理解RNN的角度是,認為它們有"記憶",能夠捕捉到到目前為止的計算信息。理論上,RNN能夠充分利用任意長序列中的信息,但是實踐上,它們被限制在可以回顧僅僅一些步驟。
結構展示,一個RNN如下圖所示。它可以想象成一個多層神經網絡,每一層代表每一個確定時刻t的觀測。
RNN在自然語言處理上展現了非常巨大的成功,尤其是它們的變種LSTM,它可以比RNN回顧得更多的。如果你對LSTM感興趣,我建議你參考一下文章:
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
在這篇文章中,我嘗試去全面的介紹神經網絡,從最基本的結構,一個神經元,到最有效的神經網絡類型。這篇文章的目標是使更多的的讀者了解神經網絡如何從0開始構建,它被應用在哪一些領域,以及它的一些最成功的種類有哪些。
我明白有還有很多其他流行的神經網絡種類,將打算在下一篇文章中涉及,如果你想要早一點覆蓋到某些主題,請向我建議。
來源 | 雷鋒網
作者 | vibhor nigam
校對 | 鄧普斯•杰弗 審核 | 醬番梨 整理 | 立魚王