tensorflow学习笔记——常见的优化器

本文介绍了深度学习中常用的优化器,包括SGD、Momentum、NAG、Adagrad、RMSprop、Adadelta和Adam。详细解释了它们的工作原理和特点,如Adagrad的自适应学习率、RMSprop的梯度平方平均值和Adam的高效计算。还探讨了不同优化器的优缺点及应用场景,强调了在实际应用中选择优化器需要考虑网络结构、学习率和批量大小等因素。
摘要由CSDN通过智能技术生成

SGD:

在最小化损失函数中,最常用的就是梯度下降法。梯度下降法主要有三种变体:

1.Vanilla 梯度下降:在 Vanilla 梯度下降(也称作批梯度下降)中,在每个循环中计算整个训练集的损失函数的梯度。该方法可能很慢并且难以处理非常大的数据集。该方法能保证收敛到凸损失函数的全局最小值,但对于非凸损失函数可能会稳定在局部极小值处。

2.随机梯度下降:在随机梯度下降中,一次提供一个训练样本用于更新权重和偏置,从而使损失函数的梯度减小,然后再转向下一个训练样本。整个过程重复了若干个循环。由于每次更新一次,所以它比 Vanilla 快,但由于频繁更新,所以损失函数值的方差会比较大。

3.小批量梯度下降:该方法结合了前两者的优点,利用一批训练样本来更新参数。一般会使用这种方法。

这里我们主要讲随机梯度下降法(SGD):

                                                                 W=W-\eta \cdot \bigtriangledown _{W}J

  •     W:要训练的参数;
  •     J(W)代价函数;
  •     \bigtriangledown _{W}J:代价函数的梯度;
  •     \eta:学习率。

Momentum:

                                                                v_{t}=\gamma v_{t-1}+\eta \bigtriangledown _{W}J(W)

                                                                          W=W-v_{t}

  •     \gamma:动力,通常设为0.9。

    加入动力既可以加快收敛速度,也可以一定程度避免局部最小点(当然也可能冲出全局最小点)。

NAG:

                                                          v_{t}=\gamma v_{t-1}+\eta \bigtriangledown _{W}J(W-\gamma v_{t-1})

                                                                        W=W-v_{t}

        在Momentum中小球会盲目跟从下坡的梯度,我们这里对此进行改进,加入了\gamma v_{t-1}用来修改W的值。计算W-\gamma v_{t-1}可以表示小球下一个位置在哪里,提取估计下一个位置梯度,使用到当前位置这种预期的更新可以避免我们走的太快。(还不太懂,只知道在梯度较大时候适当抑制收敛速度)

Adagrad:

                                                          W_{t+1}=W_{t}-\frac{\eta }{\sqrt{\sum_{t^{'}=1}^{t}(g_{t^{'},i})^{2}+\varepsilon }}\cdot g_{t}

  •     i:第i个分类;
  •     t:代表出现次数;
  •     \varepsilon:避免分母为0,一般取e-8;
  •     \eta:一般取0.01;
  •     g_{t}=\bigtriangledown _{W}J(W_{i})

       它比较适合稀疏数据集。对比较少见的数据给予较大的学习率取调整参数,对于较大的数据集给予较小1学习率取调整参数。(比如一个图片数据集里有1000张猫的照片但只有100张狗的照片)

       其优点在于不需要人为调节学习率,它可以自动调节。缺点在于随着迭代次数增多,学习率会越来越低直至趋近于0。

RMSprop:

RMS(Root Mean Square)是均方根的缩写。它借鉴了一些Adagrad的思想,公式如下:

                                                                  W_{t+1}=W_{t}-\frac{\eta }{\sqrt{E[g^{2}]_{t}+\varepsilon }}\cdot g_{t}

                                                                   E[g^{2}]_{t}=\gamma E[g^{2}]_{t-1}+(1-\gamma )g^{2}_{t}

  • E[g^{2}]_{t}:前t次的梯度平方的平均值。

与Adagrad不同的是,RMSprop不会出现学习率越来越低的问题,而且仍能够自己调节学习率,可以有一个比较好的效果。(疑问:既然求均值,那自我调节学习率有什么意义,从公式看梯度越大分母越大,学习速度越慢?)

Adadelta:

                                                                     \Delta W=-\frac{\eta }{\sqrt{E[g^{2}]_{t}+\varepsilon }}\cdot g_{t}

                                                                       \Delta W=-\frac{\eta }{RMS[g^{2}]_{t}}\cdot g_{t}

                                                                     W_{t+1}=W_{t}-\frac{RMS[\Delta W]_{t-1}}{RMS[g]_{t}}

不需要设置默认的学习率。

Adam:

优点:

Adam 算法很容易实现,并且有很高的计算效率和较低的内存需求。Adam 算法梯度的对角缩放(diagonal rescaling)具有不变性,因此很适合求解带有大规模数据或参数的问题。该算法同样适用于解决大噪声和稀疏梯度的非稳态(non-stationary)问题。超参数可以很直观地解释,并只需要少量调整。

缺点:

不过Adam算法并不能保证找到极值点。其次,Adam算法在收敛到一个次优解时,观察到一些小批次样本贡献了大幅且有效的信息梯度,指数平均后减小了它们的影响,导致模型收敛性差。

 

上面各优化器代码如下:

train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
train_step = tf.train.MomentumOptimizer(0.1,0.9,use_nesterov=True).minimize(loss) 
#use_nesterov为True时为NAG,False时为.Momentum,默认为False
train_step = tf.train.AdagradOptimizer(0.1).minimize(loss)
train_step = tf.train.RMSPropOptimizer(0.01).minimize(loss)
train_step = tf.train.AdamOptimizer(1e-2).minimize(loss)
train_step = tf.train.AdadeltaOptimizer(1).minimize(loss)

以上只填写了最基础的参数,其他参数可根据需要自己添加。不同优化器对应不同网络,不同学习率,不同批量大小时效果差别较大,具体最好的组合还得自己多种尝试。

下面是网上找到2张动图,可以看一下这些优化器的训练过程。不过每个优化器适用的情况不同,没有绝对的优劣性。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值