我們都知道略水,牛頓說過一句名言
If I have seen further, it is by standing on the shoulders of giants.
無可否認(rèn)珍策,牛頓取得了無與匹敵的成就铣耘,人類歷史上最偉大的科學(xué)家之一,但同樣無可否認(rèn)的是囤锉,牛頓確實吸收了大量前人的研究成果拣帽,諸如哥白尼、伽利略和開普勒等人嚼锄,正因如此减拭,聯(lián)合國為了紀(jì)念伽利略首次將望遠(yuǎn)鏡用作天文觀測四百周年,2009年的時候区丑,通過了”國際天文年“的決議拧粪,并選中《巨人的肩膀》(Shoulders Of Giants)作為主題曲。我想這大概是告訴后人沧侥,“吃水不忘挖井人”可霎,牛頓的成就固然偉大,他腳下的“巨人肩膀”伽利略也同樣不能忘了宴杀。
也許癣朗,“巨人肩膀”無處不在,有些人善于發(fā)現(xiàn)旺罢,有些人選擇性失明旷余,而牛頓的偉大之處在于他能夠發(fā)現(xiàn),這是偉大其一扁达,更為重要的是正卧,他還能自己造了梯子爬上“巨人的肩膀”,并成為一個新的“巨人肩膀”跪解,這是偉大其二炉旷。
而回到這篇文章的主題,作為平凡人的我們叉讥,暫且先把如何發(fā)現(xiàn)并造了梯子云云撇開不談窘行,讓我們先來捋一捋現(xiàn)在NLP當(dāng)中可能的“巨人肩膀”在哪里,以及有哪些已經(jīng)造好的“梯子”可供攀登图仓,余下的罐盔,就留給那些立志成為“巨人肩膀”的人文志士們吧。
通常來說透绩,NLP中監(jiān)督任務(wù)的基本套路都可以用三個積木來進行歸納:
文本數(shù)據(jù)搜集和預(yù)處理
將文本進行編碼和表征
設(shè)計模型解決具體任務(wù)
其中數(shù)據(jù)處理階段自不用說翘骂,各個任務(wù)按照各自的邏輯去處理和得到相應(yīng)的輸入。而其中的第二階段Encoder模塊與第三階段的Task-specific Model模塊帚豪,通常來說碳竟,界限并不是特別清晰,二者之間互有滲透狸臣。而回顧過去基于深度學(xué)習(xí)的NLP任務(wù)可以發(fā)現(xiàn)莹桅,幾乎絕大多數(shù)都比較符合這三層概念。比如很多生成任務(wù)的Seq2Seq框架中不外乎都有一個Encoder和一個Decoder烛亦,對應(yīng)到這里的話Decoder更像是一個Task-specific Model诈泼,然后相應(yīng)的將Encoder做一些細(xì)微的調(diào)整,比如引入Attention機制等等煤禽,對于一些文本分類任務(wù)的結(jié)構(gòu)铐达,則Encoder模塊與Task-specific Model模塊的區(qū)分更為明顯和清晰,Encoder負(fù)責(zé)提取文本的特征檬果,最后接上一些全連接層和Softmax層便可以當(dāng)做Task-specific Model模塊瓮孙,如此便完成了一個文本分類任務(wù)。
既然很多的NLP任務(wù)都可以用這三個模塊來進行歸納的話选脊,并且其中數(shù)據(jù)層和Task-specific Model模塊層可能根據(jù)具體任務(wù)的不同需要做一些相應(yīng)的設(shè)計杭抠,而Encoder層便可以作為一個相對比較通用的模塊來使用。那么自然會有一個想法恳啥,能不能類似于圖像領(lǐng)域中的ImageNet上預(yù)訓(xùn)練的各種模型偏灿,來做一個NLP中預(yù)訓(xùn)練好的Encoder模塊,然后我拿來直接利用就好了钝的?應(yīng)該說翁垂,這個想法并不難想到,NLP人也花了一些時間去思考NLP中究竟該如何設(shè)計一些更通用的可以遷移利用的東西硝桩,而不是所有的任務(wù)都要“from scratch”沮峡。因為如何盡量利用已有的知識、經(jīng)驗和工具亿柑,避免重復(fù)造輪子邢疙,想盡一切辦法“站在巨人的肩膀上”快速發(fā)展,我想大概也是最樸素的“發(fā)展是硬道理”的體現(xiàn)望薄。
為了更好的厘清這個思路疟游,我們先來看看人類和CV(Computer Vision,計算機圖像)曾經(jīng)都是如何“站在巨人的肩膀上”的痕支。
一. 人類的巨人肩膀
大約在20萬年前颁虐,人類祖先FOXP2基因的2處(相對于其他原始猿類,如下圖)極其微小卻又至為關(guān)鍵的突變卧须,讓人類祖先逐漸擁有了語言能力另绩,從此人類逐漸走上了一條不同于其他所有動物的文明演化之路儒陨。
而人類語言以及隨后產(chǎn)生的文字也是人類區(qū)別于其他動物的一個至關(guān)重要的特征,它使得人類協(xié)同合作的能力變得極為強大笋籽,且讓代際間經(jīng)驗與文化的傳承效率大大提升蹦漠。知名博主Tim Urban——連大佬Elon Musk都是他的鐵桿粉絲——在2017年4月發(fā)表的巨長博文中(其實也是為了商業(yè)互吹Musk的Neuralink),Tim分析了為什么語言能夠加速人類文明的發(fā)展车海,并最終從幾十萬年前智能生命競賽跑道上所有一切潛在對手中大比分強勢勝出笛园。在這個過程中,語言起了非常關(guān)鍵的作用侍芝。在語言產(chǎn)生前研铆,人類社會發(fā)展非常緩慢,表現(xiàn)為代際間的傳承效率非常低下州叠,而自從語言誕生以后棵红,人類社會的發(fā)展速度得到極大的提升,這主要體現(xiàn)在父輩的生存技能和經(jīng)驗?zāi)軌蛲ㄟ^快速有效的方式傳承給子輩咧栗,不僅如此窄赋,在同輩之間通過語言的溝通和交流,寶貴的經(jīng)驗也能夠通過語言這種高效的媒介迅速傳播到原始部落的每一個角落楼熄。于是忆绰,人類的每一代都能夠得以在他們的父輩打下的江山上,一日千里可岂,終成這顆藍(lán)色星球上的無二霸主错敢。
不過,我覺得Urban想說卻并沒有說出來的是缕粹,即便在人類語言誕生之前稚茅,人類祖先也可以通過可能已經(jīng)先于語言而誕生的學(xué)習(xí)與認(rèn)知能力,做到以“代”為單位來進行傳承與進化平斩,只不過不同于基因進化亚享,這是一種地球生命全新的進化方式,在效率上已經(jīng)比其他生物的進化效率高的多得多绘面。地球上自生命誕生以來一直被奉為圭臬的基因進化法則欺税,往往都是以一個物種為單位,上一代花了生命代價學(xué)習(xí)到的生存技能需要不斷的通過非常低效的“優(yōu)勝劣汰揭璃,適者生存”的叢林法則晚凿,寫進到該物種生物的基因中才算完事,而這往往需要幾萬年乃至幾百萬年才能完成瘦馍。而在這個過程中歼秽,比其他物種強得多的學(xué)習(xí)能力是人類制勝的關(guān)鍵。
上面兩個事實情组,前者說明了語言是加速文明進化的潤滑劑燥筷,而后者說明了強大的學(xué)習(xí)能力是人類走出一條有人類特色的發(fā)展之路箩祥,從而脫離基因進化窠臼的最為重要的因素。
也就是說肆氓,對于人類而言袍祖,他們的父輩,同輩做院,以及一切同類盲泛,乃至大自然萬事萬物都是他們的“巨人肩膀”濒持;而語言和學(xué)習(xí)能力則是人類能夠站上“巨人肩膀”的“梯子”键耕。
回到本文的主題,對于人類的鋼鐵“兒子”AI來說柑营,CV和NLP是當(dāng)前AI最火爆的兩個領(lǐng)域之二屈雄,一個要解決鋼鐵“兒子”的視覺功能,一個要解決鋼鐵“兒子”的語言或認(rèn)知能力官套,那么什么又是這個鋼鐵“兒子”的“巨人肩膀”和“梯子”呢酒奶?我們先來看看CV中的情況。
二. CV的巨人肩膀
ImageNet是2009年由李飛飛團隊鄧嘉等人提出奶赔,并迅速發(fā)展成為CV領(lǐng)域最知名的比賽ILSVRC惋嚎,從2010年舉辦第一屆,到2017年李飛飛宣布最后一屆站刑,前后總共舉辦8年另伍,這八年間先后在這個比賽中涌現(xiàn)了一大批推動AI領(lǐng)域尤其是CV領(lǐng)域大發(fā)展的算法和模型。特別值得一提的是2012年Hinton團隊提出了AlexNet绞旅,超過當(dāng)時第二名效果41%摆尝,一下子引爆了AI領(lǐng)域,因此2012年也被稱為“深度學(xué)習(xí)元年”因悲。
隨之而來堕汞,大家發(fā)現(xiàn)如果用已經(jīng)在ImageNet中訓(xùn)練好的模型,并用這些模型中的參數(shù)來初始化新任務(wù)中的模型晃琳,可以顯著的提升新任務(wù)下的效果讯检。這種站在“巨人肩膀”上的方法已經(jīng)被成功運用到很多CV任務(wù)中,諸如物體檢測和語義分割等卫旱,不僅如此视哑,更為重要的是,這種充分使用預(yù)訓(xùn)練模型的方法可以非常便利的遷移到一些獲取標(biāo)注數(shù)據(jù)較為困難的新場景中誊涯,從而極大的改善模型對標(biāo)注數(shù)據(jù)數(shù)量的要求挡毅,并降低標(biāo)注數(shù)據(jù)的成本。因此暴构,利用大規(guī)模數(shù)據(jù)集預(yù)訓(xùn)練模型進行遷移學(xué)習(xí)的方法被認(rèn)為是CV中的標(biāo)配跪呈,以至于2018年的早些時候段磨,大神何凱明所在的FAIR團隊利用Instgram中數(shù)十億張帶有用戶標(biāo)簽的圖片進行預(yù)訓(xùn)練,爾后將其在ImageNet的比賽任務(wù)中進行fine-tune耗绿,取得了最好的成績(見引用5)苹支。只不過晴氨,由于預(yù)訓(xùn)練的數(shù)據(jù)過于龐大盈咳,該工作動用了336塊GPU預(yù)訓(xùn)練了22天愚战,不得不說實在都是土豪們才玩得動的游戲笆搓,這一點和下文要介紹的NLP中的預(yù)訓(xùn)練步驟何其相似众羡。
不過為何這種預(yù)訓(xùn)練的模式能夠有效慈参?這背后有什么更深刻的內(nèi)涵嗎暴匠?為此蔚携,Google Brain團隊將2014年的ImageNet冠軍GoogleNet的中間層進行了可視化精耐,可以發(fā)現(xiàn)模型的較低層學(xué)習(xí)到的主要是物體的邊緣狼速,往高層后逐步就變成了成型的物體了。一般來說卦停,物體的邊緣和紋路都是一些比較通用的視覺特征向胡,因此將這一部分對應(yīng)的模型參數(shù)用來初始化task-specific模型中的參數(shù),意味著模型就不需要再從頭開始學(xué)習(xí)這些特征惊完,從而大大提升了訓(xùn)練的效率和性能僵芹。
總結(jié)起來就是,CV中的“巨人肩膀”是ImageNet以及由之而來Google等公司或團隊在大規(guī)模數(shù)據(jù)集上預(yù)訓(xùn)練得到的模型小槐,而“梯子”便是transfer learning之下的fine-tuning拇派。
三. 尋找NLP的巨人肩膀
和CV領(lǐng)域中深度學(xué)習(xí)的驚艷表現(xiàn)相比,對于NLP任務(wù)來講本股,深度學(xué)習(xí)的應(yīng)用一直沒有帶來讓人眼前特別一亮的表現(xiàn)攀痊。ImageNet中的圖片分類任務(wù),深度學(xué)習(xí)早已超越人類的分類準(zhǔn)確率拄显,而這一目標(biāo)對于NLP中的深度學(xué)習(xí)來說苟径,似乎成了不太可能完成的任務(wù),尤其是在那些需要深層語義理解的任務(wù)當(dāng)中躬审,更是如此棘街。但即便如此,困難從來未曾阻止人類想要教給他“兒子”理解“長輩”的話并開口說“人話”的雄心承边,憂心忡忡的人類家長恨不得也給AI來一次FOXP2基因突變——正像20萬年前上帝的一次神來之筆給人類帶來了語言能力一樣遭殉。
今年(2018年)九月份,DeepMind主辦的Deep Learning Indaba 2018 大會在南非舉行博助,ULMFit(下文會做介紹)的作者之一Sebastian Ruder在大會上做了一個很精彩的名為《Frontiers of Natural Language Processing》的報告(引用8)险污,前后分為兩個部分:第一部分梳理近些年NLP的發(fā)展;第二部分探討了當(dāng)前NLP遇到的一些困難。在參考這個報告的同時蛔糯,并回到本文最開頭拯腮,這里將主要著重于NLP中最為重要的Encoder模塊,并拋去具體的模型之爭(諸如CNN,RNN和Transformer等等)蚁飒,想要努力梳理出一條NLP任務(wù)中如何更有效站上“巨人肩膀”的一些模式出來动壤。
本質(zhì)上,自然語言理解NLU的核心問題其實就是如何從語言文字的表象符號中抽取出來蘊含在文字背后的真實意義淮逻,并將其用計算機能夠讀懂的方式表征出來——當(dāng)然這通常對應(yīng)的是數(shù)學(xué)語言琼懊,表征是如此重要,以至于2012年的時候Yoshua Bengio自己作為第一作者發(fā)表了一篇表征學(xué)習(xí)的綜述(引用9)爬早,并隨后在2013年和深度學(xué)習(xí)三大巨頭的另一位巨頭Yann LeCun牽頭創(chuàng)辦ICLR哼丈,這一會議至今才過去5年時間,如今已是AI領(lǐng)域最負(fù)盛名的頂級會議之一凸椿∠髌恚可以說翅溺,探究NLP或NLU的歷史脑漫,也可以說同樣也是探究文本如何更有效表征的歷史。而這一過程咙崎,可以根據(jù)word2vec的出現(xiàn)和使用优幸,大致分為前word2vec時代和word2vec時代兩個階段。我們先來看看前word2vec時代都發(fā)生了哪些事情褪猛。
1. 梯子出現(xiàn)之前
猶如生命的誕生之初网杆,混沌而原始。在word2vec誕生之前伊滋,NLP中并沒有一個統(tǒng)一的方法去表示一段文本碳却,各位前輩和大師們發(fā)明了許多的方法:從one-hot表示一個詞到用bag-of-words來表示一段文本,從k-shingles把一段文本切分成一些文字片段到漢語中用各種序列標(biāo)注方法將文本按語義進行分割笑旺,從tf-idf中用頻率的手段來表征詞語的重要性到text-rank中借鑒了page-rank的方法來表征詞語的權(quán)重昼浦,從基于SVD純數(shù)學(xué)分解詞文檔矩陣的LSA,到pLSA中用概率手段來表征文檔形成過程并將詞文檔矩陣的求解結(jié)果賦予概率含義筒主,再到LDA中引入兩個共軛分布從而完美引入先驗......
1.1 語言模型
而以上這些都是相對比較傳統(tǒng)的方法关噪,在介紹基于深度學(xué)習(xí)的方法之前,先來看看語言模型乌妙。實際上使兔,語言模型的本質(zhì)是對一段自然語言的文本進行預(yù)測概率的大小,即如果文本用 來表示藤韵,那么語言模型就是要求 的大小虐沥,如果按照大數(shù)定律中頻率對于概率無限逼近的思想,求這個概率大小泽艘,自然要用這個文本在所有人類歷史上產(chǎn)生過的所有文本集合中欲险,先求這個文本的頻率 奈搜,爾后便可以通過如下公式來求得
這個公式足夠簡單,但問題是全人類所有歷史的語料這種統(tǒng)計顯然無法實現(xiàn)盯荤,因此為了將這個不可能的統(tǒng)計任務(wù)變得可能馋吗,首先有人將文本不當(dāng)做一個整體,而是把它拆散成一個個的詞秋秤,通過每個詞之間的概率關(guān)系宏粤,從而求得整個文本的概率大小。假定句子長度為灼卢,詞用表示绍哎,即
然而,這個式子的計算依然過于復(fù)雜鞋真,我們一般都會引入馬爾科夫假設(shè):假定一個句子中的詞只與它前面的個詞相關(guān)崇堰,特別地,當(dāng)的時候涩咖,句子的概率計算公式最為簡潔:
并且把詞頻的統(tǒng)計用來估計這個語言模型中的條件概率海诲,如下
這樣一來,語言模型的計算終于變得可行檩互。然而特幔,這種基于統(tǒng)計的語言模型卻存在很多問題:
第一,很多情況下的計算會遇到特別多零值闸昨,尤其是在 取值比較大的情況下蚯斯,這種數(shù)據(jù)稀疏導(dǎo)致的計算為0的現(xiàn)象變得特別嚴(yán)重。所以統(tǒng)計語言模型中一個很重要的方向便是設(shè)計各種平滑方法來處理這種情況饵较。
第二拍嵌, 另一個更為嚴(yán)重的問題是,基于統(tǒng)計的語言模型無法把取得很大循诉,一般來說在3-gram比較常見横辆,再大的話,計算復(fù)雜度會指數(shù)上升打洼。這個問題的存在導(dǎo)致統(tǒng)計語言模型無法建模語言中上下文較長的依賴關(guān)系龄糊。
第三,統(tǒng)計語言模型無法表征詞語之間的相似性募疮。
1.2 NNLM
這些缺點的存在炫惩,迫使2003年Bengio在他的經(jīng)典論文《A Neural Probabilistic Language Model》中,首次將深度學(xué)習(xí)的思想融入到語言模型中阿浓,并發(fā)現(xiàn)將訓(xùn)練得到的NNLM(Neural Net Language Model, 神經(jīng)網(wǎng)絡(luò)語言模型)模型的第一層參數(shù)當(dāng)做詞的分布式表征時他嚷,能夠很好的獲取詞語之間的相似度。
撇去正則化項,NNLM的極大目標(biāo)函數(shù)對數(shù)似然函數(shù)筋蓖,其本質(zhì)上是個N-Gram的語言模型卸耘,如下所示
其中,歸一化之前的概率大姓晨А(也就是logits)為
x實際上就是將每個詞映射為m維的向量蚣抗,然后將這個詞的向量concat起來,組合成一個 維的向量瓮下。這里可以將NNLM的網(wǎng)絡(luò)結(jié)構(gòu)拆分為三個部分:
第一部分翰铡,從詞到詞向量的映射,通過C矩陣完成映射讽坏,參數(shù)個數(shù)為 锭魔;
第二部分,從x到隱藏層的映射路呜,通過矩陣H迷捧,這里的參數(shù)個數(shù)為 ;
第三部分胀葱,從隱藏層到輸出層的映射漠秋,通過矩陣U,參數(shù)個數(shù)為
第四部分巡社,從x到輸出層的映射膛堤,通過矩陣W手趣,參數(shù)個數(shù)為晌该;
因此,如果算上偏置項的參數(shù)個數(shù)(其中輸出層為绿渣,輸入層到隱藏層為)的話朝群,NNLM的參數(shù)個數(shù)為:
可見NNLM的參數(shù)個數(shù)是所取窗口大小n的線性函數(shù),這便可以讓NNLM能夠?qū)ΩL的依賴關(guān)系進行建模中符。不過NNLM的最主要貢獻(xiàn)是非常有創(chuàng)見性的將模型的第一層特征映射矩陣當(dāng)做詞的分布式表示姜胖,從而可以將一個詞表征為一個向量形式,這直接啟發(fā)了后來的word2vec的工作淀散。
這許多的方法和模型正如動蕩的春秋戰(zhàn)國右莱,諸子百家群星閃耀,然而卻也誰都未能有絕對的實力統(tǒng)一當(dāng)時的學(xué)術(shù)界档插。即便到了秦始皇慢蜓,雖武力空前強大,踏平六國郭膛,也有車同軌書同文的壯舉晨抡,卻依然未能把春秋以降的五彩繽紛的思想學(xué)術(shù)界統(tǒng)一起來,直到歷史再歷一百年,漢武帝終于完成了這個空前絕后的大手筆耘柱,“罷黜百家獨尊儒術(shù)”如捅,這也直接成為了華夏文化的核心基礎(chǔ)。不禁要問调煎,如果把NNLM當(dāng)做文化統(tǒng)一前的“書同文”苗頭镜遣,那NLP中的“獨尊儒術(shù)”在哪里?
2. 歷史突破——梯子來了
自NNLM于2003年被提出后士袄,后面又出現(xiàn)了很多類似和改進的工作烈涮,諸如LBL, C&W和RNNLM模型等等,這些方法主要從兩個方面去優(yōu)化NNLM的思想窖剑,其一是NNLM只用了左邊的個詞坚洽,如何利用更多的上下文信息便成為了很重要的一個優(yōu)化思路(如Mikolov等人提出的RNNLM);其二是NNLM的一個非常大的缺點是輸出層計算量太大西土,如何減小計算量使得大規(guī)模語料上的訓(xùn)練變得可行讶舰,這也是工程應(yīng)用上至關(guān)重要的優(yōu)化方向(如Mnih和Hinton提出的LBL以及后續(xù)的一系列模型)。
為了更好理解NNLM之后以及word2vec誕生前的情況需了,我們先來看看現(xiàn)有的幾個主要模型都有哪些優(yōu)缺點跳昼。
NNLM雖然將N-Gram的階n提高到了5,相比原來的統(tǒng)計語言模型是一個很大的進步肋乍,但是為了獲取更好的長程依賴關(guān)系鹅颊,5顯然是不夠的。再者墓造,因為NNLM只對詞的左側(cè)文本進行建模堪伍,所以得到的詞向量并不是語境的充分表征。還有一個問題就更嚴(yán)重了觅闽,NNLM的訓(xùn)練依然還是太慢帝雇,在論文中,Bengio說他們用了40塊CPU蛉拙,在含有1400萬個詞尸闸,只保留詞頻相對較高的詞之后詞典大小為17964個詞,只訓(xùn)練了5個epoch孕锄,但是耗時超過3周吮廉。按這么來算,如果只用一塊CPU畸肆,可能需要2年多宦芦,這還是在僅有1400萬個詞的語料上。如此耗時的訓(xùn)練過程恼除,顯然嚴(yán)重限制了NNLM的應(yīng)用踪旷。
2007年Mnih和Hinton提出的LBL以及后續(xù)的一系列相關(guān)模型曼氛,省去了NNLM中的激活函數(shù),直接把模型變成了一個線性變換令野,尤其是后來將Hierarchical Softmax引入到LBL后舀患,訓(xùn)練效率進一步增強,但是表達(dá)能力不如NNLM這種神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)气破;2008年Collobert和Weston
提出的C&W模型不再利用語言模型的結(jié)構(gòu)聊浅,而是將目標(biāo)文本片段整體當(dāng)做輸入,然后預(yù)測這個片段是真實文本的概率现使,所以它的工作主要是改變了目標(biāo)輸出低匙,由于輸出只是一個概率大小,不再是詞典大小碳锈,因此訓(xùn)練效率大大提升顽冶,但由于使用了這種比較“別致”的目標(biāo)輸出,使得它的詞向量表征能力有限售碳;2010年Mikolov(對强重,還是同一個Mikolov)提出的RNNLM主要是為了解決長程依賴關(guān)系,時間復(fù)雜度問題依然存在贸人。
而這一切间景,似乎都在預(yù)示著一個新時代的來臨。
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)化訓(xùn)練的方法,包括Hierarchical Softmax(當(dāng)然父晶,這個方法早在2003年哮缺,Bengio就在他提出NNLM論文中的Future Work部分提到了這種方法,并于2005年把它系統(tǒng)化發(fā)表了一篇論文), Negative Sampling和Subsampling技術(shù)甲喝。放出兩篇論文后,當(dāng)時仍在谷歌工作的Mikolov又馬不停蹄的放出了大殺器——word2vec工具铛只,并在其中開源了他的方法埠胖。順便提一下的是,很多人以為word2vec是一種模型和方法淳玩,其實word2vec只是一個工具直撤,背后的模型是CBOW或者Skip-gram,并且使用了Hierarchical Softmax或者Negative Sampling這些訓(xùn)練的優(yōu)化方法蜕着。所以準(zhǔn)確說來谋竖,word2vec并不是一個模型或算法红柱,只不過Mikolov恰好在當(dāng)時把他開源的工具包起名叫做word2vec而已。不過為了敘述簡單蓖乘,在下文我將用word2vec來指代上面提到Mikolov兩篇論文中的一整個相關(guān)的優(yōu)化思想锤悄。
word2vec對于前人的優(yōu)化,主要是兩方面的工作:模型的簡化和訓(xùn)練技巧的優(yōu)化嘉抒。我們先來看看模型的簡化方面零聚,也就是耳熟能詳?shù)腃BOW和Skip-gram。
對于CBOW而言些侍,我們可以從它的名字上一窺究竟隶症,它的全稱是Continuous Bag-of-Words,也就是連續(xù)的詞袋模型岗宣,為什么取這個名字蚂会,先來看看它的目標(biāo)函數(shù)。
首先耗式,CBOW沒有隱藏層颂龙,本質(zhì)上只有兩層結(jié)構(gòu),輸入層將目標(biāo)詞語境中的每一個詞向量簡單求和(當(dāng)然纽什,也可以求平均)后得到語境向量措嵌,然后直接與目標(biāo)詞的輸出向量求點積,目標(biāo)函數(shù)也就是要讓這個與目標(biāo)詞向量的點積取得最大值芦缰,對應(yīng)的與非目標(biāo)詞的點積盡量取得最小值企巢。從這可以看出,CBOW的第一個特點是取消了NNLM中的隱藏層让蕾,直接將輸入層和輸出層相連浪规;第二個特點便是在求語境context向量時候,語境內(nèi)的詞序已經(jīng)丟棄(這個是名字中Continuous的來源)探孝;第三笋婿,因為最終的目標(biāo)函數(shù)仍然是語言模型的目標(biāo)函數(shù),所以需要順序遍歷語料中的每一個詞(這個是名字中Bag-of-Words的來源)顿颅。因此有了這些特點(尤其是第二點和第三點)缸濒,Mikolov才把這個簡單的模型取名叫做CBOW,簡單卻有效的典范粱腻。
需要注意的是這里每個詞對應(yīng)到兩個詞向量庇配,在上面的公式中都有體現(xiàn),其中是詞的輸入向量绍些,而則是詞的輸出向量捞慌,或者更準(zhǔn)確的來講,前者是CBOW輸入層中跟詞所在位置相連的所有邊的權(quán)值(其實這就是詞向量)組合成的向量柬批,而是輸出層中與詞所在位置相連的所有邊的權(quán)值組合成的向量啸澡,所以把這一向量叫做輸出向量袖订。
同樣地,和CBOW對應(yīng)嗅虏,Skip-gram的模型基本思想和CBOW非常類似洛姑,只是換了一個方向:CBOW是讓目標(biāo)詞的輸出向量擬合語境的向量;而Skip-gram則是讓語境中每個詞的輸出向量盡量擬合當(dāng)前輸入詞的向量旋恼,和CBOW的方向相反吏口,因此它的目標(biāo)函數(shù)如下:
可以看出目標(biāo)函數(shù)中有兩個求和符號,最里面的求和符號的意義便是讓當(dāng)前的輸入詞分別和該詞對應(yīng)語境中的每一個詞都盡量接近冰更,從而便可以表現(xiàn)為該詞與其上下文盡量接近产徊。
和CBOW類似,Skip-gram本質(zhì)上也只有兩層:輸入層和輸出層蜀细,輸入層負(fù)責(zé)將輸入詞映射為一個詞向量舟铜,輸出層負(fù)責(zé)將其經(jīng)過線性映射計算得到每個詞的概率大小。再細(xì)心一點的話奠衔,其實無論CBOW還是Skip-gram谆刨,本質(zhì)上都是兩個全連接層的相連,中間沒有 任何其他的層归斤。因此痊夭,這兩個模型的參數(shù)個數(shù)都是,其中分別是詞向量的維度和詞典的大小脏里,相比上文中我們計算得到NNLM的參數(shù)個數(shù)已經(jīng)大大減小她我,且與上下文所取詞的個數(shù)無關(guān)了,也就是終于避免了N-gram中隨著階數(shù)N增大而使得計算復(fù)雜度急劇上升的問題迫横。
然而番舆,Mikolov大神說了,這些公式是“impractical”的矾踱,他的言下之意是計算復(fù)雜度依然和詞典大小有關(guān)恨狈,而這通常都意味著非常非常大,以下是他的原話
..., 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).
不得不說呛讲,大神就是大神禾怠,將模型已經(jīng)簡化到了只剩兩個全連接層(再脫就沒了),依然不滿足圣蝎,還“得寸進尺”地打起了詞典的“小算盤”酸役,那么Mikolov的“小算盤”是什么呢恨闪?
他在論文中首先提到了Hierachical Softmax,認(rèn)為這是對full softmax的一種優(yōu)化手段研叫,而Hierachical Softmax的基本思想就是首先將詞典中的每個詞按照詞頻大小構(gòu)建出一棵Huffman樹哮针,保證詞頻較大的詞處于相對比較淺的層关面,詞頻較低的詞相應(yīng)的處于Huffman樹較深層的葉子節(jié)點坦袍,每一個詞都處于這棵Huffman樹上的某個葉子節(jié)點;第二等太,將原本的一個分類問題變成了次的二分類問題捂齐,做法簡單說來就是,原先要計算的時候缩抡,因為使用的是普通的softmax奠宜,勢必要求詞典中的每一個詞的概率大小,為了減少這一步的計算量瞻想,在Hierachical Softmax中压真,同樣是計算當(dāng)前詞在其上下文中的概率大小,只需要把它變成在Huffman樹中的路徑預(yù)測問題就可以了蘑险,因為當(dāng)前詞在Huffman樹中對應(yīng)到一條路徑滴肿,這條路徑由這棵二叉樹中從根節(jié)點開始,經(jīng)過一系列中間的父節(jié)點佃迄,最終到達(dá)當(dāng)前這個詞的葉子節(jié)點而組成泼差,那么在每一個父節(jié)點上,都對應(yīng)的是一個二分類問題(本質(zhì)上就是一個LR分類器)呵俏,而Huffman樹的構(gòu)造過程保證了樹的深度為堆缘,所以也就只需要做次二分類便可以求得的大小,這相比原來次的計算量普碎,已經(jīng)大大減小了吼肥。
接著,Mikolov又提出了負(fù)采樣的思想随常,而這一思想也是受了C&W模型中構(gòu)造負(fù)樣本方法啟發(fā)潜沦,同時參考了Noise Contrastive Estimation (NCE)的思想,用CBOW的框架簡單來講就是绪氛,負(fù)采樣每遍歷到一個目標(biāo)詞唆鸡,為了使得目標(biāo)詞的概率最大,根據(jù)softmax函數(shù)的概率公式枣察,也就是讓分子中的最大争占,而分母中其他非目標(biāo)詞的最小,普通softmax的計算量太大就是因為它把詞典中所有其他非目標(biāo)詞都當(dāng)做負(fù)例了序目,而負(fù)采樣的思想特別簡單臂痕,就是每次按照一定概率隨機采樣一些詞當(dāng)做負(fù)例,從而就只需要計算這些負(fù)采樣出來的負(fù)例了猿涨,那么概率公式便相應(yīng)變?yōu)?/p>
仔細(xì)和普通softmax進行比較便會發(fā)現(xiàn)握童,將原來的分類問題變成了分類問題,這便把詞典大小對時間復(fù)雜度的影響變成了一個常數(shù)項叛赚,而改動又非常的微小澡绩,不可謂不巧妙稽揭。
除此之外,Mikolov還提到了一些其他技巧肥卡,比如對于那些超高頻率的詞溪掀,尤其是停用詞,可以使用Subsampling的方法進行處理步鉴,不過這已經(jīng)不是word2vec最主要的內(nèi)容了揪胃。
自此,經(jīng)過模型和訓(xùn)練技巧的雙重優(yōu)化氛琢,終于使得大規(guī)模語料上的訓(xùn)練成為了現(xiàn)實喊递,更重要的是,得到的這些詞向量能夠在語義上有非常好的表現(xiàn)艺沼,能將語義關(guān)系通過向量空間關(guān)系表征出來册舞。
word2vec的出現(xiàn),極大的促進了NLP的發(fā)展障般,尤其是促進了深度學(xué)習(xí)在NLP中的應(yīng)用(不過有意思的是调鲸,word2vec算法本身其實并不是一個深度模型,它只有兩層全連接)挽荡,利用預(yù)訓(xùn)練好的詞向量來初始化網(wǎng)絡(luò)結(jié)構(gòu)的第一層幾乎已經(jīng)成了標(biāo)配藐石,尤其是在只有少量監(jiān)督數(shù)據(jù)的情況下,如果不拿預(yù)訓(xùn)練的embedding初始化第一層定拟,幾乎可以被認(rèn)為是在蠻干于微。在此之后,一大批word embedding方法大量涌現(xiàn)青自,比較知名的有GloVe和fastText等等株依,它們各自側(cè)重不同的角度,并且從不同的方向都得到了還不錯的embedding表征延窜。
2.2 GloVe
先來看看GloVe的損失函數(shù)恋腕,
其中是兩個詞和在某個窗口大小中的共現(xiàn)頻率(不過GloVe對其做了一些改進,共現(xiàn)頻率相應(yīng)有一個衰減系數(shù)逆瑞,使得距離越遠(yuǎn)的詞對共現(xiàn)頻率越小一些)荠藤,是一個權(quán)重系數(shù),主要目的是共現(xiàn)越多的pair對于目標(biāo)函數(shù)貢獻(xiàn)應(yīng)該越大获高,但是又不能無限制增大哈肖,所以對共現(xiàn)頻率過于大的pair限定最大值,以防訓(xùn)練的時候被這些頻率過大的pair主導(dǎo)了整個目標(biāo)函數(shù)念秧,剩下的就是算法的核心部分了淤井,兩個值是兩個偏置項,撇去不談,那么剩下的其實就是一個普通的均方誤差函數(shù)庄吼,是當(dāng)前詞的向量缎除,對應(yīng)的是與其在同一個窗口中出現(xiàn)的共現(xiàn)詞的詞向量严就,兩者的向量點乘要去盡量擬合它們共現(xiàn)頻率的對數(shù)值总寻。從直觀上理解,如果兩個詞共現(xiàn)頻率越高梢为,那么其對數(shù)值當(dāng)然也越高渐行,因而算法要求二者詞向量的點乘也越大,而二個詞向量的點乘越大铸董,其實包含了兩層含義:第一祟印,要求各自詞向量的模越大,通常來說粟害,除去頻率非常高的詞(比如停用詞)蕴忆,對于有明確語義的詞來說,它們的詞向量模長會隨著詞頻增大而增大悲幅,因此兩個詞共現(xiàn)頻率越大套鹅,要求各自詞向量模長越大是有直覺意義的,比如“魑魅魍魎”假如能被拆分成兩個詞汰具,那么“魑魅”和“魍魎”這兩個詞的共現(xiàn)頻率相比““魑魅”和其他詞的共現(xiàn)頻率要大得多卓鹿,對應(yīng)到“魑魅”的詞向量,便會傾向于在某個詞向量維度上持續(xù)更新留荔,進而使得它的模長也會比較偏大吟孙;第二,要求這兩個詞向量的夾角越小聚蝶,這也是符合直覺的杰妓,因為出現(xiàn)在同一個語境下頻率越大,說明這兩個詞的語義越接近碘勉,因而詞向量的夾角也偏向于越小巷挥。
此外,可以從GloVe使用的損失函數(shù)中發(fā)現(xiàn)恰聘,它的訓(xùn)練主要是兩個步驟:統(tǒng)計共現(xiàn)矩陣和訓(xùn)練獲取詞向量,這個過程其實是沒有我們通常理解當(dāng)中的模型的晴叨,更遑論神經(jīng)網(wǎng)絡(luò),它整個的算法框架都是基于矩陣分解的做法來獲取詞向量的兼蕊,本質(zhì)上和諸如LSA這種基于SVD的矩陣分解方法沒有什么不同,只不過SVD分解太過于耗時产禾,運算量巨大,相同點是LSA也是輸入共現(xiàn)矩陣亚情,不過一般主要以詞-文檔共現(xiàn)矩陣為主,另外衫生,LSA中的共現(xiàn)矩陣沒有做特殊處理土浸,而GloVe考慮到了對距離較遠(yuǎn)的詞對做相應(yīng)的懲罰等等罪针。然而,相比word2vec黄伊,GloVe卻更加充分的利用了詞的共現(xiàn)信息泪酱,word2vec中則是直接粗暴的讓兩個向量的點乘相比其他詞的點乘最大,至少在表面上看來似乎是沒有用到詞的共現(xiàn)信息还最,不像GloVe這里明確的就是擬合詞對的共現(xiàn)頻率墓阀。
不過更有意思的還是,GloVe和word2vec似乎有種更為內(nèi)在的聯(lián)系憋活,再來看看他們的目標(biāo)函數(shù)有什么不一樣岂津,這是Skip-gram的目標(biāo)函數(shù)(這里在原來的基礎(chǔ)上加上了對于語料的遍歷N)
而這個目標(biāo)函數(shù)是按照語料的順序去遍歷,如果先把語料當(dāng)中的相關(guān)詞進行合并悦即,然后按照詞典序進行遍歷吮成,便可以證明Skip-gram實際上和GloVe的優(yōu)化目標(biāo)一致,有興趣的可以參考引用11中的證明細(xì)節(jié)辜梳,這里不再贅述粱甫。
2.3 fastText
word2vec和GloVe都不需要人工標(biāo)記的監(jiān)督數(shù)據(jù),只需要語言內(nèi)部存在的監(jiān)督信號即可以完成訓(xùn)練作瞄。而與此相對應(yīng)的茶宵,fastText則是利用帶有監(jiān)督標(biāo)記的文本分類數(shù)據(jù)完成訓(xùn)練,本質(zhì)上沒有什么特殊的宗挥,模型框架就是CBOW乌庶,只不過與普通的CBOW有兩點不一樣,分別是輸入數(shù)據(jù)和預(yù)測目標(biāo)的不同契耿,在輸入數(shù)據(jù)上瞒大,CBOW輸入的是一段區(qū)間中除去目標(biāo)詞之外的所有其他詞的向量加和或平均,而fastText為了利用更多的語序信息搪桂,將bag-of-words變成了bag-of-features,也就是下圖中的輸入不再僅僅是一個詞魄藕,還可以加上bigram或者是trigram的信息等等;第二個不同在于荷荤,CBOW預(yù)測目標(biāo)是語境中的一個詞,而fastText預(yù)測目標(biāo)是當(dāng)前這段輸入文本的類別,正因為需要這個文本類別古毛,因此才說fastText是一個監(jiān)督模型稻薇。而相同點在于,fastText的網(wǎng)絡(luò)結(jié)構(gòu)和CBOW基本一致案狠,同時在輸出層的分類上也使用了Hierachical Softmax技巧來加速訓(xùn)練骂铁。
這里的便是語料當(dāng)中第n篇文檔的第i個詞以及加上N-gram的特征信息。從這個損失函數(shù)便可以知道fastText同樣只有兩個全連接層套蒂,分別是A和B烁挟,其中A便是最終可以獲取的詞向量信息信夫。
fastText最大的特點在于快警没,論文中對這一點也做了詳細(xì)的實驗驗證杀迹,在一些分類數(shù)據(jù)集上树酪,fastText通常都可以把CNN結(jié)構(gòu)的模型要耗時幾小時甚至幾天的時間,急劇減少到只需要消耗幾秒鐘疮茄,不可謂不“fast”.
不過說個八卦力试,為什么fastText結(jié)構(gòu)和CBOW如此相似(感興趣的讀者想要繼續(xù)深挖的話,還可以看看2015年ACL上的一篇論文《Deep Unordered Composition Rivals Syntactic Methods for Text Classification》怖糊,結(jié)構(gòu)又是何其相似蓬抄,并且比fastText的論文探討的更為深入一些嚷缭,但是fastText是2016年的文章,剩下的大家自己去想好了)付翁,這里面大概一個特別重要的原因就是fastText的作者之一便是3年前CBOW的提出者Mikolov本人百侧,只不過昔日的Mikolov還在谷歌佣渴,如今3年時間一晃而過膨处,早已是Facebook的人了砂竖。
2.4 爬上第一級梯子的革命意義
那為什么word2vec的出現(xiàn)極大的促進了NLP領(lǐng)域的發(fā)展突硝?
通常以為狞换,word2vec一類的方法會給每一個詞賦予一個向量的表征查库,不過似乎從來沒有人想過這個辦法為什么行之有效整慎?難道是皇帝的新衣裤园?按理來說,包括NNLM在內(nèi)淤袜,這些方法的主要出發(fā)點都是將一個詞表示成詞向量铡羡,并將其語義通過上下文來表征尽爆。其實,這背后是有理論基礎(chǔ)的饱亿,1954年Harris提出分布假說(distributional hypothesis)彪笼,這一假說認(rèn)為:上下文相似的詞,其語義也相似泵肄,1957年Firth對分布假說進行了進一步闡述和明確:詞的語義由其上下文決定(a word is characterized by the company it keeps)淑翼,30年后玄括,深度學(xué)習(xí)的祖師爺Hinton也于1986年嘗試過詞的分布式表示胃惜。
而word2vec的貢獻(xiàn)遠(yuǎn)不止是給每一個詞賦予一個分布式的表征船殉,私以為利虫,它帶來了一種全新的NLP模型建立方法,在這之前寞钥,大多數(shù)NLP任務(wù)都要在如何挖掘更多文本語義特征上花費大量時間,甚至這一部分工作占去了整個任務(wù)工作量的絕大部分陌选,而以word2vec為代表的distributed representation方法大量涌現(xiàn)后(尤其是因為大規(guī)模語料上的預(yù)訓(xùn)練詞向量成為現(xiàn)實理郑,并且被證明確實行之有效之后)蹄溉,算法人員發(fā)現(xiàn)利用word2vec在預(yù)訓(xùn)練上學(xué)習(xí)到的詞向量,初始化他們自己模型的第一層您炉,會帶來極大效果的提升柒爵,以至于這五年以來,幾乎一個業(yè)內(nèi)的默認(rèn)做法便是要用了無論word2vec還是GloVe預(yù)訓(xùn)練的詞向量赚爵,作為模型的第一層,如果不這么做,大約只有兩個原因:
你很土豪疙描,有錢標(biāo)注大量監(jiān)督數(shù)據(jù);
你在蠻干瓜客。
而這一個思想,絕不是如它表象所顯示的一樣,似乎和過去做文本特征沒什么太大區(qū)別蜻直,是的,表象確實是這樣晋辆,無非是把一個詞用了一堆數(shù)字來表征而已为朋,這和離散化的特征有什么本質(zhì)區(qū)別嗎鸯匹?有根蟹,因為它開啟了一種全新的NLP模型訓(xùn)練方式——遷移學(xué)習(xí)悲龟”嵫基本思想便是利用一切可以利用的現(xiàn)成知識庆寺,達(dá)到快速學(xué)習(xí)的目的撩匕,這和人類的進化歷程何其相似谨朝。
雖然咿咿呀呀囫圇吞棗似的剛開始能夠說得三兩個詞翩活,然而這是“NLP的一小步堂竟,人類AI的一大步”税稼。正如人類語言產(chǎn)生之初盗舰,一旦某個原始人類的喉部發(fā)出的某個音節(jié),經(jīng)無比智慧和刨根問底考證的史學(xué)家研究證實了它具有某個明確的指代意義(無論它指代什么烘苹,即便是人類的排泄物)躲株,這便無比莊嚴(yán)的宣示著一個全新物種的誕生,我想遷移學(xué)習(xí)在NLP中的這一小步镣衡,大概與此同擔(dān)當(dāng)霜定。