学习记录:使用matlab初步实现SGD(随机梯度下降法)

【介绍】

最近接触的文献是关于SGD(随机梯度下降法)的,需要了解SGD细节和思想的可以参考这篇文章:https://blog.csdn.net/pengjian444/article/details/71075544,并且有python实现的代码,亲测跑的通

简单的思想视频教程建议看这个吧,感觉讲的不错 https://www.imooc.com/video/21741

这里记录下自己学习的用matlab实现的过程,代码是copy来的,but原文链接找不到了:( 作为第一次接触matlab,遇到一些困惑,这里只简单的做个总结

 

【项目结构】

matlab比较陌生的话这里说一下项目结构

  • DeltaSGD.m
  • Sigmoid.m
  • main.m

 

【实现过程】

我自己是熟悉其他语言但是没接触过matlab,刚开始遇到的问题是不知道函数在哪里写,贴一下matlab界面

 

学习记录:使用matlab初步实现SGD(随机梯度下降法)_第1张图片

点击菜单栏(左上第三个“新建”的箭头)新建一个函数,代码内容为:

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)

运行——结果如图

学习记录:使用matlab初步实现SGD(随机梯度下降法)_第2张图片

【总结和收获】

对代码理解不深,但是成功的实现了并且对SGD的思想有个更深入的了解,matlab语法较为欠缺,需要不断学习和补足

欢迎一起学习进步!

 

你可能感兴趣的:(机器学习,matlab,机器学习)