深度學習 16. 反向傳遞算法最簡單的理解與提高,BP算法,Backpropagation, 自己的心得。

本文爲原創文章轉載必須註明本文出處以及附上 本文地址超鏈接  以及 博主博客地址http://blog.csdn.NET/qq_20259459  和 作者郵箱[email protected] )。

(如果喜歡本文,歡迎大家關注我的博客或者動手點個贊,對文章有建議和想法的歡迎郵件聯繫我,如有問題需要幫助歡迎留下評論我會及時給出答覆)



在開始本文之前我想先介紹幾個易混淆的定義:

監督學習:在Objective function中如果存在監督的信號,則該學習爲監督學習。

梯度下降:利用Objective function作爲期望值從而得到error,再尋找最優結果。

反向傳遞:基於梯度下降的一種優化算法


在BP中我們可能用到監督學習也有可能不是監督學習,並且BP算法並不是等價於梯度下降算法,BP基於GD算法但是同時具備多種優化算法。

BP算法是目前機器學習最最基礎和重要的算法。



BP算法分爲幾個步驟:

首先我們擁有一個數據集:{X,Y}這裏可以是,X是data,Y是label。也可以是X是數值,Y是目標函數。也是可以是加上noise的數據和目標值。

1. 選擇一個X。

2. Forward Pass: X將經過整個訓練網絡(激活),得到input,hidden,output。

3. Error Computation: 我們將最終值(output)與Y相減得到error值。

4. Compute Weight Change: 通過已有error可以計算出整個網絡的權值更變,得到input',hidden',output'。這一步我們將縮小全局錯誤值。

5. Update Network: 更新整個網絡數值,得到新的input。

6. Repeat 2-5: 重複上面步驟,當error小於我們設定的閥值時將停止,並選擇新的X重複步驟1-6。



---------------------------------------分割線-------------------------------------------------------


對於BP的推導,很多人都會覺得很難理解和運用,其實就我而言BP並沒有那麼的複雜,其思路是很簡單的。

下面我將用最簡單的方法介紹BP的推導過程(自己以前學習時的筆記,如有不清晰見諒):


1. 首先是forward pass的部分,我們不需要一個一個node的去看,也不用去看整個網絡,這需要看一個node,僅僅一個就能說明所有:


這裏我們可以看到對於一個forward pass的算法我們計算過程如圖所示,這個應該所有人都理解吧。Y是output,Y計算也是非常簡單的,而這裏的Y是可以對應於任何的forward pass的output的,比如hidden layer output, output layer output。因此我們只要記住這一個公式就好了。



2. Error計算

我們在推導BP算法的時候用E = D - Y來計算error。 這裏D是預期值(目標函數),Y是你的網絡的訓練結果(output)。



3. Backward pass的部分,如同forward pass的部分一樣我們並不需要每一個都去記憶,只需要記住一個node的計算即可:


這裏我們可以看清楚我們往回更新的一直都是爲了爲每個node更新它的錯誤(error)值。這裏包括了input的兩個node也要更新。



4. Weight Update: 這裏我們根據每個node求得的error值來算出新的weight,新的weight'=weight+delta weight。


這裏我們可以看清楚 delta weight的等價式子有兩個,這裏其實數學如果很好且有神經網絡基礎的人是很容易看明白他們之間的等價關係的。我在這裏先解釋下第一個式子這個是通過學習率和求導來計算delta的大小的,這個也是學習的最本質的內容,就是計算錯誤。

其次再說明一下第二個式子,第二個式子是個等式,因爲我們化簡之後就會得到一樣的結果。而我們在學習BP算法 的時候肯定也必須要了解第二個式子是如何化解的,那麼我們爲什麼需要第二個式子,因爲第二個式子中就是梯度下降法。



5. 梯度下降的推導(重點):

1. 接下來的推導就是BP算法大家最容易混淆的地方,我們的舉例仍然是針對數據集:{X,Y}來說的。

X是我們現有數據,那麼網絡的input signal就是:

這樣我們就得到了實際網絡訓練時的input——Z. 同時我們將hidden signal命名爲H。


2. 在學習BP算法推導的時候,我們通常分別用hidden to input(H-I)和output to hidden(O-H)兩個部分去推導上面那個GD的式子在不同階段的結果。但是並不需要記那麼多,下面就是GD的推導式:


這裏的input指的是在針對O-H和H-I兩個步驟都是用原來網絡中前一層值來計算,這裏也就是下面這兩個式子:


hj表示O-H,ih表示H-I,W是權值,Z是input signal,H是hidden signal。

寫出這個式子的目的是爲了可以進行簡化操作以獲得結果。



針對上面式子中每一個部分是這樣的:

1. 首先是delta error的計算,利用MSE function來計算:



2. 然後就是每一部分的化簡:


這裏H和Z的求法我上面已經寫出了,請仔細查看。


3. 這樣我們就可以得到式子1和式子2的化簡結果:


可以看出這個是非常簡單的結果式子。


4. 雖然上圖所示的結果已經是理論上的delta weight了,但是我們知道在使用MSE來獲得最小值的時候會有local minima MSE的問題出現,爲了解決這個問題,BP算法中加入了動量這一個方法:


說簡單點就是給學習一個動量,讓學習過程不會再區域最低值那裏停下來,從而獲得全局最小值(Global minima MSE).



---------------------------------------分割線-------------------------------------------------------


自此BP的理論介紹已經完全結束了,接下來一段簡單的根據理論編寫的代碼(BP算法在MLP中的運用),大家可以任意修改裏面的參數進行訓練。通過對代碼的理解也會對BP的理論知識的理解有很好的幫助,下面就是示例代碼:

% BACKPROPAGATION ALGORITHM: ONLY FOR SINGLE HIDDEN LAYER
%% 
% 定義pattern 這裏的pattern在自己操作的時候是在cross-space中的對應的點
pattern=[0.1 0.1 0.1 
0.1 .95  .95 
.95  0.1 .95
.95  .95 0.1]; 

%% 初始化參數
eta = 0.1;				% Learning rate
alpha = 0.8;			% Momentum
tol = 0.001;			% Error tolerance
Q = 4;       			% Total no. of the patterns to be input
n = 2; q = 2; p = 1;	% Architecture 網絡結構 n-q-p

%% 定義weight相關函數
Wih = 2 * rand(n+1,q) - 1;	% Input-hidden weight matrix
Whj = 2 * rand(q+1,p) - 1;	% Hidden-output weight matrix
DeltaWih = zeros(n+1,q);	% Weight change matrices
DeltaWhj = zeros(q+1,p);
DeltaWihOld = zeros(n+1,q);
DeltaWhjOld = zeros(q+1,p);

%% 網絡參數
Si = [ones(Q,1) pattern(:,1:2)];	% Input signals
D = pattern(:,3);						% Desired values

Sh = [1 zeros(1,q)];		% Hidden neuron signals 
Sy = zeros(1,p);			% Output neuron signals
deltaO = zeros(1,p);		% Error-slope product at output
deltaH = zeros(1,q+1);	% Error-slope product at hidden
sumerror = 2*tol;			% To get in to the loop

%% weight updata (BP algorithm)
while (sumerror > tol)	% Iterate
   for k = 1:Q
      Zh = Si(k,:) * Wih;				% Hidden activations
      Sh = [1 1./(1 + exp(-Zh))];       % Hidden signals
      Yj = Sh * Whj;					% Output activations
      Sy = 1./(1 + exp(-Yj));			% Output signals
      Ek = D(k) - Sy;					% Error vector
      deltaO = Ek .* Sy .* (1 - Sy);    % Delta output求導過程,激活函數是sigmoid
      for h = 1:q+1                     
         DeltaWhj(h,:) = deltaO * Sh(h);% Delta W: hidden-output
      end
      for h = 2:q+1							 % Delta hidden
         deltaH(h) = (deltaO * Whj(h,:)') * Sh(h) * (1 - Sh(h));
      end 
      for i = 1:n+1							 % Delta W: input-hidden
         DeltaWih(i,:) = deltaH(2:q+1) * Si(k,i);
      end
      Wih = Wih + eta * DeltaWih + alpha * DeltaWihOld;
      Whj = Whj + eta * DeltaWhj + alpha * DeltaWhjOld;      
      DeltaWihOld = DeltaWih;				 % Store changes
      DeltaWhjOld = DeltaWhj;
      sumerror = sumerror + sum(Ek.^2); % Compute error
   end    
   sumerror	% Print epoch error
end  


這裏可以改得參數有很多,也可以自己添加,比如添加epoch,BN也可以根據這個簡單的代碼來實現自己的自編碼的程序(AE),大家隨心改動即可。


同時我們知道BP算法可以實現function approximation和classification兩個功能。這裏是實現這兩個功能的要求:


根據這個大家同樣可以通過修改上面代碼的output activation function從現有的sigmoid變成linear function來實現函數趨近的功能。



通過代碼和理論相互結果相信大家就會非常紮實的掌握BP算法所有的知識,且對調參也會有好的幫助。



本文爲原創文章轉載必須註明本文出處以及附上 本文地址超鏈接  以及 博主博客地址http://blog.csdn.NET/qq_20259459  和 作者郵箱[email protected] )。

(如果喜歡本文,歡迎大家關注我的博客或者動手點個贊,對文章有建議和想法的歡迎郵件聯繫我,如有問題需要幫助歡迎留下評論我會及時給出答覆)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章