最近接触的文献是关于SGD(随机梯度下降法)的,需要了解SGD细节和思想的可以参考这篇文章:https://blog.csdn.net/pengjian444/article/details/71075544,并且有python实现的代码,亲测跑的通
简单的思想视频教程建议看这个吧,感觉讲的不错 https://www.imooc.com/video/21741
这里记录下自己学习的用matlab实现的过程,代码是copy来的,but原文链接找不到了:( 作为第一次接触matlab,遇到一些困惑,这里只简单的做个总结
matlab比较陌生的话这里说一下项目结构
我自己是熟悉其他语言但是没接触过matlab,刚开始遇到的问题是不知道函数在哪里写,贴一下matlab界面
点击菜单栏(左上第三个“新建”的箭头)新建一个函数,代码内容为:
function y = Sigmoid(x)
y = 1 / (1 + exp(-x));
end
再新建一个函数,这里的x=X(k,:)是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
然后新建一个脚本,SGD的思想可以很容易查找到,这里使用一组简单的数据实现,其中X是训练集数据,D是训练集结果
维度1 | 维度2 | 维度3 | 结果 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 |
使用matlab是这样:
X = [ 0 0 1;0 1 1;1 0 1; 1 1 1;];
D = [ 0 0 1 1];
因此脚本代码为:
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);
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')
代码原本是对比SGD和Batch的性能并作图,这里因为没有实现Batch的代码细节所以我删除了W2的部分(其他数据没改,目的只是实现SGD)
运行——结果如图
对代码理解不深,但是成功的实现了并且对SGD的思想有个更深入的了解,matlab语法较为欠缺,需要不断学习和补足
欢迎一起学习进步!