【问题标题】:Tensorflow - Sparse embedding lookup that remains sparseTensorflow - 保持稀疏的稀疏嵌入查找
【发布时间】:2019-04-11 08:11:26
【问题描述】:

我正在使用类似于Kim 2014 的 CNN 和 Tensorflow 实现一个文本分类器。 Tensorflow 提供tf.nn.embedding_lookup_sparse,它允许您提供单词 ID 作为稀疏张量。这很好,特别是对于启用可变长度序列。但是,这个函数在查找之后需要一个“组合”步骤,例如“mean”或“sum”。这迫使它回到密集的张量空间。我不想做任何组合。我想将我的向量保持在稀疏表示中,这样我就可以在之后进行其他卷积。这在 TF 中可能吗?

编辑:我想避免在嵌入查找之前填充输入。这是因为 Tensorflow 的嵌入查找会为填充值生成向量,并且它试图用零掩盖它 (see here)

【问题讨论】:

    标签: python tensorflow conv-neural-network text-classification


    【解决方案1】:

    我认为这个问题有两点混淆。首先,组合器操作发生在稀疏索引输入sp_ids 的每一行 的嵌入 ID 集合中。因此,如果sp_ids 的形状为 N x 1,那么您将在sp_ids 的每一行中“组合”一个嵌入向量,这将只检索该嵌入向量(我认为您所说的就是您想要的) .

    其次,返回值是每行输入的嵌入向量。嵌入向量本身是一个密集向量,根据嵌入是什么以及 TensorFlow 嵌入操作计算什么的定义。所以这个返回结果总是很密集,这就是你想要的。稀疏矩阵表示将非常低效,因为无论是否发生任何“组合器”操作,矩阵都会真正密集(充满密集嵌入)。

    您链接的研究论文似乎没有采用任何会导致稀疏嵌入向量的特殊情况的特殊方法,因此我认为这里没有理由期望或期望稀疏输出。

    也许我不正确,您能否提供更多详细信息,说明为什么您希望嵌入向量本身是稀疏向量?如果是这样,那将是非常不寻常的情况。

    【讨论】:

    • 没有混淆——只是我无法仅通过文字有效地传达我想要的东西。实际上,嵌入查找采用(稀疏)单词 id 序列并生成一个(密集)嵌入向量每个序列。我想要的是生成一个嵌入向量per ID,即每个序列获得多个嵌入向量。我希望稀疏表示不是为了提高效率,而是为了启用嵌入向量的可变长度序列。与论文中一样,然后将它们进行卷积和最大池化。本质上,我想要的“组合”是 1D-conv 和池,而不是“平均值”。
    • 为什么不多次调用该函数,其中每次调用sp_ids 是一个Nx1 id 的稀疏张量。本质上是将用于sp_ids 的一个大Kx<variable length> 张量更改为K 个不同的<variable length>x1 张量,作为函数调用每个输入的返回张量的查找ID。
    猜你喜欢
    • 2020-03-14
    • 1970-01-01
    • 2018-07-19
    • 2015-12-05
    • 2018-08-22
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多