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;  

LMS Adaptive Filters



clear;
t=0:99;
xs=10*sin(0.5*t);
figure(1);
subplot(3,2,1);
plot(t,xs);grid;
axis([t(1) t(end) -20 20])
ylabel('幅值');
title('it{原信號}');
% noise
randn('state',sum(100*clock));
xn=randn(1,100);
subplot(3,2,3);
plot(t,xn);grid;
axis([t(1) t(end) -20 20])
ylabel('幅值');
xlabel('time');
title('it{noise}');
%input
x = xs+xn;
subplot(3,2,5);
plot(t,x);grid;
axis([t(1) t(end) -20 20])
ylabel('幅值');
xlabel('time');
title('it{經過干擾的input}');

rho_max = max(eig(x*x.'));   
mu = rand()*(1/rho_max)   ;    % 收斂因子 0 < mu < 1/rho
M=20;
itr =100;
en = zeros(itr,1);             % 誤差序列
W  = zeros(M,itr);
dn = xs';                      %估計輸入函數
% 迭代計算
for k = M:itr                  % 第k次迭代
    dx = x(k:-1:k-M+1);        % M個delay的輸入
    y = W(:,k-1)'* dx';        % 濾波器輸出
    en(k) = dn(k) - y ;        % 第k次迭代誤差 (目標使en越來越小)
    W(:,k) = W(:,k-1) + 2*mu*en(k)*dx';
end

yn = inf * ones(size(x));
for k = M:length(x)
    xx = x(k:-1:k-M+1);
    yn(k) = W(:,end)'* xx';
end

% yn輸出訊號
subplot(3,2,2);
plot(t,yn);grid;
axis([t(1) t(end) -20 20])
ylabel('幅值');
xlabel('time');
title('it{Adaptive filter}');

subplot(3,2,4);
plot(t,xs,'b',t,yn,'r',t,xs-yn,'g');grid;
axis([t(1) t(end) -20 20])
ylabel('幅值');
xlabel('time');
title('it{compare}');

subplot(3,2,6);
plot(t,en);grid;
ylabel('幅值');
xlabel('time');
title('error en');

Self-Organizing Map


SOM可以將N維(N-dimension)的資料映射到2維(2-dimension)的空間上(如上圖所示)並且維持輸入資料中的拓撲(topology)特性.將資料映射到2 維空間時則可以使用視覺化(visualization)的方式呈現, 以方便後續的觀察及分析.最常見的就是把輸入color data分群藉此觀察輸入color的分佈情形


上圖左為一個初使化的隨機顏色分布矩陣,隨著輸入資料SOM漸漸的秀出了輸入資料的分佈情形

SOM 演算法
1. 初始化(initialization)
2. 輸入資料集(dataset)
3. 從輸入資料集挑選一個資料並尋找x-w最接近的神經元為Best Matching Unit (BMU)
4. 更新BMU神經元的權重及其"鄰近"神經元
5. 重複步驟3~4, 直到結束


其中
假設x輸入為V1~Vn,權重w為W1~Wn
尋找最接近的神經元可用以下公式表示
需要更新的"鄰近"神經元的鄰近半徑定義如下
σ0可預設為圖形尺寸的1/2,t為當下第幾次iteration,λ為iteration的總數可見其半徑會隨時間增加逐漸由size/2減少到1,示意圖如下
更新BMU神經元的權重公式
其中L為learning rate表示如下
L0可取0.1,t為當下第幾次iteration,λ為iteration的總數可見L會隨時間增加而由0.1下降至接近0
Θ為一個墨西哥帽函數表示離BMU越遠的鄰近神經元更新影響越小
dist為當下的鄰近神經元和BMU距離,σ為上述鄰近半徑函數



有一個二維的聚類問題,其範例資料共有10筆,且在二維樣本空間上的分佈如圖所示:

            x 1     x 2
D1      -0.9    -0.8
D2     -0.8    0.6
D3     0.9     0.6
D4     0.7     -0.4
D5     -0.2    0.2
D6     -0.7    -0.6
D7     -0.9    0.8
D8     0.7     0.6
D9     0.8     -0.8
D10   0.1      -0.2

以一個輸出層為3×3個單元之SOM網路解此一問題
先隨機給定每一個輸出層單元加權值

載入第一個訓練範例D1,計算後得知輸出層處理單元的優勝神經元為 9,調整單元 9 及鄰近單元 5, 6, 8之連結加權值矩陣。
|123|
|456| 中9的鄰近為5,6,8
|789|












載入第二個訓練範例,計算後得知輸出層處理單元的優勝神經元為 4,調整優勝單元 4 及鄰近單元 1, 5, 7之連結加權值矩陣。












反覆載入上述十個訓練範例 (如:50個學習循環)可知:
輸出單元 1 代表左上角聚類特徵;單元 3 代表右上角聚類特徵;單元 5 代表中間聚類特徵;單元 7 代表左下角聚類特徵;單元 9 代表右下角聚類特徵。
其餘輸出單元不具任何聚類的特徵。
















ˇ

下圖左為輸出的3維加權值一開始的隨機初始化狀況,隨著訓練過程網子會逐漸打開線與線不會有重疊或交叉情形
然而,若相關參數設定得不恰當,則訓練過程中,很可能發生網子打結或纏繞在一起的現像

例如:如果學習速率在整個訓練過程中沒有適時地下降,則很可能會在某次疊代時,原本網子已張開,但因為學習速率還是很大,而發生網子又再度纏繞的現像。


底下是matlab代碼


clear;
width  = 50;
height = 50;
numinput = 500;
data = rand(height,width,3);
figure(1);
imshow(data);
red = [1,0,1];green = [0,1,0];dk_green = [0,0.5,0.25];blue = [0,0,1];dk_blue = [0,0,0.5];yellow = [1,1,0.2];orange = [1,0.4,0.25];purple = [1,0,1];
color = [red;green;dk_green;blue;yellow;orange;purple];
sample = rand(numinput,1);
inputdata = color(ceil(sample*7),:);
m_dMapRadius = max(width, height)/2;  %最大鄰近半徑σ
m_dTimeConstant = numinput/log(m_dMapRadius); %最大時間總數λ
for i=1:numinput;
    x=inputdata(i,:);
    x = reshape(x,1,1,3);
    bestwj=0;
    bestwk=0;
    minerror=[1,1,1];
    m_dNeighbourhoodRadius = m_dMapRadius * exp(-i/m_dTimeConstant);   %鄰近半徑σ
    m_dLearningRate = 0.1 * exp(-i/m_dTimeConstant);                       %Learning rate
    for j = 1:width
        for k = 1:height        
               error= x-data(j,k,:);
                error = reshape(error,1,3);
               dist = norm(error);
               if (dist < norm(minerror)) 
                  minerror = error;
                   bestwj=j;
                   bestwk=k;
              end
        end
    for j = max(1,floor(bestwj-m_dNeighbourhoodRadius)):min(height,floor(bestwj+m_dNeighbourhoodRadius))
        for k = max(1,floor(bestwk-m_dNeighbourhoodRadius)):min(width,floor(bestwk+m_dNeighbourhoodRadius))
            d2 = (j - bestwj)^2+(k-bestwk)^2;                    %dist^2
            theda = exp(-d2/(2*m_dNeighbourhoodRadius^2));       %墨西哥帽函數Θ
            data(j,k,:) = data(j,k,:) + theda*m_dLearningRate.*(x-data(j,k,:));   %更新權重函數         
        end
    end
    end
end
figure(2);
imshow(data);

2012年4月19日 星期四

中文終端機

sudo apt-get install zhcon

/etc/zhcon.conf

defaultencode = big5
執行時
zhcon --utf8

2012年4月18日 星期三

bootstrap無法執行

sudo apt-get install autoconf
sudo apt-get install libtool
sudo apt-get install libssl-dev
sudo apt-get install libpam0g-dev
sudo apt-get install libx11-dev
sudo apt-get install libxfixes-dev
sudo sh ./bootstrap
sudo sh ./configure
sudo make
sudo make install
cd /etc/xrdp
sudo sh ./xrdp.sh start

遠端ubuntu 11.10

sudo apt-get install gnome-shell gnome-session-fallback

vi /etc/xrdp/startwm.sh
加這行==>gnome-session-fallback
註解==>#. /etc/X11/Xsession

待機回覆時自動聯網

sudo lsmod 找出網卡MODUAL
例如eeepc 就是 atl2(有線),ath5(無線)

sudo nano /etc/pm/config.d/unload_modules
若沒有這檔案就新增
加入
SUSPEND_MODULES="$SUSPEND_MODULES atl2"

重開即可