本文介紹Embedding的概念,給出了如何在TensorFlow中進行Embedding訓練的簡單示例,並解釋了如何使用TensorBoard Embedding投影查看嵌入。前兩部分是針對機器學習或TensorFlow的新手, Embedding投影如何做麵向各級用戶。
一個Embedding是從離散對象(如單詞)到實數向量的映射。例如,英文單詞(成千上萬個)的300維Embedding可以包括:
blue: (0.01359, 0.00075997, 0.24608, ..., -0.2524, 1.0048, 0.06259)
blues: (0.01396, 0.11887, -0.48963, ..., 0.033483, -0.10007, 0.1158)
orange: (-0.24776, -0.12359, 0.20986, ..., 0.079717, 0.23865, -0.014213)
oranges: (-0.35609, 0.21854, 0.080944, ..., -0.35413, 0.38511, -0.070976)
這些向量中的各個維度通常沒有固有的意義。機器學習要利用的是向量之間的位置和距離的整體模式。
Embedding對於機器學習的輸入非常重要。更普遍的分類器和神經網絡,一般是對實數的向量起作用。他們最好是在密集向量上訓練,向量中所有的值都有助於定義一個對象。然而,對於機器學習的許多重要的輸入,例如文字,沒有自然的矢量表示。Embedding函數是將這些離散輸入對象轉換為有用的連續向量的標準和有效的方法。
Embedding作為機器學習的輸出也是有價值的。由於Embedding將對象映射到向量,因此應用程序可以使用向量空間中的相似性(例如,歐幾裏得距離或向量之間的角度)作為對象相似度的強大而靈活的度量。一個常見的用途是找到最近的鄰居。例如,使用與上麵相同的單詞Embedding,這裏是每個單詞的三個最近的鄰居和相應的角度:
blue: (red, 47.6°), (yellow, 51.9°), (purple, 52.4°)
blues: (jazz, 53.3°), (folk, 59.1°), (bluegrass, 60.6°)
orange: (yellow, 53.5°), (colored, 58.0°), (bright, 59.9°)
oranges: (apples, 45.3°), (lemons, 48.3°), (mangoes, 50.4°)
從上麵可以看到,蘋果和橙子在某種程度上比檸檬和橙子(相距45.3°)(相隔48.3°)更相似。
在TensorFlow Embedding
要在TensorFlow中創建詞Embedding,我們首先將文本分成單詞,然後為詞匯表中的每個單詞分配一個整數。讓我們假設這已經完成了,word_ids
是這些整數的一個向量。例如,“I have a cat.”這個句子可以被分成兩部分[“I”, “have”, “a”, “cat”, “.”]
然後相應的word_ids
張量維度為[5]
,即由5個整數組成。為了將這些單詞標識映射到向量,我們需要創建Embedding變量並使用tf.nn.embedding_lookup
函數如下:
word_embeddings = tf.get_variable(“word_embeddings”,
[vocabulary_size, embedding_size])
embedded_word_ids = tf.nn.embedding_lookup(word_embeddings, word_ids)
之後,張量embedded_word_ids
的維度是[5, embedding_size]
在我們的例子中,包含5個單詞中每一個的Embedding(密集向量)。在訓練結束時,word_embeddings
將包含詞匯表中所有單詞的Embedding。
Embedding可以使用許多網絡類型訓練,並且可以使用各種損失函數和數據集。例如,給定大量句子,可以使用遞歸神經網絡來預測來自前一個單詞的下一個單詞,或者可以訓練兩個網絡來做多語言翻譯。這些方法在詞的矢量表示教程中有介紹。
可視化Embedding
TensorBoard包括Embedding Projector(Embedding投影),這個工具可以讓你交互式地顯示Embedding。該工具可以讀取模型中的Embedding,並在二維或三維中渲染它們。
Embedding投影有三個麵板:
- 數據麵板在左上方,您可以選擇運行,Embedding變量和數據列,通過顏色標記點。
- 投影麵板在左下方,您可以選擇投影類型。
- 檢查員麵板在右側,您可以在那裏搜索特定點並查看最近的鄰居列表。
投影
Embedding投影提供三種方法來降低數據集的維度。
-
t-SNE:一種非線性非確定性算法(T-distributed隨機鄰居Embedding),它試圖在數據中保留局部鄰域,這通常是以扭曲全局結構為代價的。您可以選擇是否計算2維或3維投影。
-
PCA:線性確定算法(主成分分析),盡可能在盡可能少的維度上捕捉盡可能多的數據變化。 PCA往往會突出顯示數據中的large-scale結構,但會扭曲本地鄰域。Embedding投影計算前10個主要組件,從中您可以選擇兩個或三個查看。
-
自定義:在數據中使用標簽指定水平和垂直軸上的線性投影。例如,通過為”Left”和”Right”提供文本模式來定義水平軸。Embedding投影查找標簽與”Left”模式相匹配的所有點,並計算該組的質心;”Right”類似。穿過這兩個質心的線定義了水平軸。垂直軸同樣是根據與”Up”和”Down”文本模式匹配的點的質心來計算的。
其他有用的文章是如何有效地使用t-SNE和主成分分析直觀解釋。
瀏覽
您可以通過使用自然click-and-drag手勢進行縮放,旋轉和平移來做可視方化瀏覽。將鼠標懸停在某個點上會顯示所有元數據。您也可以檢查最近鄰子集。點擊一個點會導致右窗格列出最近的鄰居,以及到當前點的距離。投影中還強調了最近鄰的點。
將視圖限製為點的子集並僅在這些點上執行投影有時是有用的。為此,您可以通過多種方式選擇點:
- 點擊一個點後,最近的鄰居也被選中。
- 搜索後,選擇與查詢匹配的點。
- 啟用選擇,單擊一個點並拖動定義一個選擇範圍。
然後點擊“隔離NNN點”按鈕,它位於左側“檢查器”窗格頂部,下圖顯示了101個被選中的點,可以讓用戶單擊“隔離101點”:
在單詞Embedding數據集中選擇“important”的最近鄰居。
高級提示:使用自定義投影進行過濾很強大,下麵,我們過濾了“politics”的100個最近鄰居,並將它們投影到“worst” – “best”向量上作為x軸。 y軸是隨機的。因此,您可以在右側找到“ideas”,“science”,“perspective”,“journalism”,但在左側找到“crisis”,“violence”和“conflict”。
自定義投影控件。 | 將”politics”的鄰居自定義投影到”best” – “worst”向量上。 |
要共享您的發現,您可以使用右下角的書簽麵板,並將當前狀態(包括任何投影的計算坐標)保存為小文件。然後可以將投影指向一組一個或多個這些文件,製作下麵的麵板。然後其他用戶可以通過一係列書簽瀏覽。
Metadata(元數據)
如果您正在使用Embedding,則可能需要將標簽/圖像附加到數據點。您可以通過生成包含每個點的標簽的元數據文件並在Embedding投影的數據麵板中單擊”Load data”來完成此操作。
元數據可以是標簽或圖像,它們存儲在單獨的文件中。對於標簽,格式應該是aTSV文件(以紅色顯示的製表符),其第一行包含列標題(以粗體顯示),後續行包含元數據值。例如:
Word\tFrequency
Airplane\t345
Car\t241
...
除標題外,假定元數據文件中行的順序與嵌入變量中的向量的順序相匹配。因此,元數據文件中的第(i + 1)行對應於Embedding變量的i-th行。如果TSV元數據文件隻有一個列,那麽我們不希望有一個標題行,並假設每一行都是嵌入的標簽。我們兼容這個異常,因為它與通用的”vocab file”格式相匹配。
要將圖像用作元數據,您必須生成一個精靈圖像,由小縮略圖組成,Embedding中的每個矢量一個。精靈應該以row-first順序存儲縮略圖:第一個數據點放置在左上方,最後一個數據點放在右下方,盡管最後一行不需要填充,如下所示。
參考這個鏈接:在Embedding投影中查看縮略圖的有趣示例。
Mini-FAQ
“embedding”是動作還是事物?都是。人們討論在矢量空間(行為)中Embedding單詞,以及在生成單詞Embedding(事物)。兩者共同的是Embedding作為從離散對象到矢量的映射的概念。創建或應用該映射是一個操作,但映射本身是一個事物。
Embedding成high-dimensional(高維)還是low-dimensional(低維)?看情況。例如,單詞和短語的300維矢量空間通常被稱為low-dimensional(低維和稠密),與它可以包含的數百萬個單詞和短語相比。但在數學上它是high-dimensional,顯示出許多與我們的人類直覺了解的二維和三維空間有很大不同的屬性。
Embedding是否與Embedding層相同?不是。Embedding層是神經網絡的一部分,但一個Embedding是一個更一般的概念。