1. 程式人生 > 實用技巧 >深度學習與PyTorch | 神經網路的介紹 | 02

深度學習與PyTorch | 神經網路的介紹 | 02

人工神經網路的概念

人工神經網路(Artificial Neural Network,ANN),簡稱神經網路(Neural Newwork,NN).
人工神經網路是一種模仿生物神經網路(動物的中樞神經系統,特別是大腦)的結構和功能的數學模型,用於對函式的估計或近似.

和其他機器學習方法一樣,神經網路已經被用於解決各種各樣的問題,例如機器視覺和語音識別,這些問題都是很難被傳統基於規則的程式設計所解決的.

上面的話怎麼理解呢? 本質還是特徵抽取問題. 比如文字和影象,如果是扔給人來抽取特徵,除非是影象和文字方面的專家,否則是很難把特徵抽取好的,但是神經網路不同,它就類似一個黑箱,會自動抽取特徵.
所以深度學習對於那些複雜任務有一個比較好的處理效果.

神經元的概念

在生物神經網路中,每個神經元與其他神經元相連,當它"興奮"時,就會向相連的神經元傳送化學物質,從而改變這些神經元內的電位. 如果某神經元的電位超過了一個"閾值",那麼它就會被啟用,即"興奮"起來,向其他神經元傳送化學物質.

1943年,M,P兩人將上述情形抽象下圖所示的簡單模型,這就是一直沿用至今得分M-P神經元模型. 把許多這樣的神經元按一定的層次連線起來,就得到了神經網路.

一個簡單的神經元如下圖所示:

其中:
(1) \(a_1,a_2\dots a_n​\)為各個輸入的分量
(2) \(w_1,w_2 \dots w_n\)為各個輸入分量對應的權重引數 (3) $b$

為偏置
(4) \(f\)為啟用函式,常見的啟用函式有tanh,sigmoid,relu
(5) \(t\)為神經元輸出
使用數學公式表示就是

\[t = f(W^TA+b) \]

可見,一個神經元的功能是求得輸入向量與權向量的內積後,經過一個非線性傳遞函式得到一個標量結果.

單層神經網路

單層神經網路是最基本的神經元網路形式,由有限個神經元構成,所有神經元的輸入向量都是同一個向量.
由於每一個神經元都會產生一個標量結果,所以單層神經元的輸出是一個向量,向量的維數等於神經元的數目.
示意圖如下:

上面的單層其實指的是輸出層,如果把輸入層也看上,實際上上圖是有2層的(輸入層,輸出層).
上圖在再看其實是由3個感知機組成的.
這裡的單層神經網路的單層是相對於多層神經網路的多層來說的(或者說其實輸入層只是輸入,輸出層其實是做了一次f(W^T A+b)的處理在輸出的).

感知機

感知機由兩層神經網路組成,輸入層接收外界輸入訊號後傳遞給輸出層(輸出+1正例,-1反例),輸出層是M-P神經元模型.

感知機的作用:感知機是一個簡單的二分類模型
把一個n維向量空間用一個超平面分割成兩個部分,給定一個輸出向量,超平面可以判斷出這個向量位於超平面的哪一邊,得到輸入是正類或者反類. (對應的2二維空間就是一條直線把一個平面分為兩個部分. )

多層神經網路

多層神經網路就是由單層神經網路進行疊加之後得到的,所以就形成了"層"的概念.
常見的多層神經網路有如下結構:
(1) 輸入層(Input layer),眾多神經元(Neuron)接受大量輸入資訊,輸入的資訊稱為輸入向量.
(2) 輸出層(Output layer),訊息在神經元連結中傳輸,分析,權衡,形成輸出結果. 輸出的訊息稱為輸出向量.
(3) 隱藏層(Hidden layer),是輸入層和輸出層之間眾多神經元和連結組成的各個層面. 隱藏層可以有一層或者多層. 隱藏層的結點(神經元)數目不定,但是資料越多神經網路的非線性越顯著,從而神經網路的魯棒性(強健性)更顯著.
示意圖如下:

概念: 全連線層
全連線層: 第N層和N-1層每個神經元相互連結,我們稱第N層為全連線層.

思考: 假設第N-1層有m個神經元,第N層有n個神經元,當第N層是全連線層的時候,則N-1層和N層之間有多少個引數? 這些引數可以如何表示?
有n*m個引數. 那麼n個輸入如何得到m個輸出呢? 就是使用的矩陣乘法.


從上圖可以看出,所謂的全連線層就是在前一層的輸出的基礎上進行一次Y=W^T X +b的變化(不考慮啟用函式的情況下就是一次線性變化,所謂線性變化就是平移(+b)和縮放(W^T)的組合)

啟用函式

在前面的神經元的介紹過程中,我們提到了啟用函式,那麼它到底是幹什麼的呢?
假設我們有這樣一組資料,三角形和四邊形,需要把它們分為兩類

通過不帶啟用函式的感知機我們可以規劃出一條線,把平面分割開.

假設我們確定了引數w和b之後,那麼帶入預測的資料,如果y>0,我們認為這個點在直線的右邊,也就是正類(三角形),否則就是在左邊(四邊形).
但是可以看出,三角形和四邊形是沒有辦法通過直線分開的.如下圖所示.

那麼這個時候該怎麼辦呢? 可以考慮使用多層神經網路來進行嘗試,比如在前面的感知機模型中在增加一層.

但是對上圖的公式進行合併,我們可以得到

y = (...)x1+(...)x2+(...)b

也就是說即使增加了一層,還是隻能夠繪製出直線.
所以可以發現,即使是多層神經網路,相比於前面的感知機,沒有任何改進.

但是如果此時,我們在前面感知機的基礎上加上非線性的啟用函式之後,輸出的結果就不再是一條直線.

如上圖,右邊是sigmoid韓寒訴,對感知機的結果,通過sigmoid函式進行處理.
如果給定合適的引數w和b,就可以得到合適的曲線,能夠對最開始的問題實現非線性分割.
所以啟用函式一個很重要的作用就是: 增加模型的非線性分割能力.

常見的啟用函式有:

看圖可知:
(1) sigmoid 只會輸出正數,以及靠近0的輸出變化率最大
(2) tanhsigmoid不同的是,tanh輸出可以是負數
(3) Relu是輸出只能大於0,如果輸入含有負數,Relu就不合適. 如果輸出的圖片格式,Relu就挺常用,因為圖片的畫素值為[0,255].

啟用函式除了前面說的增加模型的非線性分割能力外,還有
(1) 提高模型魯棒性
(2) 緩解梯度消失問題
(3) 加速模型收斂等

神經網路示例

一個男孩想要找一個女朋友,於是實現了一個女友判定機,隨著年齡的增長,它的判定機也一直在發生變化.
14歲的時候:

無數次碰壁之後,男孩意識到追到女孩的可能性和顏值一樣重要,於是修正了判定機:

在15歲的時候終於找到了女朋友,但是一段時間後他發現女友有各種難以忍受的習慣,最終決定分手.
他發現找女朋友很複雜,需要更多的條件才能夠幫助他找到女朋友,於是在25歲的時候,他再次修改了判定機.

在更新了女優判定機之後,問題又來了,很多指標不能夠很好的量化,什麼樣的叫做顏值高? 什麼樣的叫做性格好? 為了解決這個問題,他又更新了判定機,最終得到超級女友判定機.

上述的超級女友判定機其實就是神經網路,它能夠接受基礎的輸入,通過隱藏層的線性和非線性的變化最終得到輸出.
通過上面例子,希望大家能夠理解深度學習的思想:
輸入的最原始的,最基本的資料,通過模型來進行特徵工程,進行更加高階特徵的學習,然後通過傳入的資料來確定合適的引數,讓模型去更好的擬合數據.

這個過程和理解為盲人摸象,多個人一起摸,把摸到的結果乘上合適的權重,進行合適的變化,讓它和目標值趨近一致. 整過過程只需要輸入基礎的資料,程式自動尋找合適的引數.