一、优化方法
上一篇说到,使用梯度下降进行优化模型参数,可能会卡在局部最小值,或优化方法不合适永远找不到具有最优参数的函数。
1、局部最小值
梯度下降如何工作?
梯度下降是一种优化算法,用于最小化损失函数,即寻找一组模型参数,使得损失函数的值最小(局部最小值)。
具体做法:梯度下降通过迭代地更新参数来实现,每次更新都沿着损失函数关于参数的梯度的反方向进行,因为梯度的反方向是函数值下降最快的方向。
反向传播用于计算损失函数关于每个参数的梯度。
从经验上看,局部最小值并不常见,大多数时候,训练网络到一个梯度很小的地方,参数不再更新,往往只是遇到了 鞍点(梯度为0,且不是极值点)。
逃离鞍点:在低维空间中没有路可以走,在更高维度其实有路可走。
解决方法:批量(BGD/SGD)、动量。
2、批量与动量——对抗鞍点/局部最小值
反向传播计算损失L梯度时,将所有数据分成一批一批(批量batch)来。
数据分批时,往往会进行随机打乱(shuffle)。
一个回合(epoch)的过程是遍历完所有批次。
2.1 批量的分类
批量梯度下降法BGD:使用全批量(full batch)的数据来更新参数的方法。模型必须把所有数据看完后,才能计算损失和梯度,参数才能更新一次。在数据集较小、需要全局最优解的情况下,BGD可能是更好的选择。
随机梯度下降法SGD(增量梯度下降法):批量大小等于1,每次随机取出1笔数据(一个样本)即可计算损失函数的梯度,更新一次参数。
随机梯度下降SGD的梯度上引入了随机噪声(noisy),因此在 非凸优化问题(目标函数不是凸函数,或者约束条件定义的区域不是凸集的情况,可能存在多个局部最优解或鞍点)中,其相比批量梯度下降BGD更容易逃离局部最小值。
为什么会引入噪声?
SGD每个批次结束更新参数,导致下个批次的损失函数L不同。
存在一种折中的方法,即小批量梯度下降法MBGD(Mini-Batch Gradient Descent),它结合了BGD和SGD的优点,每次挑一个批量计算损失进行梯度更新,以平衡计算效率和收敛稳定性
2.2 动量法
动量(momentum)法是另一个可以对抗鞍点或局部最小值的方法。
假设误差表面是真正的斜坡,参数是一个球,把球从斜坡上滚下来,如果使用梯度下降,球走到局部最小值或鞍点就停住了。但是在物理世界里,一个球如果从高处滚下来,如果球的动量足够大,就算滚到鞍点或局部最小值,因为惯性的原因,它还是会继续往前走,并不一定会被鞍点或局部最小值卡住。将其应用在梯度下降中,这就是动量。
引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。
可以从两个角度来理解动量法,一个角度是动量是 梯度的负反方向( − ∂ L ∂ w -\frac{\partial L}{\partial w} −∂w∂L) 加上前一次移动的方向;另一个角度是当加上动量的时候不是只考虑现在的梯度,而是考虑过去所有梯度的总和。
一般梯度下降走到一个局部最小值或鞍点时,就被困住了。但有动量还是有办法继续走下去,因为动量不是只看梯度,还看前一步的方向。即使梯度方向往左走,但如果前一步的影响力比梯度要大,球还是有可能继续往右走,甚至翻过一个小丘,也许可以走到更好的局部最小值,这就是动量有可能带来的好处 。
3、自适应学习率——优化器
学习率不是始终固定一个值。同一个参数不同时间不同的学习率,给每个参数不同的学习率。梯度大,学习率调小;梯度小,学习率调大。
3.1 AdaGrad
根据梯度大小自动调整学习率。可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大。
梯度下降更新某个参数 θ t i \theta^i_t θti的过程为:
θ t + 1 i ← θ t i − η g t i \theta^i_{t+1}←\theta^i_t-\eta g_t^i θt+1i←θti−ηgti
梯度计算:
g t i = ∂ L ∂ θ i ∣ θ = θ t g_t^i=\frac{\partial L}{\partial \theta^i}|_{\theta=\theta_t} gti=∂θi∂L∣θ=θt
把学习率 η \eta η变成 η σ t i \frac{\eta}{\sigma_t^i} σtiη, σ t i \sigma_t^i σti上标为 i i i,代表参数 σ \sigma σ与 i i i相关,不同的参数的 σ \sigma σ不同;下标为 t t t,代表参数 σ \sigma σ与迭代相关,不同的迭代会有不同的 σ \sigma σ。学习率变得参数相关:
θ t + 1 i ← θ t i − η σ t i g t i \theta^i_{t+1}←\theta^i_t-\frac{\eta}{\sigma_t^i} g_t^i θt+1i←