如何在序列的前后填充之间进行选择会影响结果

lan*_*lde 9 performance machine-learning recurrent-neural-network

我正在研究NLP序列标记问题.我的数据由(w_1, w_2, ..., w_k)具有相应标签的可变长度序列组成(l_1, l_2, ..., l_k)(在这种情况下,任务被命名为实体提取).

我打算用回归神经网络解决这个问题.由于序列长度可变,我需要填充它们(我希望批量大小> 1).我可以选择预先填零它们,或者将它们填充为零.即要么我让每个序列(0, 0, ..., w_1, w_2, ..., w_k)(w_1, w_2, ..., w_k, 0, 0, ..., 0)使得每个序列的lenght是一样的.

如何在填充前后填充影响结果?

似乎预填充更常见,但我无法找到解释为什么它会更好.由于RNN的性质,它对我来说是一种随意的选择,因为它们跨时间步长共享权重.

nlm*_*lml 11

通常在 RNN 中,我们获取最终输出或隐藏状态并使用它来进行预测(或执行我们尝试执行的任何任务)。

如果我们在获取最终输出之前向 RNN 发送一堆 0(即您所描述的“后”填充),那么句子中最后一个单词处的网络隐藏状态可能会在某种程度上被“冲掉”通过这个词之后的所有零输入。

如此直观,这可能就是预填充更受欢迎/更有效的原因。

  • 按照同样的逻辑,为什么序列开始时的一系列填充标记本质上会让你在开始遇到单词之前进入“零状态”,因此你实际上无法学到任何东西,因为状态的归零效应预填充?似乎它会导致同样的问题。 (4认同)
  • 这个答案是否忽略了掩蔽是一个事实?我希望看到一些经过同行评审(最好是大规模)的研究,以显示一种方法相对于另一种方法的实际好处。另外,TF、Keras 都默认使用 post 并[推荐](https://www.tensorflow.org/guide/keras/masking_and_padding#padding_sequence_data),CUDNN 会进行 postpadding,而 Huggingface Transformers 仅支持 postpadding,所以我会真正挑战预填充更流行。Pytorch [甚至不支持](https://github.com/pytorch/pytorch/issues/10536) 现在预填充。 (2认同)

Jaf*_*ado 6

这篇论文(https://arxiv.org/pdf/1903.07288.pdf)研究了padding类型对LSTM和CNN的影响。他们发现,与 LSTM 中的预填充相比,后填充的准确度要低得多(接近一半),尽管 CNN 没有显着差异(后填充只是稍微差一点)。

对 RNN 的一个简单/直观的解释是,后填充似乎会随着时间的推移向从序列中学到的内容添加噪声,并且 RNN 没有更多的时间步长来从该噪声中恢复。然而,通过预填充,RNN 能够随着时间的推移从序列中学习,从而更好地适应开始时添加的零噪声。

我认为社区需要进行更彻底的实验,以更详细地解释填充如何影响性能。

我总是建议使用预填充而不是后填充,即使对于 CNN 也是如此,除非问题特别需要后填充。