1. 程式人生 > >word2vec你可能不知道的祕密

word2vec你可能不知道的祕密

  1. 這裡並不是介紹word2vec的原理,因為原理介紹方面的資料網上多的是:推薦兩個我認為很有價值的

http://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf

http://www.cnblogs.com/peghoty/p/3857839.html

  1. 首先word2vec訓練結果的差異主要來自什麼因素?
    (1)語料影響最大:
    語料的場景,比如微博的語料和新聞語料訓練的結果差別很大。因為微博屬於個人發帖,比較隨意。而新聞比較官方正式,另外新聞句式相對複雜。經過訓練對比:微博這種短文,訓練的相似詞更多是同級別的相關詞。比如 深圳 相關的是 廣州 。而用新聞語料,訓練得到 深圳 相關的詞 更多是與 深圳 有關聯的詞,比如 深圳大學。
    實際發現在微博,違法色情的詞訓練的比較好,因為黑產用這種渠道來推廣;而在評論,罵人的詞訓練的比較好;在新聞,則是常見的正規的詞訓練的比較好。下面分別看一下‘評論 垃圾的相關詞’跟‘新聞 垃圾的相關詞’
    評論 垃圾 的相關詞

    在這裡插入圖片描述
    為何差別那麼大呢?
    因為word2vec的原理就是一個詞預測 前後詞 或者 前後詞 預測 當前詞,使得概率最大化。這就導致如下兩個結果:
    一、相似的句子,相同部位的詞 會相似。
    比如 句子1 w1 w2 w3 w4 X w5 w6 w7.
    句子2 w1 w2 w3 w5 Y w5 w6 w7.
    因為 X 的向量 受 w1 w2 w3 w4 w5 w6 w7 向量影響決定, Y也是受這幾個詞影響決定。
    所以 X Y 是相似的。
    二、挨著近的詞,也是相似的。
    比如 句子 w1 w2 w3 w4 X Y w5 w6 w7.
    這樣 X Y 都是受到 來自 w1 w2 w3 w4 w5 w6 w7 向量影響決定。
    所以X Y是相似的。
    所以,微博和新聞的句子的整體分佈是不一樣的。 這裡影響 結論一。
    其次,新聞長文多,句式複雜,微博短文多,這裡影響結論二。
    (2)演算法引數的影響。
    演算法引數對總體效果影響不大。相對來說,比較重要的引數有以下:
    一、子取樣(subsampling)
    子取樣越低,對高頻詞越不利,對低頻詞有利。可以這麼理解,本來高頻詞 詞被迭代50次,低頻詞迭代10次,如果取樣頻率降低一半,高頻詞失去了25次迭代,而低頻詞只失去了5次。一般設定成le-5。個人覺得,子取樣有類似tf-idf的功能,降低高頻詞對上下文影響的權重。
    二、語言模型
    skip-gram 和cbow,之前有對比,切詞效果偏重各不相同。
    從效果來看,感覺cbow對詞頻低的詞更有利。這是因為 cbow是基於周圍詞來預測某個詞,雖然這個詞詞頻低,但是他是基於 周圍詞訓練的基礎上,通過演算法來得到這個詞的向量。通過周圍詞的影響,周圍詞訓練的充分,這個詞就會收益。
    三、視窗大小
    視窗大小影響 詞 和前後多少個詞的關係,和語料中語句長度有關,建議可以統計一下語料中,句子長度的分佈,再來設定window大小。一般設定成8。
    四、min-count
    最小詞頻訓練閥值,這個根據訓練語料大小設定,只有詞頻超過這個閥值的詞才能被訓練。
    根據經驗,如果切詞效果不好,會切錯一些詞,比如 “在深圳”,畢竟切錯的是少數情況,使得這種錯詞詞頻不高,可以通過設定相對大一點的 min-count 過濾掉切錯的詞。
    五、向量維度
    如果詞量大,訓練得到的詞向量還要做語義層面的疊加,比如 句子 的向量表示 用 詞的向量疊加,為了有區分度,語義空間應該要設定大一些,所以維度要偏大。一般 情況下200維足夠用。
    六、其他引數
    比如學習率 可以根據需要調。
    (3)word2vec 影響速度的因素有哪些?
    一、語言模型:cbow 比skip-gram 更快
    為什麼 cbow更快,很重要的一個原因,cbow是基於周圍詞來預測這個單詞本身 。而skip-gram是基於本身詞去預測周圍詞。 那麼,cbow只要 把視窗內的其他詞相加一次作為輸入來預測 一個單詞。不管視窗多大,只需要一次運算。而skip-gram直接受視窗影響,視窗越大,需要預測的周圍詞越多。在訓練中,通過調整視窗大小明顯感覺到訓練速度受到很大影響。
    二、迭代次數
    影響訓練次數,語料不夠的情況下,可以調大迭代次數。spark 版本有bug,迭代次數超過1,訓練得到的詞向量維度值超大。
    三、執行緒數
    單機版(google word2vec)可以通過設定多執行緒跑,叢集版(spark mllib)可以設定多個 partitions.但是從經驗來看,在叢集上設定partitions 過多,會影響訓練的效果。
    四、其他引數
    取樣頻率 影響詞的訓練頻率
    min-count 最小詞頻 影響 訓練詞的數量
    Window大小 影響 skip-gram 的 預測次數。
    向量維度 維度決定了訓練過程中計算的維度
    (4)怎樣評估word2vec訓練的好壞?
    一、詞聚類
    可以採用 kmeans 聚類,看聚類簇的分佈
    二、詞cos 相關性
    查詢cos相近的詞
    三、Analogy對比
    a:b 與 c:d的cos距離 (man-king woman-queen )
    四、使用tnse,pca等降維視覺化展示
    詞的分佈,推薦用google的tensorboard,可以多視角檢視,如果不想搭建服務,直接訪問這裡

http://projector.tensorflow.org

另外可以用python的matplotlib。
五、Categorization 分類 看詞在每個分類中的概率
詞動物食物汽車電子橘子0.110.680.120.11鳥0.660.110.130.11雅閣0.140.230.670.11蘋果0.110.650.110.65
前三條來自官網的評測方法
網上也有相關的word embedding 的評估方法,可以參考這裡

http://www.aclweb.org/anthology/D15-1036

資源

word2vec :https://github.com/zhyq/word2vec-google


spark mllib word2vec訓練,轉換成google word vector形式:https://github.com/zhyq/word2vec-spark

word2vec效果展示:

在這裡插入圖片描述

Remark:

1、目前word embedding的工具有 fasttext,glove ,word2vec,elmo等,前三者對比效果差不多,關鍵在語料構建上面下功夫。elmo這個是基於監督的。
2、spark 版本有bug,迭代次數超過1,訓練得到的詞向量維度值超大。推薦用gensim,挺好用的,用spark算的話,一般語料很大了,沒有迭代也沒關係。
3、思考一個提問:word2vec可以用來做特徵選擇,相比於傳統的特徵選擇方法能夠增加語義理解。很多文章裡面的解決方法是將低頻詞通過word2vec 對映到高頻詞去。那麼是否是先用tfidf來將詞的權重算出來,然後得到高頻和低頻詞,這個時候再使用word2vec模型的相似度計算來把低頻詞轉化成高頻詞,達到降維的效果呢?