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
中给出的索引,它与输出的维度保持一致正在回归。
我感到困惑的是:
当尝试使用相同的参数时,二维数组 ids
、tf.nn.embedding_lookup
返回 3-d 数组,而不是 2-d,我不明白为什么。
我查阅了Embedding Lookup 的手册,但我仍然很难理解分区的工作原理以及返回的结果。我最近用tf.nn.embedding_lookup
尝试了一些简单的例子,它似乎每次都返回不同的值。这种行为是由于分区中涉及的随机性造成的吗?
请帮助我了解tf.nn.embedding_lookup
的工作原理,以及为什么在word2vec_basic.py
和ptb_word_lm.py
中都使用它们,即,使用它们的目的是什么?
【问题讨论】:
What does tf.nn.embedding_lookup function do?的可能重复 【参考方案1】:关于tf.nn.embedding_lookup
here的作用已经有了答案。
当尝试使用相同的参数和二维数组 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:如何将预训练模型已经嵌入的数据输入到 LSTM 模型中?