TensorFlow嵌入查找

VM_*_*_AI 10 word2vec language-model tensorflow recurrent-neural-network

我正在尝试学习如何使用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,其中包含返回的输出维度.

我感到困惑的是:

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

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

请帮助我理解它是如何tf.nn.embedding_lookup工作的,以及为什么在两者中使用word2vec_basic.py,ptb_word_lm.py即使用它们的目的是什么?

Oli*_*rot 15

已经有上什么呢答案tf.nn.embedding_lookup 在这里.


当尝试使用相同的参数和2-d数组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]]
Run Code Online (Sandbox Code Playgroud)

关于这个partition_strategy论点,你不必为此烦恼.基本上,params如果您在计算方面有局限性,它允许您给出嵌入矩阵列表而不是1个矩阵.

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

  • 所有嵌入都存储在嵌入矩阵'params'中,它们通过梯度下降来学习.使用嵌入查找,每次只更新一小部分嵌入(仅批处理中的句子中的单词). (2认同)