BPN架構分為正向傳遞和反向傳遞
正向傳遞時:
假設BPN的隱藏層非線性輸出轉換函數為雙彎曲函數(sigmoid function)
計算推論輸出向量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)網路修剪。即網路經過學習後,可能有部份連結其加權值的絕對值很小,此時可將其刪除,再繼續學習。有研究指出如此不僅減少執行時間,且網路的精度也更高。
減緩現象與跳出現象:
在接近曲面最低點時,坡度可能逐漸減小,因而減少加權值的改變量,最後近乎停滯,稱減緩現象。如果誤差函數曲面存在有峽谷,在接近峽谷時,坡度可能很大,使得加權值的改變量太大而跳到峽谷的另一邊,如此在峽谷兩邊來回跳動,反而使誤差函數值加大,稱跳出現象。稱減緩現象需加大學習速率,跳出現象需減少學習速率
如果訓練範例事先未加以隨機混合,而將各類的訓練範例依序集中,可能使網路學了後面分類規則時,卻遺忘了前面分類規則,如此下去始終無法將各類分類規則均正確學習。
解決方法:
加權值更新採批次學習
將訓練範例加以隨機混合
假設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;
沒有留言:
張貼留言