0

我正在查看 RNN 语言模型的代码。我对1)如何构造训练对(x,y)以及随后2)如何计算损失感到困惑。该代码借鉴了 Tensorflow RNN 教程(阅读器模块)。

在阅读器模块中,定义了一个生成器ptb_iterator。它将数据作为一个序列接收,并根据批量大小和您希望“展开”RNN 的步骤数产生x,y 对。最好先查看整个定义,但让我感到困惑的部分是:

for i in range(epoch_size):
  x = data[:, i*num_steps:(i+1)*num_steps]
  y = data[:, i*num_steps+1:(i+1)*num_steps+1]
  yield (x, y)

记录为:

*Yields:
 Pairs of the batched data, each a matrix of shape [batch_size, num_steps].
 The second element of the tuple is the same data time-shifted to the
 right by one.*

因此,如果理解正确,对于数据序列[1 2 3 4 5 6]num_steps = 2然后对于随机梯度下降(即 batch_size=1),将生成以下对:

  1. x=[1,2] , y=[2,3]
  2. x=[3,4] , y=[5,6]

1)这是正确的方法吗?如果不这样做,那么对是:

  1. x=[1,2] , y=[2,3]
  2. x=[2,3] , y=[3,4] ... # 允许更多数据点

或者

  1. x=[1,2] , y=[3]
  2. x=[2,3] , y=[4] ... # 确保所有预测都使用上下文长度 = num_steps

2)最后,考虑到这些对是在阅读器模块中生成的,当涉及到训练时,计算的损失会不会反映 RNN 在一系列展开步骤而不是num_steps指定范围内的性能?

例如,模型将预测 x=3(来自 x=[3,4])而不考虑 2 在它之前(即展开 RNN 一步而不是两步)。

4

1 回答 1

1

Re (1),目标是序列大小远大于 2,然后你不想复制整个数据集 N 次,因为你没有得到太多的统计能力。Re (2) 它是在训练时使用的近似值;在预测时,您应该预测整个序列。

于 2016-09-07T21:54:54.863 回答