本文是笔者对机器学习中碰到的优化器的一个总结,主要参考了网上的一些资料与李宏毅老师的视频。本文仅代表了笔者对于常用的几款优化器的浅薄认识,如有错误,欢迎指出,共同进步。
因为现在可以使用的优化器比较多,所以笔者特地写了一份关于优化器的一个总结。优化器(Optimizer)用于机器学习中帮助寻找参数 θ theta θ的解,使得损失函数(Loss Function) J ( θ ) J(theta) J(θ)达到最低值的模块。本文将对一些常见的优化器算法进行总结与归纳。(图片来自网络)
梯度下降是最基本的一种优化器,其它改进的优化器都是以此为基础建立的。梯度即是函数在参数 θ theta θ处的偏导数,并且该处的梯度是函数下降最快的方向。
θ t + 1 = θ t − l r ∇ θ t J ( θ t ) (1) {theta_{t+1} = theta_t - l_r nabla_{theta_t} J(theta_t)} tag1 θt+1=θt−lr∇θtJ(θt)(1)其中 θ theta θ为需要优化的参数, θ t theta_t θt表示迭代 t t t次后的值, l r l_r lr为学习步长,这在不同的优化器中取值不同(某些优化器的学习步长是固定值,如SGD;某些优化器的学习步长则是变化的,如Adam), J ( θ ) J(theta) J(θ)为损失函数或代价函数。后面的优化器都是基于GD的变化。
假设训练样本的总数为 N N N,样本为 ( x 1 , y 1 ) , … , ( x N , y N ) {(x^1,y^1 ),…,(x^N,y^N)} (x1,y1),…,(xN,yN),第 i i i个样本 ( x i , y i ) (x^i,y^i ) (xi,yi)在 θ t θ_t θt处的梯度为 ∇ θ t J i ( θ t ; x i , y i ) {nabla}_{theta_t}J_i (theta_t;x^i,y^i ) ∇θtJi(θt;xi,yi),则有:
θ t + 1 = θ t − l r 1 N ∑ i = 1 N ∇ θ t J i ( θ t ; x i , y i ) (2) {theta_{t+1} = theta_t - l_r frac{1}{N} sum_{i=1}^N{{nabla}_{theta_t}J_i (theta_t;x^i,y^i )}} tag2 θt+1=θt−lrN1i=1∑N∇θtJi(θt;xi,yi)(2)即BGD中每次训练都使用了所有的样本,这样有一个好处就是一定能够达到训练样本所在特征空间上的最小值,即能够到达一个全局最小的值,但是这样的优化器收敛的速度也非常慢。同时,这也会引起过拟合(Overfitting)的问题。
与批量梯度下降法不同,随机梯度下降每次只需要计算一个样本的梯度:
θ t + 1 = θ t − l r ∇ θ t J i ( θ t ; x i , y i ) (3) {theta_{t+1} = theta_t - l_r {nabla}_{theta_t}J_i (theta_t;x^i,y^i )} tag3 θt+1=θt−lr∇θtJi(θt;xi,yi)(3)与(2)不同,虽然SGD的训练速度较快,但是很容易陷入局部最优值,并且不同样本之间梯度下降的波动较大,所以也更容易发生震荡。
小批量梯度下降即是2.2与2.3的一个组合优化器。也是较为常用的一种优化器,因为其每次训练只取大小为 m ( m < N ) m(m<N) m(m<N)的样本进行训练:
θ t + 1 = θ t − l r 1 m ∑ i = 1 x + m − 1 ∇ θ t J i ( θ t ; x i , y i ) (4) {theta_{t+1} = theta_t - l_r frac{1}{m} sum_{i=1}^{x+m-1}{{nabla}_{theta_t}J_i (theta_t;x^i,y^i )}} tag4 θt+1=θt−lrm1i=1∑x+m−1∇θtJi(θt;xi,yi)(4)注:每次训练一个样本的叫On-line,而一次训练多个样本的叫Off-line。
计算当前时刻的梯度,并保留上一次梯度下降的方向,两者相加作为这一次的梯度方向:
m t + 1 = α m t + l r ∇ θ t J i ( θ t ; x i , y i ) (5) {m_{t+1} = alpha m_t + l_r {nabla}_{theta_t}J_i (theta_t;x^i,y^i )} tag5 mt+1=αmt+lr∇θtJi(θt;xi,yi)(5) θ t + 1 = θ t − m t + 1 (6) {theta_{t+1} = theta_t - m_{t+1}} tag6 θt+1=θt−mt+1(6)其中 m t m_t mt表示第 t t t时刻的参数更新的反方向, α alpha α为上一时刻参数更新的影响权重。
与SGDM保留之前的信息不同,NAG使用的信息是预测下一步的梯度。即:
θ t + 1 = θ t − m t + 1 (7) {theta_{t+1} = theta_t - m_{t+1}} tag7 θt+1=θt−mt+1(7) m t + 1 = λ m t + l r ∇ θ t J i ( θ t − λ m t ; x i , y i ) (8) {m_{t+1} = lambda m_t + l_r {nabla}_{theta_t}J_i (theta_t - lambda m_t;x^i,y^i )} tag8 mt+1=λmt+lr∇θtJi(θt−λmt;xi,yi)(8)若令 θ t ′ = θ t − λ m t {theta_t^{'} = theta_t - lambda m_t} θt′=θt−λmt,则有:
θ t + 1 ′ = θ t + 1 − λ m t + 1 = θ t − m t + 1 − λ m t + 1 {theta_{t+1}^{'} = theta_{t+1} - lambda m_{t+1} =theta_t - m_{t+1} - lambda m_{t+1}} θt+1′=θt+1−λmt+1=θt−mt+1−λmt+1 = θ t − λ m t + 1 − λ m t + l r ∇ θ t J i ( θ t − λ m t ; x i , y i ) = θ t ′ − λ m t + 1 − l r ∇ θ t J i ( θ t ′ ) {=theta_t - lambda m_{t+1} - lambda m_t + l_r {nabla}_{theta_t }J_i (theta_t - lambda m_t;x^i,y^i ) = theta_t^{'} - lambda m_{t+1} - l_r{nabla}_{theta_t}J_i (theta_t^{'})} =θt−λmt+1−λmt+lr∇θtJi(θt−λmt;xi,yi)=θt′−λmt+1−lr∇θtJi(θt′)所以NAG中, t + 1 {t+1} t+1时刻的参数可以看作由 t {t} t时刻参数的值, t {t} t时刻参数的梯度与 t + 1 {t+1} t+1时刻的移动方向共同决定的。这种考虑了未来参数变化的功能叫做超前部署(Look into the future)。
图中,蓝色线表示SGDM的梯度更新,其中蓝色短线表示当前位置的梯度,蓝色长线表示之前累计的梯度;闭合三角形的棕色线、红色线与绿色线表示NAG一次的梯度变化,其中棕色线表示先前累积的梯度,红色线表示原来参数到棕色线后的梯度,两者相加的绿色线方向即为参数更新的方向。
前面讲解的几种优化器都没有对学习步长 l r l_r lr进行修改,而当每次更新参数方向的时候,都调整其学习步长 l r l_r lr的方式即称为自适应梯度更新。
θ t + 1 = θ t − l r ∑ i = 0 t − 1 g i 2 + ϵ g t (9) {theta_{t+1} = theta_t - frac{l_r}{sqrt {sum_{i = 0}^{t - 1}{g_i^2} + epsilon}}g_t} tag9 θt+1=θt−∑i=0t−1gi2+ϵ lrgt(9)公式(9)中, l r l_r lr为一常数,通常取值 l r = 0.01 {l_r=0.01} lr=0.01; ϵ epsilon ϵ为一个非常小的数,通常取值 ϵ = 10 e − 8 {epsilon =10e-8} ϵ=10e−8。可以看出,其梯度更新的距离会随着迭代次数的增加而逐渐变小,所以这会造成一个问题,即当突然遇到很大的梯度之后,后面的小梯度相当于没有更新。
在Adagrad保留之前的梯度的基础上,RMSProp为之前的梯度与目前的梯度添加了一个权重:
θ t + 1 = θ t − l r v t + ϵ g t (10) {theta_{t+1} = theta_{t} - frac{l_r}{sqrt {v_t + epsilon}}g_t} tag{10} θt+1=θt−vt+ϵ lrgt(10)其中 v 1 = g 0 2 , v t = α v t − 1 + ( 1 − α ) g t 2 {v_1=g_0^2, v_t = alpha v_{t-1} + (1 - alpha)g_t^2} v1=g02,vt=αvt−1+(1−α)gt2,并且建议值为 l r = 0.001 , α = 0.9 {l_r = 0.001, alpha = 0.9} lr=0.001,α=0.9。
Adam是比较著名且常用的优化器了。它在SGDM与RMSProp的基础上,又提出了一种更好的优化算法:
θ t + 1 = θ t − l r v ^ t + ϵ m ^ t (11) {theta_{t+1} = theta_{t} - frac{l_r}{sqrt{hat{v}_t}+epsilon}hat{m}_t} tag{11} θt+1=θt−v^t +ϵlrm^t(11)其中有 m ^ t = m t 1 − β 1 t (12) {hat{m}_t=frac{m_t}{1 - beta_1^t}} tag{12} m^t=1−β1tmt(12) v ^ t = v t 1 − β 2 t (13) {hat{v}_t = frac{v_t}{1 - beta_2^t}} tag{13} v^t=1−β2tvt(13)另外 m t = β 1 m t − 1 + ( 1 − β 1 ) g t , m 0 = 0 , v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 , v 1 = g 0 2 {m_t = beta_1 m_{t-1} + (1-beta_1)g_t, m_0 = 0, v_t = beta_2 v_{t -1} + (1 - beta_2)g_t^2, v_1=g_0^2} mt=β1mt−1+(1−β1)gt,m0=0,vt=β2vt−1+(1−β2)gt2,v1=g02。建议值为 β 1 = 0.9 , β 2 = 0.999 , ϵ = 10 e − 8 {beta_1 = 0.9, beta_2=0.999, epsilon = 10e-8} β1=0.9,β2=0.999,ϵ=10e−8。 m t m_t mt表示其过去的参数更新的方向, v t v_t vt表示二阶动量。在实际应用中Adam比其它的优化算法更好。
θ t + 1 = θ t − l r v ^ t + ϵ m t (14) {theta_{t+1} = theta_{t} - frac{l_r}{sqrt{hat{v}_t}+epsilon}m_t} tag{14} θt+1=θt−v^t +ϵlrmt(14) v ^ t = m a x ( v ^ t − 1 , v t ) (15) {hat{v}_t = max(hat{v}_{t-1}, v_t)} tag{15} v^t=max(v^t−1,vt)(15)其中 m t = β 1 m t − 1 + ( 1 − β 1 ) g t , v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 {m_t = beta_1 m_{t-1} + (1-beta_1)g_t, v_t= beta_2 v_{t-1}+(1-beta_2)g_t^2} mt=β1mt−1+(1−β1)gt,vt=β2vt−1+(1−β2)gt2。
本文在参考了李宏毅老师关于优化器的课程的基础上,查阅了与优化器相关的资料。主要内容包括常用的优化器模型,以及使用和选择优化器的一些策略。
李宏毅老师2021课程
优化算法Optimizer比较和总结
优化器(Optimizer)
深度学习各类优化器详解(动量、NAG、adam、Adagrad、adadelta、RMSprop、adaMax、Nadam、AMSGrad)
转载请注明出处
本文发布于:2024-01-29 00:36:28,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170645979511448.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |