TensorFlow嵌入查找

时间:2016-06-18 14:15:13

标签: tensorflow word2vec recurrent-neural-network language-model

我正在尝试使用TensorFlow学习如何为语音识别构建RNN。首先,我想尝试一下TensorFlow页面TF-RNN上提供的一些示例模型

根据建议,通过完成word2vec模型代码的基本版本,我花了一些时间来了解如何将字ID嵌入到密集表示(Vector Representation)中。我理解tf.nn.embedding_lookup实际上做了什么,直到我实际遇到与TF-RNN ptb_word_lm.py中的二维数组一起使用的相同函数,直到它再也没有意义了。

我虽然tf.nn.embedding_lookup做了什么:

给定2-d数组params和1-d数组ids,函数tf.nn.embedding_lookup从params中获取行,对应于ids中给出的索引,它与输出的维度保持一致。

我很困惑:

尝试使用相同的参数和2-d数组ids时,tf.nn.embedding_lookup会返回3-d数组,而不是2-d,我不明白为什么。

我查阅了Embedding Lookup的手册,但我仍然觉得很难理解分区是如何工作的,以及返回的结果。我最近用tf.nn.embedding_lookup尝试了一些简单的例子,看起来它每次都返回不同的值。这种行为是否归因于分区涉及的随机性?

请帮助我了解tf.nn.embedding_lookup的工作原理,以及word2vec_basic.pyptb_word_lm.py中使用的原因,即使用它们的目的是什么?

1 个答案:

答案 0 :(得分:15)

关于tf.nn.embedding_lookup here的内容已有答案。

  

当尝试使用相同的参数和2-d数组id时,tf.nn.embedding_lookup返回3-d数组,而不是2-d,我不明白为什么。

如果您有一个ID {1}}的一维列表,该函数将返回一个嵌入列表[0, 1],其中[embedding_0, embedding_1]是一个形状embedding_0的数组。例如,id列表可以是一批单词。

现在,您有一个矩阵的ids或一系列ID列表。例如,您现在有一批句子,即一批单词列表,即单词列表列表。

如果您的句子列表为:embedding_size(句子1为[[0, 1], [0, 3]],句子2为[0, 1]),则该函数将计算嵌入矩阵,其形状为{ {1}}并且看起来像:

[0, 3]

关于[2, 2, embedding_size]论点,你不必为此烦恼。基本上,如果计算有限,它允许您将嵌入矩阵列表设为[[embedding_0, embedding_1], [embedding_0, embedding_3]] 而不是1个矩阵。

因此,您可以将形状partition_strategy的嵌入矩阵拆分为十个形状params的矩阵,并将此变量列表作为[1000, embedding_size]传递。参数[100, embedding_size]处理10个矩阵中词汇表(1000个单词)的分布。