原創(chuàng):王穩(wěn)鉞
資料來源:張春陽(yáng)
詞向量被應(yīng)用在非常非常多的場(chǎng)景中,甚至可以說跟文字相關(guān)的互聯(lián)網(wǎng)應(yīng)用基本上都會(huì)跟詞向量有關(guān)系。本文主要從應(yīng)用、發(fā)展以及實(shí)戰(zhàn)代碼來介紹詞向量。
1. 詞向量的應(yīng)用
搜索引擎是人們每天都在使用的產(chǎn)品,搜索引擎其實(shí)就是利用詞向量技術(shù)來進(jìn)行搜索的。搜索引擎是如何工作的呢?其實(shí)主要分為三步。第一步,搜索引擎需要爬取互聯(lián)網(wǎng)上所有的文章,把這些文章全部都轉(zhuǎn)化成詞向量。第二步是要將搜索詞也轉(zhuǎn)化為詞向量。最后一步就是用搜索詞的詞向量與文章轉(zhuǎn)變成的詞向量進(jìn)行相似度的比較,再把與搜索詞相似的文章返回給用戶。

第二個(gè)應(yīng)用也非常常見——頭條新聞。今日頭條之所以能做得像現(xiàn)在這么好,它背后最主要的商業(yè)邏輯就是它使用了推薦引擎,給不同的用戶分發(fā)不同的內(nèi)容。它是如何實(shí)現(xiàn)的呢?首先第一步就是把很多的新聞轉(zhuǎn)換成向量。第二步就是根據(jù)用戶的行為,比如點(diǎn)擊、點(diǎn)贊、評(píng)論某個(gè)新聞,將用戶也轉(zhuǎn)化為向量。第三步與搜索引擎類似,就是將與用戶向量相似的文章返回給用戶。其實(shí)還有很多類似的應(yīng)用,比如淘寶等電商平臺(tái)。
2. 從文字到詞向量
如何生成詞向量呢?詞向量是如何發(fā)展到現(xiàn)在的呢? 1946計(jì)算機(jī)誕生了。自從有了計(jì)算機(jī)之后,其實(shí)有很多偉大的先賢們一直在想著一個(gè)問題,就是怎么能夠讓計(jì)算機(jī)也能像人一樣幫助人們?nèi)プ鲆恍┦虑?,比如識(shí)別圖像,比如”理解“文字。這里面最偉大的人物就是阿蘭圖靈,阿蘭圖靈發(fā)表了《計(jì)算機(jī)器與智能》這篇論文。這篇論文可能很多人都沒聽說過,但是圖靈測(cè)試一定不陌生。圖靈測(cè)試其實(shí)就是人工智能的最早的雛形,它的思想就是制作一個(gè)機(jī)器,讓其他人分辨不出來這個(gè)機(jī)器人是一個(gè)真的機(jī)器還是一個(gè)人。阿蘭圖靈的很多理論成為了人工智能最早期的思想萌芽。
1950 年,在有了人工智能的想法之后,人們就在思考,人主要有幾個(gè)功能——文字語(yǔ)言、視覺、思考與決策。這就誕生了所謂的人工智能的三大方向——自然語(yǔ)言處理(NLP)、機(jī)器視覺(CV)、商業(yè)分析(BI)。 自然語(yǔ)言處理其實(shí)就是把人類說的文字表示成計(jì)算機(jī)也可以理解。但計(jì)算機(jī)只能處理1、0這些數(shù)字信號(hào),所以計(jì)算機(jī)看不懂人們所寫的這些奇奇怪怪的文字,不管是英文、中文或其他文字的。那最早人類是怎么去表示文字的呢?其實(shí)人類就用了一種其實(shí)到今天為止依然很常用的一種方法——WordNet。這個(gè)詞可能很多人沒聽說過,但是它的應(yīng)用卻非常實(shí)用——詞典。WordNet的想法說能不能使用同義詞或者反義詞來去解釋原單詞。其實(shí)這個(gè)過程會(huì)非常的復(fù)雜,而且同時(shí)也存在一些問題。例如解釋丈夫這個(gè)詞,就需要用很多周邊的詞來解釋,比如先生、老公、英語(yǔ)的話husband等等。但第一個(gè)問題是,人類的語(yǔ)言是在不斷進(jìn)化的,經(jīng)常會(huì)出現(xiàn)新的詞匯,比如網(wǎng)絡(luò)上的一些新鮮詞匯。那這些新鮮詞匯怎么給它放到這個(gè)同義詞的解釋當(dāng)中呢?這就需要人去做,就需要耗費(fèi)很大的勞動(dòng)力。因?yàn)椴⒉恢佬碌木W(wǎng)絡(luò)文化或者網(wǎng)絡(luò)用語(yǔ),它會(huì)產(chǎn)生在哪里,那做起來就會(huì)無從下手。并且還有非常高的延遲性,因?yàn)榭赡苄枰荛L(zhǎng)時(shí)間理解新的詞匯的意思,之后才能將它整理進(jìn)詞表中。另一個(gè)問題是這種方式其實(shí)就沒有辦法比較相似的程度是多少,但其實(shí)人們想要知道的其實(shí)不僅僅是相似不相似,而是到底有多相似或不相似。所以WordNet方法,它天生就有這樣的局限性。
后來人們又想到Onehot方法。Onehot方法其實(shí)是非常常用的一種方法,就是在今天,深度學(xué)習(xí)橫行,機(jī)器學(xué)習(xí)非常普及的情況下,其實(shí)Onehot方法也是依然在用的一種方法。Onehot方法其實(shí)就是假設(shè)有一個(gè)詞典,詞典里面包含了很多個(gè)單詞,為了解釋起來比較方便,下圖中假設(shè)詞典中只有5個(gè)詞——小學(xué)、中學(xué)、大學(xué)、碩士和博士。如何去表示這五個(gè)單詞呢?其實(shí)就用一種很簡(jiǎn)單的方式,小學(xué)給它編碼為1000,中學(xué)為0100,大學(xué)0010……五個(gè)不同編碼碼,分別來代表不同的含義。Onehot的本質(zhì)思想就是用不同的符號(hào)去表示不同的詞,這種方法其實(shí)被稱為離散型方法。其實(shí)Onehot也有它的問題。首先它無法表示相似詞,比如之前提到的老公、丈夫其實(shí)都是一個(gè)意思,但是Onehot會(huì)將它編成兩個(gè)不同的編碼,其實(shí)也無法計(jì)算相似度。另一個(gè)問題是維度爆炸。如果詞典中有1萬個(gè)詞,那么表示某一個(gè)詞就要用長(zhǎng)度1萬的向量來表示,這對(duì)于計(jì)算機(jī)來說非常浪費(fèi)存儲(chǔ)空間。

為了解決問題,人們又探索了別的方法。首先人們提出了分布式假設(shè),即如果兩個(gè)詞的上下文是相似的,那么這兩個(gè)詞也是相似的。
利用這種想法,表示方法又發(fā)生了改變——把一個(gè)單詞劃到一個(gè)向量的空間中,就是將它變成一個(gè)向量。詞義是比較相似的詞,就在向量空間中表示到很相近的位置上。下圖分別表示了二維和三維空間的表達(dá)示例。這種表達(dá)方式叫做分布式表達(dá)。


那么如何將詞投射到向量空間中呢?并且空間可以是任意維度的。第一種方法是NNLM,其實(shí)是利用一個(gè)神經(jīng)網(wǎng)絡(luò)。這個(gè)網(wǎng)絡(luò)很簡(jiǎn)單,只有三層,輸入層、隱藏層和輸出層。輸入層就是把文本用Onehot表示出來,然后給它塞到Embedding層里面去。第二層就是tanh函數(shù),第三層是softmax層。其實(shí)這個(gè)網(wǎng)絡(luò)的目的就是通過上文來預(yù)測(cè)下文。下面展示一下每一層的細(xì)節(jié)。

首先輸入層就是全鏈接層,來實(shí)現(xiàn)降維的目的。后面會(huì)展示代碼,只需一行就能實(shí)現(xiàn)這樣的功能。

隱藏層就只是tanh函數(shù),具體的函數(shù)公式以及圖像可以見上圖。這一層的目的在于增加非線性關(guān)系,讓模型擁有更強(qiáng)的學(xué)習(xí)能力。

輸出層也非常簡(jiǎn)單,就是softmax函數(shù)。softmax函數(shù)能把一個(gè)值轉(zhuǎn)化成一個(gè)概率的分布,這樣就可以得到下文可能出現(xiàn)的詞的概率。下面用代碼來具體實(shí)現(xiàn)。
3. 詞向量實(shí)戰(zhàn)
下圖用代碼展示了NNLM的實(shí)現(xiàn)。

下圖的部分展示了如何把一些單詞轉(zhuǎn)化為Onehot形式。


詞表是一個(gè)動(dòng)態(tài)大小的詞表,不同的數(shù)據(jù)就有不同的詞表大小。窗口大小是指到底用多少上文去預(yù)測(cè)一個(gè)下文,窗口大小是可以自己決定的,所以這是一個(gè)動(dòng)態(tài)的參數(shù)。圖中就是用了第一個(gè)句子的長(zhǎng)度減1。特征大小就是想得到的向量是多長(zhǎng)的,可以是兩維的、三維的、1000維的都是可以的。


這兩部分展示了模型的訓(xùn)練和模型的預(yù)測(cè)。
歡迎大家通過復(fù)現(xiàn)代碼實(shí)現(xiàn)具體的應(yīng)用,來幫助理解詞向量。