1. 程式人生 > >【MATLAB深度學習】單層神經網絡

【MATLAB深度學習】單層神經網絡

avg plot poc 定義 方差 esc 技術 mat 函數

單層神經網絡

  在神經網絡中,當隱藏節點具有線性激活函數時,隱含層將無效化。監督學習的訓練,正是一個修正模型以減少模型輸出與標準輸出之間的誤差的過程。神經網絡以權重形式存儲信息。

  根據給定信息修改權重的系統方法被稱為學習規則。

1.delta規則

  也被稱為Adaline規則或者Widrow-Hoff規則,是一種梯度下降的數值方法。

技術分享圖片

  這一規則的基本思想是,權重依據輸出節點誤差和輸入節點值成比例地調整。

技術分享圖片

2.更新權重的策略

  SGD(Stochastic Gradient Descent 隨機梯度下降):依據每個訓練數據計算誤差,並立即調整權重。

技術分享圖片

  Batch:使用訓練數據的所有誤差計算各個權重更新值,然後使用權重更新的平均值調整權重。

技術分享圖片

  Mini Batch:SGD方法和Batch方法的混合。它選擇訓練數據集的一部分,並將它們用於Batch方法訓練,即用平均權重更新來訓練網絡。若數據點的數量選擇得當,Mini Batch可以兼顧SGD的速度和Batch方法的穩定性。

3.delta規則的SGD方法實現(MATLAB)

  示例如下圖所示,激活函數為Sigmoid函數,訓練數據集為{([0,0,1],0),([0,1,1],0),([1,0,1],1),([1,1,1],1)}。

技術分享圖片

  先定義Sigmoid函數:

function y = Sigmoid(x)
  y = 1 / (1 + exp(-x));
end

  定義SGD方法:

function W = DeltaSGD(W, X, D)
% 以神經網絡的權重和訓練數據作為輸入,返回訓練後的權重
% W是傳遞權重的參數,X和D分別為傳遞訓練數據的輸入和標準輸出的參數
  alpha = 0.9;
  
  N = 4;  
  for k = 1:N
    x = X(k, :)‘;
    d = D(k);

    v = W*x;
    y = Sigmoid(v);
    
    e     = d - y;  
    delta = y*(1-y)*e;
  
    dW = alpha*delta*x;     % delta rule    
    
    W(1) = W(1) + dW(1); 
    W(2) = W(2) + dW(2);
    W(3) = W(3) + dW(3);    
  end
end

  測試一下效果:

clear all
           
X = [ 0 0 1;
      0 1 1;
      1 0 1;
      1 1 1;
    ];

D = [ 0
      0
      1
      1
    ];
      
W = 2*rand(1, 3) - 1;

for epoch = 1:10000           % train
  W = DeltaSGD(W, X, D);
end

N = 4;                        % inference
for k = 1:N
  x = X(k, :)‘;
  v = W*x;
  y = Sigmoid(v)
end

  得到結果為 0.0102 ,0.0083 ,0.9932 ,0.9917 。

4.delta規則的Batch實現(MATLAB)

  定義Batch函數:

function W = DeltaBatch(W, X, D)
  alpha = 0.9;
 
  dWsum = zeros(3, 1);
   
  N = 4;  
  for k = 1:N
    x = X(k, :)‘;
    d = D(k);
                        
    v = W*x;
    y = Sigmoid(v);
    
    e     = d - y;    
    delta = y*(1-y)*e;
    
    dW = alpha*delta*x;
    
    dWsum = dWsum + dW;
  end
  dWavg = dWsum / N;
  
  W(1) = W(1) + dWavg(1);
  W(2) = W(2) + dWavg(2);
  W(3) = W(3) + dWavg(3);
end

  Batch方法的平均性特性使得訓練數據的敏感性降低。速度比SGD慢。

  測試該函數:

clear all

X = [ 0 0 1;
      0 1 1;
      1 0 1;
      1 1 1;
    ];

D = [ 0
      0
      1
      1
    ];
      
W = 2*rand(1, 3) - 1;

for epoch = 1:40000 
  W = DeltaBatch(W, X, D); 
end

N = 4;
for k = 1:N
  x = X(k, :)‘;
  v = W*x;
  y = Sigmoid(v)
end

  輸出的結果為 0.0102,0.0083,0.9932,0.9917。

5.SGD和Batch的比較

  比較兩種方法的平均誤差。將訓練數據輸入到神經網絡中,並計算出均方差(E1,E2)

clear all
           
X = [ 0 0 1;
      0 1 1;
      1 0 1;
      1 1 1;
    ];

D = [ 0
      0
      1
      1
    ];


E1 = zeros(1000, 1);
E2 = zeros(1000, 1);

W1 = 2*rand(1, 3) - 1;
W2 = W1;

for epoch = 1:1000           % train
  W1 = DeltaSGD(W1, X, D);
  W2 = DeltaBatch(W2, X, D);

  es1 = 0;
  es2 = 0;
  N   = 4;
  for k = 1:N
    x = X(k, :)‘;
    d = D(k);
    
    v1  = W1*x;
    y1  = Sigmoid(v1);
    es1 = es1 + (d - y1)^2;
    
    v2  = W2*x;
    y2  = Sigmoid(v2);
    es2 = es2 + (d - y2)^2;
  end
  E1(epoch) = es1 / N;
  E2(epoch) = es2 / N;
end

plot(E1, ‘r‘)
hold on
plot(E2, ‘b:‘)
xlabel(‘Epoch‘)
ylabel(‘Average of Training error‘)
legend(‘SGD‘, ‘Batch‘)

  結果如下:

技術分享圖片

6.單層神經網絡的局限性

  我們知道,單層神經網絡無法擬合異或。下面測試一下,輸入改成異或數據,DeltaXOR與DeltaSGD代碼一樣。

clear all
           
X = [ 0 0 1;
      0 1 1;
      1 0 1;
      1 1 1;
    ];

D = [ 0
      1
      1
      0
    ];
      
W = 2*rand(1, 3) - 1;

for epoch = 1:40000           % train
  W = DeltaXOR(W, X, D);
end

N = 4;                        % inference
for k = 1:N
  x = X(k, :)‘;
  v = W*x;
  y = Sigmoid(v)
end

  結果為 0.5297,0.5000,0.4703,0.4409。這個結果明顯存在問題。

  單層神經網絡只能解決線性可分問題,這是因為單層神經網絡是一種將輸入數據空間線性劃分的模型。為克服單層神經網絡的這種局限,出現了多層神經網絡。

【MATLAB深度學習】單層神經網絡