本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com
SGD算法是基于小批样本的训练算法,它是深度学习中最常用、最基础的训练算法
由于深度学习中所说的SGD往往并非基础SGD算法,因此本文先讲解基础SGD算法,然后再拓展讲解深度学习中的SGD算法
通过本文可以了解基本SGD算法以及深度学习中的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的最终训练结果
本节介绍动量梯度下降算法以及带动量的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的最终训练结果
本节介绍深度学习中所说的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