TensorFlow 嵌入查找

TensorFlow Embedding Lookup

我正在尝试学习如何使用 TensorFlow 为语音识别构建 RNN。首先,我想尝试 TensorFlow 页面 TF-RNN

上的一些示例模型

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

我认为 tf.nn.embedding_lookup 做了什么:

给定一个二维数组 params 和一个一维数组 ids,函数 tf.nn.embedding_lookup 从参数中获取行,对应于 [=14= 中给出的索引],它与它返回的输出维度一致。

我困惑的地方:

尝试使用相同的参数和二维数组 idstf.nn.embedding_lookup returns 三维数组,而不是二维数组,我不明白为什么。

我查阅了Embedding Lookup的手册,但我仍然很难理解分区是如何工作的,以及返回的结果。我最近用 tf.nn.embedding_lookup 尝试了一些简单的例子,它似乎每次都 returns 不同的值。这种行为是由于分区中涉及的随机性造成的吗?

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

关于 tf.nn.embedding_lookup .

的内容已经有了答案

When tried with same params, and 2-d array ids, tf.nn.embedding_lookup returns 3-d array, instead of 2-d which I do not understand why.

当你有一个 id 的一维列表 [0, 1] 时,该函数将 return 嵌入列表 [embedding_0, embedding_1] 其中 embedding_0 是形状数组 embedding_size。例如,id 列表可以是一批单词。

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

如果您的句子列表是:[[0, 1], [0, 3]](句子 1 是 [0, 1],句子 2 是 [0, 3]),该函数将计算一个嵌入矩阵,它是形状 [2, 2, embedding_size] 看起来像:

[[embedding_0, embedding_1],
 [embedding_0, embedding_3]]

关于partition_strategy的说法,你不必理会。基本上,如果您在计算方面有限制,它允许您将嵌入矩阵列表作为 params 而不是 1 个矩阵。

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