手把手教你用matlab做深度学习(三)-SGD
前面已经举了一个CNN例子讲解matlab实现深度学习,现在来从细节上面讲解:
首先SGD详细原理网上一大堆,自己可以百度一下,不懂的一起可以交流一下,现在这里也会给出部分原理和例子实现。
这里考虑一个三个输入,一个输出的神经网络,sigmoid 函数作为**函数,图形如下:
给出四个训练数据点作为训练,如下表:
更新权值公式如下:
这个公式用matlab实现如下:
function W = DeltaSGD(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
sigmoid函数如下:
matlab 实现如下:
function y = Sigmoid(x)
y = 1 / (1 + exp(-x));
end
最后给出main函数代码:
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')
给出训练误差图形如下:
现在,可以测试效果怎么用,测试程序如下:
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
输出结果为: