神經網路嵌入詳解
深度學習在諸多方面,如影象分割、時序預測和自然語言處理,都優於其他機器學習方法。嵌入(embedding),即用連續向量表示離散變數的方法,在其中起到了不可或缺的作用。像 ofollow,noindex" target="_blank">機器翻譯 中的詞嵌入和 分類變數中的實體嵌入 ,都是嵌入的成功應用。
本文將圍繞什麼是神經網路嵌入、為什麼要使用神經網路嵌入以及神經網路嵌入如何學習這三方面進行詳細地講解。相關概念已在 之前的工作 ——將Wikipedia中所有圖書轉變為向量並構建圖書推薦系統中進行了詳細講解。
Neural Network Embedding of all books on Wikipedia. ( From Jupyter Notebook on GitHub ).
嵌入(Embeddings)
在神經網路中, 嵌入 後的資料維度較低,它能將離散的序列對映為連續的向量。
神經網路嵌入的主要用途有三種:
- 在嵌入空間中找到最近鄰。
- 作為有監督的機器學習模型的輸入。
- 挖掘變數間的關係。
利用神經網路嵌入,我們能將Wikipedia中的37000多本書轉換為至多包含50個數值的向量。
神經網路嵌入還克服了獨熱編碼的侷限性。
獨熱編碼(One-Hot Encoding)的侷限性
獨熱編碼用於處理類別變數的最簡單的嵌入方法,能夠將不同的類別對映為不同的向量。獨熱編碼保證了每一個取值只會使得一種狀態處於“啟用態”,也就是說這N種狀態中只有一個狀態位值為1,其他狀態位都是0。
獨熱編碼有兩大缺陷:
- 當類別的數量很多時,特徵空間會變得非常大。對映後的向量容易產生維數災難。
- “相似”的類別對映在嵌入空間後並不相鄰。
第一個問題很容易理解:多一個類別,在進行獨熱編碼的時候就會多一維向量。Wikipedia中共包含37000本書,對於每本書來說,向量的維度都為37000,這將無法對任何機器學習模型進行訓練。
第二個問題同樣帶來了很大的侷限性:獨熱編碼並沒有讓相似的類別在嵌入空間中相鄰。在進行獨熱編碼後,利用餘弦相似度計算出的向量間的相似度均為0。
也就是說,如果使用獨熱編碼,電影《戰爭與和平》和《安娜卡列尼娜》之間的相似性並不會比《戰爭與和平》和《銀河系漫遊指南》相似性強,但這與實際不符。
考慮到上述侷限性,在類別變數不多的情況下,可優先考慮獨熱編碼。
為了更好的處理類別變數,我們將使用嵌入神經網路和有監督的方法來學習嵌入。
學習嵌入(Learning Embeddings)
獨熱編碼的主要問題是轉換不受任何監督。通過在有監督的任務中使用神經網路學習嵌入,可以大大提高嵌入能力。 權重 是學習嵌入過程中的重要引數,起調節作用以最小化損失函式。
舉個例子,在電影評論中收集到50000個單詞,每一個單詞我們都可以使用100維的向量對其進行表示,進而使用嵌入神經網路對其進行訓練以獲取評論的情感傾向。如“brilliant”或“excellent”均與“positive”評價有很強的關聯,在嵌入空間的位置便會更為鄰近。
Movie Sentiment Word Embeddings ( source )
在上述圖書推薦的示例中,有監督的任務可以是“確定一本書是否由列夫托爾斯泰撰寫”,在嵌入空間上,托爾斯泰所寫的書彼此更為鄰近。嵌入中最為棘手的問題是:如何建立有監督的任務模型並得出通用單詞或句子的表徵。
實現(Implementation)
在Wikipedia圖書推薦專案中,有監督的學習任務是:預測某個Wikipedia頁面的連結是否出現在一本書的某一章節中。輸入成對的訓練示例,格式為(book title,link),其中的匹配有positive-true以及negative-false兩種形式。初始化設定基於這樣的假設:連結到相似的Wikipedia頁面的兩本書也是相似的,並且相似的書目在向量空間上更為鄰近。
我們使用包含兩個並行嵌入層的神經網路,它能夠將書和wikilink對映為50維向量,還有一個點積層,將嵌入結果整合為單個數字以實現預測。
部分程式碼如下:
# Both inputs are 1-dimensional book = Input(name = 'book', shape = [1]) link = Input(name = 'link', shape = [1]) # Embedding the book (shape will be (None, 1, 50)) book_embedding = Embedding(name = 'book_embedding', input_dim = len(book_index), output_dim = embedding_size)(book) # Embedding the link (shape will be (None, 1, 50)) link_embedding = Embedding(name = 'link_embedding', input_dim = len(link_index), output_dim = embedding_size)(link) # Merge the layers with a dot product along the second axis (shape will be (None, 1, 1)) merged = Dot(name = 'dot_product', normalize = True, axes = 2)([book_embedding, link_embedding]) # Reshape to be a single number (shape will be (None, 1)) merged = Reshape(target_shape = [1])(merged) # Output neuron out = Dense(1, activation = 'sigmoid')(merged) model = Model(inputs = [book, link], outputs = out) # Minimize binary cross entropy model.compile(optimizer = 'Adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
儘管有監督的機器學習任務的目的在於訓練模型後能運用於新的資料集,在本文的嵌入模型中,這些預測只是達到目的的一種手段。我們想要的是那些能夠將書本和連結轉化為連續向量的權重。
嵌入本身並不是那麼有趣,它們只是一些向量:
對於這個專案,我們探究的是如何根據最近鄰推薦書籍。為了計算相似度,我們選擇一本書,計算它與所有書目的點積。(如果我們的嵌入是標準化的,點積為向量之間的 餘弦距離 從-1,即最不相似,到+1,即最相似。此外還可以使用歐幾里德距離來測量相似度)。
下圖是我所構建的圖書推薦系統的結果:
下圖為圖書降低維度後的結果:
Embedding Books with Closest Neighbors
Wikipedia上的每一本書都能用50位數字進行表示,相似圖書彼此之間更接近。
嵌入視覺化(Embedding Visualizations)
嵌入的優點是可以將所學到的嵌入進行視覺化,以顯示哪些類別是相似的。將這些權重的維度降低為 2-D 或 3-D。然後,在散點圖上視覺化這些點,以檢視它們在空間中的分離情況。目前最流行的降維方法是——t-Distributed Stochastic Neighbor Embedding (TSNE)。
我們將37000維的圖書通過神經網路嵌入對映為50維,接著使用TSNE將維數將至為2。
Embedding of all 37,000 books on Wikipedia
TSNE是一種流形學習方法,用來降低高維資料的維度,進而對資料視覺化,瞭解資料的分佈,發現可能存在的規律。除了TSNE, UMAP(Uniform Manifold Approximation and Projection) 也是目前較為流行的降維方法。
下圖展示了降維後圖書在向量空間中的分佈情況:
通過顏色對書本型別進行區分,可以快速的找出相似流派的書籍。
Wikipedia圖書推薦的示例說明了神經網路嵌入的價值:能夠以低維向量的形式表示分類物件,並且在嵌入空間中相似的實體彼此相鄰。
互動式視覺化(Interactive Visualizations)
剛才所展示的圖片均為靜態效果,為了更好的檢視變數之間的關係,點選 此處 以獲取動態效果。
總結
神經網路嵌入能夠將離散的資料表示為連續的低維向量,克服了傳統編碼方法的侷限性,能查詢最近鄰,作為另一個模型的輸入以及進行視覺化,是處理離散變數的有效工具,也是深度學習的有效應用。
以上為譯文
本文由阿里云云棲社群組織翻譯。
文章原標題《Neural Network Embeddings Explained》,作者: William Koehrsen ,譯者:Elaine,審校:袁虎。
文章為簡譯,更為詳細的內容,請檢視 原文