Navigation

    Gpushare.com

    • Register
    • Login
    • Search
    • Popular
    • Categories
    • Recent
    • Tags

    NAG优化器

    语音识别与语义处理领域
    1
    1
    147
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • 173****5160
      173****5160 last edited by 173****5160

      最近在看fairseq源码时发现NAG优化器 (Nesterov Accelerate gradient)的实现与torch自带的有些许不一样,于是打算查下资料了解清楚。

      先回忆下Momentm,该梯度下降法引入动量的概念,使用β对历史梯度进行滑动指数加权平均,最早的梯度衰减的最快,对当前更新影响小;反之,越接近当前的梯度对更新的影响越大,公式为:
      ~A1E~JC(`1PVA}6A{VX~1TO.png
      其中Vt、gt、g(θt)分别代表t时刻的速度、梯度、模型参数,μ是动量系数,lr是学习率。该方法的思想是对网络参数进行平滑处理,让梯度的摆动幅度不要太大。

      NAG类似Momentum,它们都是利用历史梯度来更新参数,区别在于,NAG先利用μVt,对θt进行部分更新得到θt+μVt,然后利用梯度g(θt+μVt)更新得到θt+1,其公式如下所示:
      0b548033-acf7-443c-a3e1-63dad71b448a-image.png
      此处ε是学习率。
      下图对Momentum和NAG作了形象解释:
      2f7cf5bf-0cd2-4372-be18-40232b3b8d45-image.png
      Momentum使用当前位置A处的速度Vt和梯度g(θt)直接更新到目的地C;而NAG从A点先沿着惯性方向走一小步到B,此处距C很接近了, 再利用B处的梯度g(θt+μVt)更新到C。

      论文中认为这样可以快速更新V,使得Nag比momentum更稳定,且更适合于大学习率的场景。除此之外,如果Nag用μVt更新到B点较差时,由于B点梯度g(θt+μVt)比momentum的g(θt)更大,因此Nag能更快往回修正到起始点A。

      言归正传,这是torch.optim.SGD的公式和代码[1]:
      bdefa8bc-17ff-49d9-be5a-36d033e48cae-image.png
      42f9a14a-577f-46d5-bf01-f3d23ef7036b-image.png

      这是fairseq.optim.nag的公式和代码[2]:
      ca9833e5-5ed5-40f2-bb69-b42ebd434cf7-image.png
      df40b1ba-49e1-47a5-a8e3-897d64af1854-image.png
      可以看出两者实际上还是有些不同,而Fairseq的nag实际上和论文的公式基本一致,[3]中有推导:
      11dce8f3-c11a-4070-9936-1e25351d8ab5-image.png
      其中的β就是本文的动量系数μ,先对θt+βVt做了代换得到θt’后,最后将θt’当成待更新的参数θt,也就是每次更新的始终是θt+βVt,关于这个的解释见下图及[4]:
      f74fee8c-81c6-4dcf-9963-d0b8695ee67d-image.png

      总之,nag优化器能加速收敛,且使用很大的学习率也很稳定,难怪fairseq里面ConvS2S能使用0.5的学习率。

      [1]torch sgd
      [2]fairseq nag
      [3]深度学习中优化方法
      [4]CS231n Convolutional Neural Networks for Visual Recognition

      1 Reply Last reply Reply Quote 2
      • First post
        Last post