當前位置:
首頁 > 最新 > 用數據玩點花樣!如何構建skim-gram模型來訓練和可視化詞向量

用數據玩點花樣!如何構建skim-gram模型來訓練和可視化詞向量

選自Medium

作者:Priya Dwivedi

機器之心編譯

參與:柯一雄、路雪、蔣思源

本文介紹了如何在 TensorFlow 中實現 skim-gram 模型,並用 TensorBoard 進行可視化。

GitHub 地址:https://github.com/priya-dwivedi/Deep-Learning/blob/master/word2vec_skipgram/Skip-Grams-Solution.ipynb

本教程將展示如何在 TensorFlow 中實現 skim-gram 模型,以便為你正在處理的任意文本生成詞向量,然後用 TensorBoard 進行可視化。我發現這個練習 1)有助於理解 skim-gram 模型是的工作原理;2)在 CNN 或 RNN 中使用詞向量之前,先熟悉詞向量捕獲文本的關係。

我在 text8 數據集上訓練了一個 skim-gram 模型,該數據集是英文維基百科文章的集合。我用 TensorBoard 來可視化這些嵌入。TensorBoard 允許使用 PCA 選擇 3 主軸來投影數據,進而看到整個文字雲。超級酷!你可以輸入任何單詞,它會顯示相鄰的單詞。你也可以隔離最靠近它的 101 個點。

看看下面的片段。

完整代碼:https://github.com/priya-dwivedi/Deep-Learning/blob/master/word2vec_skipgram/Skip-Grams-Solution.ipynb

為了可視化訓練過程,我還持續跟蹤一組隨機單詞在模型中最靠近的預測單詞。在第一次迭代中,最接近的預測單詞看起來非常隨機。這很合理,因為所有詞向量都是隨機初始化的。

訓練結束時,該模型已經能更好地找到單詞之間的關係。

Word2Vec 和 Skip-Gram 模型

創建詞向量是基於大型文本語料庫,為每個單詞創建向量的過程,且語料庫中語境相似的單詞所對應的向量在向量空間中非常接近。

這些詞向量可以很好地捕捉單詞之間的上下文關係(例如,黑色、白色和紅色的示例向量會緊密地結合在一起),而且使用這些向量(而不是單詞本身)來完成文本分類或新文本生成等自然語言處理(NPL)任務,會得到更好的結果。

有兩個主要的模型來生成這些詞向量——連續詞袋(CBOW)和 Skip-Gram 模型。CBOW 模型試圖根據給定語境詞預測中心詞,而 skip-gram 模型試圖根據給定中心詞預測語境詞。我們可以看一個簡化的例子:

CBOW: The cat ate _____. Fill in the blank, in this case, it"s「food」.

CBOW:這隻貓吃了________。(句子填充)本例中,應該填「食物」。

Skip-gram: ___ ___ ___ food. Complete the word"s context. In this case, it"s「The cat ate」

Skip-gram:_______________食物。(句子填充)本例中,可以填「這隻貓吃了」

如果你對這兩種方法的詳細對比感興趣,請參見此鏈接:https://iksinc.wordpress.com/tag/continuous-bag-of-words-cbow/。

大量論文發現,skip-gram 模型能產生更好的詞向量,所以我將重點放在實現這個模型上。

在 Tensorflow 中實現 Skip-Gram 模型

這裡我只列出構建模型的主要步驟。詳情請查看我的 GitHub repo。

1. 數據預處理

首先清理數據,刪除標點、數字,並將文本分割成單個單詞。比起單詞,程序能更好地處理整數,因此我們創建一個「辭彙轉整數」字典,將每個單詞映射到一個整數上。代碼如下:

2. 子採樣

經常出現的單詞,如「the」、「of」和「for」,並沒有給附近的單詞提供太多的語境。如果丟棄一些,我們就可以消除數據中的的部分雜訊,實現更快的訓練和更好的表示。這個過程被 Mikolov 稱為子採樣(subsampling)。

3. 創建輸入和目標

skip-gram 模型的輸入是每個單詞(編碼為整數),而目標是圍繞該窗口的單詞。Mikolov 等人發現,如果這個窗口的大小是可變的,同時更接近中心詞的單詞被採樣次數較多時,性能會更好。

「由於距離更遠的詞通常不如距離更近的詞與目標單詞的關係那麼緊密,我們從遠距離的詞中採樣較少的單詞作為訓練樣本,以降低其權重……如果選擇窗口大小= 5,那麼我們將為每一個訓練詞隨機選擇一個 1 和窗口大小 5 之間的數字 R,然後將目標單詞在句子中的前後 R 個單詞納入訓練,作為正確的標籤。」

4. 構建模型

下圖展示了我們將要構建網路的一般結構(圖片來源:http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/)。

我們把一個輸入詞如「ants」(螞蟻)表示為獨熱向量。這個向量有 10000 個分量(每個分量都對應於辭彙表中的一個單詞),我們將單詞「ants」對應的分量設為「1」,所有其他分量都為 0。網路的輸出也是一個單向量(也包含 10000 個分量)。

訓練結束時,隱藏層將會有經過訓練的詞向量。隱藏層的大小相當於向量中的維數。在上面的例子中,每個單詞都有一個長度為 300 的向量。

你可能已經注意到,skip-gram 神經網路包含大量的權重……在我們的例子中有 300 個特徵和包含 10000 個單詞的辭彙表,也就是說在隱藏層和輸出層都有 3 百萬個權重數!在大型數據集上進行這樣的訓練令人望而卻步,因此 word2vec 的作者引入了一些調整來使訓練變得可行。詳情請查看:http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/;Github 代碼:https://github.com/priya-dwivedi/Deep-Learning/blob/master/word2vec_skipgram/Skip-Grams-Solution.ipynb。

5. 用 TensorBoard 進行可視化

使用 TensorBoard 中的「嵌入投影機」可視化嵌入。要實現這個功能,你需要完成以下步驟:

在檢查點目錄的訓練結束時保存你的模型

創建一個 metadata.tsv 文件包含每個整數轉換回單詞的映射關係,這樣 TensorBoard 就會顯示單詞而不是整數。將這個 tsv 文件保存在同一個檢查點目錄中

運行這段代碼:

打開 TensorBoard,將其指向檢查點目錄

大功告成!

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

?------------------------------------------------


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

循環神經網路自動生成程序:谷歌大腦提出「優先順序隊列訓練」

TAG:機器之心 |