人工神經網絡是一個數學模型,旨在模擬人腦的神經系統對復雜信息的處理機制,其網絡結構是對人腦神經元網絡的抽象,兩者有很多相似之處。
當然 ANN 還遠沒有達到模擬人腦的地步,但其效果也讓人眼前一亮。
1. 人工神經元結構
人工神經元是一個多輸入單輸出的信息處理單元,是對生物神經元的建模。建模方式可以有很多種,不同的建模方式就意味着不同的人工神經元結構。
比較著名的人工神經元模型是 MP 神經元,直到今天,我們仍然在使用這個神經元模型。MP 神經元是模仿生物的神經元設計的:
1)輸入向量 $x$ 模擬生物神經元中其他神經細胞給該細胞的刺激,值越大刺激越大;
2)$w$ 向量模擬該細胞不同來源的刺激的敏感度;
3)用閾值 $\theta$ 來描述激活該神經元的難易程度,越大越難激活;
4)用 $w_{1}x_{1} + w_{2}x_{2} + ... + w_{n}x_{n} - \theta$ 來計算神經元的興奮程度;
5)$y = f(x)$ 為激活函數,用來計算神經元的輸出,因為生物神經元的輸出是有上下限的,所以激活函數也是能夠“飽和”的有界函數;
6)在 MP 神經元中,激活函數為階梯函數。興奮函數大於閾值輸出 $1$,小於閾值輸出 $0$;
下圖是 MP 神經元模型的示意圖:
將激活函數代入,將項 $-\theta$ 設為 $b$,則可以得到 MP 神經元的數學模型:
$$y = sgn \left ( \sum_{i=1}^{n}(w_{i}x_{i} + b) \right ) = sgn \left ( w^{T}x + b \right )$$
驚訝得發現它就是一個線性分類模型,和感知機的數學模型是完全一樣的,所以一個 MP 神經元的作用就是:對輸入進行二分類。
這是符合生物神經元的特點的,因為一個生物神經元對輸入信號所產生的作用就是:興奮或這抑制。
所以通俗來講:一條直線把平面一分為二,一個平面把三維空間一分為二,一個 $n-1$ 維超平面把 $n$ 維空間一分為二,兩邊分屬不同的兩類,
這種分類器就叫做神經元,一個神經元只能分兩類,輸出是一個能體現類別的標量。
一個神經元的作用就是這么簡單,所做的也只能是線性分類,但是當多個神經元互聯的時候就會產生神奇的效果,下面再敘述。
MP 神經元的輸出是樣本點所屬的類別,它把直線一側變為 $0$,另一側變為 $1$,這東西不可微,不利於數學分析,經常用其它類似於 $sgn$ 的可微
函數來做激活函數,如:
用上面的激活函數,比使用符號函數能體現樣本的更多信息。
2. 多層感知器
由於 MP 神經元的輸入來自於其他神經元,我們顯然不能指望單獨一個神經元就有什么功能,而多個神經元可以組成不同的結構。
下面介紹一個二層感知器,來直觀得感受下神經網絡到底是如何工作的?其網絡結構圖如下:
用這個網絡對輸入 $(0,0),(0,1),(1,0),(1,1)$ 四個點進行分類,其中紅點是一類,藍點是一類,使用的激活函數是 $sgn$。
因為一個神經元的作用就是切一刀,即做一次線性分割,很顯然對於上面的四個點沒有辦法只切一刀就完成分類,於是考慮用兩個神經元,
即現在隱藏層有兩個神經元,即再切一刀,現在我們分析一下隱藏層兩個神經元的輸出情況:
$$x_{1} \;\;\; x_{2} \;\;\; y_{1} \;\;\; y_{2} \\
0 \;\;\;\;\; 1 \;\;\;\; 1 \;\;\;\;\; 1 \\
0 \;\;\;\;\; 0 \;\;\;\; 0 \;\;\;\;\; 1 \\
1 \;\;\;\;\; 1 \;\;\;\; 0 \;\;\;\;\; 1 \\
1 \;\;\;\;\; 0 \;\;\;\; 0 \;\;\;\;\; 0$$
我們將隱藏層的輸出 $(y_{1},y_{2})$ 繪制在坐標系上,如上右圖。神奇的事情發生了,原本無法一刀切的四個點,經過隱藏層
的后,變成了線性可分的,此時通過一條直線可以完成分類,所以輸出層的神經元一個就夠了。
神經網絡是由一層一層構建的,那么每層究竟在做什么呢?
由上面的例子可以理解到,每一層神經元就是用線性變換跟隨着非線性變化,將輸入空間投向另一個空間,變換手段有:
1)升維/降維
2)放大/縮小
3)旋轉
4)平移
5)彎曲
其中 $1,2,3$ 操作由 $w^{T}x$ 完成,$4$ 操作由 $+b$ 完成,$5$ 操作由激活函數 $f$ 完成。
我們知道空間是由基決定的,首先我們先定義一個參考系 $S_{1}$,整個神經網絡以它為坐標系。
將一個變換作用在一個向量上面,該怎么理解為空間的改變呢?舉一個例子;在參考系 $S_{1}$ 下面的一個向量 $(a,b)$,將它做如下變換:
$$ai^{'} + bj^{'}$$
其中 $i^{'},j^{'}$ 線性無關,那么這個輸出相當於以向量 $i^{'},j^{'}$ 為基(參考系還是 $S_{1}$)進行合成,因為基 $i^{'},j^{'}$ 本身就可
以表示一個空間,變換本質在這個空間里進行與原空間 $S_{1}$ 相同效果的向量合成,只不過新的空間是以參考系 $S_{1}$ 來進行坐標表示的。
關鍵就在於變化前后的參考系沒有改變,那么只要有足夠的合適的神經元,空間的扭曲形變終究會使樣本點線性可分。
注:這個地方理解得不對,參考系也變化到對應維度的空間去了。
3. 神經網絡模型訓練算法
1)單層感知器梯度下降法
激活函數為 $\sigma(u)$,故該網絡的數學模型:
$$\hat{f} = \sigma(w^{T}x + b)$$
對於一個輸入向量,期望的網絡輸出為 $f$(訓練集中已知的量),模型的實際輸出為 $\hat{f}$,損失函數定義為:
$$L(w,b) = \frac{1}{2} \left ( f - \hat{f} \right )^{2} = \frac{1}{2} \left [ f - \sigma(w^{T}x + b) \right ]^{2}$$
這個誤差只是針對一個樣本點的,除以 $2$ 的目的僅是為了求梯度時更好看,訓練的時候是一個一個樣本代入求損失函數的最小值,是隨機梯度下降法。
需要確定的參數是 $w_{i},i = 1,2,...,n$ 和 $b$,根據鏈式法則求偏導得:
$$\frac{\partial L}{\partial w_{i}} = \frac{\partial L}{\partial \hat{f}} \cdot \frac{\partial \sigma}{\partial u} \cdot \frac{\partial u}{\partial w_{i}} = - \left ( f - \hat{f}\right ) \cdot x_{i} \cdot \frac{\partial \sigma}{\partial u}
\; \Rightarrow \; \frac{\partial L}{\partial w} = \left ( f - \hat{f}\right ) \cdot X \cdot \frac{\partial \sigma}{\partial u} \\
\frac{\partial L}{\partial b} = \frac{\partial L}{\partial \hat{f}} \cdot \frac{\partial \sigma}{\partial u} \cdot \frac{\partial u}{\partial b} = - \left ( f - \hat{f}\right ) \cdot \frac{\partial \sigma}{\partial u}$$
所以參數更新方法為:
$$w = w + \eta \left ( f - \hat{f}\right ) \cdot X \cdot \frac{\partial \sigma}{\partial u} \\
b = b + \eta \left ( f - \hat{f}\right ) \cdot \frac{\partial \sigma}{\partial u}$$
2)多層感知器的反向傳播算法
圖中 $i$ 表示輸入層單元,$j$ 表示中間層單元,$k$ 表示輸出層單元。多層感知器的誤差函數 $L(w,b)$ 等於個輸出單元的誤差總和,即
$$L(w,b) = \frac{1}{2}\sum_{k=1}^{q}(r_{k} - y_{k})^{2}$$
$r_{k}$ 表示期望的輸出,是已知量(訓練集提供),$y_{k}$ 為模型的實際輸出,設激活函數為 $\sigma(u)$。
先來看一下各層的函數關系:
$$y_{k} = \sigma_{2k} \left ( \sum_{j=1}^{m}w_{2jk}z_{j} + b_{2k} \right ) \\
z_{j} = \sigma_{1j} \left ( \sum_{i=1}^{n}w_{1ij}x_{i} + b_{1j} \right )$$
需要確定的參數就是 $w_{1ij},w_{2jk},b_{1j},b_{2k}$,對每一層的各個參數求偏導有:
$$\frac{\partial L}{\partial w_{2jk}} = \frac{\partial L}{\partial y_{k}} \cdot \frac{\partial \sigma_{2k}}{\partial u_{2k}} \cdot \frac{\partial u_{2k}}{\partial w_{2jk}} = -(r_{k} - y_{k}) \cdot z_{j} \cdot \frac{\partial \sigma_{2k}}{\partial u_{2k}}$$
$$\frac{\partial L}{\partial w_{1ij}} = \sum_{k=1}^{q}\frac{\partial L}{\partial y_{k}} \cdot \frac{\partial \sigma_{2k}}{\partial u_{2k}} \cdot \frac{\partial u_{2k}}{\partial z_{j}} \cdot \frac{\partial \sigma_{1j}}{\partial u_{1j}} \cdot \frac{\partial u_{1j}}{\partial w_{1ij}} = -\sum_{k=1}^{q}(r_{k} - y_{k}) \cdot \frac{\partial \sigma_{2k}}{\partial u_{2k}} \cdot w_{2jk} \cdot \frac{\partial \sigma_{1j}}{\partial u_{1j}} \cdot x_{i}$$
假設激活函數為 $sigmod$,上面的過程可總結為下面兩張圖,圖中的 $E$ 就是誤差函數 $L$。
縱觀整個過程,對於 ANN,當我們需要使用它時,是從最前面給出輸入,然后一步步往后計算得出這個龐大復雜函數的輸出的;
而當我們需要訓練它時,則是從最后面的參數開始,一步步向前求導,調整各個參數的。並且計算前面的參數時一般都會用到之前計算過的中間結果。
這樣,ANN 調整參數的過程就可以看作是一個誤差反向傳播(BP)的過程。