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

AI科技大本營發表於2017-09-16
編譯 | AI科技大本營(rgznai100)
參與 | JeyZhang,鴿子


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

不過,本文作者不想獨自花費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函式的變換,如下:

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

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

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

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

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

稱為變換門,

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

稱為移位門。我們可以看到,高速公路層其實類似於LSTM的門函式,因為它能將輸入的一些資訊自適應地直接傳送至輸出端。

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

殘差連線

殘差連線的提出最初是用於計算機視覺領域,它是在2016年的ImageNet大賽上奪冠的主要原因。殘留連線的方式比高速公路層更為直接,使用如下的函式:

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

從上述公式來看,它簡單地將當前層的輸入新增至輸出。這個簡單的修改改善了梯度彌散的問題,這是因為即使某一層的作用不大,它也還是可以獲取到原始輸入的資訊(不至於傳遞不下去)。

密集連線

相比於之前只是簡單地將每一層的輸出直接新增至下一層的輸入,密集連線 (Huang et al., 2017) (2017年CVPR會議的最佳論文獎) 增加了從每個層到後續所有層的直接連線。我們用h表示輸出結果,x表示輸入,l表示當前層。密集連線將當前層之前的所有網路層的輸出作為輸入提供給當前層:

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

其中[⋅;⋅]表示級聯。密集連線已成功應用於計算機視覺領域之中。他們還發現這種連線方法對於不同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模型的編碼過程,也可用於任何序列模型中以回溯過去的狀態。使用注意力機制,可以基於隱藏層狀態

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

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

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

注意力函式

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

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

  • 加法式的注意力機制

  • 乘法式的注意力機制

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

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

加法式的注意力機制

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

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

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

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

乘法式的注意力機制

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

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


加法式和乘法式的注意力機制在時間複雜度上是差不多的,但乘法式在實踐中的計算更快,也更節省記憶體,因為它可以利用高效率的矩陣乘法演算法。當解碼器向量dh的維數較小時,這兩種的效能差不多;而維數較大時,會出現加法式的注意力機制表現更好的情況,此時通過將

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

縮小至

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

倍可以減少這種情況的發生。

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

基於自身的注意力機制

在沒有任何額外資訊的情況下,我們仍然可以通過關注句子本身 (即self-attention) 來從句子中提取出相關的資訊。 基於自身的注意力機制 (也稱為基於內部的注意力機制) 已經被成功地應用於各種任務上,包括閱讀理解,文字蘊涵和生成式摘要等。

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

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

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

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

我們可以計算出注意力向量a和最終的句子向量表示c如下:

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

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

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

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

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

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

Key-value形式的注意力機制

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

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

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

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

其中L是注意力視窗的長度,l是一個向量。然後通過這些來得到上下文表示向量ci:

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

上下文表示向量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的總和 :

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

這個向量捕獲了我們對輸入中所有單詞的關注程度。我們可以通過控制這個表徵覆蓋度的向量,以避免模型在輸出時使用重複的單詞:

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

此外,我們還可以增加一個輔助的損失函式,來捕獲對於特定任務我們想得到的注意力分佈:對於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 —




相關文章