BP神經網絡
人工神經網絡與人工神經元模型
In machine learning and cognitive science, artificial neural networks (ANNs) are a family of statistical learning models inspired by biological neural networks (the central nervous systems of animals, in particular the brain) and are used to estimate or approximate functions that can depend on a large number of inputs and are generally unknown.
在機器學習和認知科學,人工神經網絡(ann)是一個家庭的統計學習模型受生物神經網絡(動物的中樞神經系統,特別是大腦)和用於估計或近似函數,可以依靠大量的輸入和通常是未知的。
人工神經網絡是人工智能研究的一種方法。實際上人工神經網絡(Artificial Neural Netwroks,簡稱ANN)是對人類大腦系統的一種仿真,簡單地講,它是一個數學模型,可以用電子線路來實現,也可以用計算機程序來模擬,由大量的、功能比較簡單的形式神經元互相連接而構成的復雜網絡系統,用它可以模擬大腦的許多基本功能和簡單的思維方式。盡管它還不是大腦的完美無缺的模型,但它可以通過學習來獲取外部的知識並存貯在網絡內,可以解決計算機不易處理的難題,特別是語音和圖像的識別、理解、知識的處理、組合優化計算和智能控制等一系列本質上是非計算的問題。
生物神經元:
生物神經元模型就是一個簡單的信號處理器。樹突是神經元的信號輸入通道,接受來自其他神經元的信息。軸突是神經元的信號輸出通道。
信息的處理與傳遞主要發生在突觸附近。神經元細胞體通過樹突接受脈沖信號,通過軸突傳到突觸前膜。當脈沖幅度達到一定強度,即超過其閾值電位后,突觸前膜將向突觸間隙釋放神經傳遞的化學物質(乙酰膽鹼),使位於突觸后膜的離子通道(Ion Channel)開放,產生離子流,從而在突觸后膜產生正的或負的電位,稱為突觸后電位。
突觸有兩種:興奮性突觸和抑制性突觸。前者產生正突觸后電位,后者產生負突觸后電位。一個神經元的各樹突和細胞體往往通過突觸和大量的其他神經元相連接。這些突觸后電位的變化,將對該神經元產生綜合作用,即當這些突觸后電位的總和超過某一閻值時,該神經元便被激活,並產生脈沖,而且產生的脈沖數與該電位總和值的大小有關。脈沖沿軸突向其他神經元傳送,從而實現了神經元之間信息的傳遞。
人工神經元模型的三要素:
①連接權ω ②求和單元∑ ③激活函數f(·)
其中,
$X=[ \times 0, \times 1, \times 2, \ldots \ldots ., \times n]$
$\mathbf{W}=\left[\begin{array}{c}{w_{10}} \\ {w_{i 1}} \\ {w_{i 2}} \\ {\vdots} \\ {w_{i n}}\end{array}\right]$
常用表達式一:
$\begin{array}{c}{\text { net }_{i}=\sum_{j=1}^{n} w_{i j} x_{j}-\theta} \\ {y_{i}=\mathrm{f}\left(\text { net }_{i}\right)}\end{array}$
常用表達式二:
$\begin{array}{c}{\text { net }_{i}=\mathrm{XW}} \\ {y_{i}=\mathrm{f}\left(\mathrm{net}_{i}\right)=\mathrm{f}(\mathrm{XW})}\end{array}$
常用的激活函數:
①線性函數
$$\mathrm{f}(\mathrm{x})=k * x+c$$
②斜坡函數
$$f(x)=\left\{\begin{array}{cc}{T} & {, \quad x>c} \\ {k * x,} & {|x| \leq c} \\ {-T,} & {x<-c}\end{array}\right.$$
③閾值函數
$$f(x)=\left\{\begin{array}{l}{1, x \geq c} \\ {0, x<c}\end{array}\right.$$
④S型函數(Sigmoid)
$$\begin{array}{c}{f(x)=\frac{1}{1+e^{-\alpha x}}(0<f(x)<1)} \\ {f^{\prime}(x)=\frac{\alpha e^{-\alpha x}}{\left(1+e^{-\alpha x}\right)^{2}}=\alpha f(x)[1-f(x)]}\end{array}$$
⑤雙極S型函數
$$\begin{array}{l}{f(x)=\frac{2}{1+e^{-\alpha x}}-1(-1<f(x)<1)} \\ {f^{\prime}(x)=\frac{2 \alpha e^{-\alpha x}}{\left(1+e^{-\alpha x}\right)^{2}}=\frac{\alpha\left[1-f(x)^{2}\right]}{2}}\end{array}$$

神經網絡
連接方式
按照連接方式,可划分為前向神經網絡與反饋(遞歸)神經網絡。
前向神經網絡:
反饋神經網絡:
學習方式
按照連接方式,可分為有導師學習神經網絡與無導師學習神經網絡。
有導師學習神經網絡:
外界存在一個教師,對給定的一組輸入,提供應有的輸出(標准答案),學習系統可根據實際輸出與標准答案之間的差值來調整系統參數。
無導師學習神經網絡:
學習系統按照環境提供數據的某些統計規律來調節自身參數。
♦強化學習:
環境對系統輸出結果只給出評價信息(獎或懲),系統通過強化受獎動作來改善自身性能。
學習規則
考察神經元 k 在 n 時刻的輸入和輸出。
輸入: $x_{k}(n)$
實際輸出: $y_{k}(n)$
理應輸出:
$d_{k}(n)$
誤差信號:
$e_{k}(n)=d_{k}(n)-y_{k}(n)$
由誤差信號構造能量函數: $J(\omega)=E\left[\frac{1}{2} \sum_{k} e_{k}^{2}(n)\right]$。其中,$E( .)$為求期望算子。
求解最優化問題: $\min _{\omega} J(\omega)=E\left[\frac{1}{2} \sum_{k} e_{k}^{2}(n)\right]$
得出系統參數: ω
通常情況下用時刻 n 的瞬時值 $J_{n}(\omega)=\frac{1}{2} \sum_{k} e_{k}^{2}(n)$ 代替$J$。
即求解最優化問題: $\min _{\omega} J_{n}(\omega)=\frac{1}{2} \sum_{k} e_{k}^{2}(n)$
由數值迭代算法(如最速下降法、模擬退火算法等),可得 $\Delta \omega_{k j}=\eta e_{k}(n) x_{j}(n)$ 。
其中 $\eta$ 為學習步長。
♦Hebb學習規則
神經學家Hebb提出的學習規則:當某一連接兩端的神經元同步激活(或同為抑制)時,該連接的強度應增強,反之應減弱,數學描述如下:
$\Delta \omega_{k j}=F\left(h_{k}(n), h_{j}(n)\right)$
其中,$h_{k}(n), h_{j}(n)$ 分別為 $\omega_{i j}$ 兩端神經元的狀態。
最常用的一種情況是: $\Delta \omega_{k j}=\eta h_{k}(n) h_{j}(n)$
BP神經網絡(向后傳播算法)
Backpropagation is a common method of teaching artificial neural networks how to perform a given task.
It is a supervised learning method, and is a generalization of the delta rule. It requires a teacher that knows, or can calculate, the desired output for any input in the training set.
Backpropagation requires that the activation function used by the artificial neurons (or "nodes") be differentiable.
反向傳播是教授人工神經網絡如何執行給定任務的一種常用方法。
它是一種監督學習方法,是delta規則的推廣。它要求教師知道或能夠計算出訓練集中任何輸入所需的輸出。
反向傳播要求人工神經元(或“節點”)使用的激活函數是可微的。
對於多層網絡,由於有隱層后學習比較困難,限制了多層網絡的發展,BP算法的出現解決了這一困難。
BP算法的原理
對於多層前饋型網絡,網絡中有兩種信號在流通。
①工作信號,施加的輸入信號向前傳播直到在輸出層產生實際的輸出信號,是輸入信號和權值的函數。
②誤差信號,網絡實際輸出與應有輸出間的差值,它由輸出層開始逐層向后傳播。
BP網絡的過程描述:
假設訓練樣本集為:
$$\left\{\left(x_{p}, t_{p}\right) ; x_{p}=\left(x_{p 1}, \ldots, x_{p N}\right)^{T}, t_{p}=\left(t_{p 1}, \ldots, t_{p M}\right)^{T}, p=1,2, \cdots, \Pi\right\}$$
其中 Π 表示樣本集中樣本個數,$\mathbb{x}_{p}$為輸入向量,$\mathbb{t}_{p}$為輸出向量。
BP網絡主要有兩個階段:
①信號前傳階段

②誤差后傳階段

推導用於多層前饋型網絡學習的BP算法
設在第 n 次迭代中某一層的第 j 個單元的輸出為 $y_{j}(n)$。
當 j 單元所在層為輸出層時,
該單元的誤差信號為 $e_{j}(n)=d_{j}(n)-y_{j}(n)$,定義單元 j 的平方誤差為 $\frac{1}{2} e_{j}^{2}(n)$,則輸出層總的平方誤差的瞬時值為: $\xi(n)=\frac{1}{2} \sum_{j} e_{j}^{2}(n)$
下面就逐個樣本學習的情況來推導BP算法。
如圖,令單元 j 的凈輸入為 $v_{j}(n)=\sum_{i} \omega_{j i}(n) y_{i}(n)$,則 $y_{j}(n)=\varphi_{j}\left(v_{j}(n)\right)$。
求 $\xi(n)$ 對 $\omega_{j i}$ 的梯度
$\begin{aligned} \frac{\partial \xi(n)}{\partial \omega_{j i}} &=\frac{\partial \xi(n)}{\partial e_{j}(n)} \cdot \frac{\partial e_{j}(n)}{\partial y_{j}(n)} \cdot \frac{\partial y_{j}(n)}{\partial v_{j}(n)} \cdot \frac{\partial v_{j}(n)}{\partial \omega_{j i}(n)}=e_{j}(n) \cdot(-1) \cdot \varphi_{j}^{\prime}\left(v_{j}(n)\right) \cdot y_{i}(n) \\ &=-e_{j}(n) \varphi_{j}^{\prime}\left(v_{j}(n)\right) y_{i}(n) \end{aligned}$
權值 $\omega_{j i}$ 的修正量為 $\Delta \omega_{j i}=-\eta \frac{\partial \xi(n)}{\partial \omega_{j i}(n)}=\eta \delta_{j}(n) y_{i}(n)$
其中 ${\delta _j}(n) = - \frac{{\partial \xi (n)}}{{\partial {e_j}(n)}} \cdot \frac{{\partial {e_j}(n)}}{{\partial {y_j}(n)}} \cdot \frac{{\partial {y_j}(n)}}{{\partial {v_j}(n)}} = {e_j}(n){\varphi _j}^\prime ({v_j}(n))$ 稱為局部梯度
當 j 單元所在層為隱層時,
權值${\omega _{ji}}$的修正量為 $${\omega _{ji}} = - \eta \frac{{\partial \xi \left( n \right)}}{{\partial {\omega _{ji}}\left( n \right)}} = \eta {\delta _j}\left( n \right){y_i}\left( n \right)$$
其中,
${\delta _j}(n) = {\varphi _j}^\prime ({v_j}(n))\sum\limits_k {{\delta _k}(n){\omega _{kj}}(n)} $
${\delta _k}(n) = {e_k}(n){\varphi _k}^\prime ({v_k}(n))$
構造多層前向神經網絡
BP神經網絡的優缺點

MATLAB實現
訓練集/測試集產生
1. 導入數據
2. 隨機產生訓練集和測試集
temp = randperm(size(NIR,1));
% 訓練集——50個樣本
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
% 測試集——10個樣本
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2);
BP神經網絡創建、訓練及仿真測試
1. 創建網絡
net = newff(P_train,T_train,9);
2. 設置訓練參數
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
net.trainParam.lr = 0.01;
3. 訓練網絡
net = train(net,P_train,T_train);
4. 仿真測試
性能評價
1. 相對誤差error
error = abs(T_sim - T_test)./T_test;
2. 決定系數R^2
R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));
3. 結果對比
result = [T_test' T_sim' error']

畫圖
figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真實值','預測值')
xlabel('預測樣本')
ylabel('辛烷值')
string = {'測試集辛烷值含量預測結果對比';['R^2=' num2str(R2)]};
title(string)
