在深度學習實驗中經常會遇Eembedding層,然而網絡上的介紹可謂是相當含糊。比如 Keras中文文檔中對嵌入層 Embedding的介紹除了一句 “嵌入層將正整數(下標)轉換為具有固定大小的向量”之外就不願做過多的解釋。那么我們為什么要使用嵌入層 Embedding呢? 主要有這兩大原因:
1、使用One-hot 方法編碼的向量會很高維也很稀疏。假設我們在做自然語言處理(NLP)中遇到了一個包含2000個詞的字典,當時用One-hot編碼時,每一個詞會被一個包含2000個整數的向量來表示,其中1999個數字是0,要是我的字典再大一點的話這種方法的計算效率豈不是大打折扣?
2、訓練神經網絡的過程中,每個嵌入的向量都會得到更新。如果你看到了博客上面的圖片你就會發現在多維空間中詞與詞之間有多少相似性,這使我們能可視化的了解詞語之間的關系,不僅僅是詞語,任何能通過嵌入層 Embedding 轉換成向量的內容都可以這樣做。
Eg 1:
對於句子“deep learning is very deep”:
使用嵌入層embedding 的第一步是通過索引對該句子進行編碼,這里我們給每一個不同的句子分配一個索引,上面的句子就會變成這樣:
"1 2 3 4 1"
接下來會創建嵌入矩陣,我們要決定每一個索引需要分配多少個‘潛在因子’,這大體上意味着我們想要多長的向量,通常使用的情況是長度分配為32和50。在這篇博客中,為了保持文章可讀性這里為每個索引指定6個潛在因子。這樣,我們就可以使用嵌入矩陣來而不是龐大的one-hot編碼向量來保持每個向量更小。簡而言之,嵌入層embedding在這里做的就是把單詞“deep”用向量[.32, .02, .48, .21, .56, .15]來表達。然而並不是每一個單詞都會被一個向量來代替,而是被替換為用於查找嵌入矩陣中向量的索引。
eg 2:
假如我們有一個100W X10W的矩陣,用它乘上一個10W X 20的矩陣,我們可以把它降到100W X 20,瞬間量級降了。。。10W/20=5000倍!!!
這就是嵌入層的一個作用——降維。
然后中間那個10W X 20的矩陣,可以理解為查詢表,也可以理解為映射表,也可以理解為過度表;
參考鏈接:https://blog.csdn.net/weixin_42078618/article/details/82999906
https://blog.csdn.net/u010412858/article/details/77848878
PS: pixel wise metric learning
嵌入模型:在所提出的模型f中,其中每個像素x j,i被表示為d維嵌入向量ej,i = f(xj,i)。理想地,屬於相同對象的像素在嵌入空間中彼此靠近,並且屬於不同對象的像素彼此遠離。