一文了解深度學習在NLP中的最佳實踐經驗和技巧

編譯 | AI科技大本營(rgznai100)
參與 | JeyZhang,鴿子


在NLP社區中曾流行着這樣一個玩笑,說是一個帶注意力機制的LSTM模型在任何的NLP任務上的表現都是最好的。雖然這在過去的兩年中確實如此,但這個模型已經成爲了如今標準的baseline,隨着NLP社區的逐步發展,你們開始轉向使用其餘更加有趣的模型。html

不過,本文做者不想獨自花費2年的時間去發掘下一個帶注意力機制的LSTM模型,也不想去推翻現有效果好的一些技巧或方法。雖然許多現有的深度學習庫已經考慮了神經網絡實踐方面的最佳實踐經驗,例如模型的初始化方面,但仍有許多其餘細節,特別是面向具體領域的任務時,使用者仍是須要考慮不少特定因素。算法

這篇文章並無談及目前最早進的技術,而是聚集了各類與特定任務相關的最佳實踐經驗和方法。換句話說,這篇文章不會去描述具體的模型架構,而是去談在實際中應用這些模型的小技巧和方法。這些實踐方法和經驗對於提高模型的性能每每很是有效,甚至可以使模型的效果達到最佳,經過與baseline對比可以從直觀上更好地理解它們有效的緣由。網絡

假設你已經熟悉瞭如何將神經網絡技術應用於NLP領域 ,並對通用的或特定領域的NLP任務感興趣,想要快速掌握有關的最佳實踐經驗,從而儘快地產出有意義的成果,那麼這篇文章很適合你。架構

在文章中,做者首先會列舉適用於大多數NLP任務的最佳實踐經驗和方法。而後,做者將列舉與一些最多見NLP任務相關的最佳實踐經驗和方法,特別是分類,序列標籤,天然語言生成和神經機器翻譯等任務。框架

但願對你有幫助,如下,enjoy!函數

                                          詞向量技術

詞向量技術在最近的NLP領域中被普遍應用。文獻代表,使用預訓練好的詞向量有助於提高模型的結果 。詞向量維數的最佳大小取決於任務自己:對於語法相關的任務,如命名實體識別 或詞性標註,詞向量的維數小一點更好;而對於涉及到語義相關的任務,如情感分析,詞向量的維數能夠設置得大一些。工具

                                           模型深度

NLP中用到的神經網絡模型已變得愈來愈深,儘管目前還不及計算機視覺領域中用到的那麼深。目前最好的方法常用到深層次的雙向LSTM模型,一般由3-4層組成,如用於詞性標註和語義角色標註 任務上。用於特定任務上的模型層數甚至能夠更深,可參考Google的NMT模型,具備8層的編碼器和解碼器 。然而,在大多數狀況下,模型層數超過2層以後繼續加深模型所帶來的性能提高是很小的 。性能

以上這些結論適用於大多數的序列標記和結構預測問題。對於分類任務,深層次的模型僅在輸入爲字符級時表現較好,目前使用淺層次的模型仍然是最好的方法。學習

                                     網絡層之間的鏈接

對於深層次神經網絡的訓練,有一些技巧很是重要,能夠避免梯度彌散的問題。目前已經提出了各類各樣的網絡層和鏈接方法。在這裏,咱們將討論其中的三種方法:測試

  • 高速公路層 (highway layers)

  • 殘差鏈接 (residual connection)

  • 密集鏈接 (dense connection)

高速公路層

高速公路層的靈感來源於LSTM的門函數。首先讓咱們假設有一個單層的MLP (多層感知機,也就是全鏈接神經網絡),它將對輸入x做一個非線性g函數的變換,以下:

高速公路層則是這樣的函數變換:

其中⊙表示對應元素相乘,

稱爲變換門,

稱爲移位門。咱們能夠看到,高速公路層其實相似於LSTM的門函數,由於它能將輸入的一些信息自適應地直接傳送至輸出端。

高速公路層已經被用於語言模型之中,並取得了目前的最好結果,也被用於其餘任務上,如語音識別 。Sristava的主頁裏有關於高速公路層更多資料和代碼。

殘差鏈接

殘差鏈接的提出最初是用於計算機視覺領域,它是在2016年的ImageNet大賽上奪冠的主要緣由。殘留鏈接的方式比高速公路層更爲直接,使用以下的函數:

從上述公式來看,它簡單地將當前層的輸入添加至輸出。這個簡單的修改改善了梯度彌散的問題,這是由於即便某一層的做用不大,它也仍是能夠獲取到原始輸入的信息(不至於傳遞不下去)。

密集鏈接

相比於以前只是簡單地將每一層的輸出直接添加至下一層的輸入,密集鏈接 (Huang et al., 2017) (2017年CVPR會議的最佳論文獎) 增長了從每一個層到後續全部層的直接鏈接。咱們用h表示輸出結果,x表示輸入,l表示當前層。密集鏈接將當前層以前的全部網絡層的輸出做爲輸入提供給當前層:

其中[⋅;⋅]表示級聯。密集鏈接已成功應用於計算機視覺領域之中。他們還發現這種鏈接方法對於不一樣NLP任務的多任務學習也是有用的,而對於基於神經網絡的機器翻譯任務而言,使用殘差變量之和的方法已被證實要優於僅使用殘差鏈接。

                                               Dropout

雖然被普遍用於計算機視覺領域中的批量歸一化 (batch normalization) 方法淘汰了其餘的正則化方法,可是dropout 仍然被普遍用於NLP領域的深層神經網絡用做正則化項。在大多數狀況下,dropout都是有效的。近年來,一些dropout的變種如自適應的dropout 和可進化的dropout 等被陸續提出,但這些方法尚未被普遍地應用。Dropout在NLP領域中存在的一個問題是,它不能被用在循環鏈接層上,由於dropout mask的疊加會致使最終詞向量的輸入失效。

循環dropout

循環dropout經過在下一層使用相同的dropout mask來解決這一問題,這不只避免了dropout偏差的擴大,同時也有效地對序列模型進行了正則化。例如,循環dropout方法已被用於語義角色標註 和語言建模任務上,並取得了迄今爲止最好的結果。

                                              多任務學習

若是有足夠多的額外數據,一般能夠利用多任務學習 (MTL) 來提升目標任務的性能。能夠看看這篇博文來了解有關MTL的更多信息。

輔助目標

咱們一般能夠找到一些對任務有用的輔助目標 。例如能夠經過預測文本中的周邊單詞能夠獲得預訓練的詞向量,同時也能夠將詞向量結果做爲訓練中的輔助目標。 (Ramachandranet al., 2016)[36]中針對seq2seq模型也用到了相似的輔助目標。

面向特定任務的網絡層

儘管NLP領域中多任務學習的經常使用方法都是參數共享的,但這樣做對於面向不一樣任務的模型層的學習是有益的。這能夠經過將一個任務的輸出層放置在較低的層次 來完成。而另外一種方法是利用獨自的共享空間來實現。

                                               注意力機制

注意力機制最經常使用於seq2seq模型的編碼過程,也可用於任何序列模型中以回溯過去的狀態。使用注意力機制,能夠基於隱藏層狀態

來獲得一個上下文向量ci,再結合當前層的隱狀態hi來作出預測。上下文向量ci是以前隱藏層狀態的加權平均,權重係數爲ai:,以下面的公式:

注意力函數

利用當前隱層狀態hi和以前隱層狀態sj計算出一個相應分值(未歸一化)。接下來,咱們將探討4種注意力機制的變種:

  • 加法式的注意力機制

  • 乘法式的注意力機制

  • 基於自身的注意力機制 (self-attention)

  • 以及iv)key-value形式的注意力機制。

加法式的注意力機制

原始的注意力機制 使用了一個單層的隱藏層前饋網絡來計算注意力的對齊關係,以下公式:

其中Va和Wa是學習到的注意力參數。相應地,咱們也可使用矩陣W1和W2分別對hi和sj做相應的變換,而後求和:

乘法式的注意力機制

乘法式的注意力機制簡化了原始的注意力函數的計算,以下:


加法式和乘法式的注意力機制在時間複雜度上是差很少的,但乘法式在實踐中的計算更快,也更節省內存,由於它能夠利用高效率的矩陣乘法算法。當解碼器向量dh的維數較小時,這兩種的性能差很少;而維數較大時,會出現加法式的注意力機制表現更好的狀況,此時經過將

縮小至

倍能夠減小這種狀況的發生。

注意力機制不只能夠影響編碼器的狀態以及利用以前的隱層狀態,還能夠得到輸入信息的分佈狀況(也是一種特徵形式),例如用於閱讀理解任務中的文本對應的詞向量分析。可是,注意力機制並不適用於一些不須要額外信息的分類任務,如情感分類。對於這類任務用到的模型,一般是使用LSTM的最終隱藏層狀態或者使用相似於最大池化或平均池化的聚合函數來得到句子表示。

基於自身的注意力機制

在沒有任何額外信息的狀況下,咱們仍然能夠經過關注句子自己 (即self-attention) 來從句子中提取出相關的信息。 基於自身的注意力機制 (也稱爲基於內部的注意力機制) 已經被成功地應用於各類任務上,包括閱讀理解,文本蘊涵和生成式摘要等。

咱們能夠簡化加法式的注意力模型,即計算每一個隱藏狀態hi的非歸一化的對齊分數:

轉換爲矩陣運算形式,對於隱藏層狀態

咱們能夠計算出注意力向量a和最終的句子向量表示c以下:

相比於只提取出一個向量,咱們利用矩陣Va來取代va從而獲得幾個關注點,而後抽取出矩陣注意力矩陣A:

在實踐中,咱們會使用以下的正交約束項來防止冗餘,並採用Frobenius規範項的平方來保證注意力向量的多樣性:

一種相似的multi-head注意力機制被Vaswani等人採用過。

Key-value形式的注意力機制

最後,Key-value形式的注意力機制是最近提出的一種注意力機制的變種,與以前使用注意力函數不一樣的是,它經過維護一個獨立的向量來進行注意力的計算。這種方法被有效地應用到多種文檔建模任務中。 具體而言,Key-value形式的注意力機制將每一個隱藏層向量hi分解成一個key爲ki和一個value爲vi:即

這些key會被用於計算注意力的分佈ai,經過一個加法式的注意力函數:

其中L是注意力窗口的長度,l是一個向量。而後經過這些來獲得上下文表示向量ci:

上下文表示向量ci和當前值vi會結合在一塊兒來用於預測。

                                                    最優化

最優化算法和優化模式一般也是屬於模型的一部分,並被當作一個黑盒子。有時候,對最優化算法進行輕微的改動,例如對於Adam下降β2值會對優化結果產生很是大的影響。

最優化算法

Adam 是最受歡迎和被普遍使用的優化算法之一,一般都會做爲NLP領域研究人員的選擇。一般認爲,Adam要明顯優於傳統的隨機梯度降低(SGD)算法。然而,雖然訓練過程當中A dam比SGD收斂快得多,可是SGD的在學習率上的退火速率要略勝於Adam。最近的研究工做進一步代表,對SGD進行適當的動量調整將優於Adam算法。

優化模式

雖然Adam內部會調整每一個參數的學習率,咱們仍然在Adam中使用SGD式的退火。具體而言,咱們能夠經過重啓來進行學習率退火:設定一個學習率並訓練模型直到收斂。而後,咱們將學習率減半,並經過加載以前最佳的學習模型來重啓算法。對於Adam而言,這會使優化器忘記其以前的參數學習率並重啓。(Denkowski, M., & Neubig, G. (2017). Stronger Baselines for Trustable Results in Neural Machine Translation)代表,Adam兩次重啓後的學習率退火更快,表現要優於SGD。

                                              模型集成

經過集成多個模型來提高最終的性能是一種基於經驗主義的有效策略。儘管使用集成式的模型在測試階段會比較費時,但最新研究進展代表對集成式模型進行壓縮也是可行的。

隨着模型多樣性增長,對這些模型進行集成是確保最終結果可靠的重要方法 。 雖然對同一模型的不一樣種結果的集成被證實是有效的,可是這犧牲了模型的多樣性做爲代價。週期性的學習率有助於減輕這種影響。然而,在有充足的計算資源的狀況下,咱們更傾向於集成多個單獨訓練的模型來最大程度上增長模型的多樣性。

                                            超參數的優化

相比於單純使用預先定義好的或現成的模型超參數,簡單地對它們做一點調整就能夠提高模型的結果。貝葉斯優化的最新研究進展使其成爲神經網絡中超參數優化的理想工具,遠遠優於被普遍使用的網格搜索。對一個簡單的LSTM模型的超參數做自動調整取得了目前語言模型的最好結果,這甚至超過了一些更復雜的模型。

                                     LSTM模型調優的小技巧

初始狀態的學習 咱們一般用0向量來初始化LSTM模型的初始狀態。相較於固定模型的初始狀態,咱們能夠把初始狀態的參數也當作須要學習的參數,這能夠提升性能,也是Hinton所推薦的作法(https://www.cs.toronto.edu/~hinton/csc2535/notes/lec10new.pdf)。參考這篇博客文章(https://r2rt.com/non-zero-initial-states-for-recurrent-neural-networks.html),瞭解Tensorflow的實現。

共享輸入和輸出的詞向量

輸入和輸出的詞向量參數是LSTM模型中數量最多的參數。若是將LSTM做爲一個語言模型來進行詞的預測,那麼輸入和輸出的參數是能夠共享的。這種作法對於小型數據集特別適用,由於數據規模限制了參數的學習量。

梯度的規範化削減

下降「梯度爆炸」風險的一種方法是削減梯度的最大值。 然而,這對模型的效果並無改善。相比於簡單地削減梯度的最大值,對梯度的全局範數進行削減取得的效果更爲顯著(在此有Tensorflow的實現)。

向下投影

爲了進一步減小輸出的參數量,能夠將LSTM的隱藏層狀態投影至更小的空間。這對於輸出量較大的任務 (如語言建模) 尤爲有用。

                               面向具體任務的最佳實踐經驗

接下來,咱們將討論一些具體任務上的最佳實踐經驗。其中的大多數在一個具體的任務上的效果都是最佳的,其中的一些可能還適用於其餘的任務,但這還須要進行驗證。咱們將討論如下幾種應用:分類,序列標註,天然語言生成(NLG),以及 NLG的一個特例——基於神經網絡的機器翻譯。

                                                     分類

CNN模型被普遍應用在NLP中的分類任務中。近期發現,因爲CNN模型具備高效的卷積運算,它也一樣適用於序列類型的任務。下面是一些與CNN模型相關的最佳實踐,以及超參數上的最佳選擇。

卷積核

能夠組合多種尺寸的卷積核來取得最優的效果,例如卷積核尺寸爲(3,4,5)的組合的效果最佳 。卷積核的最佳數量範圍爲50-600。

池化函數

輸出爲1的最大池化的效果要好於平均池化和輸出爲k的最大池化方法。

                                                    序列標註

序列標註是NLP領域的常見任務。現有的實踐經驗不少都是與模型結構的中特定部分相關,下面將提供模型輸出和預測階段方面的實踐經驗。

序列標註的模式

對於某些文本標註任務而言,所使用的標註框架是不一樣的。其中有:BIO模式,它將文本片斷中出現的第一個令牌 (token) 標記成B標籤,剩餘的令牌都標記成I標籤,不屬於令牌的標記爲O標籤; IOB模式,相似於BIO,但只在前一個令牌是同一個類但不屬於分段的一部分時標記爲B標籤; 還有IOBES模式,它額外區分了單令牌實體 (S標籤) 和分段中的最後一個令牌 (E標籤)。使用IOBES和BIO模式所取得的效果是差很少的。

CRF輸出層

若是輸出之間存在相互依賴的關係,例如對於命名實體識別,最終的softmax層能夠用線性的條件隨機場 (CRF) 替代。實驗結果代表,這對模型須要進行約束的任務有必定的改進。

受約束的解碼過程

相較於使用一個CRF輸出層,對解碼進行約束是一種防止生成錯誤序列的方法,即不會產生有效的BIO轉換。對解碼進行約束的好處在於能夠執行任意的約束條件,這適用於一些特定的任務,如須要執行句法約束的任務。

                                                      天然語言生成

目前大多數的實踐經驗也適用於天然語言生成 (NLG)。事實上,迄今爲止有不少實踐上的技巧都來源於語言建模,這個最原始的NLP任務。

模型結果的覆蓋度

輸出重複問題是許多NLG任務面臨的一大問題,這是由於目前的模型沒有一個好的方法來記住模型產生了的輸出結果。在模型中使用模型輸出結果的覆蓋度是解決這個問題的好方法。若是提早有一個清單,包括了有哪些實體應該在輸出結果中說起,如 (Kiddon, C., Zettlemoyer, L., & Choi, Y. (2016). Globally Coherent Text Generation with Neural Checklist Models. Proceedings of the 2016 Conference on Empirical Methods in Natural Language Processing (EMNLP2016), 329–339) 所用到的。若是使用注意力機制,咱們能夠記錄覆蓋度向量ci,這是以前時間步長的注意力分佈at的總和 :

這個向量捕獲了咱們對輸入中全部單詞的關注程度。咱們能夠經過控制這個表徵覆蓋度的向量,以免模型在輸出時使用重複的單詞:

此外,咱們還能夠增長一個輔助的損失函數,來捕獲對於特定任務咱們想獲得的注意力分佈:對於NMT,咱們但願大體上能一對一地對齊;所以,若是覆蓋向量的指標發生了誤差,咱們則對模型作出相應的懲罰處理 。總之,當模型重複使用輸入中的相同部分時,須要對模型的訓練做相應懲罰 。

                                    基於神經網絡的機器翻譯

儘管基於神經網絡的機器翻譯 (NMT) 只是NLG的一個實例,但NMT受到了很是多的關注,許多模型和方法都是專門爲此而開發的。相應地,許多最佳的實踐經驗或超參數最佳選擇都僅適用於NMT這個任務自己。

詞向量的維數

詞向量的維數設置爲2048時的模型性能達到最佳,但這帶來的提高幅度很小。其實即便詞向量維數爲128維時模型的性能也很不錯,而收斂速度也將幾乎快上兩倍。

編碼器和解碼器的層數

編碼器的層數設置最好不要超過2-4層。儘管深層次的模型要優於淺層模型,但對於解碼器而言,其層數最好不要超過44層。

編碼方向

雙向的編碼器的性能要優於單向的編碼器。Sutskever等人(2014)[67]提出了對源序列的輸入方向反轉有助於減輕對長時記憶的依賴。在單向編碼器中反轉源序列的結果要優於沒有反轉的結果。

集束搜索 (Beam Search) 策略

集束搜索設置的大小爲10左右,同時對長度做正則化時,可以取得最佳的模型性能。

單字翻譯

Senrich等人(2016)[66]提出了一種基於字節對編碼 (BPE) 的方式將單詞劃分爲字序列。BPE迭代式地合併頻繁的符號對,最終將頻繁出現的ngram合併成單個符號,從而有效地清除了不在詞典中的詞。儘管這個方法最初是爲了處理罕見的單詞,可是處理字單元的模型總體的表現要優於全詞系統,對於以字爲單位的詞彙表大小設置爲32,000比較合適。

                                                   總結

但願這篇文章有助於您開始着手新的NLP任務。即便你已經熟悉了這當中的大多數,我仍然但願你從中學習到了新的東西,或者加深了你以前的瞭解。


原文地址

http://ruder.io/deep-learning-nlp-best-practices/index.html#attention

(注意:本文參考文獻比較多,這裏不一一羅列出,查看原文可參考完整的參考文獻)


— End —

相關文章
相關標籤/搜索