如何用深度學(xué)習(xí)做自然語(yǔ)言處理?這里有份最佳實(shí)踐清單
對(duì)于如何使用深度學(xué)習(xí)進(jìn)行自然語(yǔ)言處理,本文作者 Sebastian Ruder 給出了一份詳細(xì)的最佳實(shí)踐清單,不僅包括與大多數(shù) NLP 任務(wù)相關(guān)的最佳實(shí)踐,還有最常見(jiàn)任務(wù)的最佳實(shí)踐,尤其是分類、序列標(biāo)注、自然語(yǔ)言生成和神經(jīng)機(jī)器翻譯。作者對(duì)最佳實(shí)踐的選擇很嚴(yán)格,只有被證明在至少兩個(gè)獨(dú)立的群體中有益的實(shí)踐才會(huì)入選,并且每個(gè)最佳實(shí)踐作者至少給出兩個(gè)參引。作者承認(rèn)這份清單并不全面,比如其不熟悉的解析、信息提取等就沒(méi)有涉及。
簡(jiǎn)介
本文是一系列關(guān)于如何使用神經(jīng)網(wǎng)絡(luò)進(jìn)行自然語(yǔ)言處理(NLP)的最佳實(shí)踐匯集,將隨著新觀點(diǎn)的出現(xiàn)定期進(jìn)行更新,從而不斷提升我們對(duì)用于 NLP 的深度學(xué)習(xí)的理解。
NLP 社區(qū)中有這樣一句說(shuō)法:帶有注意力的 LSTM 能在所有任務(wù)上實(shí)現(xiàn)當(dāng)前最佳的表現(xiàn)。盡管在過(guò)去的兩年這確實(shí)是真的,NLP 社區(qū)卻在慢慢偏離帶有注意力的 LSTM,而去發(fā)現(xiàn)更有趣的模型。
但是,NLP 社區(qū)并非想再花費(fèi)兩年獨(dú)立地(重新)發(fā)現(xiàn)下一個(gè)帶有注意力的 LSTM。我們不打算重新發(fā)明已經(jīng)奏效的技巧或方法。盡管現(xiàn)存的深度學(xué)習(xí)庫(kù)已經(jīng)從整體上編碼了神經(jīng)網(wǎng)絡(luò)的最佳實(shí)踐,比如初始化方案,但是很多其他的細(xì)節(jié),尤其是特定任務(wù)或特定領(lǐng)域還有待從業(yè)者解決。
本文并不打算盤點(diǎn)當(dāng)前最佳,而是收集與大量任務(wù)相關(guān)的最佳實(shí)踐。換言之,本文并不描述某個(gè)特定架構(gòu),而是旨在收集那些構(gòu)建成功框架的特征。其中的很多特征對(duì)于推動(dòng)當(dāng)前最佳是最有用的,因此我希望對(duì)于它們的更廣泛了解將會(huì)帶來(lái)更強(qiáng)的評(píng)估、更有意義的基線對(duì)比,以及更多靈感,幫助我們覺(jué)察那些可能奏效的方法。
本文假設(shè)你對(duì)神經(jīng)網(wǎng)絡(luò)應(yīng)用于 NLP 的情況已經(jīng)很熟悉(如果不熟悉,我建議你看一下 Yoav Goldberg 寫的A Primer on Neural Network Modelsfor Natural Language Processing: https://www.jair.org/media/4992/live-4992-9623-jair.pdf),并大體上對(duì) NLP 或某個(gè)特定任務(wù)感興趣。本文的主要目標(biāo)是使你快速掌握相關(guān)的最佳實(shí)踐,從而盡快做出有意義的貢獻(xiàn)。我首先會(huì)對(duì)與絕大多數(shù)任務(wù)相關(guān)的最佳實(shí)踐做一個(gè)概述,接著略述與最常見(jiàn)的任務(wù)相關(guān)的最佳實(shí)踐,尤其是分類、序列標(biāo)注、自然語(yǔ)言生成和神經(jīng)機(jī)器翻譯。
免責(zé)聲明:把某些東西定義為最佳實(shí)踐極其困難:最佳的標(biāo)準(zhǔn)是什么?如果有更好的實(shí)踐出現(xiàn)呢?本文基于我的個(gè)人理解和經(jīng)驗(yàn)(肯定不全面)。接下來(lái),我將只討論被證明在至少兩個(gè)獨(dú)立的群體中有益的實(shí)踐。對(duì)于每個(gè)最佳實(shí)踐我將給出至少兩個(gè)參引。
最佳實(shí)踐
1. 詞嵌入
在最近的 NLP 發(fā)展中,詞嵌入無(wú)疑是最廣為人知的最佳實(shí)踐,這是因?yàn)轭A(yù)訓(xùn)練嵌入的使用對(duì)我們十分有幫助 (Kim, 2014) [12]。詞嵌入的最佳維度絕大多數(shù)是依賴任務(wù)的:一個(gè)更小的維度更多在句法任務(wù)上工作更好,比如命名實(shí)體識(shí)別(named entity recognition)(Melamud et al., 2016) [44],或者詞性標(biāo)注(POS)(Plank et al., 2016) [32],盡管一個(gè)更大的維度對(duì)于更多的語(yǔ)義任務(wù)來(lái)說(shuō)更有用,比如情感分析 (Ruder et al., 2016) [45]。
2. 深度
雖然短時(shí)間內(nèi)我們還無(wú)法達(dá)到計(jì)算機(jī)視覺(jué)的深度,但是 NLP 中的神經(jīng)網(wǎng)絡(luò)已經(jīng)發(fā)展地更深了。現(xiàn)在最佳的方法通常使用 deep Bi-LSTM,它通常包含 3-4 層,比如詞性標(biāo)注 (Plank et al., 2016) 和語(yǔ)義角色標(biāo)注 (He et al., 2017) [33]。一些任務(wù)的模型甚至更深。谷歌的 NMT 模型有 8 個(gè)編碼器和 8 個(gè)解碼器層,(Wu et al., 2016) [20]。然而,大多數(shù)情況下,模型超過(guò) 2 層所帶來(lái)的性能提升是最小的 (Reimers & Gurevych, 2017) [46]。
這些觀察適用于絕大多數(shù)序列標(biāo)注和結(jié)構(gòu)化預(yù)測(cè)問(wèn)題。對(duì)于分類,深或者非常深的模型只在字符級(jí)的輸入中表現(xiàn)良好,并且淺層的字詞級(jí)模型依然是當(dāng)前最佳 (Zhang et al., 2015; Conneau et al., 2016; Le et al., 2017) [28, 29, 30]。
3. 層連接
訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時(shí),可以使用一些核心技巧避免梯度消失問(wèn)題。不同的層和連接因此被提出來(lái)了,這里我們將討論 3 點(diǎn):i) Highway 層,ii) 殘差連接(residual connection),iii) 密集型殘差連接。
Highway 層:它受到 LSTM 的門控機(jī)制所啟發(fā) (Srivastava et al., 2015) [1]。首先讓我們假設(shè)一個(gè)單層的 MLP,它將一個(gè)非線性 g 的仿射變換應(yīng)用到其輸入 x:
Highway 層接著計(jì)算以下函數(shù):
其中 t=σ(WTx+bT) 被稱作變換門(transform gate),(1−t) 被稱作進(jìn)位門(carry gate)。我們可以看到,Highway 層和 LSTM 門很相似,因?yàn)樗鼈冏赃m應(yīng)地把輸入的一些維度直接傳遞到輸出。
Highway 層主要用于語(yǔ)言建模,并取得了當(dāng)前最佳的結(jié)果 (Kim et al., 2016; Jozefowicz et al., 2016; Zilly et al., 2017) [2, 3, 4],但它同時(shí)也用于其他任務(wù),如語(yǔ)音識(shí)別 (Zhang et al., 2016) [5]。想了解更多相關(guān)信息和代碼,可查看 Sristava 的主頁(yè)
(http://people.idsia.ch/~rupesh/very_deep_learning/)。
殘差連接:殘差連接(He et al., 2016)[6] 的首次提出是應(yīng)用于計(jì)算機(jī)視覺(jué),也是計(jì)算機(jī)視覺(jué)在 ImageNet 2016 奪冠的最大助力。殘差連接甚至比 Highway 層更直接。我們使用代表當(dāng)前層的指數(shù) L 來(lái)增加之前的層輸出 h。然后,殘差連接學(xué)習(xí)以下函數(shù):
僅通過(guò)一個(gè)快捷連接,殘差連接即可把之前層的輸入添加到當(dāng)前層。這一簡(jiǎn)單的更改緩解了梯度消失問(wèn)題,因?yàn)閷蛹?jí)不能變得更好,模型可以默認(rèn)使用恒等函數(shù)(identity function)。
密集型殘差連接:密集型殘差連接 (Huang et al., 2017) [7] ( CVPR 2017 最佳論文獎(jiǎng))從每一個(gè)層向所有隨后的層添加連接,而不是從每一個(gè)層向下一個(gè)層添加層:
密集型殘差連接已成功應(yīng)用于計(jì)算機(jī)視覺(jué),也被證明在神經(jīng)機(jī)器翻譯方面的表現(xiàn)持續(xù)優(yōu)于殘差連接 (Britz et al., 2017) [27]。
4. Dropout
盡管在計(jì)算機(jī)視覺(jué)領(lǐng)域的多數(shù)應(yīng)用中,批歸一化已使其他正則化器變得過(guò)時(shí),但是 dropout (Srivasta et al., 2014) [8] 依然是應(yīng)用于 NLP 深度神經(jīng)網(wǎng)絡(luò)中的正則化器。0.5 的 dropout 率表明其在絕大多數(shù)場(chǎng)景中依然高效 (Kim, 2014)。近年來(lái),dropout 的變體比如適應(yīng)性 dropout(Ba & Frey, 2013) [9]和進(jìn)化 dropout (Li et al., 2016) [10] 已被提出,但沒(méi)有一個(gè)在 NLP 社區(qū)中獲得廣泛應(yīng)用。造成這一問(wèn)題的主要原因是它無(wú)法用于循環(huán)連接,因?yàn)榫奂?dropout masks 會(huì)將嵌入清零。
循環(huán) dropout:循環(huán) dropout(Gal & Ghahramani, 2016)[11] 通過(guò)在層 ll 的時(shí)間步中應(yīng)用相同的 dropout masks 來(lái)解決這一問(wèn)題。這避免了放大序列中的 dropout 噪音,并為序列模型帶來(lái)了有效的正則化。循環(huán) dropout 已在語(yǔ)義角色標(biāo)注 (He et al., 2017) 和語(yǔ)言建模 (Melis et al., 2017) [34] 中取得了當(dāng)前最佳的結(jié)果。
5. 多任務(wù)學(xué)習(xí)
如果有額外的數(shù)據(jù),多任務(wù)學(xué)習(xí)(MTL)通??捎糜谠谀繕?biāo)任務(wù)中提升性能。
輔助目標(biāo)(auxiliary objective):我們通常能找到對(duì)我們所關(guān)心的任務(wù)有用的輔助目標(biāo) (Ruder, 2017) [13]。當(dāng)我們已經(jīng)預(yù)測(cè)了周圍詞以預(yù)訓(xùn)練詞嵌入 (Mikolov et al., 2013) 時(shí),我們還可以在訓(xùn)練中將其作為輔助目標(biāo) (Rei, 2017) [35]。我們也經(jīng)常在序列到序列模型中使用相似的目標(biāo)(Ramachandran et al., 2016)[36]。
特定任務(wù)層:盡管把 MTL 用于 NLP 的標(biāo)準(zhǔn)方法是硬參數(shù)共享,但允許模型學(xué)習(xí)特定任務(wù)層很有意義。這可通過(guò)把一項(xiàng)任務(wù)的輸出層放置在較低級(jí)別來(lái)完成 (Søgaard & Goldberg, 2016) [47]。另一方法是誘導(dǎo)私有和共享的子空間 (Liu et al., 2017; Ruder et al., 2017) [48, 49]。
6. 注意力機(jī)制
注意力機(jī)制是在序列到序列模型中用于注意編碼器狀態(tài)的最常用方法,它同時(shí)還可用于回顧序列模型的過(guò)去狀態(tài)。使用注意力機(jī)制,系統(tǒng)能基于隱藏狀態(tài) s_1,...,s_m 而獲得環(huán)境向量(context vector)c_i,這些環(huán)境向量可以和當(dāng)前的隱藏狀態(tài) h_i 一起實(shí)現(xiàn)預(yù)測(cè)。環(huán)境向量 c_i 可以由前面狀態(tài)的加權(quán)平均數(shù)得出,其中狀態(tài)所加的權(quán)就是注意力權(quán)重 a_i:
注意力函數(shù) f_att(h_i,s_j) 計(jì)算的是目前的隱藏狀態(tài) h_i 和前面的隱藏狀態(tài) s_j 之間的非歸一化分配值。在下文中,我們將討論四種注意力變體:加性注意力(additive attention)、乘法(點(diǎn)積)注意力(multiplicative attention)、自注意力(self-attention)和關(guān)鍵值注意力(key-value attention)。
加性注意力是最經(jīng)典的注意力機(jī)制 (Bahdanau et al., 2015) [15],它使用了有一個(gè)隱藏層的前饋網(wǎng)絡(luò)來(lái)計(jì)算注意力的分配:
其中 v_a 和 W_a 是所學(xué)到的注意力參數(shù),[* ; *] 代表了級(jí)聯(lián)。類似地,我們同樣能使用矩陣 W_1 和 W_2 分別為 h_i 和 s_j 學(xué)習(xí)單獨(dú)的轉(zhuǎn)換,這一過(guò)程可以表示為:
乘法注意力(Multiplicative attention)(Luong et al., 2015) [16] 通過(guò)計(jì)算以下函數(shù)而簡(jiǎn)化了注意力操作:
加性注意力和乘法注意力在復(fù)雜度上是相似的,但是乘法注意力在實(shí)踐中往往要更快速、具有更高效的存儲(chǔ),因?yàn)樗梢允褂镁仃嚥僮鞲咝У貙?shí)現(xiàn)。兩個(gè)變體在低維度 d_h 解碼器狀態(tài)中性能相似,但加性注意力機(jī)制在更高的維度上性能更優(yōu)。緩解這一現(xiàn)象的方法是將 f_att(h_i,s_j) 縮放到 d_h^(-1/2) 倍 (Vaswani et al., 2017) [17]。
注意力機(jī)制不僅能用來(lái)處理編碼器或前面的隱藏層,它同樣還能用來(lái)獲得其他特征的分布,例如閱讀理解任務(wù)中作為文本的詞嵌入 (Kadlec et al., 2017) [37]。然而,注意力機(jī)制并不直接適用于分類任務(wù),因?yàn)檫@些任務(wù)并不需要情感分析(sentiment analysis)等額外的信息。在這些模型中,通常我們使用 LSTM 的最終隱藏狀態(tài)或像最大池化和平均池化那樣的聚合函數(shù)來(lái)表征句子。
自注意力機(jī)制(Self-attention)通常也不會(huì)使用其他額外的信息,但是它能使用自注意力關(guān)注本身進(jìn)而從句子中抽取相關(guān)信息 (Lin et al., 2017) [18]。自注意力又稱作內(nèi)部注意力,它在很多任務(wù)上都有十分出色的表現(xiàn),比如閱讀理解 (Cheng et al., 2016) [38]、文本繼承 (textual entailment/Parikh et al., 2016) [39]、自動(dòng)文本摘要 (Paulus et al., 2017) [40]。
我們能計(jì)算每個(gè)隱藏狀態(tài) h_i 的非歸一化分配值從而簡(jiǎn)化加性注意力:
在矩陣形式中,對(duì)于隱藏狀態(tài) H=h_1,…,h_n,我們能通過(guò)以下形式計(jì)算注意力向量 a 和最后的句子表征 c:
我們不僅可以抽取一個(gè)向量,同時(shí)還能通過(guò)將 v_a 替代為 V_a 矩陣而執(zhí)行一些其他注意力特征,這可以令我們抽取注意力矩陣 A:
在實(shí)踐中,我們可以執(zhí)行以下的正交約束而懲罰計(jì)算冗余,并以 Frobenius 范數(shù)平方的形式鼓勵(lì)注意力向量的多樣性:
Vaswani et al. (2017) 同樣使用了類似的多頭注意力(multi-head attention)。
最后,關(guān)鍵值注意力 (Daniluk et al., 2017) [19] 是最近出現(xiàn)的注意力變體機(jī)制,它將形式和函數(shù)分開,從而為注意力計(jì)算保持分離的向量。它同樣在多種文本建模任務(wù) (Liu & Lapata, 2017) [41] 中發(fā)揮了很大的作用。具體來(lái)說(shuō),關(guān)鍵值注意力將每一個(gè)隱藏向量 h_i 分離為一個(gè)鍵值 k_i 和一個(gè)向量 v_i:[k_i;v_i]=h_i。鍵值使用加性注意力來(lái)計(jì)算注意力分布 a_i:
其中 L 為注意力窗體的長(zhǎng)度,I 為所有單元為 1 的向量。然后使用注意力分布值可以求得環(huán)境表征 c_i:
其中環(huán)境向量 c_i 將聯(lián)合現(xiàn)階段的狀態(tài)值 v_i 進(jìn)行預(yù)測(cè)。
7. 最優(yōu)化
最優(yōu)化算法和方案通常是模型的一部分,并且常常被視為黑箱操作。有時(shí)算法輕微的變化,如在 Adam 算法中減少超參數(shù)β2 的值 (Dozat & Manning, 2017) [50] 將會(huì)造成優(yōu)化行為的巨大改變。
Adam 方法 (Kingma & Ba, 2015) [21] 是使用最廣泛、最常見(jiàn)的優(yōu)化算法,它通常也作為 NLP 研究員的優(yōu)化器。Adam 方法要明顯地比 vanilla 隨機(jī)梯度下降更優(yōu)秀,并且其收斂速度也十分迅速。但近來(lái)有研究表明通過(guò)精調(diào)并帶動(dòng)量的梯度下降方法要比 Adam 方法更優(yōu)秀 (Zhang et al., 2017) [42]。
從優(yōu)化方案來(lái)說(shuō),因?yàn)?Adam 方法會(huì)適應(yīng)性地為每一個(gè)參數(shù)調(diào)整學(xué)習(xí)速率 (Ruder, 2016) [22],所以我們可以使用 Adam 方法精確地執(zhí)行 SGD 風(fēng)格的退火處理。特別是我們可以通過(guò)重啟(restart)執(zhí)行學(xué)習(xí)速率退火處理:即設(shè)定一個(gè)學(xué)習(xí)速率并訓(xùn)練模型,直到模型收斂。然后,我們可以平分學(xué)習(xí)速率,并通過(guò)加載前面最好的模型而重啟優(yōu)化過(guò)程。在 Adam 中,這會(huì)令優(yōu)化器忘記預(yù)訓(xùn)練參數(shù)的學(xué)習(xí)速率,并且重新開始。Denkowski & Neubig (2017) [23] 表示帶有兩個(gè)重啟和學(xué)習(xí)速率退火處理的 Adam 算法要比帶有退火處理的 SGD 算法更加優(yōu)秀。
8. 集成方法
通過(guò)平均多個(gè)模型的預(yù)測(cè)將多個(gè)模型組合為一個(gè)集成模型被證明是提高模型性能的有效策略。盡管在測(cè)試時(shí)使用集成做預(yù)測(cè)十分昂貴,最近提取方面的一些進(jìn)展允許我們把昂貴的集成壓縮成更小的模型 (Hinton et al., 2015; Kuncoro et al., 2016; Kim & Rush, 2016) [24, 25, 26]。
如果評(píng)估模型的多樣性增加 (Denkowski & Neubig, 2017),集成是確保結(jié)果可靠的重要方式。盡管集成一個(gè)模型的不同檢查點(diǎn)被證明很有效 (Jean et al., 2015; Sennrich et al., 2016) [51, 52],但這種方法犧牲了模型的多樣性。周期學(xué)習(xí)率有助于緩解這一影響 (Huang et al., 2017) [53]。但是,如果資源可用,我們更喜歡集成多個(gè)獨(dú)立訓(xùn)練的模型以最大化模型多樣性。
9. 超參數(shù)優(yōu)化
我們可以簡(jiǎn)單地調(diào)整模型超參數(shù)從而在基線上獲得顯著提升,而不僅僅只是使用預(yù)定義或現(xiàn)有的超參數(shù)來(lái)訓(xùn)練模型。最近 Bayesian Optimization 的新進(jìn)展可以用于在神經(jīng)網(wǎng)絡(luò)黑箱訓(xùn)練中優(yōu)化超參數(shù) (Snoek et al., 2012) [56],這種方法要比廣泛使用的網(wǎng)格搜索高效地多。LSTM 的自動(dòng)超參數(shù)調(diào)整已經(jīng)在語(yǔ)言建模產(chǎn)生了最佳的性能,遠(yuǎn)遠(yuǎn)勝過(guò)其他更復(fù)雜的模型 (Melis et al., 2017)。
10. LSTM 技巧
學(xué)習(xí)初始狀態(tài):我們通常初始化 LSTM 狀態(tài)為零向量。但我們可以將初始狀態(tài)看作參數(shù)進(jìn)行優(yōu)化,而不是人為地調(diào)整來(lái)提升性能。這一方法十分受 Hinton 的推薦。關(guān)于這一技巧的 TensorFlow 實(shí)現(xiàn),詳見(jiàn):
https://r2rt.com/non-zero-initial-states-for-recurrent-neural-networks.html
嘗試輸入和輸出嵌入:適合于輸入和輸出嵌入在 LSTM 模型中占了絕大多數(shù)參數(shù)數(shù)量的情況。如果 LSTM 在語(yǔ)言建模中預(yù)測(cè)詞匯,輸入和輸出參數(shù)可以共享 (Inan et al., 2016; Press & Wolf, 2017) [54, 55]。這一技巧在不允許學(xué)習(xí)大規(guī)模參數(shù)的小數(shù)據(jù)集中十分有用。
梯度范數(shù)截?cái)?Gradient norm clipping):降低梯度消失風(fēng)險(xiǎn)的一個(gè)方法是截?cái)嗥渥畲笾?(Mikolov, 2012) [57]。但是這并沒(méi)有持續(xù)提升性能(Reimers & Gurevych, 2017)。與其獨(dú)立地截?cái)嗝總€(gè)梯度,截?cái)嗵荻鹊娜址稊?shù) (Pascanu et al., 2013) 反而會(huì)帶來(lái)更加顯著的提升(這里有一個(gè) Tensorflow 實(shí)現(xiàn):https://stackoverflow.com/questions/36498127/how-to-effectively-apply-gradient-clipping-in-tensor-flow)。
下投影(Down-projection):為了進(jìn)一步減少輸出參數(shù)的數(shù)量,LSTM 的隱態(tài)可以被投影到更小的尺寸。這對(duì)帶有大量輸出的任務(wù)尤其有用,比如語(yǔ)言建模(Melis et al., 2017)。
三、特定任務(wù)的最佳實(shí)踐
下面,我們要介紹特定任務(wù)的最佳實(shí)踐。大部分模型在執(zhí)行特定類型的單項(xiàng)任務(wù)時(shí)表現(xiàn)很好,部分模型可以應(yīng)用于其他任務(wù),不過(guò)在應(yīng)用之前需要驗(yàn)證其性能。我們還將討論以下任務(wù):分類、序列標(biāo)注、自然語(yǔ)言生成(NLG)和自然語(yǔ)言生成的特殊案例神經(jīng)機(jī)器翻譯。
1. 分類
由于卷積操作更加高效,近期 CNN 應(yīng)用范圍擴(kuò)大,成為處理 NLP 中分類任務(wù)的通用方法。下面的最佳實(shí)踐和 CNN 相關(guān),可選擇多個(gè)最優(yōu)超參數(shù)(optimal hyperparameter)。
- CNN 過(guò)濾器:使過(guò)濾器大小接近最優(yōu)過(guò)濾器大小,如 (3,4,5) 性能最佳(Kim, 2014; Kim et al., 2016)。特征映射的最佳數(shù)量范圍是 50~600(Zhang & Wallace, 2015)[59]。
- 聚合函數(shù)(Aggregation function):1-最大池化優(yōu)于平均池化和 k-最大池化(Zhang & Wallace, 2015)。
2. 序列標(biāo)注
序列標(biāo)注在 NLP 中非常普遍?,F(xiàn)有的很多最佳實(shí)踐都是模型架構(gòu)的一個(gè)環(huán)節(jié),下列指南主要討論模型輸出和預(yù)測(cè)階段。
標(biāo)注策略(Tagging scheme): 對(duì)于將標(biāo)簽分配到文本分隔的任務(wù),不同的標(biāo)注策略均可采用。比如:BIO,分隔的第一個(gè)符號(hào)處標(biāo)注 B-tag,其他符號(hào)處標(biāo)注 I-tag,分隔外的符號(hào)標(biāo)注 O-tag;IOB,和 BIO 相似,不同之處在于如果前面的符號(hào)屬于相同的類別,但不屬于同一個(gè)分隔,則使用 B-tag 來(lái)標(biāo)注;IOBES,還需要在單個(gè)符號(hào)實(shí)體處標(biāo)注 S-tag,每個(gè)分隔的最后一個(gè)符號(hào)處標(biāo)注 E-tag。IOBES 和 BIO 的性能相似。
條件隨機(jī)場(chǎng)輸出層(CRF output layer): 如果輸出之間存在依賴,如在命名實(shí)體識(shí)別(named entity recognition)中,可以用線性鏈條件隨機(jī)場(chǎng)(linear-chain conditional random field)代替最后的 softmax 層。經(jīng)證實(shí),這種方法對(duì)于要求對(duì)約束進(jìn)行建模的任務(wù)有持續(xù)改善的效果(Huang et al., 2015; Max & Hovy, 2016; Lample et al., 2016)[60, 61, 62]。
約束解碼(Constrained decoding): 除了條件隨機(jī)場(chǎng)輸出層以外,還可用約束解碼來(lái)排除錯(cuò)誤排序,即不產(chǎn)生有效的 BIO 過(guò)渡(BIO transition)(He et al., 2017)。約束解碼的優(yōu)勢(shì)在于可以執(zhí)行隨意約束(arbitrary constraint),如特定任務(wù)約束或句法約束。
3. 自然語(yǔ)言生成
多數(shù)現(xiàn)有最佳實(shí)踐可用于自然語(yǔ)言生成(NLG)。事實(shí)上,目前出現(xiàn)的很多技巧都植根于語(yǔ)言建模方面的進(jìn)步,語(yǔ)言建模是最典型的 NLP 任務(wù)。
建模覆蓋率(Modelling coverage): 重復(fù)是 NLG 任務(wù)的一大難題,因?yàn)楫?dāng)前的模型無(wú)法很好地記憶已經(jīng)產(chǎn)生的輸出結(jié)果。在模型中直接設(shè)置建模覆蓋率是解決該問(wèn)題的好方法。如果提前知道哪些實(shí)體應(yīng)該出現(xiàn)在輸出結(jié)果中(就像菜譜中的調(diào)料),則需要使用一個(gè)檢查表(checklist)(Kiddon et al., 2016)[63]。如果使用注意力機(jī)制,我們可以追蹤覆蓋率向量 c_i,它是過(guò)去的時(shí)間步上注意力分布 a_t 的總和(Tu et al., 2016; See et al., 2017)[64, 65]:
該向量可以捕捉我們?cè)谠凑Z(yǔ)言所有單詞上使用的注意力。現(xiàn)在我們可以在覆蓋率向量上設(shè)置加性注意力(additive attention),以鼓勵(lì)模型不重復(fù)關(guān)注同樣的單詞:
此外,我們可以添加輔助損失(auxiliary loss),該損失可以捕捉我們想關(guān)注的特定任務(wù)的注意力行為:我們希望神經(jīng)機(jī)器翻譯可以做到一對(duì)一對(duì)齊(one-to-one alignment);如果最后的覆蓋率向量多于或少于每一個(gè)指數(shù)上的覆蓋率向量,那么模型將被罰分(Tu et al., 2016)??傊?,如果模型重復(fù)處理同樣的位置,我們就會(huì)懲罰該模型(See et al., 2017)。
4. 神經(jīng)機(jī)器翻譯
- 雖然神經(jīng)機(jī)器翻譯只是 NLG 的一個(gè)分支,但 NMT 獲得了大量關(guān)注,有許多方法專門為該任務(wù)開發(fā)。相似地,許多最佳實(shí)踐或超參數(shù)選擇只能應(yīng)用到 NMT 領(lǐng)域。
- 嵌入維度(Embedding dimensionality):2048 維嵌入的性能最佳,但很少達(dá)到該效果。128 維嵌入的性能卻出乎意料地好,收斂速度幾乎達(dá)到之前的 2 倍(Britz et al., 2017)。
- 編碼器和解碼器深度: 編碼器的深度無(wú)需超過(guò) 2−4 層。深層模型性能優(yōu)于淺層模型,但多于 4 層對(duì)解碼器來(lái)說(shuō)沒(méi)有必要(Britz et al., 2017)。
- 方向性(Directionality):雙向編碼器性能稍好于單向編碼器。Sutskever et al.(2014)[_67_] 提出顛倒源語(yǔ)言的順序,以減少長(zhǎng)期依賴的數(shù)量。使用單向編碼器顛倒源語(yǔ)言順序優(yōu)于未顛倒語(yǔ)序(Britz et al., 2017)。
- 束搜索策略(Beam search strategy):大小 10、長(zhǎng)度歸一化罰項(xiàng)為 1.0 的中型束(Wu et al., 2016)性能最佳(Britz et al., 2017)。
- 子詞翻譯(Sub-word translation):Senrich et al. (2016) [66] 提出根據(jù)字節(jié)對(duì)編碼(byte-pair encoding/BPE)將單詞分隔成子詞(sub-word)。BPE 迭代合并出現(xiàn)頻率高的符號(hào)對(duì)(symbol pair),最后將出現(xiàn)頻率高的 n 元合并成一個(gè)單獨(dú)的符號(hào),進(jìn)而有效去除非詞表詞(out-of-vocabulary-word)。該技術(shù)最初用來(lái)處理罕見(jiàn)單詞,但是子詞單元的模型性能全面超過(guò)全詞系統(tǒng),32000 個(gè)子詞單元是最高效的單詞數(shù)量(Denkowski & Neubig, 2017)。
四、結(jié)語(yǔ)
我確定這份清單上一定有遺漏的最佳實(shí)踐。相似地,也有很多我不熟悉的任務(wù),如解析、信息提取,我沒(méi)辦法做出推薦。我希望本文對(duì)開始學(xué)習(xí)新的 NLP 任務(wù)有所幫助。即使你對(duì)這里列出的大部分內(nèi)容都很熟悉,我也希望你能夠?qū)W到一些新的東西或者重新掌握有用的技巧。
原文:http://ruder.io/deep-learning-nlp-best-practices/index.html#introduction
【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】