【MATLAB深度學習】單層神經網絡
單層神經網絡
在神經網絡中,當隱藏節點具有線性激活函數時,隱含層將無效化。監督學習的訓練,正是一個修正模型以減少模型輸出與標準輸出之間的誤差的過程。神經網絡以權重形式存儲信息。
根據給定信息修改權重的系統方法被稱為學習規則。
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深度學習】單層神經網絡