跟著代碼理解BERT中的優(yōu)化器AdamW(AdamWeightDecayOptimizer)

引言

最近依舊在做命名實體識別的任務消请,一直在想如何能在保證效率的前提下杂腰,提升BERT+BiLSTM+CRF這個主流模型的準確率复亏≈和蓿“ 達觀杯 ”的獲獎方案中有的隊伍使用了Lookahead+Adam的優(yōu)化器,所以我也打算從優(yōu)化器的方向入手看看能否有效果的提升缔御。本以為BERT中使用的是用爛了的Adam抬闷,一看源碼發(fā)現是重寫的優(yōu)化器,叫AdamWeightDecayOptimizer耕突,本來Adam都沒太搞懂笤成,又來一個WeightDecay,一起學一下吧眷茁。

不查不知道炕泳,一查嚇一跳,2014年被提出的Adam優(yōu)化器的收斂性被證明是錯誤的上祈,之前大部分機器學習框架中對于Adam的權重衰減的實現也都是錯誤的喊崖。關注其收斂性的論文也獲得了ICLR 2017的Best Paper,在2017年的論文《Fixing Weight Decay Regularization in Adam》中提出了一種新的方法用于修復Adam的權重衰減錯誤雇逞,命名為AdamW。實際上茁裙,L2正則化和權重衰減在大部分情況下并不等價塘砸,只在SGD優(yōu)化的情況下是等價的。而大多數框架中對于Adam+L2正則使用的是權重衰減的方式晤锥,兩者不能混為一談掉蔬。

先回顧一下Adam優(yōu)化器的前置知識廊宪,并結合源碼理解Adam優(yōu)化器,再來看AdamW與之的不同之處女轿,本文依舊不會有復雜的數學公式箭启,相關實現以python代碼的形式展示。

Adam前置知識

1. 梯度下降法

最基本的優(yōu)化方法蛉迹,沿著負梯度的方向更新參數傅寡,實現如下:

# 梯度下降法
x += - learning_rate * dx

其中l(wèi)earning_rate是超參數代表學習率,被更新的變量為x北救,其梯度為dx荐操,梯度->位置,很好理解珍策。
但是梯度下降法相關的優(yōu)化方法容易產生震蕩托启,且容易被困在鞍點,遲遲不能到達全局最優(yōu)值攘宙。

2. 動量法

動量法是一類從物理中的動量獲得啟發(fā)的優(yōu)化方法屯耸,可以簡單理解為:當我們將一個小球從山上滾下來時,沒有阻力的話蹭劈,它的動量會越來越大疗绣,但是如果遇到了阻力,速度就會變小链方。實現如下:

# 動量法
v = mu * v - learning_rate * dx # 梯度影響速度
x += v # 速度決定位置

變量v的初始值被定為0持痰,超參數mu在優(yōu)化過程中被視為動量,其物理意義可以視為摩擦系數祟蚀,加入的這一項工窍,可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢前酿,這樣就可以加快收斂并減小震蕩患雏。和之前不同的是梯度不會直接對位置造成影響,梯度->速度->位置罢维。

3. RMSprop

RMSprop是一種自適應學習率方法淹仑,依舊是基于梯度對位置進行更新。為了消除梯度下降中的擺動肺孵,加入了梯度平方的指數加權平均匀借。梯度大的指數加權平均就大,梯度小的指數加權平均就小平窘,保證各維度的梯度都在一個良機吓肋,進而減少擺動。
關于指數加權平均的通俗理解可以參考https://zhuanlan.zhihu.com/p/29895933

# RMSprop
cache = decay_rate * cache + (1 - decay_rate) * dx**2 # 梯度平方的指數加權平均
x += - learning_rate * dx / (np.sqrt(cache) + eps) # 基于梯度更新

其中decay_rate和eps都是超參數瑰艘,每一步的變量cache的值都不同是鬼,所以可以看做自適應得對學習率進行調整肤舞。
還有一些其他效果較好的優(yōu)化器,由于這些前置知識已經足夠理解Adam了均蜜,所以在此不做過多介紹李剖。

Adam

Adam可以看做動量法和RMSprop的結合

# Adam
m = beta1*m + (1-beta1)*dx
v = beta2*v + (1-beta2)*(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)

對于m和v的處理,同樣使用了指數加權平均囤耳。相比于RMSprop篙顺,梯度換為了平滑的m,而cache的處理基本沒有變化紫皇。超參數beta1和beta2的初始值接近于1慰安,因此,計算出的偏差項接近于0聪铺。

AdamW

AdamW是在Adam+L2正則化的基礎上進行改進的算法化焕。
使用Adam優(yōu)化帶L2正則的損失并不有效。如果引入L2正則項铃剔,在計算梯度的時候會加上對正則項求梯度的結果撒桨。那么如果本身比較大的一些權重對應的梯度也會比較大,由于Adam計算步驟中減去項會有除以梯度平方的累積键兜,使得減去項偏小凤类。按常理說,越大的權重應該懲罰越大普气,但是在Adam并不是這樣谜疤。而權重衰減對所有的權重都是采用相同的系數進行更新,越大的權重顯然懲罰越大现诀。在常見的深度學習庫中只提供了L2正則夷磕,并沒有提供權重衰減的實現。

Adam+L2 VS AdamW

圖片中紅色是傳統(tǒng)的Adam+L2 regularization的方式仔沿,綠色是Adam+weightdecay的方式坐桩。可以看出兩個方法的區(qū)別僅在于“系數乘以上一步參數值“這一項的位置封锉。再結合代碼來看一下AdamW的具體實現绵跷。

以下代碼來自https://github.com/macanv/BERT-BiLSTM-CRF-NER/blob/master/bert_base/bert/optimization.py中的AdamWeightDecayOptimizer中的apply_gradients函數中,BERT中的優(yōu)化器就是使用這個方法成福。在代碼中也做了一些注釋用于對應之前給出的Adam簡化版公式碾局,方便理解∨可以看出update += self.weight_decay_rate * param這一句是Adam中沒有的擦俐,也就是Adam中綠色的部分對應的代碼,weightdecay這一步是是發(fā)生在Adam中需要被更新的參數update計算之后握侧,并且在乘以學習率learning_rate之前蚯瞧,這和圖片中的偽代碼的計算順序是完全一致的∑非妫總之一句話埋合,如果使用了weightdecay就不必再使用L2正則化了。

      # m = beta1*m + (1-beta1)*dx
      next_m = (tf.multiply(self.beta_1, m) + tf.multiply(1.0 - self.beta_1, grad))
      # v = beta2*v + (1-beta2)*(dx**2)
      next_v = (tf.multiply(self.beta_2, v) + tf.multiply(1.0 - self.beta_2, tf.square(grad)))
      # m / (np.sqrt(v) + eps)
      update = next_m / (tf.sqrt(next_v) + self.epsilon)
      # Just adding the square of the weights to the loss function is *not*
      # the correct way of using L2 regularization/weight decay with Adam,
      # since that will interact with the m and v parameters in strange ways.
      #
      # Instead we want ot decay the weights in a manner that doesn't interact
      # with the m/v parameters. This is equivalent to adding the square
      # of the weights to the loss with plain (non-momentum) SGD.
      if self._do_use_weight_decay(param_name):
        update += self.weight_decay_rate * param
      update_with_lr = self.learning_rate * update
      # x += - learning_rate * m / (np.sqrt(v) + eps)
      next_param = param - update_with_lr

原有的英文注釋中也解釋了Adam和傳統(tǒng)Adam+L2正則化的差異萄传,好了到這里應該能理解Adam了甚颂,并且也能理解AdamW在Adam上的改進了。

Lookahead秀菱,RAdam?

Lookahead和RAdam都是比較新的優(yōu)化器振诬,具體原理在此不過多介紹。但是我有疑問需要大神來解答一下衍菱。
在BERT中引入優(yōu)化器的源碼中有這樣一句注釋

  # It is recommended that you use this optimizer for fine tuning, since this
  # is how the model was trained (note that the Adam m/v variables are NOT
  # loaded from init_checkpoint.)

也就是說在微調BERT的時候強烈建議使用AdamW優(yōu)化器赶么。在自己的NER數據集上使用6層BERT,AdamW能得到98%左右的F1值脊串,我嘗試使用了RAdam辫呻,Lookahead+RAdam和Lookahead+AdamW,還有Ranger琼锋,得到的效果都非常差放闺,要不就0的F1值,要不就是30%左右缕坎,好像完全沒有效果怖侦。

項目參考源碼https://github.com/macanv/BERT-BiLSTM-CRF-NER
RAdam,Lookahead:https://github.com/lifeiteng/Optimizers
https://github.com/michaelrzhang/lookahead
Ranger:https://github.com/jyhengcoder/Ranger_tensorflow

請大神解答一下,為什么達觀杯有的隊伍用了Lookahead取得了較好的效果(可能在訓練BERT模型時就用了Lookahead谜叹?)匾寝。那是什么原因導致的我實驗中微調官方提供的BERT模型時Lookahead和RAdam效果不好,是超參數的問題還是預訓練好的BERT模型不適用于這些優(yōu)化器那叉谜?

參考資料

https://www.zhihu.com/question/323747423/answer/790457991
https://www.cnblogs.com/guoyaohua/p/8542554.html
https://zhuanlan.zhihu.com/p/63982470
https://zhuanlan.zhihu.com/p/38945390

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末旗吁,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子停局,更是在濱河造成了極大的恐慌很钓,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件董栽,死亡現場離奇詭異码倦,居然都是意外死亡,警方通過查閱死者的電腦和手機锭碳,發(fā)現死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門袁稽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人擒抛,你說我怎么就攤上這事推汽〔挂桑” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵歹撒,是天一觀的道長莲组。 經常有香客問我,道長暖夭,這世上最難降的妖魔是什么锹杈? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮迈着,結果婚禮上竭望,老公的妹妹穿的比我還像新娘。我一直安慰自己裕菠,他們只是感情好咬清,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著糕韧,像睡著了一般枫振。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萤彩,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天粪滤,我揣著相機與錄音,去河邊找鬼雀扶。 笑死杖小,一個胖子當著我的面吹牛,可吹牛的內容都是我干的愚墓。 我是一名探鬼主播予权,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浪册!你這毒婦竟也來了扫腺?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤村象,失蹤者是張志新(化名)和其女友劉穎笆环,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體厚者,經...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡躁劣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了库菲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片账忘。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出鳖擒,到底是詐尸還是另有隱情溉浙,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布蒋荚,位于F島的核電站放航,受9級特大地震影響,放射性物質發(fā)生泄漏圆裕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一荆几、第九天 我趴在偏房一處隱蔽的房頂上張望吓妆。 院中可真熱鬧,春花似錦吨铸、人聲如沸行拢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舟奠。三九已至,卻和暖如春房维,著一層夾襖步出監(jiān)牢的瞬間沼瘫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工咙俩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耿戚,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓阿趁,卻偏偏與公主長得像膜蛔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脖阵,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內容