【DeepLearning】优化算法:SGD、GD、mini-batch GD、Moment、RMSprob、Adam

优化算法

1 GD/SGD/mini-batch GD

GD:Gradient Descent,就是传统意义上的梯度下降,也叫batch GD。

SGD:随机梯度下降。一次只随机选择一个样本进行训练和梯度更新。

mini-batch GD:小批量梯度下降。GD训练的每次迭代一定是向着最优方向前进,但SGD和mini-batch GD不一定,可能会”震荡“。把所有样本一次放进网络,占用太多内存,甚至内存容纳不下如此大的数据量,因此可以分批次训练。可见,SGD是mini-batch GD的特例。

2 动量梯度下降

一个有用的方法:指数加权平均

假如有N天的数据,a1,a2,a3,...,aN

如果想拟合一条比较平滑的曲线,怎么做呢。可以使用指数加权平均。概括的说,就是平均前m天的数据作为一个数据点:

b0=0

bt=βbt1+(1β)at

比如β取0.9,那么就相当于是平均了10天的数据,这会比较平滑。

为什么叫指数加权平均?是因为,将bt计算公式中的bt1展开,依次展开下去,会发现:

bt=β(βbt2+(1β)at1)+(1β)at

合并一下,前面的数据乘以β的m次方的平均值。因此叫做指数加权平均。

指数加权平均的偏差修正:

很显然,上面公式汇总,假如β=0.9,是要平均前10天的数据,则前9天的数据,做加权平均,并没有足够的数据,这会导致前九天数据偏小。举例来说,第一天b1仅仅是a1的十分之一。可以做偏差修正:

b0=0

bt=βbt1+(1β)at

bt=bt1βt

有了指数加权平均的基本知识,就可以讲Moment Gradient Descent。

带动量的梯度下降,他是为了加快学习速度的优化算法。假如参数W方向希望学的快一点,b方向学的慢一点。普通的梯度下降的结果可能恰恰相反,使得b方向学的比较快,从而引发震荡。所以想要让b方向学的慢一点,这时可以用动量梯度下降。算法如下:

For each epco t:

​ cal dW,dB for each mini-batch.

VdW=βVdW+(1β)dW

Vdb=βVdb+(1β)db

W=WαVdW

b=bαVdb

可见,就是将梯度做了指数加权平均。至于为什么叫动量梯度下降,可能是因为VdW的计算式中,把dW看作加速度,把VdW看作速度。

3 RMSprob

Root Mean Square prob。

这是另一种加快学习的方法。其基本思想也是让b学的慢一点,让W学的快一点,从而更快更准的趋向于最优点。

For each epco t:

​ cal dW,dB for each mini-batch.

SdW=βSdW+(1β)(dW)2

Sdb=βSdb+(1β)(db)2

W=WαdWSdW

b=bαdbSdb

可见,当梯度较大,则会使得S较大,从而使得更新变缓慢。

4 Adam

Adaptive Moment Estimation

这是比较普遍的适用于各种网络的一种方法。称作自适应的动量梯度下降。这是上面动量梯度下降和RMSprob的结合版本,效果比较好。两者做加权指数平均的时候,都做了修正。

For each epco t:

​ cal dW,dB for each mini-batch.

VdW=β1VdW+(1β1)dW

Vdb=β1Vdb+(1β1)db

SdW=β2SdW+(1β2)(dW)2

Sdb=β2Sdb+(1β2)(db)2

VdWcorrection=VdW1β1t

Vdbcorrection=Vdb1β1t

SdWcorrection=SdW1β2t

Sdbcorrection=Sdb1β2t

W=WαVdWcorrectionSdWcorrecti+ε

b=bαVdbcorrectionSdbcorrecti+ε

可见,就是在RMSprob中,用动量梯度下降中的梯度指数加权代替梯度,同时所有指数加权项都做了偏差修正。另外,分母加了ε,这是为了防止除以很小的数造成不稳定。公式中共有4个超参数,他们的取值经验是:

α:学习率,需要调试

β1:取0.9

β2:Adam的作者建议取0.999

ε:取108,并不影响学习效果。

另外,值得注意的是,学习过程中可能有两种窘境,一是困在局部最优,另一个是遇平缓区学习的过慢。采用mini-batch下前者出现的概率很小,即使困在最优也能跳出来,前提是数据量足够。但后者比较棘手,Adam是个比较好的优化算法,一定程度上解决了这个问题。

5 学习率衰减

训练过程中,随着迭代次数,学习率相应减少。

在FB的一篇论文中,使用了不同时间段(迭代次数区间段)采用不同的学习率的方法,效果比较好。

posted @   pigcv  阅读(2454)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示