在本章中由于篇幅較長,特意將6.2分為上下兩部分。
PS: 找到一些資料https://www.zhihu.com/question/32275069
本節會實現用于學習word Embeddings 的模型,Word Embeddings很有力地表示NLP任務的單詞。由于在大型的文本語料庫上運行的時候,方法變得有效,所以word vector embeddings的話題近期受到歡迎。雖然暫時不使用RNN去完成這個任務,但是會將在后期的任務中依靠這部分。如果您熟悉word2vec這樣的詞向量和工具的概念,對自己實現它并不感興趣,可以隨時跳到下一節。
為什么要用向量表達單詞呢?把單詞送入學習系統的最直接的方法(straight-forward way to feed)就是使用one-hot編碼(單編碼)。也就是說,在一個大小和詞匯量一樣的向量里面,除了該單詞的位置置為1以外,其他的所有元素都是0. 這種方法有兩個問題:首先,在實際的應用中,由于自然語言中會有很多不同的單詞,所以向量會非常的長。其次,one-hot的表示方法無法提供單詞與單詞之間的任何語義相關性。
長久以來,共同表達詞匯的思想作為語義相關性的一種解決方案已經存在很長時間了。簡單的說來就是:運行了大量的文本,對于每個單詞計算出距離周圍單詞的距離,比如說是周圍5個單詞的距離,然后用附近的單詞的標準化計數表示每個單詞。然后用附近的單詞的標準化計數表示每個單詞。這種思想的背后的依據是在相似的上下文中使用的詞匯,其語義也是相似的。隨后,我們可以通過使用PCA或類似的方法來獲得更密集的表示,將發生向量壓縮到更少的維度。雖然這種方法表現的效果很好,但是需要跟蹤所有的共現(這里),這是我們詞匯量的一個方形矩陣。(這句話翻譯的不是太準確,貼上原文:While this approach leads to quite good performance, it requires us to keep track of the whole cooccurrence that is a square matrix of the size of our vocabulary.)
在2013年,Mikolov等人相處了一種既切實可行又高效的方式去計算上下文中的單詞表達。這篇文章是Mikolov, Tomas, et al. “Efficient estimation of word representations in vector space.” arXiv preprint arXiv:1301.3781 (2013)。文中使用的skip-game model 隨機的初始化表達,該模型用一個簡單的分類器去預測當前單詞上下文單詞。通過分類器權重和詞表示來傳播錯誤,并調整兩者以減少預測誤差。目前已經發現在大興的語料庫上訓練該模型可以使得表示向量近似于壓縮的共發向量。我們現在就來介紹如何在tensorflow上實現skip-gram 模型。