SPGD优化算法的实现原理:

这个编辑器确实不怎么好用。。。
SGD算法广泛应用于各种深度学习的优化模型算法中,这几天终于把该算法的优化原理研究明白了
首先,我们假设一个函数y = 2x-1,对应的
x = 1,2,3,4,5,6,7,8,9
y = 1,3,5,7,9,11,13,15,17
但是如果我们不知道该函数对应的数学关系,而只是x,y的值,如何让计算机去计算这个模型的数学函数,并且预测x = 20时候的值呢?
代码在最后。。


SPGD算法原理:

首先建立模型,假设这个函数是一个一元二次方程:y = axx+bx+c;且a = 1,b = 1,c = 1;那么我们得到两个曲线,分别如下:

其中,红色的曲线对应着y = 2x-1;
黑色曲线对应着y = x
x+x+1;
我们要做的就是让模型更接近于现有的数据真实模型y = 2x-1;
首先我随机产生几个小数,比如[0.1,0.2,0.3];(每次的随机数都不同)
然后将[1,1,1],先加上随机数,再减去随机数,得到
y = 1.1xx+1.2x+1.3;
和y = 0.9x
x+0.8x+0.7;
两个函数曲线,然后对统一减去y = 2x-1(应该是将【x = 1,2,3,4,5,6,7,8,9;y = 1,3,5,7,9,11,13,15,17】的值依次带入计算,这里为了便于理解,使用y = 2x-1函数代替);得到:
y = 1.1xx-0.8x+0.3;
和y = 0.9x
x-1.2x-0.3;
最后求这两个函数的标准差(实际上就是以标准差作为评价标准,标准差越小证明越接近真实值)
使用两个标准差的差值乘以[0.1,0.2,0.3];然后加上[1,1,1];得到一个新的多项式系数;
比如是【0.8,1.3,0.9】然后带入多项式得到函数:
y = 0.8x*x+1.3x+0.9;
再一次循环,经过多次计算,计算的曲线就能越来越接近真实的数据;比如我经过5次优化,记录下了每次的优化结果如下图:

如上图,从上到下模型的计算结果越来越接近真实的数据。可以看出优化过程是收敛的,系数的变化过程如下图:

可以看出在经过15次左右优化后就可以得到很接近真实值的计算结果;计算结果可以参考下图:

还是有明显的优化误差的,这是因为我设定的随机数的值太大了,而且优化的次数很少,如果设置的更小一些,或者优化次数更多一些的话就-能达到更高的精度。
另外考虑到我定的优化模型是一个二次函数,优化效果会差得多,如果是一次函数就会很高了。如下图:

这里优化出来的函数是y = 2x-0.9524;
使用这个函数预测出来的x = 20时,y = 39.0476;跟理论的计算结果39已经很接近了。


小结:

到这我算勉强学成了,不知不觉中完成了深度学习算法模型的优化过程,并且还做了一个简单的数据预测。
随后再进行卷积神经网络的学习和记录,后面还是把代码附上吧,我是用MATLAB编写的,回头可以用python再试一下.


首先是二次优化模型

%
clc;clear;                % 初始化
close all;x = 1:1:15;               % 横坐标
y = 2*x+1;                % 纵坐标len = length(x);          % 数据长度
coe_last = [1,1,1];       % 初始多项式系数step = 0.1;               % 优化步长
amp = 0.1;                % 扰动系数
cal_last = coe_last(1)*x.^2+coe_last(2)*x+coe_last(3);   % 初始系数的函数曲线figure,subplot(2,1,1),plot(x,y,'r');                     % 绘图函数
hold on,plot(x,cal_last,'k');
title('Before Optimize');
legend('Ideal curve','hypothesis curve');% 循环优化
for i = 1:100wg = amp*wgn(1,3,1);                                 % 扰动量coe_add = coe_last+wg;                               % 原始系数+扰动量cal_add = coe_add(1)*x.^2+coe_add(2)*x+coe_add(3);   % 原始系数+扰动量的函数曲线error_add = std(y-cal_add);                          % 计算加系数后的标准差coe_sub = coe_last-wg;                               % 原始系数-扰动量cal_sub = coe_sub(1)*x.^2+coe_sub(2)*x+coe_sub(3);   % 原始系数-扰动量的函数曲线error_sub = std(y-cal_sub);                          % 计算减系数后的标准差error_e = (error_add-error_sub)*step*wg;             % 计算每各系数优化量coe_last = coe_last-error_e;                         % 更新多项式系数
endcal = coe_last(1)*x.^2+coe_last(2)*x+coe_last(3);        % 计算优化后函数曲线
subplot(2,1,2),plot(x,y,'r');                            % 绘图函数
hold on,plot(x,cal,'k');
title('After Optimize');
legend('Ideal curve','Optimize curve');

然后是一次优化模型

clc;clear; % 初始化
close all;

x = 1:1:15; % 横坐标
y = 2*x+1; % 纵坐标

len = length(x); % 数据长度
coe_last = [1,1]; % 初始多项式系数

step = 0.1; % 优化步长
amp = 0.1; % 扰动系数
cal_last = coe_last(1)*x+coe_last(2); % 初始系数的函数曲线

figure,subplot(2,1,1),plot(x,y,‘r’); % 绘图函数
hold on,plot(x,cal_last,‘k’);
title(‘Before Optimize’);
legend(‘Ideal curve’,‘hypothesis curve’);

% 循环优化
for i = 1:100
wg = amp*wgn(1,2,1); % 扰动量
coe_add = coe_last+wg; % 原始系数+扰动量
cal_add = coe_add(1)*x+coe_add(2); % 原始系数+扰动量的函数曲线
error_add = std(y-cal_add); % 计算加系数后的标准差
coe_sub = coe_last-wg; % 原始系数-扰动量
cal_sub = coe_sub(1)*x+coe_sub(2); % 原始系数-扰动量的函数曲线
error_sub = std(y-cal_sub); % 计算减系数后的标准差
error_e = (error_add-error_sub)stepwg; % 计算每各系数优化量
coe_last = coe_last-error_e; % 更新多项式系数
end

cal = coe_last(1)*x+coe_last(2); % 计算优化后函数曲线
subplot(2,1,2),plot(x,y,‘r’); % 绘图函数
hold on,plot(x,cal,‘k’);
title(‘After Optimize’);
legend(‘Ideal curve’,‘Optimize curve’);

深度学习(二),终于理解了深度学习原理--SPGD(SGD)优化算法的实现原理相关推荐

  1. 【分布式ID】理解Snowflake算法的实现原理

    1.概述 转载:冷饭新炒:理解Snowflake算法的实现原理 我上次也看了一个视频讲解:[分布式ID]键高并发 分布式 全局唯一 ID 雪花算法 snowflake 2.前提# Snowflake( ...

  2. 对于代码复现学习的一些理解||计算机研究生学习笔记||经验分享||深度学习||pytorch||不定期长期更新

    代码复习   对于初学者,一开始接触深度学习代码总是困难的,尤其是对于github上满屏英文.复杂的环境.各种各样的报错,有时候哪怕跟着配套的readme.论文.视频,仍然不能成功跑起来. 在经受了一 ...

  3. 【入门学习二】基于 FPGA 使用 Verilog 实现蜂鸣器响动的代码及原理讲解

    目录 一.知识了解 二.模块设计 三.程序实现 四.管脚配置及结果展示 五.写给小白看的 上一篇博文:[入门学习一]基于 FPGA 使用 Verilog 实现按键点灯代码及原理讲解 功能描述:通过前面 ...

  4. Java多线程学习二十五:阻塞和非阻塞队列的并发安全原理||如何选择适合自己的阻塞队列?

    阻塞和非阻塞队列的并发安全原理. 之前我们探究了常见的阻塞队列的特点,以 ArrayBlockingQueue 为例, 首先分析 BlockingQueue 即阻塞队列的线程安全原理,然后再看看它的兄 ...

  5. Java学习二:Javac Java的学习(原创)

    安装完了JDK,就可以编译.执行简答的Java程序了, 一.Javac  ,Java 路径名和包名的关系: 在D盘下,建文件夹Test,在Test里创建文件Java1.java(类名要与文件名一致) ...

  6. JavaWeb学习 (二十六)————监听器(Listener)学习(二)

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  7. SHARC音频DSP的算法详解(十二)IIR Comb Filter (IIR 梳状滤波器)算法的实现及代码详解

    硬件准备 ADSP-21489EVB:ADI 21489 DSP的开发板 AD-HP530ICE:ADI DSP通用仿真器 软件准备 Visual DSP++ 算法功能 实现反馈延时功能,用于模拟反射 ...

  8. Verilog基础学习二

    Verilog基础学习二 文章目录 Verilog基础学习二 一.always 块 1.阻塞性赋值和非阻塞性赋值 二.条件语句 1.if 语句 基本用法 2.避免引入锁存器 3.case 语句 4.c ...

  9. C1认证学习二(信息单位)

    C1认证学习二(信息单位) 文章目录 C1认证学习二(信息单位) 学习目标 具体学习 存储单位 传输单位 转换格公式 举例: 学习目标 在计算机的内部,实际上都是使用的二进制的形式来进行存储.运算.处 ...

  10. 【深度学习】深入理解Batch Normalization批归一化

    [深度学习]深入理解Batch Normalization批归一化 转自:https://www.cnblogs.com/guoyaohua/p/8724433.html 这几天面试经常被问到BN层的 ...

最新文章

  1. 北大校友马里千:计算机视觉商用的下一个十年,AI 生成应占有一席之地
  2. cisco 2911 GRE ***
  3. 上海交通大学2006年各学院本科生平均薪酬统计
  4. 面试题 03.02. 栈的最小值
  5. 安装配置mariadb-10.1.19
  6. 删除windows目录下的$NTUnintall$文件夹DOS命令
  7. c语言stdio函数大全,初学者常用的stdio库,原来还有这么多知识点
  8. 导航电子地图数据格式概论
  9. #include和 #includefilename.h的区别
  10. Hadoop——3.x安装部署
  11. jQuery排他思想(siblings)
  12. 国民技术 MCU JLink仿真调试环境配置
  13. Obsidian css-snippets配置
  14. cannot delete inactive domain with nvram
  15. 经典的搞笑图片集,让你轻松一下
  16. 使用Matlab SPM12与MRIcroGL进行头核磁ROI的标准化与Overlap图的制作
  17. IDEA自动重写的equals方法分析
  18. 聊聊​WebRTC之音频会话管理
  19. 一个简单的数据查询到前端展示总结
  20. 解题思考F. 解方程(二分法解方程)

热门文章

  1. 02-即时通讯-XMPP 简单介绍
  2. 《你的灯亮着吗》思维导图个人梳理
  3. 一个完整的html代码是什么,html是什么?一个完整的html代码告诉你(完整实例版)...
  4. uygurqa输入法android,uygurqaapp输入法
  5. 【LEDE】树莓派上玩LEDE终极指南-92-自己编译的LEDE为啥子不能用SSR和KoolProxy?
  6. 脚本c语言编程实例,AVR C语言编程通用脚本.doc
  7. vmware安装macos
  8. 如何写一份大家都满意的专利说明书
  9. 计算机错误1327,Win7系统电脑安装软件失败并提示错误1327解决办法
  10. P2346 四子连棋 题解