在 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 b
、a b c
)。然后,如果您只进行前面提到的 "last word" 预测,您最终会得到与公式相同的监督,其中 y
是整个序列右移。但这在计算上是浪费的——你不想在 a b
和 a 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 前向传播。
假设我正在尝试在 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 b
、a b c
)。然后,如果您只进行前面提到的 "last word" 预测,您最终会得到与公式相同的监督,其中 y
是整个序列右移。但这在计算上是浪费的——你不想在 a b
和 a 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 前向传播。