嵌入在tensorflow中做了什么

时间:2016-10-21 19:55:20

标签: python tensorflow deep-learning

我正在阅读这里使用带有张量流的RNN的示例:ptb_word_lm.py

我无法弄清楚First DOW : Monday October 17, 2016 embedding在这里做了些什么。它如何为张量添加另一个维度?从(20,25)到(20,25,200)。在这种情况下(20,25)是20的批量大小,具有25个时间步长。我无法理解如何/为什么可以将单元格的embedding_lookup添加为输入数据的维度?通常,输入数据将是大小为hidden_size的矩阵,模型将映射[batch_size, num_features] ---> num_features,其大小为hidden_dims矩阵,产生的大小为[num_features, hidden_dims]。那么[batch-size, hidden-dims]如何成为输入张量的维度?

hidden_dims

2 个答案:

答案 0 :(得分:12)

好吧,我不打算尝试解释这个特定的代码,但我会尝试回答“什么是嵌入?”标题的一部分。

基本上它是将原始输入数据映射到一组实值维度中,并且组织这些维度中原始输入数据的“位置”以改进任务。

在张量流中,如果你想象一些文字输入字段有“王”,“女王”,“女孩”,“男孩”,你有2个嵌入维度。希望backprop能够训练嵌入,将版税的概念放在一个轴上,将性别放在另一个轴上。因此,在这种情况下,4分类值特征被“煮沸”到具有2维的浮点嵌入特征。

它们是使用查找表实现的,可以从原始列表或字典顺序进行哈希处理。对于一个训练有素的人,你可能会输入“女王”,然后你说出[1.0,1.0],输入“男孩”然后你得到[0.0,0.0]。

Tensorflow对此查找表中的错误进行了反向支持,希望以随机初始化的字典开头的内容将逐渐变得像我们在上面看到的那样。

希望这会有所帮助。如果没有,请查看:http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/

答案 1 :(得分:1)

最简单的

input_data:单词ID序列的批处理(形状为(20,25))

inputs:一系列词嵌入序列(形状为(20,25,200))

您可能会问input_data如何变成inputs?这就是学习单词嵌入的作用。想象的最简单方法是

  1. input_data解包为形状为(20*25,)的单个批次。
  2. 现在为展开的200中的每个元素分配大小为input_data的向量,这将为您提供形状为(20*25,200)的矩阵。
  3. 现在,将矩阵重塑为(20,25,200)

这是因为,嵌入学习不是一个时序过程。您可以通过前馈网络学习单词嵌入。下一个重要的问题是,您如何学习单词嵌入。

  1. 初始化大小为(vocabulary_size, 200)(即代码中的embedding)的巨大Tensorflow变量
  2. 优化embedding,以便给定的单词应能够根据其上下文预测任何单词。 (例如,在“狗吠叫邮递员”中,如果“ at”是目标词“狗”,“吠叫”,“ the”和“ mailman”是上下文词)
  3. 此过程为您提供了每个单词的向量(在此示例中为200长),从而保留了语义(即“ dog”的向量与“ cat”接近,但与“ pen”相距甚远) )。

这里是我刚才解释的概述。

Image:embeddings

相关问题