TensorFlow 嵌入查找

12

我正在学习如何使用TensorFlow构建语音识别的RNN。作为一个开端,我想尝试一些放在TensorFlow页面上的示例模型TF-RNN

根据建议,通过研究word2vec模型的基本版本代码,理解单词ID如何嵌入到密集表示(向量表示)中。我了解了tf.nn.embedding_lookup实际上是做什么用的,直到我在TF-RNNptb_word_lm.py中遇到同样的函数与二维数组一起使用时,就有些不理解了。

我对tf.nn.embedding_lookup的理解:

给定一个2-d数组params和一个1-d数组ids,函数tf.nn.embedding_lookupparams中提取行,这些行对应于ids中给定的索引,它具有返回的输出维度。

我感到困惑的是:

当使用相同的params和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
可能是tf.nn.embedding_lookup函数是做什么的?的重复问题。 - Jorge Leitao
1个回答

17

tf.nn.embedding_lookup函数的解释已经在这里了。


当使用相同的参数和二维数组ids进行尝试时,tf.nn.embedding_lookup返回了一个三维数组,而不是我不理解为什么的二维数组。

当你有一个由id组成的一维列表[0, 1]时,该函数将返回嵌入列表[embedding_0,embedding_1],其中embedding_0的形状为embedding_size。例如,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个矩阵中的分布。

tf在哪里学习嵌入?这个函数也会做吗? - vgoklani
2
所有的嵌入都存储在嵌入矩阵“params”中,这些嵌入是通过梯度下降学习得到的。使用嵌入查找时,每次只更新一小部分嵌入(仅批处理中句子中的单词)。 - Olivier Moindrot
所以这个函数只是为了让它的内部过程更容易? - Shamane Siriwardhana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接