在深度學習實驗中常常會遇Eembedding層,然而網絡上的介紹可謂是至關含糊。好比 Keras中文文檔中對嵌入層 Embedding的介紹除了一句 「嵌入層將正整數(下標)轉換爲具備固定大小的向量」以外就不肯作過多的解釋。那麼咱們爲何要使用嵌入層 Embedding呢? 主要有這兩大緣由:網絡
一、使用One-hot 方法編碼的向量會很高維也很稀疏。假設咱們在作天然語言處理(NLP)中遇到了一個包含2000個詞的字典,當時用One-hot編碼時,每個詞會被一個包含2000個整數的向量來表示,其中1999個數字是0,要是個人字典再大一點的話這種方法的計算效率豈不是大打折扣?學習
二、訓練神經網絡的過程當中,每一個嵌入的向量都會獲得更新。若是你看到了博客上面的圖片你就會發如今多維空間中詞與詞之間有多少類似性,這使咱們能可視化的瞭解詞語之間的關係,不只僅是詞語,任何能經過嵌入層 Embedding 轉換成向量的內容均可以這樣作。編碼
Eg 1:spa
對於句子「deep learning is very deep」:.net
使用嵌入層embedding 的第一步是經過索引對該句子進行編碼,這裏咱們給每個不一樣的句子分配一個索引,上面的句子就會變成這樣:對象
"1 2 3 4 1"blog
接下來會建立嵌入矩陣,咱們要決定每個索引須要分配多少個‘潛在因子’,這大致上意味着咱們想要多長的向量,一般使用的狀況是長度分配爲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的矩陣,能夠理解爲查詢表,也能夠理解爲映射表,也能夠理解爲過分表;
參考連接:http://www.javashuo.com/article/p-ycbfqvdj-md.html
https://blog.csdn.net/u010412858/article/details/77848878
PS: pixel wise metric learning
嵌入模型:在所提出的模型f中,其中每一個像素x j,i被表示爲d維嵌入向量ej,i = f(xj,i)。理想地,屬於相同對象的像素在嵌入空間中彼此靠近,而且屬於不一樣對象的像素彼此遠離。