在深度学习实验中常常会遇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)。理想地,属于相同对象的像素在嵌入空间中彼此靠近,而且属于不一样对象的像素彼此远离。