【问题标题】:Embedding lookup table doesn't mask padding value嵌入查找表不会掩盖填充值
【发布时间】:2016-09-12 07:25:02
【问题描述】:
我正在使用 embedding_lookup 操作来为我的文档中的每个标记生成密集向量表示,这些表示将馈送到卷积神经网络(网络架构类似于 WildML article 中的架构)。
一切正常,但是当我在文档中插入填充值时,嵌入查找也会为此标记生成一个向量。我认为这种方法可以改变分类任务的结果。我想要实现的目标类似于 Torch LookupTableMaskZero 所做的。
1) 我想做什么是正确的吗?
2) 是否已经实现了这样的功能?
3)如果没有,我该如何屏蔽填充值以防止为它生成相应的向量?
提前谢谢你,
亚历山德罗
【问题讨论】:
标签:
python
python-3.x
machine-learning
tensorflow
【解决方案1】:
@亚历山德罗·苏利亚
我认为这个功能很有用,不幸的是 tf 目前不支持。
获得相同结果但速度较慢的一种解决方法是查找两次。
如下所示
lookup_result = tf.nn.embedding_lookup(emb, index)
masked_emb = tf.concat(0, [tf.zeros([1, 1]),
tf.ones([emb.get_shape()[0] - 1, 1])
mask_lookup_result = tf.nn.embedding_lookup(masked_emb, index)
lookup_result = tf.mul(lookup_result, mask_lookup_result)
【解决方案2】:
似乎在rnn模型中,我们不需要屏蔽填充值,只要我们屏蔽损失(无论我们是否屏蔽输入填充,损失都是一样的,我通过运行测试代码得到结果) !
当然,当tf.nn.dynamic_rnn 中的sequence_len 参数未传递时,零填充可能会加速零乘法的计算。
最后,如果模型会做序列间的交互(比如CNN,卷积可能会影响padding embedding),零填充embedding是必要的。