word2vec詳解與實戰

有那麼一句話算法

不懂word2vec,就別說本身是研究人工智能->機器學習->天然語言處理(NLP)->文本挖掘網絡

因此接下來我就從頭到尾的詳細講解一下word2vec這個東西。機器學習

###簡要介紹分佈式

先直接給出維基百科上最權威的解釋(你們英語水平夠格的話必定要充分理解這個最權威的解釋,比國內的某些長篇囉嗦解釋簡直不知道簡潔清楚多少倍!):函數

Word2vec is a group of related models that are used to produce word embeddings. These models are shallow, two-layer neural networks that are trained to reconstruct linguistic contexts of words. Word2vec takes as its input a large corpus of text and produces a vector space, typically of several hundred dimensions, with each unique word in the corpus being assigned a corresponding vector in the space. Word vectors are positioned in the vector space such that words that share common contexts in the corpus are located in close proximity to one another in the space.工具

下面說一說我對word2vec的簡要歸納:學習

  • 它是Google在2013年開源的一款用於詞向量計算的工具ui

  • word2vec能夠在百萬數量級的詞典和上億的數據集上進行高效地訓練人工智能

  • 該工具獲得的訓練結果——詞向量(word embedding),能夠很好地度量詞與詞之間的類似性spa

另外簡要列出人們容易對word2vec產生的兩大誤區:

  • 不少人誤覺得word2vec是一種深度學習算法,其實word2vec算法的背後是一個淺層神經網絡(正如維基百科所述:These models are shallow, two-layer neural networks)

  • word2vec是一個計算word vector的開源工具,當咱們在說word2vec算法或模型的時候,其實指的是其背後用於計算word vector的CBoW模型和Skip-gram模型。吹毛求疵一點的話,不少人覺得word2vec指的是一個算法或模型,其實也是一種謬誤。

那麼最重要的一點來了,word2vec實際中到底有啥用(外行人士每每最關注的問題!):

  • 能夠這麼說,NLP可以涉及到的應用均可以有word2vec的影子!由於word2vec訓練後的詞向量是NLP領域的最基礎的東西,咱們隨後能夠利用它訓練出的詞向量來進行類似度比較、分類、推薦等等。換句話說,word2vec在NLP領域裏的做用就比如在數學領域裏1+1=2的做用,其餘方法都是在此基礎上進一步實現的,因此你說它重不重要呢!固然NLP領域裏還有其餘訓練詞向量的方法,這裏先不做介紹了,不能跑題哈!感興趣的能夠自行搜索

###詞的向量化表示

用詞向量來表示詞的思想並非從word2vec出現纔開始的,很早以前就有大牛提出來了!主要有兩大方式,一種是傳統的one-hot representation,另外一種的改進高級的distributed represetation。

  • 獨熱表示(one-hot representation)

    它是最先最傳統的方式,它的基本思想是:詞向量維度大小爲整個詞彙表的大小(整個詞彙表中有多少個詞,詞向量就爲多少維),對於每一個具體的詞彙表中的詞,將對應的位置置爲1。這裏舉個例子方便理解,若整個詞彙表有5個詞(my name is zhang san), 那麼 my這個詞的向量化就表示爲(1,0,0,0,0),is這個詞的向量化表示爲(0,0,1,0,0),其餘以此類推,是否是很好理解!可是one-hot representation有兩大缺點:

    • 存在維度災難,即向量維度會隨着句子的詞數量(整個詞彙表大小)的增長而增長,咱們的詞彙表通常都很是大(百萬量級),那麼one-hot representation會將沒詞向量化爲百萬個0中的一個1,向量稀疏的有些使人髮指!

    • 存在詞彙鴻溝,即任意兩個詞之間沒有聯繫,one-hot representatio沒法表示出語義層面上詞彙之間的相關信息,這一點也是很是致命的!

  • 分佈式表示(distributed represetation)

    Distributed represetation 能夠解決one-hot represetation的缺點,它的基本思想是:經過訓練,將詞映射爲連續稠密的向量。這樣咱們不只能夠直接刻畫詞彙之間的類似性,還能夠創建一個從向量到機率的平滑函數模型,使得類似的詞向量能夠映射到相近的機率空間上。

    那麼如何將稀疏離散的one-hot詞向量映射爲稠密連續的distributional representation呢?

    <p>這裏稍微舉一個小例子:咱們能夠構造一個term-document矩陣$ A_: $,矩陣的行$ A_{i,:}$對應着詞典裏的一個word;矩陣的列$ A_{:,j} $對應着訓練語料裏的一篇文檔;矩陣裏的元素$ A_{ij} $表明着word $ w_i $在文檔$ D_j $中出現的次數(或頻率)。那麼,咱們就能夠根據上述特性利用下面兩個方法來提取向量:</p>

    • 提取行向量(該詞在各個文檔中的出現狀況)作爲該詞的語義向量

    • 提取列向量(該文檔中各個詞的出現狀況)做爲文檔的主題向量

    相似地,咱們還能夠構造一個word-context矩陣。這兩類矩陣的行向量所計算的類似度有着細微的差別:term-document矩陣會給常常出如今同一篇document裏的兩個word賦予更高的類似度;而word-context矩陣會給那些有着相同context(上下文)的兩個word賦予更高的類似度。後者相對於前者是一種更高階的類似度,因此應用更加普遍。

    不過此方法仍然存在數據稀疏、維度災難的問題,接下來就須要對矩陣進行降維了(常利用SVD奇異值分解),即將原始的稀疏矩陣分解爲兩個低秩矩陣乘積的形式,這個我會在以後和你們分享~

    有一個有趣的研究代表,訓練後的詞向量有以下性質:$$ \vec {King} - \vec {Man} + \vec {Woman} = \vec {Queen} $$相似這種的還有許多,多麼好的訓練結果啊!因此咱們一旦獲得詞向量,咱們能夠利用它進行不少有趣的研究。那麼這麼理想的訓練結果是怎麼訓練的呢,接下來就和你們分享兩種訓練模型~

###兩種原始訓練模型

在word2vec出現以前,就已經有用神經網絡來訓練詞向量的了。採用的方法通常是三層神經網絡,即輸入層、隱藏層、輸出層(softmax層),那麼他們的輸入和輸出是怎麼定義的呢?這就須要介紹CBOW和Skip-gram這兩種模型了。

這兩個模型都是直接以獲得詞向量爲目標的模型,它們獲取word embedding(Distributed representation)的方式是無監督的,只須要語料自己,而不須要任何標註信息,訓練時所使用的監督信息並不來自外部標註。但word2vec之因此引爆了DL(深度學習)在NLP(天然語言處理)中的應用更多是由於它在語義方面的一些優良性質,好比類似度方面和詞類比(word analogy)現象,便於神經網絡從它開始繼續去提取一些high level的東西,進而去完成複雜的任務。

CBOW(Continuous Bag-of-Words)

對於CBOW模型須要注意如下幾點:

  • 在CBOW模型中,目標詞是一個詞串中間的詞,其擁有的上下文(context)爲先後各n個詞(n爲設定的窗口大小)。

  • 在原始的CBOW模型中,任意一個詞將獲得兩個詞向量(word embedding):

    • 做爲中心詞的詞向量(輸出詞向量)

    • 做爲周圍詞的詞向量(輸入詞向量)

  • 詞表中每一個詞的詞向量都存在一個矩陣中,即每一個詞的詞向量存儲於兩個矩陣中(每一個詞有兩套詞向量)。輸入詞矩陣中,其每一列都是一個詞做爲周圍詞時的詞向量;輸出詞矩陣中,其每一行都是一個詞做爲中心詞時的詞向量。若想取出詞做爲周圍詞時的詞向量,只要知道詞在詞表中的編號便可,取出的操做至關於用輸入詞矩陣乘以詞的one-hot representation。

<center> <img src="https://images2018.cnblogs.com/blog/1386490/201805/1386490-20180506210426885-1566957967.png " width="40%" height="40%" /> </center>

CBOW模型的各層解釋(以窗口大小爲2爲例):

  1. 輸入層:4個節點,上下文共4個詞的one-hot represetation

  2. 輸入層到投影層的鏈接邊:輸入詞矩陣 (將中心詞的上下文由one-hot represetation 轉化爲詞向量word embbedding)

  3. 投影層:1個節點,上下文共4個詞的詞向量的平均值

    CBOW像詞袋模型(BoW)同樣拋棄了詞序信息,而後窗口在語料上滑動,就成了連續詞袋(Continuous Bag-of-Words)。丟掉詞序看起來不太好,不過這裏開個玩笑:「研表究明,漢字的序順並不定一能影閱響讀,事證明明瞭當你看這完句話以後才發字現都亂是的」。

  4. 投影層到輸出層的鏈接邊:輸出詞矩陣

  5. 輸出層(softmax層):n個節點(n爲整個詞彙表大小),每一個節點表明中心詞是該節點對應詞的機率(咱們訓練的目標是指望訓練樣本特定詞對應的softmax機率最大)

    CBOW模型沒有隱藏層,投影以後就用softmax()輸出目標詞是某個詞的機率,進而減小了計算時間

這樣表述相對清楚,將one-hot到word embedding那一步描述了出來。這裏的投影層並無作任何的非線性激活操做,直接就是Softmax層。換句話說,若是隻看投影層到輸出層的話,其實就是個Softmax迴歸模型,但標記信息是詞串中心詞,而不是外部標註。

Skip-gram

<center> <img src="https://images2018.cnblogs.com/blog/1386490/201805/1386490-20180506215552384-1686216703.png " width="40%" height="40%" /> </center>

Skip-gram模型就是將CBOW模型反過來,其它徹底同樣,這裏就再也不贅述嘞~

下面比較一下兩種模型的優缺點:

  • skip-gram比Cbow準確率高,能更好的處理生僻字(即出現頻率低的字)。由於在計算時,Cbow會將context word加起來,因此在遇到生僻詞時預測效果將會大大下降,而skip-gram則會預測生僻字的使用環境

  • Cbow比skip-gram訓練快

詞類似度(word analogy)

  • word analogy是一種有趣的現象,能夠做爲評估詞向量的質量的一項任務。

  • word analogy是指訓練出的word embedding能夠經過加減法操做,來對應某種關係。舉個例子$$ \vec {King} - \vec {Man} + \vec {Woman} = \vec {Queen} $$

  • word analogy現象不僅存在於語義類似,也存在於語法類似。

###兩種加速(改進)方法

上面和你們分享了原始的CBOW和Skip-gram模型,可是word2vec並非直接採用上述原始模型的,由於咱們通常的詞彙表都是百萬量級的,若是採用原始模型就意味着softmax層須要輸出這百萬量級詞彙的各個機率,不太現實啊!因此word2vec進行了以下兩種方法的改進。

  • 負採樣(Negative Sample)

  • 哈夫曼樹 (Hierarchical Softmax)

###word2vec與word embedding聯繫區別

相關文章
相關標籤/搜索