10.02 神經網絡嵌入解釋

近年來,從圖像分割到自然語言處理再到時間序列預測,神經網絡的應用已經顯著擴展。深度學習的一個顯著成功的用途是嵌入,一種用於將離散變量表示為連續向量的方法。該技術已經發現了用於機器翻譯的單詞嵌入和用於分類變量的實體嵌入的實際應用。

在本文中,我將解釋什麼是神經網絡嵌入,我們為什麼要使用它們,以及如何學習它們。我們將在我正在研究的一個真正的問題的背景下審視這些概念:將維基百科上的所有書籍都表示為向量來創建書籍推薦系統。

神經網絡嵌入解釋

維基百科上所有書籍的神經網絡嵌入

嵌入(Embeddings)

嵌入是discrete — categorical — variable到連續數向量的映射。 在神經網絡中,嵌入是離散變量的低維連續向量表示。在神經網絡中,嵌入是離散變量的低維連續向量表示。神經網絡嵌入是有用的,因為它可以降低分類變量的維數,並在變換後的空間中有意義地表示類別。

神經網絡嵌入有三個主要目的:

  • 在嵌入空間中查找最近鄰。這些可用於根據用戶興趣或群集類別提出建議。
  • 作為監督任務的機器學習模型的輸入。
  • 用於可視化概念和類別之間的關係。

這意味著就書籍項目而言,使用神經網絡嵌入,我們可以在維基百科上獲取所有37,000本書籍文章,並在向量中僅使用50個數字來表示每一篇。此外,因為嵌入是學習的,所以在我們的學習問題的背景下更相似的書籍在嵌入空間中彼此更接近。

神經網絡嵌入克服了表示分類變量的常用方法的兩個侷限性:one-hot編碼。

one-hot編碼的侷限性

one-hot編碼分類變量的操作實際上是簡單的嵌入,其中每個類別被映射到不同的向量。這個過程包含了離散的實體並將每個觀察映射到0和1的矢量,表示特定的類別。

one-hot編碼技術有兩個主要缺點:

  • 對於高基數變量 - 具有許多唯一類別的變量 - 變換後的矢量的維數變得難以管理。
  • 映射完全不知情:“類似”類別在嵌入空間中不會彼此靠近。

第一個問題很容易理解:對於每一個額外的類別—被稱為實體—我們必須向one-hot編碼的向量添加另一個數字。如果我們在維基百科上有37000本書,那麼每本書都需要一個37000維的向量來表示,這就使得在這種表示上訓練任何機器學習模型都不可行。

第二個問題同樣具有侷限性:在向量空間中,one-hot編碼不會使相似的實體彼此更接近。如果我們使用餘弦距離度量向量之間的相似性,那麼在one-hot編碼之後,實體之間的每一次比較的相似性為0。

這意味著像《戰爭與和平》和《安娜·卡列尼娜》(都是列夫·托爾斯泰的經典著作)這樣的實體彼此之間的距離並不比《戰爭與和平》(War and Peace)和《銀河系漫遊指南》(Hitchhiker’s Guide to The Galaxy, if we use one-hot encoding)更接近。

Python代碼如下:

# One Hot Encoding Categoricals
books = ["War and Peace", "Anna Karenina",
"The Hitchhiker's Guide to the Galaxy"]
books_encoded = [[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]
Similarity (dot product) between First and Second = 0
Similarity (dot product) between Second and Third = 0
Similarity (dot product) between First and Third = 0

考慮到這兩個問題,表示類別變量的理想解決方案需要的數字將少於唯一類別的數量,並將相似類別放在彼此更接近的位置。Python代碼如下:

# Idealized Representation of Embedding
books = ["War and Peace", "Anna Karenina",
"The Hitchhiker's Guide to the Galaxy"]
books_encoded_ideal = [[0.53, 0.85],
[0.60, 0.80],
[-0.78, -0.62]]
Similarity (dot product) between First and Second = 0.99
Similarity (dot product) between Second and Third = -0.94
Similarity (dot product) between First and Third = -0.97

為了構建更好的分類實體表示,我們可以使用嵌入式神經網絡和監督任務來學習嵌入。

學習嵌入

one-hot編碼的主要問題是轉換不依賴於任何監督。通過在有監督的任務中使用神經網絡來學習嵌入,我們可以大大改進嵌入。嵌入形成網絡的參數—權重—這些參數被調整以使任務的損失最小化。產生的嵌入向量是類別的表示,在這些類別中,與任務相關的相似類別彼此更接近。

例如,如果我們在電影評論集合中使用了50,000個單詞的詞彙表,我們可以使用經過訓練的嵌入式神經網絡來學習每個單詞的100維嵌入,以預測評論的情感。詞彙中與正面評論相關聯的單詞(如“brilliant”或“excellent”)將在嵌入空間中更接近,因為網絡已經瞭解這些與正面評論相關聯。

神經網絡嵌入解釋

電影情感詞嵌入

在上面給出的書籍例子中,我們的監督任務可能是“確定一本書是否由Leo Tolstoy撰寫”,並且由此產生的嵌入將使托爾斯泰寫的書更接近彼此。弄清楚如何創建監督任務以產生相關表示是製作嵌入的最艱難的部分。

Python實現

在維基百科圖書項目(完整Python代碼:https://github.com/WillKoehrsen/wikipedia-data-science/blob/master/notebooks/Book%20Recommendation%20System.ipynb)中,監督學習任務被設置為預測某個維基百科頁面的鏈接是否出現在一本書的文章中。我們輸入成對的(書名,鏈接)訓練例子,混合了positive — true — and negative — false — pairs。這種設置是基於這樣一種假設,即鏈接到類似維基百科頁面的圖書彼此相似。因此,由此產生的嵌入應該將類似的書籍放在向量空間中更緊密地放在一起。

我使用的網絡有兩個平行的嵌入層,將書和wikilink映射到單獨的50維向量上,還有一個點積層,將嵌入的內容組合到一個數字中進行預測。嵌入是網絡的參數,或權重,在訓練過程中被調整,以最小化監督任務的損失。

在Keras代碼中,如下所示

# 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'])
神經網絡嵌入解釋

雖然在監督的機器學習任務中,目標通常是訓練模型來對新數據進行預測,但在此嵌入模型中,預測可能只是達到目的的手段。我們想要的是嵌入權重,書籍和鏈接的表示作為連續向量。

嵌入本身並不那麼有趣:它們只是數字的向量:

神經網絡嵌入解釋

書籍推薦嵌入模型的嵌入示例

但是,嵌入可用於前面列出的3個目的,對於此項目,我們主要感興趣的是根據最近鄰推薦書籍。為了計算相似性,我們採用查詢書並找到其向量與所有其他書籍之間的點積。(如果我們的嵌入被歸一化,這個點積是向量之間的餘弦距離,範圍從-1,最不相似,到+1,最相似。我們也可以使用歐幾里德距離來測量相似性)。

這是我構建的書籍嵌入模型的輸出:

神經網絡嵌入解釋

(矢量與其自身之間的餘弦相似度必須為1.0)。在減少一些維數後,我們可以製作如下數字:

神經網絡嵌入解釋

嵌入最近鄰居的書籍

我們可以清楚地看到學習嵌入的價值!我們現在在維基百科上有每本書的50個數字代表,類似的書籍彼此更接近。

嵌入可視化

嵌入式的最酷的部分之一是,它們可以用來可視化概念,例如小說或非小說之間的關係。這需要進一步的降維技術來將維度降至2或3。最流行的約簡技術本身就是一種嵌入方法:TSNE。

我們可以把維基百科上所有書的37000個維度,用神經網絡嵌入把它們映射到50個維度,然後用TSNE把它們映射到2個維度。結果如下:

神經網絡嵌入解釋

在維基百科上嵌入所有37,000本書籍

在維基百科上嵌入所有37,000本書籍

(TSNE是一種流形學習技術,意味著它試圖將高維數據映射到低維流形,創建嵌入,試圖在數據中維護局部結構。它幾乎專門用於可視化,因為輸出是隨機的,它不支持轉換新數據。一種新的選擇是UMAP,它更快,並且支持將新數據轉換為嵌入空間)。

這本身並不是很有用,但是一旦我們根據不同的書籍特徵開始著色它就會很有見地。

神經網絡嵌入解釋

按類型著色的嵌入

我們可以清楚地看到屬於同一類型的書籍的分組。它並不完美,但令人印象深刻的是,我們只用2個數字代表維基百科上的所有書籍,這些數字仍能捕捉到不同類型之間的差異。

書中的例子(即將發表的完整文章)展示了神經網絡嵌入的價值:我們有一個分類對象的矢量表示,它是低維的,並且在嵌入空間中將相似的實體彼此靠近。

交互式可視化

靜態圖的問題在於我們無法真正探索數據並調查變量之間的分組或關係。為了解決這個問題,TensorFlow開發了projector,,這是一個在線應用程序,可以讓我們可視化並與嵌入交互。結果如下:

神經網絡嵌入解釋

利用projector互動探索書籍嵌入

結論

神經網絡嵌入是離散數據的低維表示,作為連續向量。這些嵌入克服了傳統編碼方法的侷限性,可用於尋找最近鄰,輸入另一個模型和可視化等目的。

儘管在學術術語中討論了許多深度學習概念,但神經網絡嵌入既直觀又易於實現。我堅信任何人都可以學習深度學習,並使用像Keras這樣的庫來構建深度學習解決方案。嵌入是處理離散變量的有效工具,並提供深度學習的有用應用。


分享到:


相關文章: