KERAS各种优化方法总结

yizhihongxing

KERAS各种优化方法总结 SGDMOMENTUMNESTEROV

 

http://blog.csdn.net/luo123n/article/details/48239963

 

前言

这里讨论的优化问题指的是,给定目标函数f(x),我们需要找到一组参数x,使得f(x)的值最小。

本文以下内容假设读者已经了解机器学习基本知识,和梯度下降的原理。

SGD

SGD指stochastic gradient descent,即随机梯度下降。是梯度下降的batch版本。

对于训练数据集,我们首先将其分成n个batch,每个batch包含m个样本。我们每次更新都利用一个batch的数据,而非整个训练集。即: 

xt+1=xt+Δxt

 

 

Δxt=ηgt

其中,η为学习率,gt为x在t时刻的梯度。

 

这么做的好处在于:

  • 当训练数据太多时,利用整个数据集更新往往时间上不显示。batch的方法可以减少机器的压力,并且可以更快地收敛。
  • 当训练集有很多冗余时(类似的样本出现多次),batch方法收敛更快。以一个极端情况为例,若训练集前一半和后一半梯度相同。那么如果前一半作为一个batch,后一半作为另一个batch,那么在一次遍历训练集时,batch的方法向最优解前进两个step,而整体的方法只前进一个step。

Momentum

SGD方法的一个缺点是,其更新方向完全依赖于当前的batch,因而其更新十分不稳定。解决这一问题的一个简单的做法便是引入momentum。

momentum即动量,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力: 

Δxt=ρΔxt1ηgt


其中,ρ 即momentum,表示要在多大程度上保留原来的更新方向,这个值在0-1之间,在训练开始时,由于梯度可能会很大,所以初始值一般选为0.5;当梯度不那么大时,改为0.9。η 是学习率,即当前batch的梯度多大程度上影响最终更新方向,跟普通的SGD含义相同。ρ 与 η 之和不一定为1。

 

Nesterov Momentum

这是对传统momentum方法的一项改进,由Ilya Sutskever(2012 unpublished)在Nesterov工作的启发下提出的。

其基本思路如下图(转自Hinton的coursera公开课lecture 6a):

KERAS各种优化方法总结

首先,按照原来的更新方向更新一步(棕色线),然后在该位置计算梯度值(红色线),然后用这个梯度值修正最终的更新方向(绿色线)。上图中描述了两步的更新示意图,其中蓝色线是标准momentum更新路径。

公式描述为: 

Δxt=ρΔxt1ηΔf(xt+ρΔxt1)

 

Adagrad

上面提到的方法对于所有参数都使用了同一个更新速率。但是同一个更新速率不一定适合所有参数。比如有的参数可能已经到了仅需要微调的阶段,但又有些参数由于对应样本少等原因,还需要较大幅度的调动。

Adagrad就是针对这一问题提出的,自适应地为各个参数分配不同学习率的算法。其公式如下: 

Δxt=ηtτ=1g2τ+ϵ‾‾‾‾‾‾‾‾‾‾‾‾√gt

 

其中gt 同样是当前的梯度,连加和开根号都是元素级别的运算。eta 是初始学习率,由于之后会自动调整学习率,所以初始值就不像之前的算法那样重要了。而ϵ是一个比较小的数,用来保证分母非0。

其含义是,对于每个参数,随着其更新的总距离增多,其学习速率也随之变慢。

Adadelta

Adagrad算法存在三个问题

  • 其学习率是单调递减的,训练后期学习率非常小
  • 其需要手工设置一个全局的初始学习率
  • 更新xt时,左右两边的单位不同一

Adadelta针对上述三个问题提出了比较漂亮的解决方案。

首先,针对第一个问题,我们可以只使用adagrad的分母中的累计项离当前时间点比较近的项,如下式: 

E[g2]t=ρE[g2]t1+(1ρ)g2t


Δxt=ηE[g2]t+ϵ‾‾‾‾‾‾‾‾‾‾√gt


这里ρ是衰减系数,通过这个衰减系数,我们令每一个时刻的gt随之时间按照ρ指数衰减,这样就相当于我们仅使用离当前时刻比较近的gt信息,从而使得还很长时间之后,参数仍然可以得到更新。

 

针对第三个问题,其实sgd跟momentum系列的方法也有单位不统一的问题。sgd、momentum系列方法中: 

Δxgfx1x


类似的,adagrad中,用于更新Δx的单位也不是x的单位,而是1。

 

而对于牛顿迭代法: 

Δx=H1tgt


其中H为Hessian矩阵,由于其计算量巨大,因而实际中不常使用。其单位为: 

ΔxH1gfx2f2xx


注意,这里f无单位。因而,牛顿迭代法的单位是正确的。

 

所以,我们可以模拟牛顿迭代法来得到正确的单位。注意到: 

Δx=fx2f2x12f2x=Δxfx


这里,在解决学习率单调递减的问题的方案中,分母已经是fx的一个近似了。这里我们可以构造Δx的近似,来模拟得到H1的近似,从而得到近似的牛顿迭代法。具体做法如下: 

Δxt=E[Δx2]t1‾‾‾‾‾‾‾‾‾‾√E[g2]t+ϵ‾‾‾‾‾‾‾‾‾‾√gt

 

可以看到,如此一来adagrad中分子部分需要人工设置的初始学习率也消失了,从而顺带解决了上述的第二个问题。

各个方法的比较

Karpathy做了一个这几个方法在MNIST上性能的比较,其结论是: 
adagrad相比于sgd和momentum更加稳定,即不需要怎么调参。而精调的sgd和momentum系列方法无论是收敛速度还是precision都比adagrad要好一些。在精调参数下,一般Nesterov优于momentum优于sgd。而adagrad一方面不用怎么调参,另一方面其性能稳定优于其他方法。

实验结果图如下:

Loss vs. Number of examples seen 
KERAS各种优化方法总结

Testing Accuracy vs. Number of examples seen 
KERAS各种优化方法总结

Training Accuracy vs. Number of examples seenKERAS各种优化方法总结

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:KERAS各种优化方法总结 - Python技术站

(0)
上一篇 2023年4月8日
下一篇 2023年4月8日

相关文章

  • 对机器学习的一些理解【学术篇】

    写在前面:   在SenseTime工作了大概3个月,接触了机器学习的冰山一角,整理下这段时间的理解。   另外,这里说的机器学习,如无特殊说明,均指“监督学习”。   在下才疏学浅,如果又什么地方写错了,希望大神能不吝赐教(大神都不会来看我的博客吧)。   概念性总结:   这里介绍一些机器学习中常见的东西,如果你对此不感兴趣,可以直接跳到下一话题。   …

    机器学习 2023年4月11日
    00
  • [深度学习]Keras利用VGG进行迁移学习模板

    # -*- coding: UTF-8 -*- import keras from keras import Model from keras.applications import VGG16 from keras.callbacks import TensorBoard, ModelCheckpoint from keras.layers import …

    Keras 2023年4月8日
    00
  • 深度学习(6) – 循环神经网络

    语言模型 RNN是在自然语言处理领域中最先被用起来的,比如,RNN可以为语言模型来建模。那么,什么是语言模型呢? 我们可以和电脑玩一个游戏,我们写出一个句子前面的一些词,然后,让电脑帮我们写下接下来的一个词。比如下面这句: 我昨天上学迟到了,老师批评了____。 我们给电脑展示了这句话前面这些词,然后,让电脑写下接下来的一个词。在这个例子中,接下来的这个词最…

    2023年4月8日
    00
  • PyTorch基础——使用卷积神经网络识别手写数字

    一、介绍 实验内容 内容包括用 PyTorch 来实现一个卷积神经网络,从而实现手写数字识别任务。 除此之外,还对卷积神经网络的卷积核、特征图等进行了分析,引出了过滤器的概念,并简单示了卷积神经网络的工作原理。 知识点 使用 PyTorch 数据集三件套的方法 卷积神经网络的搭建与训练 可视化卷积核、特征图的方法 二、数据准备 引入相关包 import to…

    卷积神经网络 2023年4月8日
    00
  • tensorflow机器学习指数衰减学习率的使用tf.train.exponential_decay

    训练神经网络模型时通常要设置学习率learning_rate,可以直接将其设置为一个常数(通常设置0.01左右),但是用产生过户学习率会使参数的更新过程显得很僵硬,不能很好的符合训练的需要(到后期参数仅需要很小变化时,学习率的值还是原来的值,会造成无法收敛,甚至越来越差的情况),过大无法收敛,过小训练太慢。 所以我们通常会采用指数衰减学习率来优化这个问题,e…

    tensorflow 2023年4月7日
    00
  • pytorch tensor 的拼接和拆分

    torch.catimport torch a=torch.randn(3,4) #随机生成一个shape(3,4)的tensort b=torch.randn(2,4) #随机生成一个shape(2,4)的tensor print(“a:”) print(a) print(“b:”) print(b) print(“拼接结果:”) #print(torch…

    PyTorch 2023年4月8日
    00
  • Anaconda中如何安装Tensorflow

    这篇文章主要介绍了Anaconda中如何安装Tensorflow的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Anaconda中如何安装Tensorflow文章都会有所收获,下面我们一起来看看吧。 Anaconda中如何安装Tensorflow (1) 建立一个 conda 计算环境名字叫tensorflow: conda cr…

    2023年4月5日
    00
  • caffe的损失函数

    损失函数,一般由两项组成,一项是loss term,另外一项是regularization term。 J=L+R 先说损失项loss,再说regularization项。 1. 分对得分1,分错得分0.gold standard 2. hinge loss(for softmargin svm),J=1/2||w||^2 + sum(max(0,1-yf(…

    2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部