找回密码
 立即注册
查看: 357|回复: 0

请说下常见优化方法各自的优缺点?

[复制链接]
发表于 2022-3-11 21:53 | 显示全部楼层 |阅读模式
梯度下降法深理解
对于优化算法,优化的标是络模型中的参数θ(是个集合,θ1、θ2、θ3......)标函数为损失函数L = 1/N ∑ Li (每个样本损失函数的叠加求均值)。这个损失函数L变量就是θ,其中L中的参数是整个训练集,换句话说,标函数(损失函数)是通过整个训练集来确定的,训练集全集不同,则损失函数的图像也不同。
那么为何在mini-batch中如果遇到鞍点/局部最值点就法进优化了呢?因为在这些点上,L对于θ的梯度为零,换句话说,对θ每个分量求偏导数,带训练集全集,导数为零。
对于SGD/MBGD,每次使的损失函数只是通过这个批量的数据确定的,其函数图像与真实全集损失函数有所不同,所以其求解的梯度也含有定的随机性,在鞍点或者局部最值点的时候,震荡跳动,因为在此点处,如果是训练集全集带即BGD,则优化会停不动,如果是minibatch或者SGD,每次找到的梯度都是不同的,就会发震荡,来回跳动。
先来看下梯度下降最常的三种变形 BGD,SGD,MBGD,这三种形式的区别就是取决于我们多少数据来计算标函数的梯度,这样的话然就涉及到个 trade-off,即参数更新的准确率和运时间。
(1).Batch Gradient Descent(BGD)
梯度更新规则:
BGD 采整个训练集的数据来计算 cost function 对参数的梯度:


缺点:
由于这种法是在次更新中,就对整个数据集计算梯度,所以计算起来常慢,遇到很量的数据集也会常棘,且不能投新数据实时更新模型。
for i in range(nb_epochs):
    params_grad = evaluate_gradient(loss_function, data, params)
    params = params - learning_rate*params_grad 我们会事先定义个迭代次数epoch, 先计算梯度向量params_grad,然后沿着梯度的向更新参数params,learning rate决定了我们每步迈多。
Batch gradient descent对于凸函数可以收敛到全局极值,对于凸函数可以收敛到局部极值。
(2).Stochastic Gradient Descent (SGD)
梯度更新规则: 和BGD 的次所有数据计算梯度相, SGD 每次更新时对每个样本进梯度更新,对于很的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余, SGD 次只进次更新,就没有冗余,且较快,并且可以新增样本。


for i in range(nb_epochs):
    np.random.shuffle(data)
    for example in data:
        params_grad = evaluate_gradient(loss_function, example, params)
        params = params - learning_rate * params_grad看代码,可以看到区别,就是整体数据集是个循环,其中对每个样本进行一次参数更新。
随机梯度下降是通过每个样本来迭代更新次,如果样本量很的情况,那么可能只其中部分的样本,就已经将theta迭代到最优解了,对上的批量梯度下降,迭代次需要到万训练样本,次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。
缺点是SGD的噪较BGD要多,使得SGD并不是每次迭代都向着整体最优化向。所以虽然训练速度快,但是准确度下降,并不是全局最优。虽然包含定的随机性,但是从期望上来看,它是等于正确的导数的。
缺点:
SGD 因为更新较频繁,会造成Cost Function有严重的震荡。
BGD 可以收敛到局部极值,当然 SGD 的震荡可能会跳到更好的局部极值处。
当我们稍微减 learning rate,SGD 和 BGD 的收敛性是样的。
(3).Mini-Batch Gradient Descent (MBGD)
梯度更新规则: MBGD 每次利批样本,即 n 个样本进计算,这样它可以降低参数更新时的差,收敛更稳定,另可以充分地利深度学习库中度优化的矩阵操作来进更有效的梯度计算。


和SGD的区别是每次循环不是作于每个样本,是具有 n 个样本的批次。
for i in range(nb_epochs):
    np.random.shuffle(data)
    for batch in get_batches(data, batch_size=50):
        params_grad = evaluate_gradient(loss_function, batch, params)
        params = params - learning_rate * params_grad 超参数设定值: n 般取值在 50~256
缺点:(两缺点)
1)不过 Mini-batch gradient descent 不能保证很好的收敛性,learning rate 如果选择的太,收敛速度会很慢,如果太,loss function 就会在极值处不停地震荡甚偏离。(有种措施是先设定点的学习率,当两次迭代之间的变化低于某个阈值后,就减 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点)。
对于凸函数,还要避免陷于局部极值处,或者鞍点处,因为鞍点周围的error是样的,所有维度的梯度都接近于0,SGD 很容易被困在这。(会在鞍点或者局部最点震荡跳动,因为在此点处,如果是训练集全集带即BGD,则优化会停不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发震荡,来回跳动)
2)SGD对所有参数更新时应同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进点的更新。LR会随着更新的次数逐渐变。
(4).Momentum
SGD 在 ravines 的情况下容易被困住, ravines 就是曲的个向另个向更陡,这时SGD 会发震荡迟迟不能接近极值:


梯度更新规则:
Momentum通过加 γv_t1,可以加速 SGD,并且抑制震荡


当我们将个球从上滚下来时,没有阻的话,它的动量会越来越,但是如果遇到了阻,速度就会变。
加的这项,可以使得梯度向不变的维度上速度变快,梯度向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减震荡。
超参数设定值: 般 γ 取值 0.9 左右。
缺点:
这种情况相当于球从上滚下来时是在盲地沿着坡滚,如果它能具备些先知,例如快要上坡时,就知道需要减速了的话,适应性会更好。
(5).Nesterov Accelerated Gradient
梯度更新规则:
来近似当做参数下步会变成的值,则在计算梯度时,不是在当前位置,是未来的位置上


超参数设定值: 般 γ 仍取值 0.9 左右。
效果较:


蓝是Momentum 的过程,会先计算当前的梯度,然后在更新后的累积梯度后会有个的跳跃。
NAG 会先在前步的累积梯度上(brown vector)有个的跳跃,然后衡量下梯度做下修 正(red vector),这种语气的更新可以避免我们走的太快。
NAG 可以使 RNN 在很多任务上有更好的表现。
前为,我们可以做到,在更新梯度时顺应 loss function 的梯度来调整速度,并且对 SGD 进加速。
我们还希望可以根据参数的重要性对不同的参数进不同程度的更新。
(6).Adagrad (Adaptive gradient algorithm)
这个算法就可以对低频的参数做较的更新,对频的做较的更新,也因此,对于稀疏的数据它的表现很好,很好地提了 SGD 的鲁棒性,例如识别 Youtube 视频的猫,训练 GloVe word embeddings,因为它们都是需要在低频的特征上有更的更新。梯度更新规则:


其中g为:t时刻参数的梯度:


如果是普通SGD,那么 在每时刻的梯度更新公式为:


  但这的 learning rate η 也随 t 和 i 变:


  其中 是个对矩阵, 元素就是t时刻参数  的梯度平和。
Adagrad的优点是减少了学习率的动调节
超参数设定值:般η选取0.01  
(7).Adadelta
这个算法是对 Adagrad 的改进。
和 Adagrad 相,就是分的 G 换成了过去的梯度平的衰减平均值,指数衰减平均值


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


其中 E 的计算公式如下,t 时刻的依赖于前时刻的平均和当前的梯度:


梯度更新规则:
此外,还将学习率 η 换成了 RMS[Δθ],这样的话,我们甚都不需要提前设定学习率了:
   



超参数设定值: γ 般设定为 0.9   
(8).RMSprop
RMSprop 是 Geoff Hinton 提出的种适应学习率法。
RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的,
梯度更新规则:
RMSprop 与 Adadelta 的第种形式相同:(使的是指数加权平均,旨在消除梯度下降中的摆动,与Momentum的效果样,某维度的导数较,则指数加权平均就,某维度的导数较,则其指数加权平均就,这样就保证了各维度导数都在个量级,进减少了摆动。允许使个更的学习率η)      



超参数设定值:
Hinton 建议设定 γ 为 0.9, 学习率 η 为 0.001。
(9).Adam:Adaptive Moment Estimation
这个算法是另种计算每个参数的适应学习率的法。相当于 RMSprop + Momentum除了像 Adadelta 和 RMSprop 样存储了过去梯度的平 vt 的指数衰减平均值 ,也像momentum 样保持了过去梯度 mt 的指数衰减平均值:


如果mt和vt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,通过计算偏差校正后的 mt 和 vt 来抵消这些偏差:


梯度更新规则:


超参数设定值:
建议 β1 = 0.9,β2 = 0.999, = 10e8
实践表明,Adam 其他适应性学习法效果要好。
多动手,多练习,多理解,加油!!!
觉得不错的话,记得帮我 @小象点个赞哟,祝大家都能学有所获!
小象:深度学习入门一----一个神经元
小象:深度学习入门二----深度神经网络
小象:深度学习入门三----梯度下降
小象:深度学习入门四----过拟合与欠拟合
小象:深度学习入门五----Dropout and Batch Normalization

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 17:40 , Processed in 0.065803 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表