梯度下降法、学习率、优化算法笔记

			梯度下降法、学习率、优化算法

一、 梯度下降法
梯度下降法一种求解最优化的算法。其中心思想是沿着目标函数梯度的方向更新参数值以希望达到目标函数最小
我们可以想象我们深处高山上的某一处位置,而梯度下降法,就是帮助我们到达山底的方法。当我们不知道自身所处在山的具体位置时,我们可以通过查看最陡峭的下坡路寻找到最快到达山底的路,每走一段距离,我们将重新测试山坡的梯度。通过迭代的方式(反复测量和行走)直到到达山底,显然这是下山的最短路径。
在机器学习中我们可以将初始位置当作是输入到预测函数的初始值,同时也对应损失函数上的某个起始点。山体的陡峭程度则是梯度,对应于损失函数的导数或偏导数。以测量最陡路径次数作为迭代次数,那么在一次迭代中所走的下坡路的路径则与学习率密切相关。通过一定次数的迭代,当我们走到山脚时,如果此山峰只有山脚这一个低谷,那么这个山脚就对应于损失函数的最小值。如下图所示。所以梯度下降法的目的就是寻找到损失函数的最小值
梯度下降法、学习率、优化算法笔记_第1张图片

他的公式如下
在这里插入图片描述
梯度下降法、学习率、优化算法笔记_第2张图片

需要注意的一点是:梯度下降法依赖于求导,这也是为什么对函数的求导能力如此重要!
对于梯度下降法来说,有一个重要的参数叫作学习率(learning rate)(上图的n), 我们可以把它看作是可调节的参数(也称之为超参数)。学习率对于收敛以及对最终的结果起到很重要的作用。
当我们学习率比较小时,收敛会比较慢。当我们的学习率很大时,算法不稳定,可能不收敛
(1) 梯度下降法的优点:
在凸优化(Convex Optimization)的情况下, 一定会找到最优解
在非凸优化的情况下, 一定能找到局部最优解
(2) 梯度下降法的缺点:
梯度下降法、学习率、优化算法笔记_第3张图片

当样本很多的时候,每一次迭代所花费的时间成本是很高的。举个例子,当数据集里有一百万个样本的时候,每一次的参数更新就需要循环所有的样本并把它们的梯度做累加。
当样本数量非常大时,使用传统的梯度下降法,会导致效率变得非常低,因为我们每次更新梯度都需要求出所以的样本梯度,在进行更新。
梯度下降法、学习率、优化算法笔记_第4张图片

二、 随机梯度下降法(SGD)
随机梯度下降法(SGD)可以看作是梯度下降法的极端的情况。在梯度下降法里,每次的参数更新依赖于所有的样本。然而,在随机梯度下降法里,每一次的迭代不再依赖于所有样本的梯度之和,而是仅仅依赖于其中一个样本的梯度 。所以这种方法的优势很明显,通过很“便宜”的方式获得梯度,并频繁的对参数做迭代更新,这有助于在更短的时间内得到收敛结果

随机取出样本中的一个样本,进行梯度计算并且根据计算的梯度进行梯度更新

(1) 随机梯度下降法(SGD)的优点:
与使用整个样本用于梯度计算相比,随机梯度下降(SGD)更快,只取其中一个样本用于梯度计算更新。
目标函数会出现严重的震荡,这种震荡有可能让他避免套牢到某一个局部最小值,从而找到更好的局部最优解
(2) 随机梯度下降法(SGD)的缺点
由于在 随机梯度下降法中,我们用一个样本的 梯度 来代替所有样本的梯度之和,计算出来的结果包含大量噪声,并且不太稳定,目标函数会出现严重的震荡。为了部分解决这个问题,我们通常会把学习率设置为较小的值,这样可以有效削弱梯度计算中带来的不稳定性。

梯度下降法、学习率、优化算法笔记_第5张图片

三、 小批量梯度下降法
小批量梯度下降法可以看做是梯度下降法和随机梯度下降法的折中
梯度下降法和随机梯度下降法其实可以看作是两个极端,前者在计算梯度时考虑所有的样本,后者则仅仅考虑其中的一个样本,而小批量梯度下降可以每次取出样本的中一部分,并且基于这些选出来的样本进行梯度计算和更新
梯度下降法、学习率、优化算法笔记_第6张图片

打乱样本的顺序,随机取出50个样本进行梯度计算,累加计算出来的梯度取平均,进行梯度更新
(1) 小批量梯度下降法的优点:
结合了梯度和随机梯度下降法的优点
减少了目标函数的震荡,更加稳定
易于硬件加速实现,常用的机器学习库都利用了这个特性提供了高性能的计算速度
(2) 批量大小的选择:
在迷你批量梯度下降法中,批量大小(Batch Size)对网络优化的影响也非常大
一般而言,批量大小不影响随机梯度的期望,但是会影响随机梯度的方差。
批量大小越大,随机梯度的方差越小,引入的噪声也越小,训练也越稳定,因此可以设置较大的学习率。
而批量大小较小时,需要设置较小的学习率,否则模型会不收敛。学习率通常要随着批量大小的增大而相应地增大。
四、 学习率
对于梯度下降法来说,有一个重要的参数叫作学习率(learning rate), 我们可以把它看作是可调节的参数(也称之为超参数)。学习率对于收敛以及对最终的结果起到很重要的作用
学习率影响着梯度更新的幅度,当学习率很大时,更新的梯度相对幅度也变大,当学习率很小时,更新的梯度幅度也很小。
学习率在一开始要保持大些来保证收敛速度,在收敛到最优 点附近时要小些以避免来回震荡。比较简单的学习率调整可以通过学习率衰减 (Learning Rate Decay)的方式来实现,也称为学习率退火(Learning Rate Annealing)。

五、 学习率衰减
1、 逆时衰减(Inverse Time Decay):
梯度下降法、学习率、优化算法笔记_第7张图片

2、 分段常数衰减(Piecewise Constant Decay):
在这里插入图片描述

	即每经过T1,T2,··· ,Tm次迭 代将学习率衰减为原来的β1, β2, · · · , βm 倍,其中Tm 和βm < 1为根据经验设置 的超参数。分段常数衰减也称为步衰减(Step Decay)

3、 指数衰减(Exponential Decay):
梯度下降法、学习率、优化算法笔记_第8张图片

4、 自然指数衰减(Natural Exponential Decay):
在这里插入图片描述

5、 余弦衰减(Cosine Decay):
梯度下降法、学习率、优化算法笔记_第9张图片

6、 学习率与迭代次数对比图:
梯度下降法、学习率、优化算法笔记_第10张图片

7、 学习率与BatchSize对训练的影响:
梯度下降法、学习率、优化算法笔记_第11张图片

如果对要训练的网络的特性有了解或者之前训练过该网络,可以采用分段常数衰减,如果是对于一个新的网络,通过采用自然指数衰减
六、 学习率预热
在小批量梯度下降方法中,当批量大小的设置比较大时,通常需要比较大的学习率。但在刚开始训练时,由于参数是随机初始化的,梯度往往也比较大,在加上比较大的初始学习率,会使得训练不稳定
为了提高训练稳定性,我们可以在最初几轮迭代时,采用比较小的学习率,等梯度下降到一定程度后再恢复到初始的学习率,这种方法称为学习率预热(Learning Rate Warmup) 。
一个常用的学习率预热方法是逐渐预热(Gradual Warmup)。假设预热的迭代次数为 ,初始学习率为α0,在预热过程中,每次更新的学习率为
在这里插入图片描述

当预热过程结束,再选择一种学习率衰减方法来逐渐降低学习率。
七、 周期性学习率调整
为了使得梯度下降方法能够逃离局部最小值或鞍点,一种经验性的方式是在训练过程中周期性地增大学习率。虽然增加学习率可能短期内有损网络的收敛稳定性,但从长期来看有助于找到更好的局部最优解。一般而言,当一个模型收敛一个平坦(Flat)的局部最小值时,其鲁棒性会更好,即微小的参数变动不会剧烈影响模型能力;而当模型收敛到一个尖锐(Sharp)的局部最小值时,其鲁棒性也会比较差。
周期性学习率调整可以使得梯度下降方法在优化过程中跳出尖锐的局部极小值,虽然会短期内会损害优化过程,但最终会收敛到更加理想的局部极小值。

周期性学习率调整的方法:
(1) 循环学习率(Cyclic Learning Rate)
在让学习率在一个区间内周期性地增大和缩小。通常可以使用线 性缩放来调整学习率,称为三角循环学习率(Triangular Cyclic Learning Rate)。
假设每个循环周期的长度相等都为 2∆T ,其中前 ∆T 步为学习率线性增大阶段, 后 ∆T 步为学习率线性缩小阶段。在第 t 次迭代时,其所在的循环周期数 m 为

在这里插入图片描述
在这里插入图片描述

(2) 带热重启的随机梯度下降(Stochastic Gradient Descent with Warm Restarts,SGDR)
用热重启 方式来替代学习率衰减的方法。学习率每间隔一定周期后重新初始化为某个预 先设定值,然后逐渐衰减。每次重启后模型参数不是从头开始优化,而是从重启 前的参数基础上继续优化。
梯度下降法、学习率、优化算法笔记_第12张图片

(3) 周期性调整学习率对比图

梯度下降法、学习率、优化算法笔记_第13张图片

八、 传统梯度下降法面临的挑战
梯度下降法、随机梯度下降法、小批量梯度下降法都称为传统的梯度下降法。
面临的挑战如下:
传统迷你批处理不能保证能够收敛
当学习率太小, 收敛会很慢, 学习率太高容易震荡, 甚至无法收敛
可以按照某个公式随着训练逐渐减小学习率, 但是不同的数据集需要不同的学习率变化曲线, 不容易估计
所有的参数使用同样的学习率并不合适
容易被套牢在马鞍点(容易被套在一个局部最优解上)

基于SGD研究出了几种其他的优化算法(Momenton、NAG、Adagrad、Adadelta、Rmsprop),与我们前面所学的学习率衰减、预热、周期性都能相结合。

九、 Momentun
不同dimension的变化率不一样
动量在梯度在某一维度上的投影指向同一方向上增强, 在维度上的指向不断变化的方向抵消
梯度下降法、学习率、优化算法笔记_第14张图片

Momentum 通过加入 rVt−1,可以加速 SGD,并且抑制震荡
对当前位置对梯度更新时,会参考上一次的梯度更新,如果上一次的梯度与这一次的梯度方向相同,则当前的梯度更新有变大,如果相反,则相互抵消,从而加速SGD,减少做无用的梯度更新。
例如:假设A点为[0.9,0.5],进行梯度求导得出值假设为[-0.4,0.6],带入公式得出新的位置为[0.5,1.1]。当两者梯度方向相同时会得到更大的梯度(即0.5与0.6相加为1.1),当两者梯度相反时,则会相互抵消,减少做无用的梯度更新(即0.9-0.4得到0.5)

梯度下降法、学习率、优化算法笔记_第15张图片

十、 Nesterov Accelerated Gradient(NAG)
动量 + 预测的前方的梯度
在多个RNN的任务中表现突出
梯度下降法、学习率、优化算法笔记_第16张图片

对于Momenton,改变了对θ求导方式,新增了一个rVt-1他的意义在于,当我们要对当前的θ进行梯度求导时,会加入上一次Vt-1求出的梯度,把当前要进行梯度求导θ发生改变,将当前的θ加上Vt-1的梯度进行求导,将原本要在当前位置进行梯度求导的点,加入Vt-1(上一次求的梯度值)的梯度,使得原先的位置发生改变后,在进行梯度求导,从而实现预测得到作用。
十一、 根据参数的重要程度进行不同程度调整
前面的算法是整体提升梯度下降法的速度, 我们还希望可以根据参数的重要性而对不同的参数进行不同程度的更新。网络的每一层的参数(如W,b),可以通过调节他的学习率,从而能有不同程度的更新

十二、 Adagrad
梯度下降法、学习率、优化算法笔记_第17张图片

这个算法可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性,例如识别 Youtube 视频里面的猫,训练 GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。
梯度下降法、学习率、优化算法笔记_第18张图片

这里的I是指在第I层的参数,gt_i 是指跟新第I层的梯度,其中 G_t 是个对角矩阵, (i,i) 元素就是 t 时刻参数 θ_i 的梯度平方和。G_t对角矩阵存储是的各个层的历史梯度的总和,当对该层求得梯度次数越多,则G_t,ii的值越大,更新的梯度就幅度越小,当对该层求得梯度次数越多,则G_t,ii的值越小,更新的梯度幅度就越大,

十三、 Adadelta

梯度下降法、学习率、优化算法笔记_第19张图片

这个算法是对 Adagrad 的改进,和 Adagrad 相比,就是分母的 G 换成了过去的梯度平方的衰减平均值,指数衰减平均值
在这里插入图片描述

这个分母相当于梯度的均方根 root mean squared (RMS),在数据统计分析中,将所有值平方求和,求其均值,再开平方,就得到均方根值 ,所以可以用 RMS 简写

其中 E 的计算公式如下,t 时刻的依赖于前一时刻的平均和当前的梯度
梯度下降法、学习率、优化算法笔记_第20张图片

假设r=0.9,那么t-1时刻的梯度为0.9(t-1), 那么t-2时刻的梯度为0.9(t-1)的平方……以此类推,就会把我们很久之前的梯度信息给遗忘掉。
梯度下降法、学习率、优化算法笔记_第21张图片

十四、 RMSprop

RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。
RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的
梯度下降法、学习率、优化算法笔记_第22张图片

RMSprop 与 Adadelta 的第一种形式相同:(使用的是指数加权平均,旨在消除梯度下降中的摆动,与Momentum的效果一样,某一维度的导数比较大,则指数加权平均就大,某一维度的导数比较小,则其指数加权平均就小,这样就保证了各维度导数都在一个量级,进而减少了摆动。允许使用一个更大的学习率η)
十五、 Adam

这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum

除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值:
梯度下降法、学习率、优化算法笔记_第23张图片

如果 mt 和 vt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,通过计算偏差校正后的 mt 和 vt 来抵消这些偏差:
梯度下降法、学习率、优化算法笔记_第24张图片

公式如下

梯度下降法、学习率、优化算法笔记_第25张图片

十六、 如何选择优化算法

Momentun、Nesterov Accelerated Gradient(NAG):这两个算法是对梯度下降方面的优化,使得梯度下降更快。

Adagrad、Adadelta、RMSprop:这三个算法是对参数学习率进行优化,使得每一层参数都能通过不同的学习率进行不同幅度的梯度更新,从而可以根据参数的重要性而进行不同程度的更新
Adam:是Momentun与RMSprop的结合,所以对两方面都进行优化

如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。
RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。
Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,
随着梯度变的稀疏,Adam 比 RMSprop 效果会好。
整体来讲,Adam 是最好的选择。
很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。
如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。

十七、 神经网络训练技巧
(1) 每一个epoch之前重新随机洗牌训练数据
(2) 使用Batch Normalization:
我们一般会对训练数据做正规化(normalize), 但是随着数据前馈, 后面layers的输入已经不是 正规化(normalize) 的了, Batch Normalization就是在后面layer之间做 正规化(normalize)
使得训练可使用更大的学习率, layer参数的初始化可以更加随意
BN还有regularization的作用, 还可以减少对Dropout的依赖

(3) 添加随机噪声到梯度

你可能感兴趣的:(算法,学习,机器学习)