我正在查看RNN语言模型的代码。我很困惑 1)如何构建训练对(x,y),然后 2)如何计算损失。该代码借鉴了Tensorflow RNN教程( reader 模块)。
在阅读器模块中,定义了一个生成器ptb_iterator。它将数据作为一个序列接收,产生 x,y对,根据批量大小和您希望“展开”RNN的步骤数。最好先看一下整个定义,但让我感到困惑的是:
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)这是正确的方法吗?如果没有这样做,那么对是:
OR
2)最后,假设这些对在reader模块中生成,那么在训练时,计算的损失是否会反映RNN在一定范围内的表现展开的步骤而不是指定的num_steps
?
例如,模型将对x = 3(来自x = [3,4])进行预测,而不考虑其前面的2(即将RNN展开一步而不是两步)。
答案 0 :(得分:0)
Re(1),目标是序列大小远大于2,然后你不想复制整个数据集N次,因为你没有太多的统计能力。 Re(2)它是训练时使用的近似值;在预测时,你应该用整个序列进行预测。