在seq2seq模型中,应用填充以使存储桶中的所有序列具有相同的长度。除此之外,看起来似乎没有对填充应用特殊处理:
编码器也对填充进行编码 基本解码器没有注意使用编码填充的最后编码进行解码 注意力的解码器也会关注填充输入的隐藏状态 如果可以澄清这将是非常有用的:是否真的,基本上填充只是一个特殊的id /嵌入,而当前的seq2seq实现就像其他嵌入一样处理它们?并且不需要特殊的机制来忽略这些填充,例如在编码包含填充的序列时;或使用基于注意力的解码器解码包含填充的序列?所以在填充之后,填充没有什么特别之处,我们可以假装填充只是另一种嵌入(除了使用target_weights进行加权x熵时)?
如果上述情况属实,那么在测试训练模型时,是否需要填充(因为在测试时,每个句子是单独解码而不是批量解码)? ---从代码看起来,在测试时,输入句子仍然先被删除然后填充?
答案 0 :(得分:1)
我认为你的基本前提是正确的:模型不会将填充符号与其他任何符号区别对待。但是,当打包数据张量时,填充总是出现在“EOS”符号之后的解码器训练示例的末尾,并且在编码器训练示例的开头(因为编码器序列被反转)。
据推测,模型会知道编码器端的填充不会带有真正的语义信息,因为它与其他单词的任何内容都不相关......我想它可以传达一些关于序列长度的事情。在,但这不会是一件坏事。存储桶方法是尝试限制多余填充量。
在解码器方面,模型将很快知道填充总是出现在'EOS'符号之后,因此无论如何都会在发出'EOS'符号后忽略所有内容。
填充主要是有用的,因为当批量运行张量时,序列都必须是相同的大小...因此,当一次测试一次时,你真的不需要填充。但是,在测试大型验证集时,使用填充批量运行仍然很有用。
(我自己对 UNK 符号有更多疑问和担忧。)