[英]Learning XOR with deep neural network
我是深度學習的新手,所以我從最簡單的測試用例開始:XOR學習。
在G&W發行的新版《數字圖像處理》中,作者給出了一個通過三層深度網絡進行XOR學習的示例:輸入,隱藏和輸出(每一層有2個神經元),以及一個S形作為網絡激活功能。
對於網絡的信息化,他們說:“我們使用alpha = 1.0,這是初始的高斯隨機權重集,均值為零, 標准差為0.02 ”(alpha是梯度下降學習率)。 培訓有4個帶有標簽的示例:
X = [1 -1 -1 1;1 -1 1 -1];%MATLAB syntax
R = [1 1 0 0;0 0 1 1];%Labels
我編寫了以下MATLAB代碼來實現網絡學習過程:
function output = neuralNet4e(input,specs)
NumPat = size(input.X,2);%Number of patterns
NumLayers = length(specs.W);
for kEpoch = 1:specs.NumEpochs
% forward pass
A = cell(NumLayers,1);%Output of each neuron in each layer
derZ = cell(NumLayers,1);%Activation function derivative on each neuron dot product
A{1} = input.X;
for kLayer = 2:NumLayers
B = repmat(specs.b{kLayer},1,NumPat);
Z = specs.W{kLayer} * A{kLayer - 1} + B;
derZ{kLayer} = specs.activationFuncDerive(Z);
A{kLayer} = specs.activationFunc(Z);
end
% backprop
D = cell(NumLayers,1);
D{NumLayers} = (A{NumLayers} - input.R).* derZ{NumLayers};
for kLayer = (NumLayers-1):-1:2
D{kLayer} = (specs.W{kLayer + 1}' * D{kLayer + 1}).*derZ{kLayer};
end
%Update weights and biases
for kLayer = 2:NumLayers
specs.W{kLayer} = specs.W{kLayer} - specs.alpha * D{kLayer} * A{kLayer - 1}' ;
specs.b{kLayer} = specs.b{kLayer} - specs.alpha * sum(D{kLayer},2);
end
end
output.A = A;
end
現在,當我使用其設置時(即,std = 0.02的權重初始化)
clearvars
s = 0.02;
input.X = [1 -1 -1 1;1 -1 1 -1];
input.R = [1 1 0 0;0 0 1 1];
specs.W = {[];s * randn(2,2);s * randn(2,2)};
specs.b = {[];s * randn(2,1);s * randn(2,1)};
specs.activationFunc = @(x) 1./(1 + exp(-x));
specs.activationFuncDerive = @(x) exp(-x)./(1 + exp(-x)).^2;
specs.NumEpochs = 1e4;
specs.alpha = 1;
output = neuralNet4e(input,specs);
我得到(在10000次練習之后)輸出了網絡的最終輸出output.A{3} = [0.5 0.5 0.5 0.5;0.5 0.5 0.5 0.5]
但是當我改變s = 0.02;
到s = 1;
我得到了output.A{3} = [0.989 0.987 0.010 0.010;0.010 0.012 0.0.98 0.98]
。
是否可以用s = 0.02;獲得這些結果? 我在代碼中做錯了什么? 還是0.02的標准偏差只是一個錯字?
根據您的代碼,我看不到任何錯誤。 據我所知,你得到的結果,
[0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5]
這是過度擬合的典型結果。 發生這種情況的原因很多,例如時期太多,學習率太大,樣本數據太小等等。
在您的示例中,s = 0.02限制了隨機權重和偏差的值。 將其更改為s = 1將使隨機值保持不變/不按比例縮放。
為了使s = 0.02有效,您可以嘗試減少時期數或降低alpha。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.