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

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:100
    wg = 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;                         % 更新多项式系数
end

cal = 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’);

猜你喜欢

转载自blog.csdn.net/ruredfive/article/details/118118094