我們都知道,牛頓說過一句名言
If I have seen further, it is by standing on the shoulders of giants.
無可否認,牛頓取得了無與匹敵的成就,人類歷史上最偉大的科學家之一,但同樣無可否認的是,牛頓確實吸收了大量前人的研究成果,諸如哥白尼、伽利略和開普勒等人,正因如此,聯合國為了紀念伽利略首次將望遠鏡用作天文觀測四百周年,2009年的時候,通過了”國際天文年“的決議,并選中《巨人的肩膀》(Shoulders Of Giants)作為主題曲。我想這大概是告訴后人,“吃水不忘挖井人”,牛頓的成就固然偉大,他腳下的“巨人肩膀”伽利略也同樣不能忘了。
也許,“巨人肩膀”無處不在,有些人善于發(fā)現,有些人選擇性失明,而牛頓的偉大之處在于他能夠發(fā)現,這是偉大其一,更為重要的是,他還能自己造了梯子爬上“巨人的肩膀”,并成為一個新的“巨人肩膀”,這是偉大其二。
而回到這篇文章的主題,作為平凡人的我們,暫且先把如何發(fā)現并造了梯子云云撇開不談,讓我們先來捋一捋現在NLP當中可能的“巨人肩膀”在哪里,以及有哪些已經造好的“梯子”可供攀登,余下的,就留給那些立志成為“巨人肩膀”的人文志士們吧。
通常來說,NLP中監(jiān)督任務的基本套路都可以用三個積木來進行歸納:
文本數據搜集和預處理
將文本進行編碼和表征
設計模型解決具體任務
其中數據處理階段自不用說,各個任務按照各自的邏輯去處理和得到相應的輸入。而其中的第二階段Encoder模塊與第三階段的Task-specific Model模塊,通常來說,界限并不是特別清晰,二者之間互有滲透。而回顧過去基于深度學習的NLP任務可以發(fā)現,幾乎絕大多數都比較符合這三層概念。比如很多生成任務的Seq2Seq框架中不外乎都有一個Encoder和一個Decoder,對應到這里的話Decoder更像是一個Task-specific Model,然后相應的將Encoder做一些細微的調整,比如引入Attention機制等等,對于一些文本分類任務的結構,則Encoder模塊與Task-specific Model模塊的區(qū)分更為明顯和清晰,Encoder負責提取文本的特征,最后接上一些全連接層和Softmax層便可以當做Task-specific Model模塊,如此便完成了一個文本分類任務。
既然很多的NLP任務都可以用這三個模塊來進行歸納的話,并且其中數據層和Task-specific Model模塊層可能根據具體任務的不同需要做一些相應的設計,而Encoder層便可以作為一個相對比較通用的模塊來使用。那么自然會有一個想法,能不能類似于圖像領域中的ImageNet上預訓練的各種模型,來做一個NLP中預訓練好的Encoder模塊,然后我拿來直接利用就好了?應該說,這個想法并不難想到,NLP人也花了一些時間去思考NLP中究竟該如何設計一些更通用的可以遷移利用的東西,而不是所有的任務都要“from scratch”。因為如何盡量利用已有的知識、經驗和工具,避免重復造輪子,想盡一切辦法“站在巨人的肩膀上”快速發(fā)展,我想大概也是最樸素的“發(fā)展是硬道理”的體現。
為了更好的厘清這個思路,我們先來看看人類和CV(Computer Vision,計算機圖像)曾經都是如何“站在巨人的肩膀上”的。
一. 人類的巨人肩膀
大約在20萬年前,人類祖先FOXP2基因的2處(相對于其他原始猿類,如下圖)極其微小卻又至為關鍵的突變,讓人類祖先逐漸擁有了語言能力,從此人類逐漸走上了一條不同于其他所有動物的文明演化之路。
而人類語言以及隨后產生的文字也是人類區(qū)別于其他動物的一個至關重要的特征,它使得人類協(xié)同合作的能力變得極為強大,且讓代際間經驗與文化的傳承效率大大提升。知名博主Tim Urban——連大佬Elon Musk都是他的鐵桿粉絲——在2017年4月發(fā)表的巨長博文中(其實也是為了商業(yè)互吹Musk的Neuralink),Tim分析了為什么語言能夠加速人類文明的發(fā)展,并最終從幾十萬年前智能生命競賽跑道上所有一切潛在對手中大比分強勢勝出。在這個過程中,語言起了非常關鍵的作用。在語言產生前,人類社會發(fā)展非常緩慢,表現為代際間的傳承效率非常低下,而自從語言誕生以后,人類社會的發(fā)展速度得到極大的提升,這主要體現在父輩的生存技能和經驗能夠通過快速有效的方式傳承給子輩,不僅如此,在同輩之間通過語言的溝通和交流,寶貴的經驗也能夠通過語言這種高效的媒介迅速傳播到原始部落的每一個角落。于是,人類的每一代都能夠得以在他們的父輩打下的江山上,一日千里,終成這顆藍色星球上的無二霸主。


不過,我覺得Urban想說卻并沒有說出來的是,即便在人類語言誕生之前,人類祖先也可以通過可能已經先于語言而誕生的學習與認知能力,做到以“代”為單位來進行傳承與進化,只不過不同于基因進化,這是一種地球生命全新的進化方式,在效率上已經比其他生物的進化效率高的多得多。地球上自生命誕生以來一直被奉為圭臬的基因進化法則,往往都是以一個物種為單位,上一代花了生命代價學習到的生存技能需要不斷的通過非常低效的“優(yōu)勝劣汰,適者生存”的叢林法則,寫進到該物種生物的基因中才算完事,而這往往需要幾萬年乃至幾百萬年才能完成。而在這個過程中,比其他物種強得多的學習能力是人類制勝的關鍵。
上面兩個事實,前者說明了語言是加速文明進化的潤滑劑,而后者說明了強大的學習能力是人類走出一條有人類特色的發(fā)展之路,從而脫離基因進化窠臼的最為重要的因素。
也就是說,對于人類而言,他們的父輩,同輩,以及一切同類,乃至大自然萬事萬物都是他們的“巨人肩膀”;而語言和學習能力則是人類能夠站上“巨人肩膀”的“梯子”。
回到本文的主題,對于人類的鋼鐵“兒子”AI來說,CV和NLP是當前AI最火爆的兩個領域之二,一個要解決鋼鐵“兒子”的視覺功能,一個要解決鋼鐵“兒子”的語言或認知能力,那么什么又是這個鋼鐵“兒子”的“巨人肩膀”和“梯子”呢?我們先來看看CV中的情況。
二. CV的巨人肩膀
ImageNet是2009年由李飛飛團隊鄧嘉等人提出,并迅速發(fā)展成為CV領域最知名的比賽ILSVRC,從2010年舉辦第一屆,到2017年李飛飛宣布最后一屆,前后總共舉辦8年,這八年間先后在這個比賽中涌現了一大批推動AI領域尤其是CV領域大發(fā)展的算法和模型。特別值得一提的是2012年Hinton團隊提出了AlexNet,超過當時第二名效果41%,一下子引爆了AI領域,因此2012年也被稱為“深度學習元年”。
隨之而來,大家發(fā)現如果用已經在ImageNet中訓練好的模型,并用這些模型中的參數來初始化新任務中的模型,可以顯著的提升新任務下的效果。這種站在“巨人肩膀”上的方法已經被成功運用到很多CV任務中,諸如物體檢測和語義分割等,不僅如此,更為重要的是,這種充分使用預訓練模型的方法可以非常便利的遷移到一些獲取標注數據較為困難的新場景中,從而極大的改善模型對標注數據數量的要求,并降低標注數據的成本。因此,利用大規(guī)模數據集預訓練模型進行遷移學習的方法被認為是CV中的標配,以至于2018年的早些時候,大神何凱明所在的FAIR團隊利用Instgram中數十億張帶有用戶標簽的圖片進行預訓練,爾后將其在ImageNet的比賽任務中進行fine-tune,取得了最好的成績(見引用5)。只不過,由于預訓練的數據過于龐大,該工作動用了336塊GPU預訓練了22天,不得不說實在都是土豪們才玩得動的游戲,這一點和下文要介紹的NLP中的預訓練步驟何其相似。
不過為何這種預訓練的模式能夠有效?這背后有什么更深刻的內涵嗎?為此,Google Brain團隊將2014年的ImageNet冠軍GoogleNet的中間層進行了可視化,可以發(fā)現模型的較低層學習到的主要是物體的邊緣,往高層后逐步就變成了成型的物體了。一般來說,物體的邊緣和紋路都是一些比較通用的視覺特征,因此將這一部分對應的模型參數用來初始化task-specific模型中的參數,意味著模型就不需要再從頭開始學習這些特征,從而大大提升了訓練的效率和性能。
總結起來就是,CV中的“巨人肩膀”是ImageNet以及由之而來Google等公司或團隊在大規(guī)模數據集上預訓練得到的模型,而“梯子”便是transfer learning之下的fine-tuning。
三. 尋找NLP的巨人肩膀
和CV領域中深度學習的驚艷表現相比,對于NLP任務來講,深度學習的應用一直沒有帶來讓人眼前特別一亮的表現。ImageNet中的圖片分類任務,深度學習早已超越人類的分類準確率,而這一目標對于NLP中的深度學習來說,似乎成了不太可能完成的任務,尤其是在那些需要深層語義理解的任務當中,更是如此。但即便如此,困難從來未曾阻止人類想要教給他“兒子”理解“長輩”的話并開口說“人話”的雄心,憂心忡忡的人類家長恨不得也給AI來一次FOXP2基因突變——正像20萬年前上帝的一次神來之筆給人類帶來了語言能力一樣。
今年(2018年)九月份,DeepMind主辦的Deep Learning Indaba 2018 大會在南非舉行,ULMFit(下文會做介紹)的作者之一Sebastian Ruder在大會上做了一個很精彩的名為《Frontiers of Natural Language Processing》的報告(引用8),前后分為兩個部分:第一部分梳理近些年NLP的發(fā)展;第二部分探討了當前NLP遇到的一些困難。在參考這個報告的同時,并回到本文最開頭,這里將主要著重于NLP中最為重要的Encoder模塊,并拋去具體的模型之爭(諸如CNN,RNN和Transformer等等),想要努力梳理出一條NLP任務中如何更有效站上“巨人肩膀”的一些模式出來。
本質上,自然語言理解NLU的核心問題其實就是如何從語言文字的表象符號中抽取出來蘊含在文字背后的真實意義,并將其用計算機能夠讀懂的方式表征出來——當然這通常對應的是數學語言,表征是如此重要,以至于2012年的時候Yoshua Bengio自己作為第一作者發(fā)表了一篇表征學習的綜述(引用9),并隨后在2013年和深度學習三大巨頭的另一位巨頭Yann LeCun牽頭創(chuàng)辦ICLR,這一會議至今才過去5年時間,如今已是AI領域最負盛名的頂級會議之一??梢哉f,探究NLP或NLU的歷史,也可以說同樣也是探究文本如何更有效表征的歷史。而這一過程,可以根據word2vec的出現和使用,大致分為前word2vec時代和word2vec時代兩個階段。我們先來看看前word2vec時代都發(fā)生了哪些事情。
1. 梯子出現之前
猶如生命的誕生之初,混沌而原始。在word2vec誕生之前,NLP中并沒有一個統(tǒng)一的方法去表示一段文本,各位前輩和大師們發(fā)明了許多的方法:從one-hot表示一個詞到用bag-of-words來表示一段文本,從k-shingles把一段文本切分成一些文字片段到漢語中用各種序列標注方法將文本按語義進行分割,從tf-idf中用頻率的手段來表征詞語的重要性到text-rank中借鑒了page-rank的方法來表征詞語的權重,從基于SVD純數學分解詞文檔矩陣的LSA,到pLSA中用概率手段來表征文檔形成過程并將詞文檔矩陣的求解結果賦予概率含義,再到LDA中引入兩個共軛分布從而完美引入先驗......
1.1 語言模型
而以上這些都是相對比較傳統(tǒng)的方法,在介紹基于深度學習的方法之前,先來看看語言模型。實際上,語言模型的本質是對一段自然語言的文本進行預測概率的大小,即如果文本用 來表示,那么語言模型就是要求
的大小,如果按照大數定律中頻率對于概率無限逼近的思想,求這個概率大小,自然要用這個文本在所有人類歷史上產生過的所有文本集合中,先求這個文本的頻率
,爾后便可以通過如下公式來求得
這個公式足夠簡單,但問題是全人類所有歷史的語料這種統(tǒng)計顯然無法實現,因此為了將這個不可能的統(tǒng)計任務變得可能,首先有人將文本不當做一個整體,而是把它拆散成一個個的詞,通過每個詞之間的概率關系,從而求得整個文本的概率大小。假定句子長度為,詞用
表示,即
然而,這個式子的計算依然過于復雜,我們一般都會引入馬爾科夫假設:假定一個句子中的詞只與它前面的個詞相關,特別地,當
的時候,句子的概率計算公式最為簡潔:
并且把詞頻的統(tǒng)計用來估計這個語言模型中的條件概率,如下
這樣一來,語言模型的計算終于變得可行。然而,這種基于統(tǒng)計的語言模型卻存在很多問題:
第一,很多情況下的計算會遇到特別多零值,尤其是在
取值比較大的情況下,這種數據稀疏導致的計算為0的現象變得特別嚴重。所以統(tǒng)計語言模型中一個很重要的方向便是設計各種平滑方法來處理這種情況。
第二, 另一個更為嚴重的問題是,基于統(tǒng)計的語言模型無法把取得很大,一般來說在3-gram比較常見,再大的話,計算復雜度會指數上升。這個問題的存在導致統(tǒng)計語言模型無法建模語言中上下文較長的依賴關系。
第三,統(tǒng)計語言模型無法表征詞語之間的相似性。
1.2 NNLM
這些缺點的存在,迫使2003年Bengio在他的經典論文《A Neural Probabilistic Language Model》中,首次將深度學習的思想融入到語言模型中,并發(fā)現將訓練得到的NNLM(Neural Net Language Model, 神經網絡語言模型)模型的第一層參數當做詞的分布式表征時,能夠很好的獲取詞語之間的相似度。
撇去正則化項,NNLM的極大目標函數對數似然函數,其本質上是個N-Gram的語言模型,如下所示
其中,歸一化之前的概率大?。ㄒ簿褪莑ogits)為
x實際上就是將每個詞映射為m維的向量,然后將這個詞的向量concat起來,組合成一個
維的向量。這里可以將NNLM的網絡結構拆分為三個部分:
第一部分,從詞到詞向量的映射,通過C矩陣完成映射,參數個數為 ;
第二部分,從x到隱藏層的映射,通過矩陣H,這里的參數個數為 ;
第三部分,從隱藏層到輸出層的映射,通過矩陣U,參數個數為
第四部分,從x到輸出層的映射,通過矩陣W,參數個數為;
因此,如果算上偏置項的參數個數(其中輸出層為,輸入層到隱藏層為
)的話,NNLM的參數個數為:
可見NNLM的參數個數是所取窗口大小n的線性函數,這便可以讓NNLM能夠對更長的依賴關系進行建模。不過NNLM的最主要貢獻是非常有創(chuàng)見性的將模型的第一層特征映射矩陣當做詞的分布式表示,從而可以將一個詞表征為一個向量形式,這直接啟發(fā)了后來的word2vec的工作。
這許多的方法和模型正如動蕩的春秋戰(zhàn)國,諸子百家群星閃耀,然而卻也誰都未能有絕對的實力統(tǒng)一當時的學術界。即便到了秦始皇,雖武力空前強大,踏平六國,也有車同軌書同文的壯舉,卻依然未能把春秋以降的五彩繽紛的思想學術界統(tǒng)一起來,直到歷史再歷一百年,漢武帝終于完成了這個空前絕后的大手筆,“罷黜百家獨尊儒術”,這也直接成為了華夏文化的核心基礎。不禁要問,如果把NNLM當做文化統(tǒng)一前的“書同文”苗頭,那NLP中的“獨尊儒術”在哪里?
2. 歷史突破——梯子來了
自NNLM于2003年被提出后,后面又出現了很多類似和改進的工作,諸如LBL, C&W和RNNLM模型等等,這些方法主要從兩個方面去優(yōu)化NNLM的思想,其一是NNLM只用了左邊的個詞,如何利用更多的上下文信息便成為了很重要的一個優(yōu)化思路(如Mikolov等人提出的RNNLM);其二是NNLM的一個非常大的缺點是輸出層計算量太大,如何減小計算量使得大規(guī)模語料上的訓練變得可行,這也是工程應用上至關重要的優(yōu)化方向(如Mnih和Hinton提出的LBL以及后續(xù)的一系列模型)。
為了更好理解NNLM之后以及word2vec誕生前的情況,我們先來看看現有的幾個主要模型都有哪些優(yōu)缺點。
NNLM雖然將N-Gram的階n提高到了5,相比原來的統(tǒng)計語言模型是一個很大的進步,但是為了獲取更好的長程依賴關系,5顯然是不夠的。再者,因為NNLM只對詞的左側文本進行建模,所以得到的詞向量并不是語境的充分表征。還有一個問題就更嚴重了,NNLM的訓練依然還是太慢,在論文中,Bengio說他們用了40塊CPU,在含有1400萬個詞,只保留詞頻相對較高的詞之后詞典大小為17964個詞,只訓練了5個epoch,但是耗時超過3周。按這么來算,如果只用一塊CPU,可能需要2年多,這還是在僅有1400萬個詞的語料上。如此耗時的訓練過程,顯然嚴重限制了NNLM的應用。
2007年Mnih和Hinton提出的LBL以及后續(xù)的一系列相關模型,省去了NNLM中的激活函數,直接把模型變成了一個線性變換,尤其是后來將Hierarchical Softmax引入到LBL后,訓練效率進一步增強,但是表達能力不如NNLM這種神經網絡的結構;2008年Collobert和Weston
提出的C&W模型不再利用語言模型的結構,而是將目標文本片段整體當做輸入,然后預測這個片段是真實文本的概率,所以它的工作主要是改變了目標輸出,由于輸出只是一個概率大小,不再是詞典大小,因此訓練效率大大提升,但由于使用了這種比較“別致”的目標輸出,使得它的詞向量表征能力有限;2010年Mikolov(對,還是同一個Mikolov)提出的RNNLM主要是為了解決長程依賴關系,時間復雜度問題依然存在。

而這一切,似乎都在預示著一個新時代的來臨。
2.1 CBOW和Skip-gram
2013年,Tomas Mikolov連放幾篇劃時代的論文,其中最為重要的是兩篇,《Efficient estimation of word representations in vector space》首次提出了CBOW和Skip-gram模型,進一步的在《Distributed Representations of Words and Phrases and their Compositionality》中,又介紹了幾種優(yōu)化訓練的方法,包括Hierarchical Softmax(當然,這個方法早在2003年,Bengio就在他提出NNLM論文中的Future Work部分提到了這種方法,并于2005年把它系統(tǒng)化發(fā)表了一篇論文), Negative Sampling和Subsampling技術。放出兩篇論文后,當時仍在谷歌工作的Mikolov又馬不停蹄的放出了大殺器——word2vec工具,并在其中開源了他的方法。順便提一下的是,很多人以為word2vec是一種模型和方法,其實word2vec只是一個工具,背后的模型是CBOW或者Skip-gram,并且使用了Hierarchical Softmax或者Negative Sampling這些訓練的優(yōu)化方法。所以準確說來,word2vec并不是一個模型或算法,只不過Mikolov恰好在當時把他開源的工具包起名叫做word2vec而已。不過為了敘述簡單,在下文我將用word2vec來指代上面提到Mikolov兩篇論文中的一整個相關的優(yōu)化思想。
word2vec對于前人的優(yōu)化,主要是兩方面的工作:模型的簡化和訓練技巧的優(yōu)化。我們先來看看模型的簡化方面,也就是耳熟能詳的CBOW和Skip-gram。
對于CBOW而言,我們可以從它的名字上一窺究竟,它的全稱是Continuous Bag-of-Words,也就是連續(xù)的詞袋模型,為什么取這個名字,先來看看它的目標函數。
首先,CBOW沒有隱藏層,本質上只有兩層結構,輸入層將目標詞語境中的每一個詞向量簡單求和(當然,也可以求平均)后得到語境向量,然后直接與目標詞的輸出向量求點積,目標函數也就是要讓這個與目標詞向量的點積取得最大值,對應的與非目標詞的點積盡量取得最小值。從這可以看出,CBOW的第一個特點是取消了NNLM中的隱藏層,直接將輸入層和輸出層相連;第二個特點便是在求語境context向量時候,語境內的詞序已經丟棄(這個是名字中Continuous的來源);第三,因為最終的目標函數仍然是語言模型的目標函數,所以需要順序遍歷語料中的每一個詞(這個是名字中Bag-of-Words的來源)。因此有了這些特點(尤其是第二點和第三點),Mikolov才把這個簡單的模型取名叫做CBOW,簡單卻有效的典范。
需要注意的是這里每個詞對應到兩個詞向量,在上面的公式中都有體現,其中是詞的輸入向量,而
則是詞的輸出向量,或者更準確的來講,前者是CBOW輸入層中跟詞
所在位置相連的所有邊的權值(其實這就是詞向量)組合成的向量,而是輸出層中與詞
所在位置相連的所有邊的權值組合成的向量,所以把這一向量叫做輸出向量。
同樣地,和CBOW對應,Skip-gram的模型基本思想和CBOW非常類似,只是換了一個方向:CBOW是讓目標詞的輸出向量擬合語境的向量
;而Skip-gram則是讓語境中每個詞的輸出向量盡量擬合當前輸入詞的向量
,和CBOW的方向相反,因此它的目標函數如下:
可以看出目標函數中有兩個求和符號,最里面的求和符號的意義便是讓當前的輸入詞分別和該詞對應語境中的每一個詞都盡量接近,從而便可以表現為該詞與其上下文盡量接近。
和CBOW類似,Skip-gram本質上也只有兩層:輸入層和輸出層,輸入層負責將輸入詞映射為一個詞向量,輸出層負責將其經過線性映射計算得到每個詞的概率大小。再細心一點的話,其實無論CBOW還是Skip-gram,本質上都是兩個全連接層的相連,中間沒有 任何其他的層。因此,這兩個模型的參數個數都是,其中
分別是詞向量的維度和詞典的大小,相比上文中我們計算得到NNLM的參數個數
已經大大減小,且與上下文所取詞的個數無關了,也就是終于避免了N-gram中隨著階數N增大而使得計算復雜度急劇上升的問題。
然而,Mikolov大神說了,這些公式是“impractical”的,他的言下之意是計算復雜度依然和詞典大小有關,而這通常都意味著非常非常大,以下是他的原話
..., and W is the number of words in the vocabulary. This formulation is impractical because the cost of computing ? log p(wO|wI ) is proportional to W, which is often large (105–107 terms).
不得不說,大神就是大神,將模型已經簡化到了只剩兩個全連接層(再脫就沒了),依然不滿足,還“得寸進尺”地打起了詞典的“小算盤”,那么Mikolov的“小算盤”是什么呢?
他在論文中首先提到了Hierachical Softmax,認為這是對full softmax的一種優(yōu)化手段,而Hierachical Softmax的基本思想就是首先將詞典中的每個詞按照詞頻大小構建出一棵Huffman樹,保證詞頻較大的詞處于相對比較淺的層,詞頻較低的詞相應的處于Huffman樹較深層的葉子節(jié)點,每一個詞都處于這棵Huffman樹上的某個葉子節(jié)點;第二,將原本的一個分類問題變成了
次的二分類問題,做法簡單說來就是,原先要計算
的時候,因為使用的是普通的softmax,勢必要求詞典中的每一個詞的概率大小,為了減少這一步的計算量,在Hierachical Softmax中,同樣是計算當前詞
在其上下文中的概率大小,只需要把它變成在Huffman樹中的路徑預測問題就可以了,因為當前詞
在Huffman樹中對應到一條路徑,這條路徑由這棵二叉樹中從根節(jié)點開始,經過一系列中間的父節(jié)點,最終到達當前這個詞的葉子節(jié)點而組成,那么在每一個父節(jié)點上,都對應的是一個二分類問題(本質上就是一個LR分類器),而Huffman樹的構造過程保證了樹的深度為
,所以也就只需要做
次二分類便可以求得
的大小,這相比原來
次的計算量,已經大大減小了。
接著,Mikolov又提出了負采樣的思想,而這一思想也是受了C&W模型中構造負樣本方法啟發(fā),同時參考了Noise Contrastive Estimation (NCE)的思想,用CBOW的框架簡單來講就是,負采樣每遍歷到一個目標詞,為了使得目標詞的概率最大,根據softmax函數的概率公式,也就是讓分子中的
最大,而分母中其他非目標詞的
最小,普通softmax的計算量太大就是因為它把詞典中所有其他非目標詞都當做負例了,而負采樣的思想特別簡單,就是每次按照一定概率隨機采樣一些詞當做負例,從而就只需要計算這些負采樣出來的負例了,那么概率公式便相應變?yōu)?/p>
仔細和普通softmax進行比較便會發(fā)現,將原來的分類問題變成了
分類問題,這便把詞典大小對時間復雜度的影響變成了一個常數項,而改動又非常的微小,不可謂不巧妙。
除此之外,Mikolov還提到了一些其他技巧,比如對于那些超高頻率的詞,尤其是停用詞,可以使用Subsampling的方法進行處理,不過這已經不是word2vec最主要的內容了。
自此,經過模型和訓練技巧的雙重優(yōu)化,終于使得大規(guī)模語料上的訓練成為了現實,更重要的是,得到的這些詞向量能夠在語義上有非常好的表現,能將語義關系通過向量空間關系表征出來。
word2vec的出現,極大的促進了NLP的發(fā)展,尤其是促進了深度學習在NLP中的應用(不過有意思的是,word2vec算法本身其實并不是一個深度模型,它只有兩層全連接),利用預訓練好的詞向量來初始化網絡結構的第一層幾乎已經成了標配,尤其是在只有少量監(jiān)督數據的情況下,如果不拿預訓練的embedding初始化第一層,幾乎可以被認為是在蠻干。在此之后,一大批word embedding方法大量涌現,比較知名的有GloVe和fastText等等,它們各自側重不同的角度,并且從不同的方向都得到了還不錯的embedding表征。
2.2 GloVe
先來看看GloVe的損失函數,
其中是兩個詞
和
在某個窗口大小中的共現頻率(不過GloVe對其做了一些改進,共現頻率相應有一個衰減系數,使得距離越遠的詞對共現頻率越小一些),
是一個權重系數,主要目的是共現越多的pair對于目標函數貢獻應該越大,但是又不能無限制增大,所以對共現頻率過于大的pair限定最大值,以防訓練的時候被這些頻率過大的pair主導了整個目標函數,剩下的就是算法的核心部分了,兩個
值是兩個偏置項,撇去不談,那么剩下的
其實就是一個普通的均方誤差函數,
是當前詞的向量,
對應的是與其在同一個窗口中出現的共現詞的詞向量,兩者的向量點乘要去盡量擬合它們共現頻率的對數值。從直觀上理解,如果兩個詞共現頻率越高,那么其對數值當然也越高,因而算法要求二者詞向量的點乘也越大,而二個詞向量的點乘越大,其實包含了兩層含義:第一,要求各自詞向量的模越大,通常來說,除去頻率非常高的詞(比如停用詞),對于有明確語義的詞來說,它們的詞向量模長會隨著詞頻增大而增大,因此兩個詞共現頻率越大,要求各自詞向量模長越大是有直覺意義的,比如“魑魅魍魎”假如能被拆分成兩個詞,那么“魑魅”和“魍魎”這兩個詞的共現頻率相比““魑魅”和其他詞的共現頻率要大得多,對應到“魑魅”的詞向量,便會傾向于在某個詞向量維度上持續(xù)更新,進而使得它的模長也會比較偏大;第二,要求這兩個詞向量的夾角越小,這也是符合直覺的,因為出現在同一個語境下頻率越大,說明這兩個詞的語義越接近,因而詞向量的夾角也偏向于越小。

此外,可以從GloVe使用的損失函數中發(fā)現,它的訓練主要是兩個步驟:統(tǒng)計共現矩陣和訓練獲取詞向量,這個過程其實是沒有我們通常理解當中的模型的,更遑論神經網絡,它整個的算法框架都是基于矩陣分解的做法來獲取詞向量的,本質上和諸如LSA這種基于SVD的矩陣分解方法沒有什么不同,只不過SVD分解太過于耗時,運算量巨大,相同點是LSA也是輸入共現矩陣,不過一般主要以詞-文檔共現矩陣為主,另外,LSA中的共現矩陣沒有做特殊處理,而GloVe考慮到了對距離較遠的詞對做相應的懲罰等等。然而,相比word2vec,GloVe卻更加充分的利用了詞的共現信息,word2vec中則是直接粗暴的讓兩個向量的點乘相比其他詞的點乘最大,至少在表面上看來似乎是沒有用到詞的共現信息,不像GloVe這里明確的就是擬合詞對的共現頻率。
不過更有意思的還是,GloVe和word2vec似乎有種更為內在的聯系,再來看看他們的目標函數有什么不一樣,這是Skip-gram的目標函數(這里在原來的基礎上加上了對于語料的遍歷N)
而這個目標函數是按照語料的順序去遍歷,如果先把語料當中的相關詞進行合并,然后按照詞典序進行遍歷,便可以證明Skip-gram實際上和GloVe的優(yōu)化目標一致,有興趣的可以參考引用11中的證明細節(jié),這里不再贅述。
2.3 fastText
word2vec和GloVe都不需要人工標記的監(jiān)督數據,只需要語言內部存在的監(jiān)督信號即可以完成訓練。而與此相對應的,fastText則是利用帶有監(jiān)督標記的文本分類數據完成訓練,本質上沒有什么特殊的,模型框架就是CBOW,只不過與普通的CBOW有兩點不一樣,分別是輸入數據和預測目標的不同,在輸入數據上,CBOW輸入的是一段區(qū)間中除去目標詞之外的所有其他詞的向量加和或平均,而fastText為了利用更多的語序信息,將bag-of-words變成了bag-of-features,也就是下圖中的輸入不再僅僅是一個詞,還可以加上bigram或者是trigram的信息等等;第二個不同在于,CBOW預測目標是語境中的一個詞,而fastText預測目標是當前這段輸入文本的類別,正因為需要這個文本類別,因此才說fastText是一個監(jiān)督模型。而相同點在于,fastText的網絡結構和CBOW基本一致,同時在輸出層的分類上也使用了Hierachical Softmax技巧來加速訓練。
這里的便是語料當中第n篇文檔的第i個詞以及加上N-gram的特征信息。從這個損失函數便可以知道fastText同樣只有兩個全連接層,分別是A和B,其中A便是最終可以獲取的詞向量信息。
fastText最大的特點在于快,論文中對這一點也做了詳細的實驗驗證,在一些分類數據集上,fastText通常都可以把CNN結構的模型要耗時幾小時甚至幾天的時間,急劇減少到只需要消耗幾秒鐘,不可謂不“fast”.
不過說個八卦,為什么fastText結構和CBOW如此相似(感興趣的讀者想要繼續(xù)深挖的話,還可以看看2015年ACL上的一篇論文《Deep Unordered Composition Rivals Syntactic Methods for Text Classification》,結構又是何其相似,并且比fastText的論文探討的更為深入一些,但是fastText是2016年的文章,剩下的大家自己去想好了),這里面大概一個特別重要的原因就是fastText的作者之一便是3年前CBOW的提出者Mikolov本人,只不過昔日的Mikolov還在谷歌,如今3年時間一晃而過,早已是Facebook的人了。
2.4 爬上第一級梯子的革命意義
那為什么word2vec的出現極大的促進了NLP領域的發(fā)展?
通常以為,word2vec一類的方法會給每一個詞賦予一個向量的表征,不過似乎從來沒有人想過這個辦法為什么行之有效?難道是皇帝的新衣?按理來說,包括NNLM在內,這些方法的主要出發(fā)點都是將一個詞表示成詞向量,并將其語義通過上下文來表征。其實,這背后是有理論基礎的,1954年Harris提出分布假說(distributional hypothesis),這一假說認為:上下文相似的詞,其語義也相似,1957年Firth對分布假說進行了進一步闡述和明確:詞的語義由其上下文決定(a word is characterized by the company it keeps),30年后,深度學習的祖師爺Hinton也于1986年嘗試過詞的分布式表示。
而word2vec的貢獻遠不止是給每一個詞賦予一個分布式的表征,私以為,它帶來了一種全新的NLP模型建立方法,在這之前,大多數NLP任務都要在如何挖掘更多文本語義特征上花費大量時間,甚至這一部分工作占去了整個任務工作量的絕大部分,而以word2vec為代表的distributed representation方法大量涌現后(尤其是因為大規(guī)模語料上的預訓練詞向量成為現實,并且被證明確實行之有效之后),算法人員發(fā)現利用word2vec在預訓練上學習到的詞向量,初始化他們自己模型的第一層,會帶來極大效果的提升,以至于這五年以來,幾乎一個業(yè)內的默認做法便是要用了無論word2vec還是GloVe預訓練的詞向量,作為模型的第一層,如果不這么做,大約只有兩個原因:
你很土豪,有錢標注大量監(jiān)督數據;
你在蠻干。
而這一個思想,絕不是如它表象所顯示的一樣,似乎和過去做文本特征沒什么太大區(qū)別,是的,表象確實是這樣,無非是把一個詞用了一堆數字來表征而已,這和離散化的特征有什么本質區(qū)別嗎?有,因為它開啟了一種全新的NLP模型訓練方式——遷移學習?;舅枷氡闶抢靡磺锌梢岳玫默F成知識,達到快速學習的目的,這和人類的進化歷程何其相似。
雖然咿咿呀呀囫圇吞棗似的剛開始能夠說得三兩個詞,然而這是“NLP的一小步,人類AI的一大步”。正如人類語言產生之初,一旦某個原始人類的喉部發(fā)出的某個音節(jié),經無比智慧和刨根問底考證的史學家研究證實了它具有某個明確的指代意義(無論它指代什么,即便是人類的排泄物),這便無比莊嚴的宣示著一個全新物種的誕生,我想遷移學習在NLP中的這一小步,大概與此同擔當。








