当前位置: 代码迷 >> 综合 >> SGD、Momentum、RMSProp、Adam等优化算法比较
  详细解决方案

SGD、Momentum、RMSProp、Adam等优化算法比较

热度:15   发布时间:2023-12-16 16:57:49.0
算法名称 公式 解释
牛顿法 θ t = θ t ? 1 ? H t ? 1 ? 1 ? ▽ θ t ? 1 J ( θ t ? 1 ) \theta_t=\theta_{t-1}-H^{-1}_{t-1}·▽_{\theta_{t-1}}J(\theta_{t-1}) θt?=θt?1??Ht?1?1??θt?1??J(θt?1?) H t ? 1 ? 1 H^{-1}_{t-1} Ht?1?1?为第t-1轮迭代时海森矩阵
逆矩阵,即目标函数对参数 θ t ? 1 \theta_{t-1} θt?1?二阶导数。
梯度下降(GD) θ t = θ t ? 1 ? α ? ▽ θ t ? 1 J ( θ t ? 1 ) \theta_t=\theta_{t-1}?α?▽_{\theta_{t-1}}J(\theta_{t-1}) θt?=θt?1??α?θt?1??J(θt?1?) 使用所有数据进行梯度下降
随机梯度下降(SGD) θ t = θ t ? 1 ? α ? ▽ θ t ? 1 J ( θ t ? 1 ; x ( i ) y ( i ) ) \theta_t=\theta_{t-1}?α?▽_{\theta_{t-1}}J(\theta_{t-1};x^{(i)}y^{(i)}) θt?=θt?1??α?θt?1??J(θt?1?;x(i)y(i)) 使用单个数据进行梯度下降
批量梯度下降(Mini-batch GD) θ t = θ t ? 1 ? α ? ▽ θ t ? 1 J ( θ t ? 1 ; x ( i : i + n ) y ( i : i + n ) ) \theta_t=\theta_{t-1}?α?▽_{\theta_{t-1}}J(\theta_{t-1};x^{(i:i+n)}y^{(i:i+n)}) θt?=θt?1??α?θt?1??J(θt?1?;x(i:i+n)y(i:i+n)) 使用每一小批数据进行梯度下降
(即GD与SGD的折中)
Momentum T t = β ? T t ? 1 + ( 1 ? β ) ? ▽ θ t ? 1 J ( θ t ? 1 ) T_t=\beta·T_{t-1}+(1-\beta)·▽_{\theta_{t-1}}J(\theta_{t-1}) Tt?=β?Tt?1?+(1?β)?θt?1??J(θt?1?)
θ t = θ t ? 1 ? α ? T t \theta_t=\theta_{t-1}?α?T_t θt?=θt?1??α?Tt?
利用累计的指数加权梯度-动量即
惯性
,作为每次权重更新的梯度
Nesterov Momentum T t = β ? T t ? 1 + ▽ θ t ? 1 J ( θ t ? 1 ? α ? β ? T t ? 1 ) T_t=\beta·T_{t-1}+▽_{\theta_{t-1}}J(\theta_{t-1}-\alpha·\beta·T_{t-1}) Tt?=β?Tt?1?+θt?1??J(θt?1??α?β?Tt?1?)
θ t = θ t ? 1 ? α ? T t \theta_t=\theta_{t-1}?α?T_t θt?=θt?1??α?Tt?
在Momentum的基础上根据下一步的
新权重计算新梯度
(“往前多看一步”)
AdaGrad G t = G t ? 1 + ( d θ t ? 1 ) 2 G_{t}=G_{t-1}+(d\theta_{t-1})^2 Gt?=Gt?1?+(dθt?1?)2
θ t = θ t ? 1 ? α G t + ε ? d θ i ? 1 \theta_t=\theta_{t-1}?\frac α{\sqrt{G_t}+\varepsilon}·d\theta_{i-1} θt?=θt?1??Gt? ?+εα??dθi?1?
不同参数有各自的自适应学习率,
即全局学习率除以累计梯度平方和
RMSProp G t = β ? G t ? 1 + ( 1 ? β ) ? ( d θ t ? 1 ) 2 G_{t}=\beta·G_{t-1}+(1-\beta)·(d\theta_{t-1})^2 Gt?=β?Gt?1?+(1?β)?(dθt?1?)2
θ t = θ t ? 1 ? α G t + ε ? d θ i ? 1 \theta_t=\theta_{t-1}?\frac α{\sqrt{G_t}+\varepsilon}·d\theta_{i-1} θt?=θt?1??Gt? ?+εα??dθi?1?
同样自适应学习率,只不过是用全局学习
率除以累计梯度平方的的指数加权均值
Adam T t = β 1 ? T t ? 1 + ( 1 ? β 1 ) ? d θ t ? 1 T_{t}=\beta_1·T_{t-1}+(1-\beta_1)·d\theta_{t-1} Tt?=β1??Tt?1?+(1?β1?)?dθt?1?
G t = β 2 ? G t ? 1 + ( 1 ? β 2 ) ? ( d θ t ? 1 ) 2 G_{t}=\beta_2·G_{t-1}+(1-\beta_2)·(d\theta_{t-1})^2 Gt?=β2??Gt?1?+(1?β2?)?(dθt?1?)2
T t ^ = T t / ( 1 ? β 1 t ) \hat {T_{t}}= {T_t}/({1-\beta_1^t}) Tt?^?=Tt?/(1?β1t?)
G t ^ = G t / ( 1 ? β 2 t ) \hat {G_{t}}= {G_t}/{(1-\beta_2^t)} Gt?^?=Gt?/(1?β2t?)
θ t = θ t ? 1 ? α G t ^ + ε ? T t ^ \theta_t=\theta_{t-1}?\frac α{\sqrt{\hat {G_t}}+\varepsilon}·\hat {T_t} θt?=θt?1??Gt?^? ?+εα??Tt?^?
相当于Momentum和RMSProp的结合体,
计算权重梯度和权重梯度平方的累计加权
平均
,并在偏差校正后进行梯度下降
(即综合一阶动量和二阶动量)

ps: d θ d\theta dθ表示对原始损失函数对 W W W的求导,其可以是 ▽ θ J ( θ ) 、 ▽ θ J ( θ ; x ( i ) y ( i ) ) 、 ▽ θ J ( θ ; x ( i : i + n ) y ( i : i + n ) ) ▽_{\theta}J(\theta)、▽_{\theta}J(\theta;x^{(i)}y^{(i)})、▽_{\theta}J(\theta;x^{(i:i+n)}y^{(i:i+n)}) θ?J(θ)θ?J(θ;x(i)y(i))θ?J(θ;x(i:i+n)y(i:i+n)) 中的一种,多使用最后者,即批量梯度下降。

算法名称 优点 缺点
牛顿法 收敛速度相比梯度下降法快,且由于海森矩阵的的逆在迭代中不断减小,有逐渐缩小步长的效果 计算海森矩阵的逆比较困难,消耗时间和计算资源
梯度下降(GD) 目标函数为凸函数时,可以找到全局最优值(若为非凸函数,能够收敛到局部最优值) 计算量大,收敛速度慢;要用到全部数据,内存消耗大;不允许在线更新模型,如新增样本
随机梯度下降(SGD) 避免冗余数据的干扰,收敛速度加快;能够在线学习;有几率跳出一个比较差的局部最优而收敛到一个更好的局部最优甚至是全局最优; 每次计算的梯度可能方差较大;更新频繁、收敛过程可能产生严重震荡,有可能落入极小值;选择合适的学习率比较困难
批量梯度下降(Mini-batch GD) 降低计算的梯度方差,收敛较为稳定 选择合适的学习率比较困难
Momentum 能够使用动量(即惯性)在相关方向加速SGD,抑制振荡,在一定程度上增加训练稳定性,加快收敛 需要人工设定学习率
Nesterov Momentum 具有"前瞻性",比Momentum收敛速度要快。(数学本质上则是利用了目标函数的二阶导信息) 需要人工设定学习率
AdaGrad 不需要对每个学习率手工地调节;对出现频率较低参数采用较大的α更新,相反,对于出现频率较高的参数采用较小的α更新。 仍依赖于人工设置一个全局学习率,学习率设置过大,对梯度的调节太大。中后期,梯度接近于0(因为是累计的梯度平方和),使得训练提前结束
RMSProp 使用梯度累计指数加权均值的方式解决 Adagrad 算法学习率下降较快的问题 依然依赖于全局学习率
Adam 对内存需求较小,为不同的参数计算不同的自适应学习率。偏差矫正是为了保证每一次迭代学习率都有个确定范围,使得参数比较平稳(否则一阶和二阶动量会偏向于 初始值) /

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
4.牛顿法推导:
牛顿法基本思想是在当前位置 x 0 x_0 x0? f ( x ) f(x) f(x)进行二阶泰勒展开,通过二阶导数找到下一个位置 x x x的估计值,推导:

f ( x ) f(x) f(x) x 0 x_0 x0?进行二阶泰勒展开得:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x ? x 0 ) + 1 2 f ′ ′ ( x 0 ) ( x ? x 0 ) 2 f(x)=f(x_0)+f'(x_0)(x-x_0)+\frac12f''(x_0)(x-x_0)^2 f(x)=f(x0?)+f(x0?)(x?x0?)+21?f(x0?)(x?x0?)2
对上式左右两边进行求导,得:
f ′ ( x ) = f ′ ( x 0 ) + f ′ ′ ( x 0 ) ( x ? x 0 ) f'(x)=f'(x_0)+f''(x_0)(x-x_0) f(x)=f(x0?)+f(x0?)(x?x0?)
因为对f(x)求极值,所以令:
f ′ ( x ) = 0 f'(x)=0 f(x)=0
上上式于是变成:
f ′ ( x 0 ) + f ′ ′ ( x 0 ) ( x ? x 0 ) = 0 f'(x_0)+f''(x_0)(x-x_0)=0 f(x0?)+f(x0?)(x?x0?)=0
于是求得下一位置 x x x的公式为:
x = x 0 ? f ′ ( x 0 ) f ′ ′ ( x 0 ) x=x_0-\frac {f'(x_0)}{f''(x_0)} x=x0??f(x0?)f(x0?)?
迭代式即为:
x k + 1 = x k ? f ′ ( x k ) f ′ ′ ( x k ) x_{k+1}=x_k-\frac {f'(x_k)}{f''(x_k)} xk+1?=xk??f(xk?)f(xk?)?
同理,对于有 N N N个变量的多变量形式,在进行二阶泰勒展开,并令一阶导数为0后,即得:
x k + 1 = x k ? H k ? 1 ? ▽ x k f ( x k ) , k = 0 , 1 , ? x_{k+1}=x_k?H_k^{-1}?▽_{x_k}f(x_k),k=0,1,? xk+1?=xk??Hk?1??xk??f(xk?),k=0,1,?
其中 ▽ x f ( x ) 、 H ? 1 ▽_{x}f(x)、H^{-1} x?f(x)H?1分别一阶导数和二阶导数(海森矩阵),即:
在这里插入图片描述
(未完待续。。。持续更新)
参考:
1.https://zhuanlan.zhihu.com/p/22810533
2.https://blog.csdn.net/u010089444/article/details/76725843
3.https://blog.csdn.net/weixin_38582851/article/details/80555145
4https://blog.csdn.net/zgcr654321/article/details/89674713

  相关解决方案