在序列的前零填充和后零填充之间进行选择如何影响结果
Posted
技术标签:
【中文标题】在序列的前零填充和后零填充之间进行选择如何影响结果【英文标题】:How does choosing between pre and post zero padding of sequences impact results 【发布时间】:2018-02-28 03:24:12 【问题描述】:我正在研究 NLP 序列标记问题。我的数据由可变长度序列(w_1, w_2, ..., w_k)
和相应的标签(l_1, l_2, ..., l_k)
组成(在这种情况下,任务被命名为实体提取)。
我打算使用循环神经网络来解决这个问题。由于序列的长度可变,我需要填充它们(我希望批量大小>1)。我可以选择对它们进行预零填充,或者对它们进行零填充。 IE。要么我使每个序列(0, 0, ..., w_1, w_2, ..., w_k)
或(w_1, w_2, ..., w_k, 0, 0, ..., 0)
使每个序列的长度相同。
前填充和后填充之间的选择对结果有何影响?
似乎预填充更常见,但我找不到解释为什么它会更好。由于 RNN 的性质,我觉得这是一个随意的选择,因为它们在时间步长之间共享权重。
【问题讨论】:
对此也感兴趣?有什么好心人有一些不错的答案吗...? 【参考方案1】:通常在 RNN 中,我们获取最终输出或隐藏状态并使用它来进行预测(或执行我们尝试执行的任何任务)。
如果我们在获取最终输出之前向 RNN 发送一堆 0(即您描述的“后”填充),那么句子中最后一个单词的网络隐藏状态可能会被“刷新”在某种程度上,这个词之后的所有零输入。
从直觉上讲,这可能就是预填充更受欢迎/更有效的原因。
【讨论】:
按照同样的逻辑,为什么序列开头的一系列填充标记会在你开始遇到单词之前让你进入“零状态”,因此你实际上什么也学不到,因为预填充状态的归零效应?似乎它会导致同样的问题。 你说得很好。在处理可变序列长度时,使用 Pytorch 的 PackedSequence 可能会更好***.com/questions/51030782/… 这个答案不是忽略了掩蔽是一件事的事实吗?我希望看到一些经过同行评审(理想情况下是大规模)的研究,显示一种方法相对于另一种方法的实际好处。另外,TF、Keras 默认有 post 和 recommend it,CUDNN 做 postpadding,而 Huggingface Transformers 只支持 postpadding,所以我真的会挑战 prepadding 更受欢迎。 Pytorch doesnt even support 正在预填充。 我的模型在后填充中根本没有学到任何东西。它为所有样本输出相同的值。在调整所有其他超参数的艰苦过程之后,我发现将填充类型更改为预填充可以修复它。这很奇怪,因为 mask_zero 设置为 True。我不认为填充类型会产生如此剧烈的影响。【参考方案2】:这篇论文(https://arxiv.org/pdf/1903.07288.pdf)研究了填充类型对 LSTM 和 CNN 的影响。他们发现,与 LSTM 中的 pre-padding 相比,post-padding 的准确率大大降低(接近一半),尽管 CNN 没有显着差异(post-padding 只是稍微差一点)。
对 RNN 的一个简单/直观的解释是,后填充似乎会给从序列中学到的内容添加噪声,并且 RNN 没有更多的时间步可以从这种噪声中恢复。然而,通过预填充,RNN 能够更好地适应开始时添加的零噪声,因为它会随着时间的推移从序列中学习。
我认为社区需要进行更彻底的实验,以更详细地解释填充如何影响性能。
我始终建议使用 pre-padding 而不是 post-padding,即使对于 CNN,除非问题特别需要 post-padding。
【讨论】:
以上是关于在序列的前零填充和后零填充之间进行选择如何影响结果的主要内容,如果未能解决你的问题,请参考以下文章
是否应该对可变长度序列上的 RNN 注意力权重进行重新归一化以“掩盖”零填充的影响?
如何在 Swift 的 UIScrollView 中的视图之间添加填充? [关闭]