NLP 神經網絡訓練慎用 Adam 優化器

https://www.jianshu.com/p/48e71b72ca67

NLP 神經網絡訓練慎用 Adam 優化器

theoqian關注

12019.02.10 16:01:45字數 499閱讀 1,168

 

 

AllenNLP 在 EMNLP 2018 的演講 PPT 《Writing Code for NLP Research》中提到在 NLP 的神經網絡中使用 sparse 版的 Adam 優化器替代普通的 Adam 優化器。

使用 sparse 版的 Adam 優化器.png

NLP 模型的特點

通常自然語言處理模型的輸入是非常稀疏的。對於包含幾十萬上百萬詞的詞表,在訓練的每個 Batch 中能出現的獨立詞數不超過幾萬個。也就是說,在每一輪梯度計算過程中,只有幾萬個詞的 embedding 的梯度是非 0 的,其它 embedding 的梯度都是 0。

Adam 優化器的特點

 

 

Adam 優化器可以說是目前使用最廣泛、收斂速度較快且收斂過程較穩定的優化器。Adam 的計算公式如圖所示。可以看到公式中梯度的計算使用了動量原理,每一輪用於梯度下降的梯度是當前計算的真實梯度與上一輪用於梯度下降的梯度的加權和。這樣動量的引入可以防止訓練時產生震盪。Adam 優化器的學習率對於不同參數也是不同的,由該參數歷史每一輪的真實梯度的大小決定。好處是對於 NLP 這種輸入極度稀疏且輸入特徵極度不平衡(例如整個預料庫中“我”這樣的詞經常出現,而“拉姆塞”這樣的詞只出現幾次)的任務,學習率是自適應的,一些在一次訓練 epoch 中只更新幾次的 embedding,在訓練後期還是會有較大的學習率。

Adam 計算公式.png

問題

NLP 輸入稀疏的特點與 Adam 使用動量計算梯度的特點相結合就引入了麻煩。每一輪更新參數時,只有極少數 embedding 的梯度是非 0 的,大部分 embedding 的梯度是 0 即上圖公式中的 gt 是 0。但是,計算了動量之後,這些原本梯度都應該是 0 的 embedding 有了非零梯度 mt 用於梯度下降更新。想象一個極端的例子,“拉姆塞”這個詞在一個 epoch 中只在第一個 batch 出現了,於是第一個 batch 計算了“拉姆塞”這個 embedding 的真實梯度 g0 用於更新參數,在以後的每個 batch 中雖然“拉姆塞”這個詞沒有出現過,Adam 都會計算它的動量梯度 mt,並用於更新“拉姆塞”這個 embedding,實際上方向與 g0 完全相同,只是每一輪做一次 β1 倍的衰減。這樣的做法就相當於對這些出現次數較少的低頻詞的 embedding,每次梯度下降的等效學習率是非常大的,容易引起類似過擬合的問題。

解決方法

知道了問題的根節,解決方法就很簡單了,每輪迭代只更新這個 batch 中出現過的詞的 embedding 即可。TensorFlow 中可以使用 tf.contrib.opt.LazyAdamOptimizer,也可參考 https://www.zhihu.com/question/265357659/answer/580469438 的實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章