神经网络-原理自实现

【原理】动量梯度下降法

作者 : 老饼 发表日期 : 2023-08-11 19:05:28 更新日期 : 2023-08-16 12:13:22
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com



动量梯度下降法是机器学习中常用的训练算法之一

它是梯度下降法的一种改进算法,它相比梯度下降算法的好处在于能跳出一些较小的局部最优

本文讲解动量梯度下降算法的思想、算法流程以及具体的代码实现



   01.动量梯度下降法介绍   



本节介绍动量梯度下降法的思想以及算法流程



     动量梯度下降法的简介与思想      


动量梯度下降法的思想
动量梯度下降法是对梯度下降法的一种改进,
这主要是因为梯度下降法在遇到局部最优时,毫无办法
 
为了解决跳出局部最优,动量梯度下降法为此模仿物体从高处滚到低处的原理,
由于物体具有动量,遇到小坑时会由于原有动量而跃出小坑
 
 动量梯度下降法的迭代公式
 
动量梯度下降法在迭代的过程中引入动量的概念,
它的迭代量改为"速度",而当前的负梯度只作为速度的修改量,
动量梯度下降法迭代公式如下:
 
1.初始速度                                                                
 

2.之后的速度用梯度g来更新                                     
  
 其中,mc是动量系数,一般设为0.9
 
3.用v来更新x                                                           
                                      




     动量梯度下降法的优点    


 动量梯度法最大的好处是,
在遇到“小坑”的时候,会因为原有的速度方向,冲出小坑





   02.动量梯度下降法的算法流程  


本节介绍动量梯度下降法的完整、具体算法流程


     动量梯度下降法的算法流程      


动量梯度下降法的具体算法流程如下
 一、设置参数与初始化相关变量                                 
1. 设置学习率lr                                               
 lr一般设为0.1                          
2. 设置动量系数mc                                        
 mc一般设为0.9                        
3. 初始化速度v                                              
 v一般初始化为0                       
4. 初始化初始解x                                          
 x随机初始化,或者具体问题具体设定    
 二、循环迭代                                                            
  按如下步骤进行迭代                       
1.计算当前的梯度g                                         
2.计算当前的梯度对v带来的修改量dx             
             
3.计算当前的速度                                          

4.更新x                                                         
                
5.检查迭代终止条件                                      
如果满足终止条件,就退出迭代程序        
 终止条件可设如下:                 
(1)是否达到最大迭代次数         
(2)目标函数值是否满足要求       
(3) x是否多次变化极小          
 
 三、输出结果                                                            
输出最终的求解结果x                                   




   03.动量梯度下降法代码实例  



本节展示动量梯度下降法求解函数最小值的一个代码实例



     动量梯度下降法实例代码      


现求解 的极小值
它的函数图像如下:

其中,梯度公式为 

按以上算法流程,编写程序如下:
% 本代码用动量梯度下降法求解函数y = 0.4*x^2+3*exp(-(x+2)^2) 的极小值
% 代码主旨用于教学,供大家学习理解动量梯度下降法的原理
%  转载请说明来自 《老饼讲解神经网络》 www.bbbdata.com
clc;clear all ;
line_x = -5:0.1:5;                            % 目标函数曲线x
line_y = 0.4*line_x.^2+3*exp(-(line_x+2).^2); % 目标函数曲线y
lr = 0.1;                                     % 学习率
mc = 0.9;                                     % 动量系数
x  = -4;                                      % x的初始值
v  = 0;                                       % 初始速度
for i = 1:100
   gx = -(0.8*x-6*exp(-(x+2).^2)*(x+2));      % 计算负梯度
   v  = mc*v+(1-mc)*lr*gx;                    % 将负梯度叠加到上一次速度中,作为本次的速度
   x  = x+v;                                  % 更新x
   y  = 0.4*x.^2+3*exp(-(x+2).^2);            % 计算当前的目标函数值
   fprintf('第%d轮x的迭代值x=%f\n',i,x)
   plot(line_x,line_y,x,y,'or')               % 画出曲线与当前迭代点
   drawnow;                                   % 展示图象
end
运行结果如下
第1轮x的迭代值x=-3.970198
第2轮x的迭代值x=-3.914051
第3轮x的迭代值x=-3.835152
第4轮x的迭代值x=-3.737256
第5轮x的迭代值x=-3.624348
第6轮x的迭代值x=-3.500702
第7轮x的迭代值x=-3.370885
第8轮x的迭代值x=-3.239642
....
第97轮x的迭代值x=0.037061
第98轮x的迭代值x=0.041660
第99轮x的迭代值x=0.047361
第100轮x的迭代值x=0.053971
经过100步迭代,求得最后y在x=0.053971处取得极小值









 End 







联系老饼