什么是神经网络中的嵌入层?


91

在许多神经网络库中,都有“嵌入层”,例如KerasLasagne中

尽管阅读了文档,但我不确定我是否了解它的功能。例如,在Keras文档中说:

将正整数(索引)转换为固定大小的密集向量,例如。[[4],[20]]-> [[0.25,0.1],[0.6,-0.2]]

知识渊博的人可以解释它的作用以及何时使用吗?


编辑:关于文档中的粘贴,没有太多可从文档中粘贴,因此是我的问题。我不了解它所做的转换,也不知道为什么要使用它。

无论如何,这是在Keras中解释的方式:

嵌入

keras.layers.embeddings.Embedding(input_dim,output_dim,init ='uniform',input_length = None,weights = None,W_regularizer = None,W_constraint = None,mask_zero = False)将正整数(索引)转换为固定大小的密集向量,例如。[[4],[20]]-> [[0.25,0.1],[0.6,-0.2]]

输入形状:2D张量,形状为:(nb_samples,sequence_length)。输出形状:具有以下形状的3D张量:(nb_samples,sequence_length,output_dim)。参数:

input_dim:int> =0。词汇量,即。输入数据中出现1+最大整数索引。output_dim:int> =0。密集嵌入的尺寸

这就是千层面的解释:

单词嵌入层。输入应为整数类型Tensor变量。

参数:传入:一个Layer实例或一个元组

送入该层的层,或预期的输入形状。

input_size:整数

不同嵌入的数量。最后的嵌入将具有索引input_size-1。

output_size:整数

每个嵌入的大小。

W:Theano共享变量,表达式,numpy数组或可调用

嵌入矩阵的初始值,表达式或初始化程序。这应该是形状为(input_size,output_size)的矩阵。有关更多信息,请参见lasagne.utils.create_param()。

例子

>>> from lasagne.layers import EmbeddingLayer, InputLayer, get_output
>>> import theano
>>> x = T.imatrix()
>>> l_in = InputLayer((3, ))
>>> W = np.arange(3*5).reshape((3, 5)).astype('float32')
>>> l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)
>>> output = get_output(l1, x)
>>> f = theano.function([x], output)
>>> x_test = np.array([[0, 2], [1, 2]]).astype('int32')
>>> f(x_test) array([[[  0.,   1.,   2.,   3.,   4.],
                      [ 10.,  11.,  12.,  13.,  14.]],
                     [[  5.,   6.,   7.,   8.,   9.],
                      [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

1
请粘贴在任何必要的上下文中以理解和回答您的问题。人们不会想去其他地方阅读文档来为您回答问题。
gung

1
我做了你问的变化
弗朗西斯

我也有同样的疑问,并找到了一些有关它的文件。下面是一些有趣的:cs.cmu.edu/afs/cs/academic/class/15782-f06/slides/... fromthebottomoftheheap.net/2011/01/21/...显然,它适用延迟在输入的时间序列,并认为延迟作为新的向量。
abutremutante

观看此视频:youtube.com/watch?v=bvZnphPgz74。大约30分钟,他谈论了嵌入。
Pieter

Answers:


69

与Word2Vec的关系

=========================================

Word2Vec中的简单图片:

word2vec图片

更深入的解释:

我认为这与最近Word2Vec在自然语言处理方面的创新有关。大致而言,Word2Vec意味着我们的词汇是离散的,我们将学习将每个单词嵌入到连续向量空间中的映射。使用这种向量空间表示将使我们能够连续,分散地表示词汇。例如,如果我们的数据集由n-gram组成,那么我们现在可以使用连续词特征来创建n-gram的分布式表示形式。在训练语言模型的过程中,我们将学习此词嵌入图。希望是通过使用连续表示,我们的嵌入会将相似的单词映射到相似的区域。例如,在具有里程碑意义的论文中,单词和短语的分布式表示及其组成在表6和表7中,从语义的角度来看,某些短语具有非常好的最近邻居短语。转换为这个连续的空间,使我们可以使用相似性的连续度量标准概念来评估嵌入的语义质量。

使用千层面代码的说明

让我们分解一下Lasagne代码片段:

x = T.imatrix()

x是整数矩阵。好的没问题。词汇表中的每个单词都可以表示一个整数或1-hot稀疏编码。因此,如果x为2x2,我们有两个数据点,每个数据点均为2克。

l_in = InputLayer((3, ))

w0,w1,w2

W = np.arange(3*5).reshape((3, 5)).astype('float32')

这是我们的词嵌入矩阵。它是一个3行乘5列的矩阵,条目为0到14。

w0=(1,0,0)w1=(0,1,0)w2=(0,0,1)Ww0w0W=[0,1,2,3,4].w1w1W=[5,6,7,8,9]

应该注意的是,由于我们使用的是单热稀疏编码,因此您也将其称为表查找。

l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)

嵌入层

 output = get_output(l1, x)

嵌入的符号Theano表达式。

f = theano.function([x], output)

Theano函数,用于计算嵌入。

x_test = np.array([[0, 2], [1, 2]]).astype('int32')

(w0,w2)(w1,w2)

(w0,w2)W

f(x_test) 

返回:

          array([[[  0.,   1.,   2.,   3.,   4.],
                  [ 10.,  11.,  12.,  13.,  14.]],
                 [[  5.,   6.,   7.,   8.,   9.],
                  [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

为使您确信3确实代表了词汇量,请尝试输入矩阵x_test = [[5, 0], [1, 2]]。您将看到它引发了矩阵失配误差。


2
这个答案很好。我对此问题有一个扩展,即嵌入式层以何种方式将Imdb情感样本(或任何其他数据集)转换为向量。这些是单词的集合。
预感

1

https://stackoverflow.com/questions/45649520/explain-with-example-how-embedding-layers-in-keras-works/中,我尝试使用2个句子准备一个示例,即keras的texts_to_sequences

'This is a text' --> [0 0 1 2 3 4]

和嵌入层。基于Keras的“嵌入”层如何工作?嵌入层首先随机初始化嵌入向量,然后使用网络优化器对其进行更新,就像对keras中的任何其他网络层所做的一样。

[0 0 1 2 3 4] --> 
[-0.01494285, -0.007915  ,  0.01764857],
[-0.01494285, -0.007915  ,  0.01764857],
[-0.03019481, -0.02910612,  0.03518577],
[-0.0046863 ,  0.04763055, -0.02629668],
[ 0.02297204,  0.02146662,  0.03114786],
[ 0.01634104,  0.02296363, -0.02348827]

上面是(最多)6个单词的句子和output_dim为3的句子的一些初始嵌入向量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.