Keras:嵌入LSTM

时间:2017-06-26 11:57:27

标签: keras lstm embedding

在LSTM上用于建模IMDB序列数据(https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py)的keras示例中,在输入LSTM层之前有一个嵌入层:

model.add(Embedding(max_features,128)) #max_features=20000
model.add(LSTM(128))

嵌入层真正做了什么?在这种情况下,这是否意味着进入LSTM层的输入序列的长度是128?如果是这样,我可以将LSTM层写为:

model.add(LSTM(128,input_shape=(128,1))

但是还注意到输入X_train已经过pad_sequences处理:

print('Pad sequences (samples x time)')
X_train = sequence.pad_sequences(X_train, maxlen=maxlen) #maxlen=80
X_test = sequence.pad_sequences(X_test, maxlen=maxlen) #maxlen=80

输入序列长度似乎是80?

2 个答案:

答案 0 :(得分:1)

To quote the documentation

  

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

基本上,这会将索引(表示您的IMDB审核所包含的单词)转换为具有给定大小的向量(在您的情况下为128)。

如果您不知道嵌入的内容是什么,here is the wikipedia definition

  

Word嵌入是一组语言建模的统称   和自然语言处理中的特征学习技术(NLP)   词汇表中的单词或短语被映射到的向量   相对于词汇的低维空间中的实数   大小(“连续空间”)。

回到你提出的另一个问题:

  

在这种情况下,这是否意味着输入序列的长度   LSTM层是128?

不太好。对于经常性网络,您将拥有时间维度和要素维度。 128是您的要素维度,因为每个嵌入向量应具有多少维度。示例中的时间维度是maxlen中存储的内容,用于生成训练序列。

无论你提供的是LSTM layer is the actual number of output units of the LSTM的128。

答案 1 :(得分:1)

如果考虑如何将单词作为LSTM的输入(基本上是矩阵乘法,加法和浮点函数的网络/模型)的输入,您将意识到需要一些基于整数/浮点数的单词表示才能输入您的网络。

然后,最合乎逻辑的表示形式是用整数表示每个单词,并且由于数据集的词汇量是有限的,因此您将拥有一组有限的整数来表示单词。为了矩阵代数的目的,我们将这些整数表示为1–0数组的数组索引,其中每个单词在其指定整数的数组索引处由1表示。其他所有索引均为0。

如果您感到困惑,让我给您举个例子:

让我们说您的数据集仅包含两个句子:

我爱咖啡。 我喜欢狗。 词汇:{我,爱,咖啡,我,像狗一样}

分配的整数:

I:0,爱:1,咖啡:2,喜欢:3,狗:4

矢量表示形式

I:[1,0,0,0,0]

爱:[0,1,0,0,0]

咖啡:[0,0,1,0,0]

like:[0,0,0,1,0]

狗:[0,0,0,0,1]

这种类型的单词表示称为单向矢量表示。

但是,正如您所看到的,相似的单词不会共享任何信息。

例如,如果您在“咖啡”和“爱”之间以及“喜欢”和“爱”之间保持欧几里得距离,您将得到相同的结果。

为了具有这样一种表示,相似单词的欧氏距离比根本不相似的单词的欧氏距离小。这里,相似性基于单词的上下文,即单词所用的条件或环境。

这种表示形式称为单词嵌入。

它们可能看起来像:

I:[0.02、0.08、0.14、0.16、0.60]等……

但是,大多数情况下,这些嵌入是在您已经在做的更大的训练任务中学习的。

因此,使用大小等于数据集词汇量大小的嵌入层已变得非常流行。

此层是您的输入层(词汇表中的单词索引矩阵)和LSTM层之间的接口。

该层可能是全零,随机或预训练的词嵌入,例如GloVe,word2vec等。

在培训(或测试)的前向过程中,从该嵌入层对单词进行了查找以获得特定的单词嵌入。

在向后传递过程中,损失函数的梯度也会流过嵌入层,从而学习最适合手头任务的词嵌入。

PS:存入https://qr.ae/TUnl1R