已经有人解释的比较详细了,参考了一些我写在下面:
总结就是一句话:以batch为一个单位,对补齐后的batch进行压缩计算最后解压。减少这个batch中大量pad对输出的影响。
参考:pytorch中如何处理RNN输入变长序列padding - 知乎
https://www.cnblogs.com/lindaxin/p/8052043.html
如果已经看过类似解释的同学,可以直接跳到最后的代码展示。
当我们进行batch个训练数据一起计算的时候,我们会遇到多个训练样例长度不同的情况,这样我们就会很自然的进行padding,将短句子padding为跟最长的句子一样。
比如向下图这样:
但是这会有一个问题,什么问题呢?比如上图,句子“Yes”只有一个单词,但是padding了5的pad符号,这样会导致LSTM对它的表示通过了非常多无用的字符,这样得到的句子表示就会有误差,更直观的如下图:
那么我们正确的做法应该是怎么样呢?
这就引出pytorch中RNN需要处理变长输入的需求了。在上面这个例子,我们想要得到的表示仅仅是LSTM过完单词"Yes"之后的表示,而不是通过了多个无用的“Pad”得到的表示。
主要是用函数torch.nn.utils.rnn.pack_padded_sequence()以及torch.nn.utils.rnn.pad_packed_sequence()来进行的,分别来看看这两个函数的用法。
torch.nn.utils.rnn.pack_padded_sequence():
这