在 PyTorch 中,训练 RNN 预测给定序列的最后一个单词与预测整个序列移位有什么区别?

In PyTorch, what's the difference between training an RNN to predict the last word given a sequence, vs predicting the entire sequence shifted?

假设我正在尝试在 PyTorch 中训练 RNN 语言模型。假设我迭代了一批单词序列,并且每个训练批次张量具有以下形状:

data.shape = [batch_size, sequence_length, vocab_dim]

我的问题是,只使用每个序列中的最后一个词作为目标标签有什么区别:

X = data[:,:-1]
y = data[:,-1]

并训练使用最后一个词的 softmax 预测来最小化损失,

vs 将目标设置为整个序列右移:

X = data[:,:-1]
y = data[:,1:]

并训练以最小化移位序列中每个预测词的损失总和

正确的做法是什么?我觉得我在网上看过这两个例子。这是否也与循环展开 vs BPTT 有关?

考虑序列预测问题a b c d 您想通过教师强制训练 RNN 的地方。

如果你只使用句子中的最后一个词,你就是在做下面的分类问题(左边是输入;右边是你应该预测的输出):

a b c -> d

对于第二种方法,y 设置为整个序列右移,您正在解决三个分类问题:

a -> b
a b -> c
a b c -> d

预测序列中 中间 单词的任务对于训练有用的 RNN 至关重要(否则,你会知道如何从 c 给定 a b,但在 a).

之后你不知道如何继续

等效的做法是将训练数据定义为完整序列 a b c d 和所有不完整序列(a ba b c)。然后,如果您只进行前面提到的 "last word" 预测,您最终会得到与公式相同的监督,其中 y 是整个序列右移。但这在计算上是浪费的——你不想在 a ba b c 上重新运行 RNN(你从 a b 获得的状态可以在消耗 a b c).

换句话说,"shift y right"的目的是将长度为N的单个序列(a b c d)拆分为N - 1个独立的分类问题形式:"given words up to time t, predict word t + 1",同时只需要一个 RNN 前向传播。