2012年4月21日 星期六

BPN(Back Propagation Network)


BPN架構分為正向傳遞和反向傳遞

正向傳遞時:

假設BPN的隱藏層非線性輸出轉換函數為雙彎曲函數(sigmoid function)







先計算隱藏層輸出向量H







計算推論輸出向量Y








反向傳遞時 :

計算輸出層差距量Δy
求解出誤差函數Err = (T-Y)
使用最速梯度下降法Δ = F’(Y) * Err
因為Y的轉換函數為Y
(直接就是輸出了沒有再一個sigmoid function所以可視為經過一個Out = f(Y) = Y的函數,
故Out'(Y) = 1)






計算隱藏層差距量Δh
Δh = F’(net) * (W * Δy)
sigmoid function微分後為 f*(1-f)



更新公式




隱藏層處理單元數目問題;
通常隱藏層處理單元數目愈多收歛愈慢,但可達到更小的誤差值,特別是訓練範例的誤差。但是,超過一定數目之後,再增加則對降低測試範例誤差幾乎沒有幫助,徒然增加執行時間。隱藏層處理單元數目太少,不足以反映輸入變數間的交互作用,因而有較大的誤差。
隱藏層處理單元數目越多,雖然可以達到更小的誤差值,但因網路較複雜,因而收歛較慢。

隱藏層處理單元數目的選取原則:
隱藏層處理單元數目 = (輸入層單元數+輸出層單元數)/2
隱藏層處理單元數目 = (輸入層單元數×輸出層單元數)^1/2
問題的雜訊高,隱藏層處理單元數目 宜少
問題的複雜性高,隱藏層處理單元數目宜多
測試範例誤差遠高於訓練範例誤差,隱藏層處理單元數目宜減少;反之,宜增加。

隱藏層層數:
通常隱藏層的層數為一層到二層時有最好的收歛性質,太多層或是太少層其收歛結果均較差。更多的隱藏層反而使網路過度複雜,造成更多局部最佳值,使得在修正網路加權值時更易掉入一個局部最佳值,而無法收歛。在用倒傳遞網路解問題時,一定要先用無隱藏層架構作作看,如果其精確性比有隱藏層者為佳,則此問題必不適用倒傳遞網路解。這是因為無隱藏層架構其效果接近統計學上一些有線性假設的方法,因此無理由用一個複雜的網路去取代一個有明確公式的統計學解答。


學習速率n:
依據經驗取0.5,或0.1到1.0的值作為學習速率的值,大都可以得到良好的收歛性

局部最佳化問題:

由於倒傳遞網路是基於最速梯度法,因此不可避免地會受到局部最佳化的困擾。

可利用以下方式解決:
1)選擇一個新的初始加權值亂數種子
2)加上一隨機擾動量,以跳出局部最佳值
3)網路修剪。即網路經過學習後,可能有部份連結其加權值的絕對值很小,此時可將其刪除,再繼續學習。有研究指出如此不僅減少執行時間,且網路的精度也更高。

減緩現象與跳出現象:

在接近曲面最低點時,坡度可能逐漸減小,因而減少加權值的改變量,最後近乎停滯,稱減緩現象。如果誤差函數曲面存在有峽谷,在接近峽谷時,坡度可能很大,使得加權值的改變量太大而跳到峽谷的另一邊,如此在峽谷兩邊來回跳動,反而使誤差函數值加大,稱跳出現象。稱減緩現象需加大學習速率,跳出現象需減少學習速率


如果訓練範例事先未加以隨機混合,而將各類的訓練範例依序集中,可能使網路學了後面分類規則時,卻遺忘了前面分類規則,如此下去始終無法將各類分類規則均正確學習。
解決方法:
加權值更新採批次學習
將訓練範例加以隨機混合





clc;  
close all;   
clear all;  
  
x = [-2 : 0.1 : 2];   
z = 1 + sin((pi / 4) * 4 * x);  %期望輸出函數 
plot(x , z , 'g'); 
  
[featureNum , sampleNum] = size(x); 
inputNum = featureNum; %輸入維度=1
middleNum = 3; %Hidden Layer的神經元數目  
outputNum = 1; %Output Layer的個數  
  
%初始化  
weight2 = rand(outputNum , middleNum) ; % Output Layer W  
weight1 = rand(middleNum , inputNum);   % Hidden Layer W
threshold2 = rand(outputNum , 1) ;      %Output Layer theda
threshold1 = rand(middleNum , 1) ;      % Hidden Layer theda
  
runCount = 0;   
sumMSE = 1; %總均方差 
minError = 1e-5; %可容忍的最大誤差  
assistS1 = zeros(middleNum , middleNum); %
assistS2 = zeros(outputNum , outputNum); %  
afa = 0.1; % Learning rate  
  
while(runCount < 10000 & sumMSE > minError)  
    sumMSE = 0; %每次計算前歸零 
    for i = 1 : sampleNum   
        netMiddle = weight1 * x(: , i) + threshold1; %計算Hidden Layer的output  
        netMiddle = 1 ./ (1 + exp(-netMiddle)); %假設Hidden Layer的output經過logistic函数  
        netOutput = weight2 * netMiddle + threshold2; %計算Output Layer的 output
        e = z(i) - netOutput; %計算誤差
        
        assistS1 = diag((1 - netMiddle) .* netMiddle);  
        assistS2 = diag(ones(size(netOutput)));  
        s2 = -2 * assistS2 * e; %計算s2
        s1 = assistS1 * weight2' * s2; %逆向計算s1  
          
        weight2 = weight2 - afa * s2 * netMiddle'; % update
        threshold2 = threshold2 - afa * s2; % 
        weight1 = weight1 - afa * s1 * x(: , i)'; %  
        threshold1 = threshold1 - afa * s1; % 
        sumMSE = sumMSE + e * e;  
    end  
    sumMSE = sqrt(sumMSE) / sampleNum;  
    runCount = runCount + 1;  
end  
y = zeros(size(x));   
for i = 1 : length(x)  
    netMiddle = weight1 * x(: , i) + threshold1;  
    netMiddle = 1 ./ (1 + exp(-netMiddle));  
    y(: , i) = weight2 * netMiddle + threshold2;  
end    
hold on; 
plot(x , y , 'r');   
legend('期望輸出','實際輸出');  
hold off;  

沒有留言:

張貼留言