CNN-卷积神经网络

【原理】深度学习的SGD训练算法

作者 : 老饼 发表日期 : 2023-07-28 10:28:23 更新日期 : 2024-02-29 22:08:12
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com



SGD算法是基于小批样本的训练算法,它是深度学习中最常用、最基础的训练算法

由于深度学习中所说的SGD往往并非基础SGD算法,因此本文先讲解基础SGD算法,然后再拓展讲解深度学习中的SGD算法

通过本文可以了解基本SGD算法以及深度学习中的SGD算法的详细原理与流程




     01. 梯度下降法与SGD   




本文介绍梯度下降法与SGD算法的流程




     梯度下降法     


梯度下降法指的是每次让待优化的参数往负梯度方法下降
梯度下降法的流程如下:
 一、初始化待优化参数P                                                
      可以使用随机初始化,也可以使用其它的初始化算法
 二、训练t步(epoch),每步过程如下:                          
 1. 计算参数P的梯度dP                                      
 2. 将参数往负梯度方向更新                               
P=P-dP                                      
 3. 检验终止条件                                                
 终止条件如下:                    
(1) 如果epoch已经足够大,则终止训练   
              (2) 误差是否满足要求,如果满足,则退出训练       
 三、输出结果                                                                
输出参数P的最终训练结果                               




     SGD随机梯度下降法     


SGD的全称为stochastic gradient descent,随机梯度下降
简单来说,就是每次随机抽一个样本来进行梯度下降,无他
 但实际中的SGD一般都是抽一批样本(随机小批量梯度下降)来进行梯度下降
SGD的流程如下:
一、初始化待优化参数P                                                
        可以使用随机初始化,也可以使用其它的初始化算法
 二、训练t步(epoch),每步过程如下:                          
 1. 将数据打乱,并分为n批                                
 2. 逐批训练样本                                                
(1) 计算本批次样本的参数P的梯度dP       
(2) 将参数往负梯度方向更新                    
P=P-dP                                      
 3. 检验终止条件                                                
 终止条件如下:                    
(1) 如果epoch已经足够大,则终止训练   
              (2) 如果梯度已经极小,则退出训练                       
 三、输出结果                                                                
输出参数P的最终训练结果                               







     02. 动量下降法与带动量SGD   




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




     动量梯度下降法    


由于梯度下降法只能找到离初始值最近的局部最小值,如果目标函数中有些“小坑”会很吃亏
因此动量梯度下降法对梯度下降算法进行优化,目的是跳出一些小坑

动量梯度下降法模仿石头滚下山时的场景,由于石头下滑时拥有动量,所以遇到小坑时能冲出小坑,效果如下:
 
动量梯度下降算法使用速度来更新参数,而负梯度则作为加速度,用于更新速度,
动量梯度下降算法的具体公式如下
1. 初始时刻的速度,然后第t轮的速度更新公式为:            
 
其中,:学习率              
 :动量系数 
 :阻尼系数
2. 每次使用速度来更新参数P:                                               
 
 将动量梯度下降算法往石头下波的方向去想,就很形象,石头就相当于"解",坡度(梯度)决定了石头的加速度
在重力加速度的作用下,石头会滚到底谷,且由于速度具有一定的惯性,还会继续滚动一段时间,直到能量耗尽,又会滚回谷底





      带动量的SGD     


带动量的随机梯度下降算法,指的参数更新时使用动量下降法,而不是梯度下降法

SGD(带动量)的流程如下:
 一、初始化                                                                   
       1. 初始化参数P                                                        
                可以使用随机初始化,也可以使用其它的初始化算法
2. 初始化速度                                                   
v=0                                                   
 二、训练t步(epoch),每步过程如下:                          
 1. 将数据打乱,并分为n批                                 
 2. 逐批训练样本                                                 
(1) 计算本批次样本的参数P的梯度dP         
(2) 更新本次的速度                                   
    
(2) 将参数往负梯度方向更新                      
                       
 3. 检验终止条件                                                 
 终止条件如下:                      
(1) 如果epoch已经足够大,则终止训练     
              (2) 误差是否满足要求,如果满足,则退出训练         
 三、输出结果                                                                
输出参数P的最终训练结果                              








    03. 深度学习中的SGD算法    



本节介绍深度学习中所说的SGD算法是什么




     深度学习中的SGD算法     


由于SGD不仅效果好,而且支持总样本的小批拆解,这使得SGD成为了深度学习中最基础的优化算法,
深度学习中的SGD算法一般指的是"带权重衰减机制的、带动量的SGD算法",它在上述"带动量的SGD算法"的基础上加入了权重衰减机制
带权重衰减的动量SGD算法
"带权重衰减的动量SGD算法"是指"动量SGD算法"在更新速度时,同时加入权重衰减项,如下:
  动量SGD-速度v的更新公式 :     
带权重衰减的动量SGD-速度v的更新公式:
                                                 其中是衰减系数,一般设为0.0005
如何理解"权重衰减"
这里的“权重衰减”,应该理解为“待优化参数P的衰减”,
"权重衰减"出自AlexNet一文,由于原文中"待优化参数P"用"权重w"来表示,以致于后来都用"权重衰减"一词来表示
 
 权重衰减的意义
加入权重衰减项的意义主要是衰减待优化参数的绝对值,使得训练出来的参数的绝对值相对会更小一些
一方面是因为参数绝对值过大容易带来过拟合,另一方面权重衰减可以加速神经网络的训练
 当参数(权重)绝对值过大时,传给下层的值也更容易趋向极大值,这会导致神经元死亡,从而阻碍训练的速度
总的来说,加入权重衰减,使得神经网络在训练过程中不断减小参数的绝对值,有利于训练和增加网络的泛化能力





      深度学习中的SGD-带权重衰减、带动量的SGD-算法流程     


"带权重衰减、带动量的SGD算法",与"带动量的SGD算法"几乎是一致的(只有速度的更新公式不一样)
 由于它是深度学习中常用的基础算法,这里作为全文总结,不妨完整地展示它的算法流程
SGD(带权重衰减、带动量)的具体算法流程如下:
 一、初始化                                                                   
       1. 初始化参数P                                                        
                可以使用随机初始化,也可以使用其它的初始化算法
2. 初始化速度                                                   
v=0                                                   
 二、训练t步(epoch),每步过程如下:                          
 1. 将数据打乱,并分为n批                                 
 2. 逐批训练样本                                                 
(1) 计算本批次样本的参数P的梯度dP         
(2) 更新本次的速度                                   
                  
(2) 将参数往负梯度方向更新                      
                       
 3. 检验终止条件                                                 
 终止条件如下:                      
(1) 如果epoch已经足够大,则终止训练     
              (2) 误差是否满足要求,如果满足,则退出训练         
 三、输出结果                                                                
输出参数P的最终训练结果                              










 End 






联系老饼