作者:Will Koehrsen
編譯:ronghuaiyang
深度學習的一個顯著成功應用是嵌入,這是一種將離散變量表示為連續向量的方法。這項技術已經有了實際的應用,其中有在機器翻譯中使用詞嵌入和類別變量中使用實體嵌入。
近年來,神經網絡在圖像分割、自然語言處理、時間序列預測等方面的應用有了很大的發展。深度學習的一個顯著成功應用是嵌入,這是一種將離散變量表示為連續向量的方法。這項技術已經有了實際的應用,其中有在機器翻譯中使用詞嵌入和類別變量中使用實體嵌。
在本文中,我將解釋什麼是神經網絡嵌入,為什麼要使用它們,以及如何學習它們。我們會在真正的問題的上下文中討論這些概念:將Wikipedia上的所有圖書表示為向量,並創建圖書推薦系統。
Wikipedia上所有書的神經網絡嵌入
嵌入是一個從離散變量到連續數字向量的映射。在神經網絡的上下文中,embeddings是低維的, 離散變量用學習到的連續向量表示。神經網絡嵌入是有用的,因為它們可以減少類別變量的維數,並有意義地在轉換空間中表示類別。
神經網絡嵌入有3個主要目的:
這意味著在圖書項目中,使用神經網絡嵌入,我們可以把維基百科上所有的37000篇圖書文章,用一個具有50個數字的向量來表示每一篇文章。此外,由於嵌入式是學習的,在我們的學習問題上下文中更相似的書籍在嵌入式空間中更接近。
神經網絡嵌入克服了用獨熱編碼表示分類變量的兩個局限性:
獨熱編碼類別變量的操作實際上是一個簡單的嵌入,其中每個類別都映射到一個不同的向量。這個過程採用離散實體,並將每個觀察結果映射到一個只有一個1的向量中。
獨熱編碼技術有兩個主要缺點:
第一個問題很好理解:對於每個額外的類別(稱為實體),我們必須向一個熱編碼向量添加另一個數字。如果我們在Wikipedia上有37000本書,那麼表示這些書需要為每本書提供37000維的向量,這使得針對這種表示的任何機器學習模型的訓練都是不可行的。
第二個問題同樣是有局限的:獨熱編碼不會將相似的實體彼此靠近的放在向量空間中。如果我們使用餘弦距離來度量向量之間的相似性,那麼經過獨熱編碼後,實體之間的相似性為0。
這意味著,《戰爭與和平》和《安娜•卡列尼娜》(這兩本書都是列夫•托爾斯泰(Leo Tolstoy)的經典著作)這樣的實體彼此之間的距離,並不比《戰爭與和平》與《銀河系漫遊指南》之間的距離更近。
考慮到這兩個問題,表示類別變量的理想解決方案是需要更少的數字,而不是類別的數量,並且將類似的類別放在更靠近的位置。
為了更好地表示類別實體,我們可以使用嵌入神經網絡和監督任務來學習嵌入。
使用one-hot編碼的主要問題是轉換不依賴於任何監督。我們可以通過在有監督的任務中使用神經網絡來學習嵌入,從而大大改進嵌入。嵌入形成參數—網絡的權重—經過調整以最小化任務上的損失。得到的嵌入向量表示類別,其中相似的類別(相對於任務)彼此更接近。
例如,如果我們有一個包含50,000個單詞的電影評論集合,我們可以使用一個訓練好的嵌入式神經網絡來預測評論是的情感,從而為每個單詞學習100維的嵌入。詞彙表中與正面評價相關的單詞,如「brilliant」或「excellent」,將在嵌入空間中出現得更近,因為網絡已經了解到它們都與正面評價相關。
電影句子中的詞嵌入
在上面給出的書的例子中,我們的監督任務可以是「確定一本書是否是列夫·托爾斯泰寫的」,由此產生的嵌入將使托爾斯泰寫的書彼此更接近。解決如何創建監督任務來生成相關表示的問題是嵌入過程中最困難的部分。
在Wikipedia book項目中,監督學習任務被設置為預測一本書的文章中是否出現了指向Wikipedia頁面的給定連結。我們提供成對的(書名、連結)訓練示例,其中混合了正樣本對和負樣本對。這種設置基於這樣的假設,即連結到類似Wikipedia頁面的書籍彼此相似。因此,由此產生的嵌入應該將類似的書籍更緊密地放置在向量空間中。
我使用的網絡有兩個平行的嵌入層,分別映射書和wikilink,用來區分50維向量,還有一個點積層,將嵌入的內容組合成一個數字,用於預測。嵌入是網絡的參數或權重,在訓練過程中進行調整,以最小化監督任務的損失。
在Keras代碼中,這看起來像這樣(如果你不完全理解代碼,不要擔心,直接跳到圖像):
雖然在有監督的機器學習任務中,目標通常是訓練一個模型對新數據進行預測,但在這個嵌入模型中,預測只是達到目的的一種手段。我們想要的是嵌入權值,將書籍和連結表示為連續向量。
嵌入本身並不那麼有趣,它們只是數字的向量:
來自書籍推薦嵌入模型的示例嵌入
然而,嵌入可以用於前面列出的3個目的,對於這個項目,我們主要感興趣的是推薦基於最近鄰的書籍。為了計算相似性,我們取一本書進行查詢,找到它的向量與其他所有圖書向量的點積。(如果我們的嵌入是標準化的,那麼這個點積就是向量之間的cos距離,範圍從-1(最不相似)到+1(最相似)。我們也可以用歐氏距離來度量相似性。
這是我建立的圖書嵌入模型的輸出:
(向量與自身的餘弦相似度必須為1.0)。經過降維(見下圖),可以得到如下圖:
書的嵌入以及最近的鄰居
我們可以清楚地看到學習嵌入的價值!現在,維基百科上每一本書都有一個50個數字的向量表示,相似的書彼此之間距離更近。
嵌入的最酷的部分之一是,它們可以用來可視化概念,例如「小說」或「非小說」之間的關係。這需要進一步的降維技術來將維度降為2或3。最常用的約簡方法本身就是一種嵌入方法:t分布隨機鄰接嵌入(TSNE)。
我們可以把維基百科上所有書籍的37000個原始維度,用神經網絡嵌入將它們映射到50個維度,然後用TSNE將它們映射到2個維度。結果如下:
在Wikipedia上的所有37000本書的嵌入
(TSNE是一種流形學習技術,這意味著它試圖將高維數據映射到低維流形,創建一個試圖維護數據內部局部結構的嵌入。它幾乎只用於可視化,因為輸出是隨機的,不支持轉換新數據。一個正在興起的替代方案是統一流形近似和投影,UMAP,它更快,並且支持將新數據轉換到嵌入空間中)。
這本身並不是很有用,但是一旦我們開始根據不同的書的特點給它上色,它就會變得很有洞察力。
用流派對嵌入上色
我們可以清楚地看到屬於同一類型的書籍的分組。這並不完美,但仍然令人印象深刻的是,我們可以用兩個數字來表示維基百科上的所有書籍,這兩個數字仍然能夠捕捉到不同類型之間的差異。
書的例子(即將發表的完整文章)展示了神經網絡嵌入的價值:我們有一個類別對象的向量表示,它是低維的,並且在嵌入空間中將相似的實體彼此放置得更近。
靜態圖的問題是,我們不能真正地研究數據並研究變量之間的分組或關係。為了解決這個問題,TensorFlow開發了projector,這是一個在線應用程式,可以讓我們可視化並與嵌入進行交互。我將很快發布一篇關於如何使用這個工具的文章,但是現在,結果如下:
使用projector交互式探索書籍嵌入
神經網絡嵌入是學習離散數據作為連續向量的低維表示。這些嵌入克服了傳統編碼方法的限制,可以用於查找最近的鄰居、輸入到另一個模型和可視化。
雖然很多深度學習的概念都是在學術術語中討論的,但是神經網絡嵌入既直觀又相對容易實現。我堅信任何人都可以學習深度學習並使用Keras這樣的庫構建深度學習解決方案。嵌入是處理離散變量的有效工具,是深度學習的一個有用應用。
英文原文:https://towardsdatascience.com/neural-network-embeddings-explained-4d028e6f0526
請長按或掃描二維碼關注本公眾號