常用的几款优化器

https://blog.csdn.net/u010899985/article/details/81836299
https://www.jianshu.com/p/ee39eca29117


  1. 梯度下降算法(Gradient Descent Optimization)

根据计算目标函数J(θ)采用数据量的大小,梯度下降算法又可以分为批量梯度下降算法(Batch Gradient Descent),随机梯度下降算法(Stochastic GradientDescent)和小批量梯度下降算法(Mini-batch Gradient Descent)。

  • 批量梯度下降算法:
    针对的是整个数据集,通过对所有的样本的计算来求解梯度的方向。
    优点:全局最优解;易于并行实现;
    缺点:当样本数据很多时,计算量开销大,计算速度慢

  • 随机梯度下降算法:只通过一个随机选取的数据(xn,yn) 来获取“梯度”,以此对w进行更新。这种优化方法叫做随机梯度下降。其收敛速度会快一些,但是有可能出现目标函数值震荡现象,因为高频率的参数更新导致了高方差。
    每个数据都计算算一下损失函数,然后求梯度更新参数。
    优点:计算速度快
    缺点:收敛性能不好

  • 小批量梯度下降算法(通常选用该方案),是折中方案,J(θ)选取训练集中一个小批量样本计算,这样可以保证训练过程更稳定,而且采用批量训练方法也可以利用矩阵计算的优势。这是目前最常用的梯度下降算法。

\Theta=\Theta-\eta*\nabla_{\Theta}J(\Theta)

常见问题:
  • 选择合适的learning rate比较困难,如果对所有的参数更新使用同样的learning rate。对于稀疏数据或者特征,有时我们可能想对不经常出现的特征更新快一些,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求了。
image.png
  • SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点,容易产生局部最优,而不能达到全局最优。

  1. Momentum(动量)
    https://zhuanlan.zhihu.com/p/21475880

SGD更新方向完全依赖于当前的batch,因而其更新十分不稳定,每次迭代计算的梯度含有比较大的噪音。

  • 滑板问题:
image.png

下图为函数z=x^2+50y^2,可知最小值位于(0,0)点,从(150,75)这个点开始下降。

# 梯度函数,返回x,y方向上的导数。
def g(x):
    return np.array([2 * x[0], 100 * x[1]])
def momentum(x_start, step, g, discount = 0.7):   
    x = np.array(x_start, dtype='float64')
    pre_grad = np.zeros_like(x)
    for i in range(50):
        grad = g(x)
        pre_grad = pre_grad * discount + grad * step
        # 部分(discount)保留之前的惯性pre_grad
        x -= pre_grad
        
        print '[ Epoch {0} ] grad = {1}, x = {2}'.format(i, grad, x)
        if abs(sum(grad)) < 1e-6:
            break;
    return x
朴素SGD.png

当使用了动量后,实际上沿-y和+y方向的两个力可以相互抵消,而-x方向的力则会一直加强,这样滑板少年会在y方向打转,但是y方向的力量会越来越小,但是他在-x方向的速度会比之前快不少。但还是在y轴方向浪费了不少时间,产生了强烈的震荡抖动。

Momentum.png

  1. Nesterov Accelerated Gradient(2012年)

该优化器相对于Momentum,唯一不同的是计算反向梯度的时机。Momentum计算的是当前位置的反向梯度,Nesterov Momentum 计算的是按照上次更新方向走一小步后的反向梯度。

def g(x):
    return np.array([2 * x[0], 100 * x[1]])
def momentum(x_start, step, g, discount = 0.7):   
    x = np.array(x_start, dtype='float64')
    pre_grad = np.zeros_like(x)
    for i in range(50):
        grad = g(x+pre_grad*discount)
        # 提前跨一步,但是是用于提取它的梯度
        pre_grad = pre_grad * discount + grad * step
        # 部分(discount)保留之前的惯性pre_grad
        x -= pre_grad
        
        print '[ Epoch {0} ] grad = {1}, x = {2}'.format(i, grad, x)
        if abs(sum(grad)) < 1e-6:
            break;
    return x
image.png

因为momentum的\Delta值更小,所以可以减弱震荡,避免跨过头太多导致剧烈的震荡。

Nesterov.png


  1. AdaGrad算法(2011年)

增加了一个学习率递减系数。在训练迭代过程,初期步长大后期步长小。由于比较陡的方向梯度比较大,其学习速率将衰减得更快,这有利于参数沿着更接近坡底的方向移动,从而加速收敛。

w_{t}=w_{t-1}-\frac{\eta}{\delta+\sqrt{\sum_{i=0}^{i=t-1}g^i*g^i}}*g^t

注: \delta 通常为10^{−7},是为了防止分母的为 0,\eta为步长(学习率)

注:如果第t次训练有m个样本,则取g^t=\frac{1}{m}\nabla_\Theta\sum_{i=1}^{i=m}L(f(x_i;\Theta),y_i)

  • 特点:
    (1)适合处理稀疏梯度。
  • 缺点:
    (1)由公式可以看出,仍依赖于人工设置一个全局学习率。
    (2)分母上梯度平方的累加将会越来越大,会造成训练提前结束。
    (3)深度学习中,深度过深时会造成训练提前结束。

  1. RMSProp算法

衰减系数累积了所有更新步骤中的梯度,我们可能更希望考察最近几步中的梯度来决定衰减系数。所以我们添加了一个衰减系数,使距离远的更新影响更弱,距离近的更新影响大。这就是RMSProp。
g^t=\frac{1}{m}\nabla_\Theta\sum_{i=1}^{i=m}L(f(x_i;\Theta),y_i)

r=p*r+(1-p)*g^t*g^t

\Delta\theta=\frac{\varepsilon}{\sigma+\sqrt{r}}g^t

\theta=\theta-\Delta\theta

衰减系数ρ
步长ε
第t轮迭代的梯度g^t


  1. 自适应矩估计(adaptive moment estimation):
    https://blog.csdn.net/qq_41747565/article/details/86100697
    https://blog.csdn.net/fengchao03/article/details/78208414
详细版.png

m_t=u*m_{t-1}+(1-u)*g_t

n_t=v*n_{t-1}+(1-v)*g_t^2

\hat m_t=\frac{m_t}{1-u^t}

\hat n_t=\frac{n_t}{1-v^t}

\Delta \theta_t=-\frac{\hat m_t}{\sqrt{\hat n_t}+\varepsilon}*\eta

  • 偏置修正:因为m_0初始化为0,为了能快点进入工作状态,给每个m_t都除以1-u^t校正初始化偏差。

t从0开始,m0,n0初始化为0,\hat{mt}\hat{nt}是对m_tn_t的无偏估计, gt指Θt在该处目标函数的梯度值,u一般取0.9, v一般取0.999, ε一般取10^{-8}\eta是步长。


各种算法的选择:
https://blog.csdn.net/weixin_40170902/article/details/80092628

  1. 对于稀疏数据,优先选择学习速率自适应的算法如RMSprop和Adam算法,而且最好采用默认值,大部分情况下其效果是较好的
    SGD通常训练时间更长,容易陷入鞍点,但是在好的初始化和学习率调度方案的情况下,结果更可靠。
  2. 如果要求更快的收敛,并且较深较复杂的网络时,推荐使用学习率自适应的优化方法。例如对于RNN之类的网络结构,Adam速度快,效果好,而对于CNN之类的网络结构,SGD +momentum 的更新方法要更好(常见国际顶尖期刊常见优化方法).
  3. Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
  4. 在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。
  5. 特别注意学习速率的问题。学习速率设置得非常大,那么训练可能不会收敛,就直接发散了;如果设置的比较小,虽然可以收敛,但是训练时间可能无法接受。理想的学习速率是:刚开始设置较大,有很快的收敛速度,然后慢慢衰减,保证稳定到达最优
  6. 其实还有很多方面会影响梯度下降算法,如梯度的消失与爆炸,梯度下降算法目前无法保证全局收敛还将是一个持续性的数学难题。
  7. RMSprop适合处理非平稳目标 - 对于RNN效果很好

Momentum还有NAG这种动量算法容易在梯度翻转的时候因为惯性作用偏离目标航线,但是一但找到了正确的行驶方向就能跑得 比自适应的快很多。自适应相对比较稳妥

三处低地的曲面.gif
鞍点曲面.gif
峡谷地貌.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容