[非監督]Word Embedding

簡介

假設我們有5個類別,我們做one-hot-encoder變成5維的數據,我們可以用Word Embedding將資料分類,變成低於5維的數據。
機器在沒有監督的情況下閱讀大量文件來學習單詞的意義,一個詞可以通過其語境來理解。

  • 能用auto-encoder嗎?
    不容易,因為auto-encoder輸入的資料是word,且每個word是one-hot-encoding本身資料就都是independent,如果我們輸入是一整篇文章,將文章都轉成bag of word,然後文章有這個詞就為1作為輸入,auto-encoder我們可以找到文章的關聯性,但不能單獨分析出詞義。

Word Embedding兩種做法

  • Count based
    類似ALS的做法,Glove Vector,基於頻率去計算詞彙的相似度。

  • Prediction-based
    基於預測,有上下文關聯。
    我們先將詞彙都轉成one-hot-encoding,輸入一個詞彙進行預測下一個(上一個)可能出現詞彙的機率,輸入不同詞彙進行預測,他們的中間層z就可以作為詞彙的Vector。


    我們可以拓展成輸入前10個詞彙,預測下一個詞彙,前10個詞彙的one-hot-encoding串接再一起。

    但我們希望10個詞彙他們的weight是一樣的,這樣前10個詞彙串接順序就不影響預測結果,同時也降低了參數量,如果我們one-hot-encoding有10萬個詞彙,那麼串接10個詞彙參數的數量很驚人,這樣做不一定會影響詞義的判斷,雖然我們排除了順序,但在文章上我們只選定輸入前10個詞彙,不同詞在出現頻率上還是會有不同的。

變形

用前一個與後一個詞彙測中間那個詞彙,或中間預測前後詞彙。


CBOW、Skip-gram

進行類推

Word Embedding與PCA一樣都有類似的現象,因此我們可以輸入中國、日本、東京來類推中國首都。



實作

  • word2vec實作細節
    因為word2vec的輸入特徵為one hot encoder形式,是稀疏矩陣,若使用GPU進行矩陣實作運算會有維度爆炸(運算量過大)、顯存不足的問題,所以我們會使用查找的方式進行運算。
    如下圖batch=1、feature_num=5(15),要乘上hidden(53)降維到feature_num=3,若feature_num超過10000運算量非常龐大,但仔細看圖會發現其實只要輸入為只有0、1的矩陣,那麼矩陣做dot(內積)只是一個查找的動作,如下圖只是從input第四個column索引到hidden第四個row。
#範例
search_list = np.flatnonzero(input)
output = []
for index in search_list :
  output.append(hidden[:,index ])
output = np.array(output)
  • gensim:word2vec
    Github-gist代碼
    使用wiki百科xml頁面備份(使用gensim的WikiCorpus工具),去除xml標籤等等,整理出文章內容,安裝openccpip install opencc-python-reimplemented進行簡繁轉換,使用jieba進行中文分詞,jieba使用中文停用詞1893個,完成前處理。
    使用word2vec,SG=0(CBOW模式,1=skip-gram)、window=10(取前後10個詞)、size=280(最後降維到280維)、min_count=5(彙整單詞做one-hot-encoding時,小於5次的單詞不列入),儲存訓練好的model,以及詞典與它的詞向量。
    最後讀取model使用model.wv來取得詞向量。


參考李宏毅老師ML課程
推薦閱讀

你可能感兴趣的:([非監督]Word Embedding)