在seq2seq模型中,使用垫子使桶中的所有序列具有相同的长度。除此之外,似乎没有对垫子进行特殊处理:
编码器对填充物进行编码,以及基本解码器w/o注意解码使用最后一种编码--编码解码器的填充--注意填充输入的隐藏状态--如果能澄清这一点将是非常有帮助的:实际上,这些填充仅仅是一个特殊的id/嵌入,而当前的seq2seq实现对待它们就像对待其他嵌入一样?并且不需要特殊的机制来忽略这些填充,例如,在编码包含填充的序列时;或者使用基于注意力的解码器解码包含填充的序列?所以在填充之后,对填充没有什么特别的处理,我们可以假装填充只是另一个嵌入(除了使用target_weights进行加权x熵之外)?
如果上述情况属实,那么在测试一个经过训练的模型时,是否需要填充(因为在测试时,每个句子都是单独解码的,而不是成批的)?-从代码看,在测试时,输入语句仍然是先插入后填充的吗?
发布于 2016-06-04 05:47:09
我认为你的基本前提是正确的:模型对填充符号的处理方式与任何其他符号没有区别。然而,当填充数据张量时,填充总是出现在“EOS”符号之后的解码器训练示例的末尾,以及编码器训练示例的开头(因为编码器序列被反转)。
据推测,这个模型将学习到编码器端的填充没有真正的语义信息,因为它不会与任何其他词相关.我想当注意力被考虑进去时,它可以传达一些关于序列长度的信息,但这并不是一件坏事。桶法是一种限制多余填充量的尝试。
在解码器端,模型将很快了解填充总是发生在'EOS‘符号之后,因此您忽略了'EOS’符号发出后的所有内容。
填充主要是有用的,因为当批量运行张量时,当测试一个时间的时候,所有的序列都必须是相同的size...so。但是,在测试大型验证集时,在batches...with填充中运行仍然是有用的。
(我本人对UNK符号还有更多的疑问和担忧。)
https://stackoverflow.com/questions/35561665
复制相似问题