有誰可以解釋下word embedding?

最近在學nlp然後看到這個詞了wiki的英文解釋沒太理解,求中文的解釋。。


word embedding的意思是:給出一個文檔,文檔就是一個單詞序列比如 「A B A C B F G」, 希望對文檔中每個不同的單詞都得到一個對應的向量(往往是低維向量)表示。
比如,對於這樣的「A B A C B F G」的一個序列,也許我們最後能得到:A對應的向量為[0.1 0.6 -0.5],B對應的向量為[-0.2 0.9 0.7] (此處的數值只用於示意)

之所以希望把每個單詞變成一個向量,目的還是為了方便計算,比如「求單詞A的同義詞」,就可以通過「求與單詞A在cos距離下最相似的向量」來做到。

word embedding不是一個新的topic,很早就已經有人做了,比如bengio的paper「Neural probabilistic language models」,這其實還不算最早,更早的時候,Hinton就已經提出了distributed representation的概念「Learning distributed representations of concepts」(只不過不是用在word embedding上面) ,AAAI2015的時候問過Hinton怎麼看google的word2vec,他說自己20年前就已經搞過了,哈哈,估計指的就是這篇paper。

總之,常見的word embedding方法就是先從文本中為每個單詞構造一組features,然後對這組feature做distributed representations,哈哈,相比於傳統的distributed representations,區別就是多了一步(先從文檔中為每個單詞構造一組feature)。

既然word embedding是一個老的topic,為什麼會火呢?原因是Tomas Mikolov在Google的時候發的這兩篇paper:「Efficient Estimation of Word Representations in Vector Space」、「Distributed Representations of Words and Phrases and their Compositionality」。

這兩篇paper中提出了一個word2vec的工具包,裡面包含了幾種word embedding的方法,這些方法有兩個特點。一個特點是速度快,另一個特點是得到的embedding vectors具備analogy性質。analogy性質類似於「A-B=C-D」這樣的結構,舉例說明:「北京-中國 = 巴黎-法國」。Tomas Mikolov認為具備這樣的性質,則說明得到的embedding vectors性質非常好,能夠model到語義。

這兩篇paper是2013年的工作,至今(2015.8),這兩篇paper的引用量早已經超好幾百,足以看出其影響力很大。當然,word embedding的方案還有很多,常見的word embedding的方法有:
1. Distributed Representations of Words and Phrases and their Compositionality
2. Efficient Estimation of Word Representations in Vector Space
3. GloVe Global Vectors forWord Representation
4. Neural probabilistic language models
5. Natural language processing (almost) from scratch
6. Learning word embeddings efficiently with noise contrastive estimation
7. A scalable hierarchical distributed language model
8. Three new graphical models for statistical language modelling
9. Improving word representations via global context and multiple word prototypes

word2vec中的模型至今(2015.8)還是存在不少未解之謎,因此就有不少papers嘗試去解釋其中一些謎團,或者建立其與其他模型之間的聯繫,下面是paper list
1. Neural Word Embeddings as Implicit Matrix Factorization
2. Linguistic Regularities in Sparse and Explicit Word Representation
3. Random Walks on Context Spaces Towards an Explanation of the Mysteries of Semantic Word Embeddings
4. word2vec Explained Deriving Mikolov et al.』s Negative Sampling Word Embedding Method
5. Linking GloVe with word2vec
6. Word Embedding Revisited: A New Representation Learning and Explicit Matrix Factorization Perspective


題主問的是embedding的含義,樓上幾位的回答都是拿word embedding說了一通,也沒解釋出embedding的含義。我來說一下。
Embedding在數學上表示一個maping, f: X -&> Y, 也就是一個function,其中該函數是injective(就是我們所說的單射函數,每個Y只有唯一的X對應,反之亦然)和structure-preserving (結構保存,比如在X所屬的空間上X1 &< X2,那麼映射後在Y所屬空間上同理 Y1 &< Y2)。那麼對於word embedding,就是將單詞word映射到另外一個空間,其中這個映射具有injective和structure-preserving的特點。

通俗的翻譯可以認為是單詞嵌入,就是把X所屬空間的單詞映射為到Y空間的多維向量,那麼該多維向量相當於嵌入到Y所屬空間中,一個蘿蔔一個坑。

word embedding,就是找到一個映射或者函數,生成在一個新的空間上的表達,該表達就是word representation。

推廣開來,還有image embedding, video embedding, 都是一種將源數據映射到另外一個空間


(基於我之前做的一個slides編寫。slides完整版:https://sites.google.com/site/shaohua03/intro-word-embedding.pdf


詞嵌入最粗淺的理解

o 詞映射到低維連續向量(如圖)

cat: (-0.065, -0.035, 0.019,
-0.026, 0.085,…)

dog: (-0.019, -0.076, 0.044,
0.021,0.095,…)

table: (0.027, 0.013,
0.006, -0.023,
0.014, …)

o 相似詞映射到相似方向 -- 語義相似性被編碼了

o Cosine相似度衡量方向

詞嵌入可以做類比題
o v(「國王」) – v(「王后」) ≈ v(「男」) – v(「女」)
o v(「英國」) + v(「首都」) ≈ v(「倫敦」)
o 反映出語義空間中的線性關係
o詞嵌入編碼了語義空間中的線性關係, 向量的不同部分對應不同的語義
o 質疑:然而並沒有什麼x用?
o 兩個句子: A含「英國」,「首都」,不含「倫敦」;B含「倫敦」
o 所有詞的詞向量的和表示句子
o 兩個句子仍會比較相似

相似詞映射到相似方向:為什麼
o 基本假設:「相似」詞的鄰居詞分布類似
o 倒推:兩個詞鄰居詞分布類似 → 兩個詞語義相近
o 寵物
主人 餵食 蹭 喵
o 寵物
主人 餵食 咬 汪
o v(「貓」)≈v(「狗」)
o Apple: tree red growth design music company
engineering executive
o v(「apple」)≈v(「orange」), v(「apple」)≈v(「microsoft」)

詞嵌入的優點
傳統one-hot編碼:
「天氣」: (1,0,0…,0),「氣候」: (0,1,0,…0)
權力/的/遊戲:
(1,0,0,1,1,0,0, …)

冰/與/火/之/歌: (0,1,1,0,0,1,1,…)
o 維度高(幾千–幾萬維稀疏向量),數據稀疏
o 沒有編碼不同詞之間的語義相似性
o 難以做模糊匹配
詞嵌入:
o 維度低(100 – 500維), 連續向量,方便機器學習模型處理
o 無監督學習,容易獲得大語料
o 天然有聚類後的效果
o 一個向量可以編碼一詞多義 (歧義的問題需另外處理)
o 罕見詞也可以學到不錯的表示:「風姿綽約」 ≈
「漂亮」


Word2vec 簡介

o Mikolov 2013, Distributed
Representations of Words and Phrases and their Compositionality

o 使用最廣泛的詞嵌入方法

o 速度快,效果好,容易擴展

o 原因:簡單(Less is
more)

Word2vec 模型

o 回歸連結函數:

o P(w_k|w_i) propto exp(	ilde{v}_{w_k}^T v_{w_i} ) (分母是歸一化項,可暫時忽略)

o 	ilde{v}_{w_k}v_{w_i} 方向相似: 預測的 P(w_k|w_i)

方向不同: 預測的概率小

o w_k經常出現在w_i周圍,P(w_k|w_i) 大,驅使 	ilde{v}_{w_k}v_{w_i} 指向相似方向

o 	ilde{v}_{w_i}v_{w_i} 兩套詞向量,使用時只保留一套

o 沒有耗時的矩陣乘,只留一個softmax變換,所以效率高

o 優化用隨機梯度遞降,罕見詞不會主導優化目標

o 罕見詞的統計數據噪音(隨機性)很大;常用詞的統計數據比較穩定,偏差很小

o 與之相對,基於矩陣分解的演算法經常被罕見詞主導優化目標,導致overfit噪音


YJango的Word Embedding--介紹 - 知乎專欄

該篇主要是討論為什麼要做word embedding:

gitbook閱讀地址:Word Embedding介紹

目錄

  • 單詞表達
    • One hot representation
    • Distributed representation
  • Word embedding
    • 目的
      • 數據量角度
      • 神經網路分析
    • 訓練簡述

至於word embedding的詳細訓練方法在下一節描述。

單詞表達

先前在卷積神經網路的一節中,提到過圖片是如何在計算機中被表達的。 同樣的,單詞也需要用計算機可以理解的方式表達後,才可以進行接下來的操作。

One hot representation

程序中編碼單詞的一個方法是one hot encoding。

實例:有1000個辭彙量。排在第一個位置的代表英語中的冠詞"a",那麼這個"a"是用[1,0,0,0,0,...],只有第一個位置是1,其餘位置都是0的1000維度的向量表示,如下圖中的第一列所示。

也就是說,

在one hot representation編碼的每個單詞都是一個維度,彼此independent。

Distributed representation

然而每個單詞彼此無關這個特點明顯不符合我們的現實情況。我們知道大量的單詞都是有關。

語義:girl和woman雖然用在不同年齡上,但指的都是女性。

複數:word和words僅僅是複數和單數的差別。

時態:buy和bought表達的都是「買」,但發生的時間不同。

所以用one hot representation的編碼方式,上面的特性都沒有被考慮到。

我們更希望用諸如「語義」,「複數」,「時態」等維度去描述一個單詞。每一個維度不再是0或1,而是連續的實數,表示不同的程度。

目的

但是說到底,為什麼我們想要用Distributed representation的方式去表達一個單詞呢?

數據量角度

這需要再次記住我們的目的:

機器學習:從大量的個樣本 {{(x_i,y_i)^N_{i=1}}} 中,尋找可以較好預測未見過 x_{new} 所對應 y_{new} 的函數 f:x
ightarrow y

實例:在我們日常生活的學習中,大量的 {{(x_i,y_i)^N_{i=1}}} 就是歷年真題, x_i 是題目,而 y_i 是對應的正確答案。高考時將會遇到的 x_{new} 往往是我們沒見過的題目,希望可以通過做題訓練出來的解題方法 f:x
ightarrow y 來求解出正確的 y_{new}

如果可以見到所有的情況,那麼只需要記住所有的 x_i 所對應的 y_i 就可以完美預測。但正如高考無法見到所有類型的題一樣,我們無法見到所有的情況。這意味著,

機器學習需要從有限的例子中尋找到合理的 f

高考有兩個方向提高分數:

  • 方向一:訓練更多的數據:題海戰術。
  • 方向二:加入先驗知識:儘可能排除不必要的可能性。

問題的關鍵在於訓練所需要的數據量上。同理,如果我們用One hot representation去學習,那麼每一個單詞我們都需要實例數據去訓練,即便我們知道"Cat"和"Kitty"很多情況下可以被理解成一個意思。為什麼相同的東西卻需要分別用不同的數據進行學習?

神經網路分析

假設我們的辭彙只有4個,girl, woman, boy, man,下面就思考用兩種不同的表達方式會有什麼區別。

One hot representation

儘管我們知道他們彼此的關係,但是計算機並不知道。在神經網路的輸入層中,每個單詞都會被看作一個節點。 而我們知道訓練神經網路就是要學習每個連接線的權重。如果只看第一層的權重,下面的情況需要確定4*3個連接線的關係,因為每個維度都彼此獨立,girl的數據不會對其他單詞的訓練產生任何幫助,訓練所需要的數據量,基本就固定在那裡了。

Distributed representation

我們這裡手動的尋找這四個單詞之間的關係 f 。可以用兩個節點去表示四個單詞。每個節點取不同值時的意義如下表。 那麼girl就可以被編碼成向量[0,1],man可以被編碼成[1,1](第一個維度是gender,第二個維度是age)。

那麼這時再來看神經網路需要學習的連接線的權重就縮小到了2*3。同時,當送入girl為輸入的訓練數據時,因為它是由兩個節點編碼的。那麼與girl共享相同連接的其他輸入例子也可以被訓練到(如可以幫助到與其共享female的woman,和child的boy的訓練)。

Word embedding也就是要達到第二個神經網路所表示的結果,降低訓練所需要的數據量。

而上面的四個單詞可以被拆成2個節點的是由我們人工提供的先驗知識將原始的輸入空間經過 f (上圖中的黃色箭頭)投射到了另一個空間(維度更小),所以才能夠降低訓練所需要的數據量。 但是我們沒有辦法一直人工提供,機器學習的宗旨就是讓機器代替人力去發現pattern。

Word embedding就是要從數據中自動學習到輸入空間到Distributed representation空間的 映射f

訓練方法

問題來了,我們該如何自動尋找到類似上面的關係,將One hot representation轉變成Distributed representation。 我們事先並不明確目標是什麼,所以這是一個無監督學習任務。

無監督學習中常用思想是:當得到數據 {{(x_i,y_i)^N_{i=1}}} 後,我們又不知道目標(輸出)時,

  • 方向一:從各個輸入 {{x_i}^N_{i=1}} 之間的關係找目標。 如聚類。
  • 方向二:並接上以目標輸出 y_i 作為新輸入的另一個任務 g:y 
ightarrow z ,同時我們知道的對應 z_i 值。用數據 {{(x_i,z_i)^N_{i=1}}} 訓練得到 k:x 
ightarrow z ,也就是 z=g(f(x)) ,中間的表達 y=g(x) 則是我們真正想要的目標。如生成對抗網路。

Word embedding更偏向於方向二。 同樣是學習一個 k:x 
ightarrow z ,但訓練後並不使用 k ,而是只取前半部分的 f:x 
ightarrow y

到這裡,我們希望所尋找的 k:x 
ightarrow z 既有標籤 z_i ,又可以讓 f(x) 所轉換得到的 y 的表達具有Distributed representation中所演示的特點。

同時我們還知道,

單詞意思需要放在特定的上下文中去理解。

那麼具有相同上下文的單詞,往往是有聯繫的。

實例:那這兩個單詞都狗的品種名,而上下文的內容已經暗指了該單詞具有可愛,會舔人的特點。

  • 這個可愛的 泰迪 舔了我的臉。
  • 這個可愛的 金巴 舔了我的臉。

而從上面這個例子中我們就可以找到一個 k:x 
ightarrow z :預測上下文。

用輸入單詞 x 作為中心單詞去預測其他單詞 z 出現在其周邊的可能性。

我們既知道對應的 z 。而該任務 k 又可以讓 f(x) 所轉換得到的 y 的表達具有Distributed representation中所演示的特點。 因為我們讓相似的單詞(如泰迪和金巴)得到相同的輸出(上下文),那麼神經網路就會將泰迪的輸入 x金巴的輸入 x經過神經網路 f(x) 得到幾乎相同的和泰迪的輸出 y 金巴的輸出 y

用輸入單詞作為中心單詞去預測周邊單詞的方式叫做:Word2Vec The Skip-Gram Model。

用輸入單詞作為周邊單詞去預測中心單詞的方式叫做:Continuous Bag of Words (CBOW)。


竟然沒人提分散式假設(distributional hypothesis)。

總的來說,word embedding就是一個詞的低維向量表示(一般用的維度可以是幾十到幾千)。有了一個詞的向量之後,各種基於向量的計算就可以實施,如用向量之間的相似度來度量詞之間的語義相關性。其基於的分散式假設就是出現在相同上下文(context)下的詞意思應該相近所有學習word embedding的方法都是在用數學的方法建模詞和context之間的關係。

如何得到word embedding?主要分為兩種:基於矩陣分解和基於預測,可參見論文[1].

基於矩陣分解

  1. 首先基於語料庫構建word context共現矩陣M,矩陣中每個單元可以是二值的表示是否二者共現,也可以是經過處理後的,如共現頻率,共現的TF-IDF,共現的mutual information, point-wise mutual information和positive point-wise mutual information,還可以根據一些規則對單元值進行過濾(比如超過某個值後截斷, Stanford的Glove用的這種方式[2]),等等。很多可衡量二個對象之間關聯的指標都可以用來作為矩陣中每個單元的值。
  2. 得到矩陣之後,就可以進行矩陣分解,這裡的矩陣分解可以是SVD分解 [4];,也可以是直接分解成兩個子矩陣的形式,即M=AB [2]; 還可以是低秩矩陣分解。

基於矩陣分解(SVD)的方法我看到的最早的論文是1992年Schutze的文章[7].

這裡如果不進行矩陣分解(降維),也可以得到一個詞的向量表示(矩陣的行),只不過維度太高(詞典大小),不方便計算。

基於預測

這種方法就是所謂的基於神經網路的方法了。其核心思想就是先用向量代表各個詞,然後通過一個預測目標函數學習這些向量的參數。比如給定當前詞預測窗口範圍內的上下文詞;給定周圍幾個詞,預測中間這個詞;給定前邊幾個詞,預測下一個詞(語言模型)。比如Bengio 2000年在NIPS上提出的neural language model [7],給定前n給詞預測下一個詞出現的概率;Hinton 2007年提出的用Restricted Boltzmann Machine作為language model, Collobert提出用CNN預測上下文詞[8]。給定xx預測xxx的模型的輸入都是詞的向量,然後通過中間各種NN模型預測下一個詞的概率。通過優化目標函數,最後得到這些向量的值。

比如word2vec中直接用二者的向量表示的內積來表示二者之間的關聯,如下圖公式 [3] (這裡的向量是待學習的參數):

------------------------

基於矩陣分解和基於預測的模型之間有什麼關聯?Levy在文章[3]中證明了基於預測的SGNS (word2vec)和基於PMI的矩陣分解是等價的,二者差了一個常數。

各種各樣的上下文:

既然語料庫中的上下文可以反映一個詞的語義信息,那麼其他種類的上下文呢?於是各種各樣的上下文被提出來,如topic, 如knowledge base相關聯的詞或對象,一個詞的內部組成結構(部首,詞根詞綴,詞的定義詞, 多語言之間的一一對應的對象,句法樹中特定dependency的詞,和詞對應的圖片,和詞對應的音頻等等。所有這些信息都可以反應一個詞的語義信息,即semantic evidence。於是各種集成不同context的方法也被提出來了 multi-view, multi-modal, multi-source [5,6]。

1. Baroni, Marco, Georgiana Dinu, and Germán Kruszewski. 「Don』t Count, Predict! A Systematic Comparison of Context-Counting vs. Context-Predicting Semantic Vectors.」 In Proceedings of the 52nd Annual Meeting of the Association for Computational Linguistics (ACL), 238–247. Baltimore, MD, USA, 2014. http://anthology.aclweb.org/P/P14/P14-1023.pdf.

2.Pennington, Jeffrey, Richard Socher, and Christopher D. Manning. 「Glove: Global Vectors for Word Representation.」 In Proceedings of the Conference on Empirical Methods in Natural Language Processing (EMNLP), 1532--1543, 2014. http://nlp.stanford.edu/projects/glove/glove.pdf.

3. Levy, Omer, and Yoav Goldberg. 「Neural Word Embedding as Implicit Matrix Factorization.」 In Proceedings of NIPS, 2177–2185, 2014. http://papers.nips.cc/paper/5477-scalable-non-linear-learning-with-adaptive-polynomial-expansions.

4. Levy, Omer, Yoav Goldberg, and Ido Dagan. 「Improving Distributional Similarity with Lessons Learned from Word Embeddings.」 Transactions of the Association for Computational Linguistics 3 (2015): 211–225.

5. Faruqui, Manaal. 「Diverse Context for Learning Word Representations.」 Carnegie Mellon University, 2016. http://www.manaalfaruqui.com/.

6. Li, Yingming, Ming Yang, and Zhongfei Zhang. 「Multi-View Representation Learning: A Survey from Shallow Methods to Deep Methods.」 arXiv:1610.01206 [Cs], October 3, 2016. http://arxiv.org/abs/1610.01206.

7. Schutze, Hinrich. 「Dimensions of Meaning.」 In Proceedings of Supercomputing, 787–796. IEEE, 1992. http://ieeexplore.ieee.org/abstract/document/236684/.

8. Collobert, Ronan, and Jason Weston. 「A Unified Architecture for Natural Language Processing: Deep Neural Networks with Multitask Learning,」 160–67. ACM, 2008.


我覺得這是一篇很好的文章可以幫助理解word embedding:
Deep Learning, NLP, and Representations
http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/
如果不愛看英文的話,中文版也有:
深度學習、自然語言處理和表徵方法


你可以把word想成是一個多維空間的點。


基本概念:這是自然語言處理中的名詞,是將辭彙映射到實數向量的方法總稱。

內在思想:辭彙的意思,要根據上下文進行理解。

直觀理解:

  • 在一段話中,每個單詞是一個維度,而做了word embedding後,相當於降維。
  • 通俗的說是「抓重點」,例如:
    • 老王對老李說:「老李啊,今天天氣不錯啊。聽說你最近高升了,孩子還考上了重點大學,真是不錯啊,我都羨慕不來!我老姨的女兒的三舅姥生病了,最近手頭有點緊,你看,能不能寬裕我點兒?」(共80字,相當於80維)
    • 上面這段話十分冗長,那麼我們做一下word embedding,通過模型訓練,可以發現這段話包括了「評論天氣」,「誇獎對方」,「親戚生病」,「試圖借錢」幾個概念。進一步的,我們可以通過模型看出前三個概念相互之間沒什麼聯繫,而與第四個概念強相關,最後我們可以將這段話總結成兩個字,「借錢」
    • 事實上這個例子就說出了word embedding的優勢,通過降維,可以極大的提高NLP在句法分析和情緒分析方面的表現。

做word embedding的數學方法:

  • 神經網路
  • 辭彙共生矩陣(word co-occurrence matrix)
  • 隨機模型
  • 根據辭彙的語境進行顯示錶達

發展歷史:

  • 2000年 -- 開始發展
  • 2003年 -- 出現了相關係統敘述此方法的著作:"A Neural Probabilistic Language Model". doi:10.1007/3-540-33486-6_6.
  • 2009年 -- 高維數據的降維方法 Roweis, S. T., Saul, L. K. (2000). Nonlinear Dimensionality Reduction by Locally Linear Embedding. Science, 290(5500). Retrieved from http://science.sciencemag.org/content/290/5500/2323
  • 2013年 -- word2dec出現。這是由Tomas Mikolov帶領的谷歌團隊編寫的toolkit
  • 2017年 -- 機器可以學到語言中的深意(可能算不上重要進展,但至少是篇有意思的文章)。Caliskan-islam, A., Bryson, J. J., Narayanan, A. (2017). Semantics derived automatically from language corpora necessarily contain human biases. Science, 356(April), 183–186. http://doi.org/10.1126/science.aal4230

如有不妥,勞煩指正,共同進步。^_^


本質分析

從另外一個角度分析Word Embedding的本質,並以word2vec示例。

word2vec(一種Word Embedding方法)的網路主體是一種單隱層前饋神經網路,網路的輸入和輸出均為詞向量,其主要訓練的是圖中的紅圈部分。

圖1 Word Embedding方框圖

為方便解釋,將網路輸入層與隱藏層間的權重矩陣稱為Input Vector,將網路隱藏層與輸出層間的權重矩陣稱為Output Vector。Word Embedding的實際使用中,Input Vector被用於將輸入詞向量嵌入至新的詞向量空間,反映詞與詞之間的關係。

容易發現,Input Vector與Output Vector乘的結果近似為詞的co-occurence矩陣,所以網路學習的是cooccurence矩陣的分解。

圖2 co-occurence矩陣

根據上述分析可以比較直觀地發現問題,既然需要學習co-occurence矩陣的分解,為什麼不直接根據詞庫建立co-occurence矩陣然後分解呢,比如使用SVD? 這是因為SVD需要有一個明確的矩陣用於分解,但word2vec僅需輸入和輸出詞向量,即可學到映射關係。

如果不甚清楚或有興趣的可翻牆參考Xing Rong的演講

https://www.youtube.com/watch?v=D-ekE-Wlcdsamp;t=1522s


WordEmbedding是文本挖掘的內容。文本挖掘的根本任務是分析文本,當前對文本進行分析基本上就是在兩個層次:辭彙和文檔。(也有一些體系分為:辭彙、句子和文檔,其實句子也屬於文檔,俗稱「短文本」)。

因此,只要將辭彙和文檔進行數值化處理,就可以進行大部分的語言分析任務了。傳統的思路有兩種:

思路1: 直接對文檔進行數值化處理,分析時需要用到辭彙時,把辭彙視為特殊的文檔

思路2:先對辭彙進行數值化處理,然後再將文檔的分析問題轉化為對辭彙集合的分析問題

WordEmbedding主要指基於思路2的技術實現,即WordEmbedding主要用於對辭彙進行數值化處理。每個詞對應一個數,就可以進行文本比較分析了。當然,為了豐富一下辭彙的含義,可以把每個詞對應成一個向量。


突然發現PPAP原來是在講Embeddings啊……

你有個盆,把他插蘋果上,然後就固定了蘋果和盆在空間中的距離。


你有個盆,把他插鳳梨上,然後就固定了鳳梨和盆空間中的距離。


然後拿著這倆作對比,發現他們性質很相似,你發現可以通過固定這倆在空間中的相對距離的方法,判斷這倆物體的相似性。


難怪這麼火,原來PPAP是NLP科普啊!!!


word embedding 的中文解釋為 「詞嵌入」。 先用『one-hot encoding』來簡單的理解,one-hot encoding是一種編碼技術,假如有三個詞「麥克風」、「話筒」、「杯子」,用『one-hot encoding』技術編碼,三個詞對應的向量是[1, 0, 0], [0, 1, 0],[0, 0, 1]。但是現實是我們有成千上萬的詞語啊,這樣會造成每個詞向量含有很多0,也就是造成稀疏編碼的問題,所以我們需要降維。比如說,上面的三個詞語也可以這樣表示[0, 1], [0.4, 0.9],[1, 0],這樣就降低了一個維度。這裡要注意的是「賣麥克風」和「話筒」的意思很接近,所以它們對應的向量也很接近,即空間距離短,向量夾角小。"word embedding"大致也是這樣的功能,它是深度學習的一個附加產物,將詞語映射到空間向量,這就為詞語的表示提供了一個新思路,NLP的大門打開了。有很多word-embedding工具,谷歌的word2vec就很好,可以去用一下,會有更好的領悟。


我更通俗的解釋一下embedding 這個拓撲學的詞兒。
地圖就是對於現實地理的embedding,現實的地理地形的信息其實遠遠超過三維 但是地圖通過顏色和等高線等來最大化表現現實的地理信息。

詞的embedding也就是用固定的維度來最大化表現詞的信息


詞嵌入源於降維的「嵌入」,而降維的嵌入來自於保結構映射的「嵌入」,這是沿用數學術語,範疇論中也稱為「態射」,不能隨便換別的,何況「編碼」涵義顯然不足

南大周志華教授的微博:詞嵌入源於降維的「嵌入」,而降維的嵌入來自... 來自南大周志華


...我以為就是一種hash方式而已,比如上面提到的把 cat/kitten/etc. map到一個feature去(或者說一個vector的一維),然後就再折騰唄。。。居然可以講出這麼多道道來,牛!


維基百科中的Embedding解釋:Embedding - Wikipedia


Word representation

  1. one-hot
  2. distributed
    1. LSA
    2. word embedding

#!/usr/bin/env python # coding=utf-8 # File Name: cbow1.py # Author: Fang Pin # Mail: fangpin1993@hotmail.com # Created Time: 2016年08月12日 星期五 15時59分41秒

import tensorflow as tf
import numpy as np
import collections
import math

sentences = []
words = []
batch_size = 128
embedding_size = 128
learning_rate = 1.0
thread_hold = 2 # the frequence of word in vocabulary must greater than thread_hold
skip_window = 1
steps = 1000001

valid_size = 16 # Random set of words to evaluate similarity on.
valid_window = 100 # Only pick dev samples in the head of the distribution.
valid_examples = np.random.choice(valid_window, valid_size, replace=False)
num_sampled = 64 # Number of negative examples to sample. for line in open("data.txt","r"):
sentences.append(line)
for word in line.split():
words.append(word)

def build_dataset(words):
count_tmp = []
count_tmp.extend(collections.Counter(words).most_common())
count = [item for item in count_tmp if item[1]&>thread_hold]
dic={}
dic["UNK"] = 0 for word,_ in count:
dic[word] = len(dic)
reverse_dic = dict(zip(dic.values(),dic.keys()))
return dic,reverse_dic

dic, reverse_dic = build_dataset(words)
vocabulary_size = len(dic)
del words

sentences_index = 0
word_of_sentencs_index = 0

def generate_batch(batch_size=128, skip_window=1, dic=dic):
global sentences_index
global word_of_sentencs_index
features = np.ndarray([batch_size,2*skip_window],dtype=np.int32)
labels = np.ndarray([batch_size,1],dtype=np.int32)
for i in range(batch_size):
labels[i,0] = dic.get(sentences[sentences_index].split()[word_of_sentencs_index],0)
left_index = word_of_sentencs_index - skip_window
right_index = word_of_sentencs_index + skip_window
left = 0 right = 2*skip_window - 1 for j in range(skip_window):
if left_index &< 0: features[i,left] = 0 else: features[i,left] = dic.get(sentences[sentences_index].split()[left_index],0) left_index += 1 left += 1 if right_index &>= len(sentences[sentences_index].split()):
features[i,right] = 0 else:
features[i,right] = dic.get(sentences[sentences_index].split()[word_of_sentencs_index],0)
right_index -= 1 right -= 1
word_of_sentencs_index += 1 if word_of_sentencs_index == len(sentences[sentences_index].split()):
word_of_sentencs_index = 0
sentences_index = (sentences_index+1)%len(sentences)
return features,labels

print valid_examples

train_features = tf.placeholder(tf.int32,shape=[batch_size, skip_window * 2])
train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])
valid_dataset = tf.constant(valid_examples, dtype=tf.int32)

embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
embed = tf.nn.embedding_lookup(embeddings, train_features)
reduce_embed = tf.div(tf.reduce_sum(embed, 1), skip_window*2)

nce_weights = tf.Variable(tf.truncated_normal([vocabulary_size, embedding_size],stddev=1.0 / math.sqrt(embedding_size)))
nce_bias = tf.Variable(tf.zeros([vocabulary_size]))

loss = tf.reduce_mean(tf.nn.nce_loss(nce_weights, nce_bias, reduce_embed, train_labels,num_sampled, vocabulary_size))

train = tf.train.GradientDescentOptimizer(1.0).minimize(loss)

norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))
normalized_embeddings = embeddings / norm
valid_embeddings = tf.nn.embedding_lookup(normalized_embeddings, valid_dataset)
similarity = tf.matmul( valid_embeddings, normalized_embeddings, transpose_b=True)

init = tf.initialize_all_variables()

with tf.Session() as session:
init.run()
print("Initialized")

average_loss = 0 for step in xrange(100001):
batch_features, batch_labels = generate_batch()
feed_dict = {train_features : batch_features, train_labels : batch_labels}

_, loss_val = session.run([train, loss], feed_dict=feed_dict)
average_loss += loss_val

if step % 2000 == 0:
if step &> 0:
average_loss /= 2000.0
print "at step %d avg_loss average_loss %f"%(step, average_loss)
average_loss = 0 if step % 20000 == 0:
sim = similarity.eval()
for i in xrange(valid_size):
valid_word = reverse_dic[valid_examples[i]]
top_k = 8 # number of nearest neighbors
nearest = (-sim[i, :]).argsort()[1:top_k+1]
log_str = "Nearest to %s:" % valid_word
for k in xrange(top_k):
close_word = reverse_dic[nearest[k]]
log_str = "%s %s," % (log_str, close_word)
print log_str

實現代碼,,,


推薦閱讀:

深度學習應用在哪些領域讓你覺得「我去,這也能行!」?
如何評價季逸超、Peak Labs 和 Magi 搜索引擎?

TAG:機器學習 | 自然語言處理 | word embedding |