TensorFlow 嵌入查找

Posted

技术标签:

【中文标题】TensorFlow 嵌入查找【英文标题】:TensorFlow Embedding Lookup 【发布时间】:2016-10-20 06:11:11 【问题描述】:

我正在尝试学习如何使用 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从参数中获取行,对应于ids中给出的索引,它与输出的维度保持一致正在回归。

我感到困惑的是:

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

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

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

【问题讨论】:

What does tf.nn.embedding_lookup function do?的可能重复 【参考方案1】:

关于tf.nn.embedding_lookuphere的作用已经有了答案。


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

当您有一个 id 的一维列表[0, 1] 时,该函数将返回一个嵌入列表[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 个矩阵中的分布。

【讨论】:

tf 在哪里学习嵌入?这个函数也是这样做的吗? 所有嵌入都存储在嵌入矩阵ˋparamsˋ中,通过梯度下降学习。通过嵌入查找,每次只更新一小部分嵌入(仅批量中的句子中的单词)。 所以这个功能只是为了简化它的内部流程?

以上是关于TensorFlow 嵌入查找的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow NN 嵌入 C++ 项目

仅更新 Tensorflow 中词嵌入矩阵的一部分

使用 tensorflow 实现嵌入层

Tensorflow:如何将预训练模型已经嵌入的数据输入到 LSTM 模型中?

如何在 scikit 学习模型中使用 Tensorflow 嵌入?

所有的Tensorflow模型都可以嵌入到移动设备