在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函數的變換,如下:
高速公路層則是這樣的函數變換:
其中⊙表示對應元素相乘,
高速公路層已經被用于語言模型之中,并取得了目前的好結果,也被用于其他任務上,如語音識別 。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模型的編碼過程,也可用于任何序列模型中以回溯過去的狀態。使用注意力機制,可以基于隱藏層狀態
注意力函數
加法式的注意力機制
原始的注意力機制 使用了一個單層的隱藏層前饋網絡來計算注意力的對齊關系,如下公式:
其中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:即
其中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任務。即使你已經熟悉了這當中的大多數,我仍然希望你從中學習到了新的東西,或者加深了你之前的了解。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。