Neural network 基于十亿字语言模型基准的语言模型困惑度计算

Neural network 基于十亿字语言模型基准的语言模型困惑度计算,neural-network,deep-learning,lstm,recurrent-neural-network,language-model,Neural Network,Deep Learning,Lstm,Recurrent Neural Network,Language Model,最近,我一直在尝试基于此实现RNNLM。 有一个与一些LSTM分解技巧有关的示例,但与作者最初的实现类似 序言部分 1) 将数据集拆分为文件,然后在训练时对文件行进行洗牌,并在测试时按顺序馈送。(): 2) 批次是连续形成的 *符号表示句子的开始\结束。每个矩阵代表一个巴赫。因此: 如果句子比num_步骤长,它将在同一行的下一批中继续 如果句子较短,则批处理行将填充其他句子 3) 他们计算了一批平均损失。num_steps-LSTM的内存。 4) LSTM单元在每次训练迭代后更新,并在评估

最近,我一直在尝试基于此实现RNNLM。 有一个与一些LSTM分解技巧有关的示例,但与作者最初的实现类似

序言部分 1) 将数据集拆分为文件,然后在训练时对文件行进行洗牌,并在测试时按顺序馈送。():

2) 批次是连续形成的

*符号表示句子的开始\结束。每个矩阵代表一个巴赫。因此:

  • 如果句子比num_步骤长,它将在同一行的下一批中继续

  • 如果句子较短,则批处理行将填充其他句子

  • 3) 他们计算了一批平均损失。num_steps-LSTM的内存。

    4) LSTM单元在每次训练迭代后更新,并在评估时归零

    他们将其声明为局部变量

    然后是在火车时刻。在评估的时候

    5) 在评估时,作者通过以下方式计算困惑度():

    这意味着他们测量批次平均困惑度

    话虽如此,我有两个主要问题

    问题
  • 考虑到序言1)、2)和4) 为什么批次是这样形成的? LSTM单元不会在每个句子后被清零,因此它会保留对前一个句子的记忆

    在上面的示例中,当神经网络处理批处理时№1.排队№2对于单词“Half”,它记住单词Music和start\end标记的上下文。 如果句子不是混排的,而是真实的文本,但它们是混排的,彼此之间没有联系,这可能是有意义的

    我实现了这两种方法,无限批处理提供了更好的性能

  • 考虑到序言3)和5)
  • 为什么我们要估计批次平均困惑度? 考虑到第一个问题,我不清楚当我们以这种方式衡量困惑时,我们是否真的可以估计我们的模型有多好。 但句子平均困惑似乎更有效

    如果我的逻辑有缺陷,如果你能指出,我将不胜感激

    # deterministic at test time, non deterministic at train time
    if not self._deterministic:
        random.shuffle(lines)
    
    # loss_shape = [batch_size * num_steps]
    # 1D tensor, reshaped 2d tensor with dims of [batch_size, num_steps]
    loss = tf.reduce_mean(loss)
    
    for i, (x, y) in enumerate(data_iterator):
        # get a batch
        loss = sess.run(model.loss, {model.x: x, model.y: y})
        loss_nom += loss
        loss_den += 1
        loss = loss_nom / loss_den
        sys.stdout.write("%d: %.3f (%.3f) ... " % (i, loss, np.exp(loss)))
        sys.stdout.flush()
        sys.stdout.write("\n")