NLP的巨人肩膀(中)

本文另兩篇系列

  1. NLP的巨人肩膀(上)
  2. NLP的巨人肩膀(下)

3. 梯子的一級半

除了在word級別的embedding方法上有大量模型和算法的涌現(xiàn)溪胶,同樣地躯嫉,在char級別纱烘、句子級別和段落級別同樣有大量模型提出杨拐。

word2vec開源隨后的第一年,也就是在2014年擂啥,還是Mikolov哄陶,在他和另一位作者合作的一篇論文《Distributed Representations of Sentences and Documents》中,提出了可以借鑒word2vec思想的兩種結構:PV-DM和PV-DBOW哺壶,分別對應word2vec中的CBOW和Skip-gram.

3.1 PV-DM和PV-DBOW

PV-DM的全稱是Distributed Memory Model of Paragraph Vectors屋吨,和CBOW類似,也是通過上下文預測下一個詞山宾,不過在輸入層的時候至扰,同時也維護了一個文檔ID映射到一個向量的look-up table,模型的目的便是將當前文檔的向量以及上下文向量聯(lián)合輸入模型资锰,并讓模型預測下一個詞渊胸,訓練結束后,對于現(xiàn)有的文檔台妆,便可以直接通過查表的方式快速得到該文檔的向量翎猛,而對于新的一篇文檔,那么則需要將已有的look-up table添加相應的列接剩,然后重新走一遍訓練流程切厘,只不過此時固定好其他的參數,只調整look-up table懊缺,收斂后便可以得到新文檔對應的向量了疫稿。PV-DBOW的全稱則是Distributed Bag of Words version of Paragraph Vector,和Skip-gram類似鹃两,通過文檔來預測文檔內的詞遗座,訓練的時候,隨機采樣一些文本片段俊扳,然后再從這個片段中采樣一個詞途蒋,讓PV-DBOW模型來預測這個詞,以此分類任務作為訓練方法馋记,說白了号坡,本質上和Skip-gram是一樣的。這個方法有個致命的弱點梯醒,就是為了獲取新文檔的向量宽堆,還得繼續(xù)走一遍訓練流程,并且由于模型主要是針對文檔向量預測詞向量的過程進行建模茸习,其實很難去表征詞語之間的更豐富的語義結構畜隶,所以這兩種獲取文檔向量的方法都未能大規(guī)模應用開來。

pv-dm-dbow.png

2015年,多倫多大學的Kiros等人提出了一個很有意思的方法叫Skip-thoughts籽慢,同樣也是借鑒了Skip-gram的思想浸遗,但是和PV-DBOW中利用文檔來預測詞的做法不一樣的是,Skip-thoughts直接在句子間進行預測嗡综,也就是將Skip-gram中以詞為基本單位,替換成了以句子為基本單位杜漠,具體做法就是選定一個窗口极景,遍歷其中的句子,然后分別利用當前句子去預測和輸出它的上一句和下一句驾茴。對于句子的建模利用的RNN的sequence結構盼樟,預測上一個和下一個句子時候,也是利用的一個sequence的RNN來生成句子中的每一個詞锈至,所以這個結構本質上就是一個Encoder-Decoder框架晨缴,只不過和普通框架不一樣的是,Skip-thoughts有兩個Decoder峡捡。在今天看來击碗,這個框架還有很多不完善或者可以改進的地方(作者也在論文中分別提到了這些future works),比如輸入的Encoder可以引入attention機制们拙,從而讓Decoder的輸入不再只是依賴Encoder最后一個時刻的輸出稍途;Encoder和Decoder可以利用更深層的結構;Decoder也可以繼續(xù)擴大砚婆,可以預測上下文中更多的句子械拍;RNN也不是唯一的選擇,諸如CNN以及2017年谷歌提出的Transformer的結構也可以利用進來装盯,后來果不其然谷歌的BERT便借鑒了這一思路坷虑,當然這是后話了,留下暫且不表埂奈。

3.2 Skip-thoughts

skip-thoughts.png

2018年的時候迄损,在Skip-thoughts的基礎上,Google Brain的Logeswaran等人將這一思想做了進一步改進账磺,他們認為Skip-thoughts的Decoder效率太低海蔽,且無法在大規(guī)模語料上很好的訓練(這是RNN結構的通病)绑谣。所以他們把Skip-thoughts的生成任務改進成為了一個分類任務党窜,具體說來就是把同一個上下文窗口中的句子對標記為正例,把不是出現(xiàn)在同一個上下文窗口中的句子對標記為負例借宵,并將這些句子對輸入模型幌衣,讓模型判斷這些句子對是否是同一個上下文窗口中,很明顯,這是一個分類任務豁护『呖可以說,僅僅幾個月之后的BERT正是利用的這種思路楚里。而這些方法都和Skip-thoughts一脈相承断部。

3.3 Quick-thoughts

quick-thoughts.PNG

除了Skip-thoughts和Quick-thoughts這兩種不需要人工標記數據的模型之外,還有一些從監(jiān)督數據中學習句子表示的方法班缎,比如2017年Facebook的研究人員Conneau等人提出的InferSent框架蝴光,它的思想特別簡單,先設計一個模型在斯坦福的SNLI(Stanford Natural Language Inference)數據集上訓練达址,爾后將訓練好的模型當做特征提取器蔑祟,以此來獲得一個句子的向量表示,再將這個句子的表示應用在新的分類任務上沉唠,來評估句子向量的優(yōu)劣疆虚。框架結構如下圖所示

3.4 InferSent

infersent_snli.PNG

這個框架最底層是一個Encoder满葛,也就是最終要獲取的句子向量提取器径簿,然后將得到的句子向量通過一些向量操作后得到句子對的混合語義特征,最后接上全連接層并做SNLI上的三分類任務嘀韧,做過句子匹配任務的一定知道牍帚,這個框架是一個最基本(甚至也是最簡陋)的句子匹配框架。對于底層的Encoder來說乳蛾,論文作者分別嘗試了7種模型暗赶,然后分別以這些模型作為底層的Encoder結構,然后在SNLI上進行監(jiān)督訓練肃叶。訓練完成后蹂随,在新的分類任務上進行評估,最后發(fā)現(xiàn)當Encoder使用BiLSTM with max pooling結構時因惭,對于句子的表征性能最好岳锁,對于具體細節(jié)感興趣的可以參考他們的論文《Supervised Learning of Universal Sentence Representations from Natural Language Inference Data》。

3.5 General Purpose Sentence Representation

此外蹦魔,除了InferSent這種單個任務的監(jiān)督學習外激率,最新的工作逐漸將多任務的聯(lián)合學習應用到獲取句子的表征中,例如Subramanian等人發(fā)表在2018年ICLR上的一篇文章《Learning General Purpose Distributed Sentence Representations via Large Scale Multi-task Learning》中就提出了利用四種不同的監(jiān)督任務來聯(lián)合學習句子的表征勿决,這四種任務分別是:Natural Language Inference, Skip-thougts, Neural Machine Translation以及Constituency Parsing等乒躺,作者的出發(fā)點也特別簡單,通用的句子表征應該通過側重點不同的任務來聯(lián)合學習到低缩,而不是只有一個特定任務來學習句子表征嘉冒,后來作者在論文中的實驗也確實證明了這點曹货。實驗的具體做法是,先用聯(lián)合學習的方法在上述四個任務上進行訓練讳推,訓練結束后顶籽,將模型的輸出作為句子的表征(或者把這個聯(lián)合學習的模型作為特征提取器),然后直接在這個表征上接上非常簡單的全連接層做分類器银觅,并且同時保證最底層的特征提取器中參數不動(也就是只把它當做特征提取器)礼饱,然后在新的分類任務上做訓練(只訓練最后接上的全連接層分類器),最后根據訓練出來的簡單分類器在各自分類任務的測試集上做評估究驴。最后作者驚喜的發(fā)現(xiàn)很多任務上他們的簡單分類器都要超過當時的最好結果谋旦,并且他們還發(fā)現(xiàn)聯(lián)合訓練中不同的任務對于句子表征中的不同方面有不同的貢獻钦睡。

3.6 Universal Sentence Encoder

同樣在2018年搀菩,谷歌的Daniel Cer等人在論文《Universal Sentence Encoder》中提出的思路基本和General Purpose Sentence Representation的工作一樣帜羊,只不過作者提出了利用Transformer和DAN(上文提到過的和CBOW與fastText都神似的《Deep Unordered Composition Rivals Syntactic Methods for Text Classification》)兩種框架作為句子的Encoder犹褒,Transformer結構更為復雜政钟,參數更多闲先,訓練也相對比較耗時撕氧,但是一般來說效果會更好一些摧找;對應的核行,DAN結構簡單,只有兩個隱藏層(甚至可以減小為只需要一個隱藏層)蹬耘,參數比較少芝雪,訓練相對比較省時省資源,但是一般來說效果會差一些(并不是絕對综苔,論文中也發(fā)現(xiàn)某些場景下DAN的效果甚至更好)惩系。然后作者既在無標記數據上訓練,也在監(jiān)督數據上訓練如筛,最后在十個分類任務上進行遷移學習的評估堡牡。最后作者還放出了他們預訓練好的Encoder,可以供遷移學習的句子特征提取器使用(見引用16)杨刨。

example-classification.png
example-similarity.png

4. 撥開迷霧——第二級梯子若隱若現(xiàn)

4.1 戈多會來嗎晤柄?

上面我們介紹了好幾種獲取句子表征的方法,然而值得注意的是妖胀,我們并不是只對如何獲取更好的句子表征感興趣芥颈,其實更有趣的是,這些方法在評估他們各自模型性能的時候所采取的方法赚抡,回過頭去進行梳理爬坑,我們發(fā)現(xiàn),無論是稍早些的InferSent涂臣,還是2018年提出的Quick-thoughts和Multi-task Learning獲取通用句子表征的方法妇垢,他們無一例外的都使用了同一種思路:將得到的句子表征,在新的分類任務上進行訓練,而此時的模型一般都只用一個全連接層闯估,然后接上softmax進行分類灼舍,分類器足夠簡單,足夠淺層涨薪,相比那些在這些分類任務上設計的足夠復雜的模型來說簡直不值一提骑素,然而令人大跌眼鏡的是,結果無一例外的這些簡單的分類器都能夠比肩甚至超越他們各自時代的最好結果刚夺,這不能不說是個驚喜献丑。而創(chuàng)造這些驚喜的背后功臣,就是遷移學習侠姑。更進一步地创橄,遷移學習的本質,就是給爬上“巨人的肩膀”提供了一架結實的梯子莽红。

具體的妥畏,在這些句子級別的任務中,屬于InferSent和Quick-thoughts這些模型的“巨人肩膀”便是他們各自使用的訓練數據安吁,遷移學習最后給他們搭了一個梯子醉蚁,然而這個梯子并沒有很好上,磕磕絆絆鬼店,人類AI算是站在第一級梯子上网棍,試探性的伸出了一只腿,另一只腿即將跨出妇智,只可惜并不知道是否有他們苦苦等待了五年之久的戈多滥玷?

4.2 一絲曙光

2017年,Salesforce的Bryan McCann和其他一些人巍棱,發(fā)表了一篇文章《Learned in Translation: Contextualized Word Vectors》惑畴,在這篇文章中,他們首先用一個Encoder-Decoder框架在機器翻譯的訓練語料上進行預訓練拉盾,爾后用訓練好的模型桨菜,只取其中的Embedding層和Encoder層,同時在一個新的任務上設計一個task-specific模型捉偏,然后將原先預訓練好的Embedding層和Encoder層的輸出作為這個task-specific模型的輸入倒得,最終在新的任務場景下進行訓練。他們嘗試了很多不同的任務夭禽,包括文本分類霞掺,Question Answering,Natural Language Inference和SQuAD等等讹躯,并在這些任務中菩彬,與GloVe作為模型的輸入時候的效果進行比較缠劝,實驗結果表明他們提出的Context Vectors在不同任務中不同程度的都帶來了效果的提升。

cove.png

和上文中提到的諸如Skip-thoughts方法有所不同的是骗灶,CoVe更側重于如何將現(xiàn)有數據上預訓練得到的表征遷移到新任務場景中惨恭,而之前的句子級任務中大多數都只把遷移過程當做一個評估他們表征效果的手段,因此觀念上有所不同耙旦。

那么脱羡,CoVe似乎通過監(jiān)督數據上的預訓練,取得了讓人眼前一亮的結果免都,是否可以進一步地锉罐,撇去監(jiān)督數據的依賴,直接在無標記數據上預訓練呢绕娘?

4.3 ELMo

2018年的早些時候脓规,AllenNLP的Matthew E. Peters等人在論文《Deep contextualized word representations》(該論文同時被ICLR和NAACL接受,并且還獲得了NAACL最佳論文獎险领,可見這篇論文的含金量)中首次提出了ELMo侨舆,它的全稱是Embeddings from Language Models,從名稱上可以看出舷暮,ELMo為了利用無標記數據态罪,使用了語言模型噩茄,我們先來看看它是如何利用語言模型的下面。

biLM_with_residual_ELMo.png

基本框架是一個雙層的Bi-LSTM,不過在第一層和第二層之間加入了一個殘差結構(一般來說绩聘,殘差結構能讓訓練過程更穩(wěn)定)沥割。做預訓練的時候,ELMo的訓練目標函數為

\sum_{k=1}^N \log p(t_k|t_1,...,t_{k-1}) + \log p(t_k|t_{k+1},...,t_N)

這個式子很清晰凿菩,前后有兩個概率机杜,第一個概率是來自于正向的由左到右的RNN結構,在每一個時刻上的RNN輸出(也就是這里的第二層LSTM輸出)衅谷,然后再接一個Softmax層將其變?yōu)楦怕屎x椒拗,就自然得到了p(t_k|t_1,...,t_{k-1});與此類似获黔,第二個概率來自反向的由右到左的RNN結構蚀苛,每一個時刻RNN的輸出經過Softmax層后也能得到一個概率大小,表示從某個詞的下文推斷該詞的概率大小玷氏。

ELMo的基本框架便是2-stacked biLSTM + Residual的結構堵未,不過和普通RNN結構的不同之處在于,ELMo借鑒了2016年Google Brain的Rafal Jozefowicz等人發(fā)表的一篇論文《Exploring the Limits of Language Modeling》盏触,其主要改進在于輸入層和輸出層不再是word渗蟹,而是變?yōu)榱艘粋€char-based CNN結構块饺,ELMo在輸入層和輸出層考慮了使用同樣的這種結構,該結構如下圖示

modified_input_embedding-ELMo.png

這樣做有什么好處呢雌芽?因為輸入層和輸出層都使用了這種CNN結構授艰,我們先來看看輸出層使用這種結構怎么用,以及有什么優(yōu)勢世落。我們都知道想诅,在CBOW中的普通Softmax方法中,為了計算每個詞的概率大小岛心,使用的如下公式的計算方法

P(w_t|c_t) = \frac{exp(e^{\prime}(w_t)^Tx)}{\sum_{i=1}^{|V|}exp(e^{\prime}(w_i)^Tx)}, x = \sum_{i\in c}e(w_i)

說白了来破,也就是先通過向量點乘的形式計算得到logits,然后再通過softmax變成概率意義忘古,這本質上和普通的分類沒有什么區(qū)別徘禁,只不過是一個較大的|V|分類問題。現(xiàn)在我們假定char-based CNN模型是現(xiàn)成已有的髓堪,對于任意一個目標詞都可以得到一個向量表示CNN(t_k)送朱,相應的當前時刻的LSTM的輸出向量為h,那么便可以通過同樣的方法得到目標詞的概率大小

p(t_k|t_1,...,t_{k-1}) = \frac{exp(CNN(t_k)^Th)}{\sum_{i=1}^{|V|}exp(CNN(t_i)^Th)}, h = LSTM(t_k|t_1,...,t_{k-1})

在原論文中干旁,把這種先經過CNN得到詞向量驶沼,然后再計算Softmax的方法叫做CNN Softmax,而利用CNN解決有三點優(yōu)勢值得注意争群,第一是回怜,CNN能夠減少普通做Softmax時全連接層中的必須要有的|V|h的參數規(guī)模,只需要保持CNN內部的參數大小即可换薄,而一般來說玉雾,CNN中的參數規(guī)模都要比|V|h的參數規(guī)模小得多;另一方面轻要,CNN可以解決OOV(Out-of-Vocabulary)問題复旬,這個在翻譯問題中尤其頭疼;最后一方面冲泥,在預測階段驹碍,CNN對于每一個詞向量的計算可以預先做好,更能夠減輕inference階段的計算壓力凡恍。補充一句:普通Softmax在大詞典上的計算壓力志秃,都是因為來自于這種方法需要把一個神經網絡的輸出通過全連接層映射為單個值(而每個類別需要一個映射一次,就是一次h大小的計算規(guī)模咳焚,|V|次映射便需要總共|V|*h這么多次的映射規(guī)模)洽损,對于每個類別的映射參數都不同,而CNN Softmax的好處就在于能夠做到對于不同的詞革半,映射參數都是共享的碑定,這個共享便體現(xiàn)在使用的CNN中的參數都是同一套流码,從而大大減少參數的規(guī)模。

同樣的延刘,對于輸入層漫试,ELMo也是用了一樣的CNN結構,只不過參數不一樣而已碘赖,和輸出層中的分析類似驾荣,輸入層中CNN的引入同樣可以減少參數規(guī)模(不過《Exploring the Limits of Language Modeling》文中也指出了訓練時間會略微增加,因為原來的look-up操作可以做到更快一些)普泡,對OOV問題也能夠比較好的應對播掷,從而把詞典大小不再限定在一個固定的詞典大小上。最終ELMo的主要結構便如下圖(b)所示撼班,可見輸入層和輸出層都是一個CNN歧匈,中間使用Bi-LSTM框架,至于具體細節(jié)便如上兩張圖中所示砰嘁。

elmo_cnn_softmax.PNG

最后件炉,在大規(guī)模語料上訓練完成的這種CNN-BIG-LSTM模型(原文如此叫法),怎么用呢矮湘?其實斟冕,如果把每一層的輸出結果拿出來,這里大概有三層的詞向量可以利用:輸入層CNN的輸出缅阳,即是LSTM的輸入向量磕蛇,第一層LSTM的輸出和第二層的輸出向量。又因為LSTM是雙向的券时,因此對于任意一個詞孤里,如果LSTM的層數為L的話伏伯,總共可獲得的向量個數為2L+1橘洞,表示如下

R_k = \{x_k, \overrightarrow {\textbf{h}}_{k,j}, \overleftarrow { \textbf{h}}_{k,j} \}, j = [1,2,...,L]

到這里還只是把ELMo的向量給抽取出來了,具體用的話说搅,對于每一個詞炸枣,可以根據下面的式子得到它的向量,其中\gamma是一個scale因子弄唧,加入這個因子主要是想要將ELMo的向量于具體任務的向量分布拉平到同一個分布水平适肠,這個時候便需要這么一個縮放因子了。另外候引,s_j便是針對每一層的輸出向量侯养,利用一個softmax的參數來學習不同層的權值參數,因為不同的任務需要的詞語意義的粒度也不一致澄干,一般認為淺層的表征比較傾向于句法逛揩,而高層輸出的向量比較傾向于語義信息柠傍,因此通過一個softmax的結構讓任務自動去學習各層之間的權重,自然也是比較合理的做法辩稽。

\textbf{ELMo}_k^{task} = \gamma^{task} \sum_{j=0}^{L}s_j^{task}\textbf{h}_{k,j}

elmo_combination.png

前面我們說過惧笛,無論是基于傳統(tǒng)統(tǒng)計的N-gram還是普通神經網絡的NNLM結構,都會有一個很嚴重的問題逞泄,那就是計算復雜度隨著上下文窗口N大小的增大急劇上升(其中N-gram是指數上升患整,NNLM是以|d|\times N的形式增加,|d|是詞向量的維度喷众,雖然NNLM已經改觀了很多各谚,但依然是一個斜率很大的線性增加關系),后來CBOW和Skip-gram以及再后來的GloVe等等終于做到了計算復雜度與所選窗口大小無關到千,只與詞典大小和詞向量維度相關(不過需要指出的是嘲碧,這里討論的計算復雜度只是預測單個詞的計算時間復雜度,如果是求整個輸入序列的話父阻,還是避免不了要與序列長度相關愈涩,在這一點上和下面要分析的RNN在橫向的時間序列上有一個時間復雜度,其原因是一致的)加矛,并且近些年得益于硬件持續(xù)的摩爾定律發(fā)揮威力履婉,機器的計算能力也有長足的進步,因此在這兩方面因素的作用下斟览,以word2vec為代表的方法大放光彩毁腿,引領了一波NLP的發(fā)展浪潮。

然而苛茂,在今天看來已烤,無論word2vec中的模型,還是GloVe的模型妓羊,模型都過于簡單胯究,它們都受限于所使用的模型表征能力,某種意義上都只能得到比較偏上下文共現(xiàn)意義上的詞向量躁绸,并且也很少考慮過詞序對于詞的意義的影響(比如CBOW從其名稱來看就是一個bag-of-words裕循,在模型的輸入中沒有詞序的概念)。理論上净刮,RNN結構的計算復雜度剥哑,跟兩個方向上都有關系,一方面是縱向上淹父,另一方面是橫向上株婴,縱向上主要是RNN結構本身的時間復雜度,這個復雜度只與RNN結構內部的hidden state維度以及模型結構的復雜度暑认,在ELMo中的話還跟詞典大小相關(因為最后一層還是一個詞典大小上的分類問題困介,以及輸入也需要維護一個詞典大小的loop up操作)揪垄;在橫向上的計算復雜度,就主要是受制于輸入序列的長度逻翁,而RNN結構本身因為在時間序列上共享參數饥努,RNN本身的計算復雜度這一部分不變,因而總的ELMo結構計算復雜度主要有詞典大小八回、隱藏層輸出維度大小酷愧、模型的結構復雜度以及最后的輸入序列長度,前三者可以認為和之前的模型保持一致缠诅,最后的輸入序列長度溶浴,也只是與其保持線性關系,雖然系數是單個RNN單元的計算復雜度管引,斜率依然很大(通常RNN結構的訓練都比較費時)士败,但是在機器性能提升的情況下,這一部分至少不是阻礙詞向量技術發(fā)展的最關鍵的因素了褥伴。

因此谅将,在新的時代下,機器性能得到更進一步提升的背景下重慢,算法人員都急需一種能夠揭示無論詞還是句子更深層語義的方法出現(xiàn)饥臂,我想ELMo正是順應了這種時代的需要而華麗誕生。

ELMo的思想足夠簡單似踱,相比它的前輩們隅熙,可以說ELMo并沒有本質上的創(chuàng)新,連模型也基本是引用和拼接別人的工作(這似乎從反面證明了真正漂亮的工作從來不是突出各自的模型有多么絢麗核芽,只有無其他亮點的論文囚戚,才需要依靠描摹了高清足夠喜人眼球的圖片去吸引評審人的注意力,因此從這個角度去看轧简,似乎可以得出一個啼笑皆非的結論:論文的漂亮程度與論文圖的漂亮程度呈反比)驰坊,它的思想在很多年前就已經有人在用,并沒有特別新奇的地方吉懊。

但同時它的效果又足夠驚艷庐橙,它的出現(xiàn),在2018年年初借嗽,這個也許在NLP歷史上并沒有多么顯眼的年頭,掀起了一陣不小的波瀾转培,至少在6項NLP任務上橫掃當時的最好結果恶导,包括question answering(SQuAD), textual entailment(SNLI), semantic role labelling(SRL), named entity extraction(NER), coreference resolution(Coref), and sentiment analysis(SST-5)。

而后來的故事以及可預見的將來里浸须,這或許僅僅只是一個開始惨寿,就如山洪海嘯前的一朵清秀的漣漪邦泄。

4.4 ULMFit

差不多和ELMo同期,另一個同樣非常驚艷的工作也被提出來裂垦,這個團隊是致力于將深度學習普及和易用的Fast AI顺囊,而論文的兩位共同作者之一的Jeremy Howard,其實就是Fast AI的創(chuàng)始人蕉拢,是Kaggle之前的president和首席科學家特碳,并且親自參與過Kaggle上的很多比賽,長期排在排行榜的第一晕换。在他們的論文《Universal Language Model Fine-tuning for Text Classification》中午乓,他們提出了ULMFit結構,其實這本質上他們提出的是一個方法闸准,而不是具體的某種結構或模型益愈,只不過正如論文標題所言,他們主要把它應用在了文本分類的問題中夷家。和ELMo相同的地方在于蒸其,ULMFit同樣使用了語言模型,并且預訓練的模型主要也是LSTM库快,基本的思路也是預訓練完成后去具體任務上進行finetune枣接,但是不同的地方也有很多,分別來講講缺谴。

首先但惶,ULMFit的預訓練和finetune過程主要可以分為三個階段,分別是在大規(guī)模語料集上(比如Wikitext 103湿蛔,有103million個詞)先預訓練膀曾,然后再將預訓練好的模型在具體任務的數據上重新利用語言模型來finetune一下(這是第一次finetune,叫做LM finetune)阳啥,爾后再根據具體任務設計的一個模型上添谊,將預訓練好的模型當做這個任務模型的多層,再一次finetune(這是第二次finetune察迟,如果是分類問題的話可以叫做Classifier finetune)斩狱,整個過程如下所示:

ulmfit_approach.png
ULMFit.PNG

其次,所使用的模型來自于2017年salesforce發(fā)表的一篇論文《Regularizing and Optimizing LSTM Language Models》(這是一篇很好的文章)扎瓶,在這篇文章中所踊,他們提出了AWD-LSTM(Averaged SGD and Weight-Dropped LSTM),正如名字中所揭示的概荷,這個框架更多的是一種訓練方法秕岛,主要思想分為兩大塊,其中Averaged SGD是指先將模型訓練到一定epoch,然后再將其后的每一輪權值進行平均后继薛,得到最終的權值修壕,用公式表示就是,普通的SGD方法權值更新過程為

w_{k+1} = w_k - \gamma_k \nabla f(w_k)

其中k代表迭代次數遏考,而f則是loss function慈鸠,這就是普通的一個SGD權值更新迭代式子,那么ASGD則把它變成了

w = \frac{1}{K-T+1}\sum_{i=T}^K w_i

其中T是一個閾值灌具,而K則是總共的迭代次數青团,這個式子的意思就是把迭代到第T次之后,對該參數在其后的第T輪到最后一輪之間的所有值求平均稽亏,從而得到最后模型的該參數值壶冒,而相應的,普通的SGD則是直接取w = w_K作為最后模型的參數值截歉。

除了使用ASGD的方法訓練模型之外胖腾,在普通的LSTM上一個時刻和下一個時刻之間的隱藏層之間是有連接的,并且這個連接通過一個全連接的矩陣相連瘪松,而這個模型則用了DropConnect的方法隨機drop掉一些連接咸作,從而減少了一些過擬合的風險,當然在其他的諸如輸入層到隱藏層之間也有正常的dropout操作宵睦。

第三记罚,微調的方法設計的非常精妙。作者提出了幾種微調的技巧壳嚎,它們是:discriminative fine-tuning, slanted triangular learning rates, 以及gradual unfreezing桐智,分別來看一下。

discriminative fine-tune的基本思想是針對不同的層在訓練更新參數的時候,賦予不同的學習率。這里的出發(fā)點是樱溉,一般來說,對于NLP的深度學習模型來說刊驴,不同層的表征有不同的物理含義,比如淺層偏句法信息寡润,高層偏語義信息捆憎,因此對于不同層的學習率不同,自然就是比較合理的了梭纹。具體來說躲惰,公式是這樣的

\theta_{t}^l = \theta_{t-1}^l + \eta^l \nabla_{\theta^l} J(\theta)

這里的\eta^l便是不同的層l有不同的學習率,原文也給出了具體的選擇:先指定最后一層的學習率栗柒,然后根據下式得到前面層的學習率礁扮,基本思想是讓淺層的學習率要更小一些知举。

\eta^{l-1} = \frac{\eta^l}{2.6}

而對于slanted triangular learning rates來說瞬沦,主要思想便是在finetune的第一階段太伊,希望能夠先穩(wěn)定住原來已經在大規(guī)模語料集上已經預訓練好的參數,所以選擇一個比較小的finetune學習率逛钻;爾后希望能夠逐步加大學習率僚焦,使得學習過程能夠盡量快速;最后曙痘,當訓練接近尾聲時芳悲,逐步減小學習率,這樣讓模型逐漸平穩(wěn)收斂(這個思想边坤,個人覺得大概借鑒了2017年谷歌提出Transformer時用到的warm up的學習率調節(jié)方法名扛,這個方法也是在訓練的時候先將學習率逐步增大,爾后再逐步減屑胙鳌)肮韧。因此,這樣一個三段論式的學習過程旺订,用圖表示如下

triangular_learning_rate.PNG

另外一個finetune的技巧是gradual unfreezing弄企,主要思想是把預訓練的模型在新任務上finetune時,逐層解凍模型区拳,也就是先finetune最后一層拘领,然后再解凍倒數第二層,把倒數第二層和最后一層一起finetune樱调,然后再解凍第三層约素,以此類推,逐層往淺層推進笆凌,最終finetune整個模型或者終止到某個中間層圣猎。這樣做的目的也是為了finetune的過程能夠更平穩(wěn)。

當然菩颖,值得提出的是样漆,因為ULMFiT中包含了兩次finetune,即在新任務上用語言模型finetune和在新任務上finetune訓練一個最終的task-specifi-model(比如分類器)晦闰,而論文中主要把discriminative fine-tuning, slanted triangular learning rates這兩個技巧用在了語言模型的finetune階段放祟,把最后一個gradual unfreezing的技巧應用在最終task-specifi-model的finetune階段。

通過上面的這些方法呻右,ULMFiT最終在分類任務上表現(xiàn)驚艷跪妥,尤其是只需要100個標記數據,就足夠能夠學習到一個表現(xiàn)非常comparable的分類器声滥,不得不說眉撵,這個過程中預訓練的語言模型侦香,對最終的表現(xiàn)起到了至關重要的作用。

4.5 GPT

大規(guī)模語料集上的預訓練語言模型這把火被點燃后纽疟,整個業(yè)界都在驚呼罐韩,原來預訓練的語言模型遠不止十年前Bengio和五年前Mikolov只為了得到一個詞向量的威力。然而污朽,當大家還在驚呼散吵,沒過幾個月,很快在2018年6月的時候蟆肆,不再屬于“鋼鐵俠”馬斯克的OpenAI矾睦,發(fā)了一個大新聞(相關論文是《Improving Language Understanding by Generative Pre-Training》),往這把火勢正猛的烈焰上加了一劑猛料炎功,從而將這把火推向了一個新的高潮枚冗。

OpenAI的猛料配方里,第一劑主料便是谷歌于2017年年中的時候提出的Transformer框架(《Attention Is All You Need》)蛇损,因此赁温,讓我們先來弄明白Transformer里面都有什么東西。私以為州藕,Transformer里最為核心的機制是Self-attention束世,正是因為Self-attention的存在,才使得Transformer在做類似翻譯問題的時候床玻,可以讓其Encoder不用做序列輸入毁涉,而是將整個序列一次全輸入,并且超長序列的輸入也變得可能锈死。而具體到Self-attention中贫堰,可以用下圖表示

transformer_multi-headed_self-attention-recap.png

簡單說來,輸入為句子的矩陣待牵,先分別通過三個全連接矩陣將輸入矩陣變化為三個矩陣其屏,分別為Q, K和V,然后通過Q和K的計算得到一些權值缨该,將這些權值加權求和到V矩陣上偎行,便可以得到一個新的矩陣表示。而Self-attention機制中的多頭機制便是將這樣的操作分別進行多次贰拿,這樣能讓句子的表征充分學習到不同的側重點蛤袒,最終將這些多頭學習出來的表征concat到一起妙真,然后再同一個全連接網絡锈候,便可以得到這個句子的最終Self-attention下新的表示嫡锌。將其中的每一個頭的操作過程用公式表示如下蛛倦,需要注意的是softmax是針對矩陣的row方向上進行操作得到的。所以,說白了端幼,這個公式表示的意思就是針對V進行加權求和滑进,加權的權值通過Q和K的點乘得到驮审。

self-attention-matrix-calculation-2.png

不過其實Self-attention和普通的attention機制在形式上幾乎完全等價。主要區(qū)別在于,對于普通的attention機制试浙,輸入可能有多個寞蚌,并且下式在求得e_{ij}中的v_a^T實際上是一個全連接網絡(當然這只是其中一種計算方法田巴,也可以用dot attention的方式得到),將式子右邊的部分(也就是attention的輸入)映射為一個值挟秤,從而可以根據這個值計算attention的權值大小壹哺。除此之外,普通的attention和self-attention并沒有本質不同艘刚,最大的區(qū)別還是在于在自我輸入上計算attention權值大小管宵。

attention-mechanisms.jpg

在Transformer的Encoder中,還有一些其他的設計昔脯,比如加入position embedding(因為Transformer的Encoder中不是時序輸入詞序列啄糙,因此position embedding也是主要的位置信息);Residual結構云稚,使得模型的訓練過程更為平穩(wěn)隧饼,此外還有normalization層,接著便是feed forward層(本質上是一個兩層的全連接網絡静陈,中間加一個ReLu的激活函數)燕雁。Decoder的結構與此類似,只不過在進行decode的時候鲸拥,會將Encoder這邊的輸出作為Decoder中Self-attention時候的K和V拐格。

transformer_resideual_layer_norm_3.png

對于decode的過程,具體來看刑赶,大致過程如下捏浊。

transformer_decoding_2.gif

(對具體實現(xiàn)細節(jié)不關心的可以略過此段)但是Decoder實際上還有很多細節(jié),一般來說撞叨,訓練的時候Decoder中的輸入可以用矩陣的形式一次完成當前整個序列的decode過程金踪,因為ground truth已經提前知道浊洞,只需要做好每個詞的mask就好(為了避免待預測的詞影響到當前的輸入),然而在做inference的時候胡岔,Decoder必須按照序列輸入法希,因為在生成每一個詞的時候,必須先生成它的前一個詞靶瘸,無法一次將整個序列全部生成(當然理論上也可以苫亦,但是效果并不好)。在矩陣運算過程中怨咪,Decoder中有許多的mask操作屋剑,參與運算的三個矩陣Q,K和V都要做許多的mask操作,主要有兩方面的作用:一方面是消除輸入句子本身長度之外的padding的影響惊暴,另一方面是decoder必須要求不能提前看到待生成的詞饼丘。除了mask操作,另外辽话,值得注意的是,和Encoder中只有一種類型的Self-attention不同的卫病,Decoder的attention實際上包含兩部分油啤,第一部分是帶有mask的Self-attention,通過mask的作用將decode階段的attention限定只會attention到已經生成過的詞上蟀苛,因此叫做Mask Self-attention益咬;第二部分是普通的Self-attention操作,不過這個時候的K和V矩陣已經替換為Encoder的輸出結果帜平,所以本質上并不是一個Self-attention了幽告。

下面的動圖很好的表現(xiàn)了decoding過程,生成每一個詞的時候裆甩,既和Encoder的輸出信息有關冗锁,也和已經生成過的詞相關。

transformer_decoding_3.gif

大體介紹完Transformer后嗤栓,再來看看GPT中的是怎么用Transformer的冻河。按照論文中的說法,GPT中使用的Transformer是只用了Decoder茉帅,因為對于語言模型來講叨叙,確實不需要Encoder的存在,而具體模型堪澎,他們參考了2018年早些時候谷歌發(fā)表的一篇論文《Generating Wikipedia by Summarizing Long Sequences》(而GPT名稱中的Generative該詞便是來自于這篇文章擂错,因為這二者都有用到生成式的方法來訓練模性,也就是生成式的Decoder)樱蛤,關于這篇論文中提到的T-DMCA(Transformer Decoder with Memory-Compressed Attention)钮呀,實際上就是一個Decoder桃犬,只不過這篇文章中要做超長的序列輸入(可以長達11000個詞),為了能夠高效節(jié)省時間和內存的處理如此長的序列行楞,做了一些Memory-Compressed的工作攒暇,主要是兩方面:一方面是把一個batch內部的序列按長度進行分組,然后分別在每個組內部進行self-attention操作子房,這樣可以避免將一些很短的句子也padding到整個語料的最大長度形用;另一方面,通過CNN的操作证杭,把K和V壓縮到序列長度更小的一個矩陣田度,同時保持Q不變,這樣也能相當程度上減少計算量解愤。

transformer_decoder_memory_compressed_attention.PNG

除了這些具體的模型細節(jié)外镇饺,GPT本質上就是用了語言模型的目標函數來優(yōu)化和訓練Transformer-Decoder,這個和上文提到過的語言模型保持一致送讲。利用語言模型的目標函數預訓練完成后奸笤,進階這便可以在具體的任務上進行finetune,和ULMFiT中的finetune分為兩個階段的方法不一樣的是哼鬓,GPT直接把這兩個過程糅合到一個目標函數中监右,如

L_3(C) = L_2(C) + \lambda L_1(C)

其中L_2是task-specific的目標函數,L_1則是語言模型的目標函數异希。論文中說這種聯(lián)合學習的方式能夠讓訓練效果更好健盒。而在具體如何做遷移學習的方面,GPT大概也同樣借鑒了上面提到的《Generating Wikipedia by Summarizing Long Sequences》論文中的做法称簿,非常巧妙的將整個遷移學習的框架做到非常的精簡和通用扣癣。分類問題中,直接在原序列的開始和末尾添加表示開始和末尾的符號憨降,在Text Entailment問題中(比如Natural Language Inference)父虑,將Premise和Hypothesis通過一個中間分隔符“$”連接起來成為一個序列,爾后同樣在開頭和末尾添加標記符號券册,文本相似問題中频轿,因為序列1和序列2沒有先后關系,因此將先后關系相反的兩個序列作為輸入烁焙,在Question Aswering中航邢,將query和每一個候選的answer都分別連接成一個序列作為輸入,最后按各自的打分進行排序骄蝇。因此膳殷,這套輸入的表示方法,基本可以使用同一個輸入框架來表征許多文本問題(以至于后來的BERT直接借用了這套做法)。除此之外赚窃,在輸出層册招,只需要接入一個很簡單的全連接層或者MLP便可以,根本不需要非常復雜的模型設計勒极。而整個finetune階段是掰,新加入的參數極少,只有輸出層以及輸入層中添加的一些特殊標記(比如分隔符)辱匿。

正是因為有了輸入層和輸出層的這種通用化設計考慮键痛,一旦中間的Transformer(當然,正如前文所說匾七,這里的Transformer在使用語言模型進行預訓練的時候只有Decoder部分絮短,然而在將其當做文本特征提取器的時候,相應的也可以很便利的將其變成Encoder)表征能力足夠強大昨忆,遷移學習在NLP任務中的威力也會變得更為強大丁频。

果不其然,GPT在其公布的結果中邑贴,一舉刷新了12項NLP任務中的9項榜單席里,效果不可謂不驚艷。然而對于OpenAI來講痢缎,GPT底層模型使用的是谷歌提出的Tranformer胁勺,正是依靠了Transformer的強大表征能力,使得最終的效果有了一個堅實的基礎独旷,然而僅僅過了四個月之后的BERT橫空出世,同樣也是用了Transformer寥裂,同樣是谷歌嵌洼,甚至很多思想也是直接借鑒GPT,GPT作為與BERT氣質最為接近的工作封恰,同時也是BERT的前輩麻养,得到的待遇差別如此之大,不知道GPT是否有些可惜和遺憾诺舔,相比BERT鳖昌,GPT并沒有帶來特別巨大的反響,他的驚艷亮相低飒,迅速變?yōu)樗锏囊宦晲烅懶碜颍破鹆艘魂嚌i漪后迅速消散,將整個舞臺讓位于正值青春光艷照人的BERT褥赊,頗有點“成也蕭何敗也蕭何”的味道糕档。

GPT.PNG

本文另兩篇系列

  1. NLP的巨人肩膀(上)
  2. NLP的巨人肩膀(下)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拌喉,隨后出現(xiàn)的幾起案子速那,更是在濱河造成了極大的恐慌俐银,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件端仰,死亡現(xiàn)場離奇詭異捶惜,居然都是意外死亡,警方通過查閱死者的電腦和手機荔烧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門吱七,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茴晋,你說我怎么就攤上這事陪捷。” “怎么了诺擅?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵市袖,是天一觀的道長。 經常有香客問我烁涌,道長苍碟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任撮执,我火速辦了婚禮微峰,結果婚禮上,老公的妹妹穿的比我還像新娘抒钱。我一直安慰自己蜓肆,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布谋币。 她就那樣靜靜地躺著仗扬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蕾额。 梳的紋絲不亂的頭發(fā)上早芭,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音诅蝶,去河邊找鬼退个。 笑死,一個胖子當著我的面吹牛调炬,可吹牛的內容都是我干的语盈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼筐眷,長吁一口氣:“原來是場噩夢啊……” “哼黎烈!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤照棋,失蹤者是張志新(化名)和其女友劉穎资溃,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體烈炭,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡溶锭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了符隙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趴捅。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖霹疫,靈堂內的尸體忽然破棺而出拱绑,到底是詐尸還是另有隱情,我是刑警寧澤丽蝎,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布猎拨,位于F島的核電站,受9級特大地震影響屠阻,放射性物質發(fā)生泄漏红省。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一国觉、第九天 我趴在偏房一處隱蔽的房頂上張望吧恃。 院中可真熱鬧,春花似錦麻诀、人聲如沸痕寓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厂抽。三九已至,卻和暖如春丁眼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昭殉。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工苞七, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挪丢。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓蹂风,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乾蓬。 傳聞我的和親對象是個殘疾皇子惠啄,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345