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

本文介绍了如何在MATLAB中实现随机梯度下降法(SGD),通过创建Sigmoid函数、DeltaSGD函数以及主脚本来训练模型。作者分享了学习过程,包括MATLAB项目结构、函数创建步骤以及简单的SGD思想。通过实例数据展示SGD的运行效果,加深了对SGD算法的理解。
摘要由CSDN通过智能技术生成

【介绍】

最近接触的文献是关于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界面

 

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

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结果
0010
0110
1011
1111

使用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语法较为欠缺,需要不断学习和补足

欢迎一起学习进步!

 

  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
随机梯度下降(Stochastic Gradient Descent,SGD)是一种常用的优化算,尤其在深度学习中被广泛应用。下面介绍如何用 MATLAB 实现 SGD。 假设我们需要最小化一个损失函数 $J(\theta)$,其中 $\theta$ 是模型参数。SGD 的更新公式如下: $$\theta_{i+1} = \theta_{i} - \alpha \nabla J(\theta_{i}, x_{i}, y_{i})$$ 其中 $\alpha$ 是学习率,$\nabla J(\theta_{i}, x_{i}, y_{i})$ 是对参数 $\theta_{i}$ 在样本 $(x_{i},y_{i})$ 上的梯度。每次更新时,随机选择一个样本 $(x_{i},y_{i})$,用它来计算梯度并更新参数。 下面是一个简单的 SGD 实现代码: ```matlab function [theta, J_history] = sgd(X, y, theta, alpha, num_iters) % X: 训练样本,每行表示一个样本 % y: 目标变量,每行对应一个样本 % theta: 初始参数 % alpha: 学习率 % num_iters: 迭代次数 % theta: 训练后的参数 % J_history: 每次迭代后的损失函数值 m = length(y); J_history = zeros(num_iters, 1); for iter = 1:num_iters % 随机选择一个样本 i = randi(m); % 计算梯度并更新参数 theta = theta - alpha * grad(X(i,:), y(i,:), theta); % 计算损失函数值 J_history(iter) = loss(X, y, theta); end end function g = grad(x, y, theta) % 计算梯度 g = (x * theta - y) * x'; end function J = loss(X, y, theta) % 计算损失函数值 m = length(y); J = sum((X * theta - y).^2) / (2 * m); end ``` 其中 `X` 和 `y` 分别表示训练样本和目标变量,每行表示一个样本,`theta` 是初始参数,`alpha` 是学习率,`num_iters` 是迭代次数。`sgd` 函数使用 `for` 循环进行迭代,每次随机选择一个样本,计算梯度并更新参数,同时记录损失函数值。`grad` 函数计算梯度,`loss` 函数计算损失函数值。 可以使用以下代码进行测试: ```matlab % 生成数据 m = 1000; n = 2; X = [ones(m,1), rand(m,n-1)]; theta_true = [1;2]; y = X * theta_true + randn(m,1); % 初始化参数 theta = zeros(n,1); % 运行 SGD alpha = 0.01; num_iters = 1000; [theta, J_history] = sgd(X, y, theta, alpha, num_iters); % 绘制损失函数值随迭代次数的变化 plot(J_history); xlabel('Iterations'); ylabel('Loss'); ``` 该代码生成一个二维数据集,并在其中加入噪声。然后运行 SGD 进行训练,并绘制损失函数值随迭代次数的变化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值