自然語言處理之word2vec


  在word2vec出現之前,自然語言處理經常把字詞轉為one-hot編碼類型的詞向量,這種方式雖然非常簡單易懂,但是數據稀疏性非常高,維度很多,很容易造成維度災難,尤其是在深度學習中;其次這種詞向量中任意兩個詞之間都是孤立的,存在語義鴻溝(這樣就不能體現詞與詞之間的關系)而有Hinton大神提出的Distributional Representation 很好的解決了one-hot編碼的主要缺點。解決了語義之間的鴻溝,可以通過計算向量之間的距離來體現詞與詞之間的關系。Distributional Representation 詞向量是密集的。word2vec是一個用來訓練Distributional Representation 類型的詞向量的一種工具。

1、CBOW與Skip-Gram模型

  word2vec模型其實就是簡單化的神經網絡,主要包含兩種詞訓練模型:CBOW模型和Skip-gram模型。模型的結構圖如下(注意:這里只是模型結構,並不是神經網絡的結構)

  

  CBOW模型根據中心詞W(t) 周圍的詞來預測中心詞;Skip-gram模型則根據中心詞W(t) 來預測周圍的詞。

  1)CBOW模型的第一層是輸入層,輸入的值是周圍每個詞的one-hot編碼形式,隱藏層只是對輸出值做了權值加法,沒有激活函數進行非線性的轉換,輸出值的維度和輸入值的維度是一致的。

  2)Skip-gram模型的第一層是輸入層,輸入值是中心詞的one-hot編碼形式,隱藏層只是做線性轉換,輸出的是輸出值的softmax轉換后的概率。

  神經網絡結構如下

  

  神經網絡的訓練是有監督的學習,因此要給定輸入值和輸出值來訓練神經網絡,而我們最終要獲得的是隱藏層的權重矩陣。因為隱藏層的輸出事實上是每個輸入單詞的 “嵌入詞向量”。我們來看個圖

  

  上如中左邊的式子是輸入詞向量和隱藏層權重矩陣的乘積,在做這個乘法時是不會進行矩陣的運算的,而是直接通過輸入值中1的位置索引來尋找隱藏層中的權重矩陣中對應的索引的行。

  詞向量的兩個優點:

    1)降低輸入的維度。詞向量的維度一般取100-200,對於大樣本時的one-hot向量甚至可能達到10000以上。

    2)增加語義信息。兩個語義相近的單詞的詞向量也是很相似的。

 

2、word2vec API講解

  在gensim中,word2vec 相關的API都在包gensim.models.word2vec中。和算法有關的參數都在類gensim.models.word2vec.Word2Vec中。算法需要注意的參數有:

    1) sentences:我們要分析的語料,可以是一個列表,或者從文件中遍歷讀出(word2vec.LineSentence(filename) )。

    2) size:詞向量的維度,默認值是100。這個維度的取值一般與我們的語料的大小相關,如果是不大的語料,比如小於100M的文本語料,則使用默認值一般就可以了。如果是超大的語料,建議增大維度。

    3) window:即詞向量上下文最大距離,window越大,則和某一詞較遠的詞也會產生上下文關系。默認值為5,在實際使用中,可以根據實際的需求來動態調整這個window的大小。

     如果是小語料則這個值可以設的更小。對於一般的語料這個值推薦在[5;10]之間。

    4) sg:即我們的word2vec兩個模型的選擇了。如果是0, 則是CBOW模型;是1則是Skip-Gram模型;默認是0即CBOW模型。

    5) hs:即我們的word2vec兩個解法的選擇了。如果是0, 則是Negative Sampling;是1的話並且負采樣個數negative大於0, 則是Hierarchical Softmax。默認是0即Negative Sampling。

    6) negative:即使用Negative Sampling時負采樣的個數,默認是5。推薦在[3,10]之間。這個參數在我們的算法原理篇中標記為neg。

    7) cbow_mean:僅用於CBOW在做投影的時候,為0,則算法中的xw為上下文的詞向量之和,為1則為上下文的詞向量的平均值。在我們的原理篇中,是按照詞向量的平均值來描述的。個人比較喜歡用平均值來表示xw,默認值也是1,不推薦修改默認值。

    8) min_count:需要計算詞向量的最小詞頻。這個值可以去掉一些很生僻的低頻詞,默認是5。如果是小語料,可以調低這個值。

    9) iter:隨機梯度下降法中迭代的最大次數,默認是5。對於大語料,可以增大這個值。

    10) alpha:在隨機梯度下降法中迭代的初始步長。算法原理篇中標記為η,默認是0.025。

    11) min_alpha: 由於算法支持在迭代的過程中逐漸減小步長,min_alpha給出了最小的迭代步長值。隨機梯度下降中每輪的迭代步長可以由iter,alpha, min_alpha一起得出。這部分由於不是word2vec算法的核心內容,因此在原理篇我們沒有提到。

          對於大語料,需要對alpha, min_alpha,iter一起調參,來選擇合適的三個值。

  word2vec是可以進行增量式訓練的,因此可以實現一:在輸入輸入值時可以將數據用生成器的形式導入到模型中;二:可以將數據一個磁盤中讀取出來,然后訓練完保存模型;之后加載模型再從其他的磁盤上讀取數據進行模型的訓練。初始化模型的相似度之后,模型就無法再進行增量式訓練了,相當於鎖定模型了。

 

3、三個最常見的應用

  當訓練完模型之后,我們就可以用模型來處理一些常見的問題了,主要包括以下三個方面:

  1)找出某一個詞向量最相近的集合

    model.wv.similar_by_word()

    從這里可以衍生出去尋找相似的句子,比如“北京下雨了”,可以先進行分詞為{“北京”,“下雨了”},然后找出每個詞的前5或者前10個相似的詞,比如”北京“的前五個相似詞是

      {“上海”, “天津",”重慶“,”深圳“,”廣州“}

    "下雨了"的前五個相似詞是

      {”下雪了“,”刮風了“,”天晴了“,”陰天了“,”來台風了“}

    然后將這兩個集合隨意組合,可以得到25組不同的組合,然后找到這25組中發生概率最大的句子輸出。

  2)查看兩個詞向量的相近程度

    model.wv.similarity()

    比如查看"北京"和”上海“之間的相似度

  3)找出一組集合中不同的類別

    model.wv.doesnt_match()

    比如找出集合{“上海”, “天津",”重慶“,”深圳“,”北京“}中不同的類別,可能會輸出”深圳“,當然也可能輸出其他的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM