当前位置: 首页 > 面试题库 >

如何计算张量流中RNN的困惑度

燕英逸
2023-03-14
问题内容

我正在运行单词RNN的张量流的单词RNN实现

如何计算RNN的困惑度。

以下是训练中的代码,显示每个时期的训练损失和其他情况:

for e in range(model.epoch_pointer.eval(), args.num_epochs):
        sess.run(tf.assign(model.lr, args.learning_rate * (args.decay_rate ** e)))
        data_loader.reset_batch_pointer()
        state = sess.run(model.initial_state)
        speed = 0
        if args.init_from is None:
            assign_op = model.batch_pointer.assign(0)
            sess.run(assign_op)
            assign_op = model.epoch_pointer.assign(e)
            sess.run(assign_op)
        if args.init_from is not None:
            data_loader.pointer = model.batch_pointer.eval()
            args.init_from = None
        for b in range(data_loader.pointer, data_loader.num_batches):
            start = time.time()
            x, y = data_loader.next_batch()
            feed = {model.input_data: x, model.targets: y, model.initial_state: state,
                    model.batch_time: speed}
            summary, train_loss, state, _, _ = sess.run([merged, model.cost, model.final_state,
                                                         model.train_op, model.inc_batch_pointer_op], feed)
            train_writer.add_summary(summary, e * data_loader.num_batches + b)
            speed = time.time() - start
            if (e * data_loader.num_batches + b) % args.batch_size == 0:
                print("{}/{} (epoch {}), train_loss = {:.3f}, time/batch = {:.3f}" \
                    .format(e * data_loader.num_batches + b,
                            args.num_epochs * data_loader.num_batches,
                            e, train_loss, speed))
            if (e * data_loader.num_batches + b) % args.save_every == 0 \
                    or (e==args.num_epochs-1 and b == data_loader.num_batches-1): # save for the last result
                checkpoint_path = os.path.join(args.save_dir, 'model.ckpt')
                saver.save(sess, checkpoint_path, global_step = e * data_loader.num_batches + b)
                print("model saved to {}".format(checkpoint_path))
    train_writer.close()

问题答案:

您正在引用的项目使用sequence_to_sequence_loss_by_example,它返回交叉熵损失。因此,为了计算训练的困惑度,您只需要像这里解释的那样对损失进行幂运算即可。

train_perplexity = tf.exp(train_loss)

我们必须使用e而不是2作为底数,因为TensorFlow用自然对数来衡量交叉熵损失(TF
Documentation
)。谢谢@Matthias
Arro和@Colin Skow的提示。

当我们基于Q制定编码方案时,两个概率分布P和Q的交叉熵告诉我们编码P事件所需的最小平均位数。因此,P是真实分布,通常我们不这样做。不知道。我们希望找到一个尽可能接近P的Q,这样我们就可以开发出一种很好的编码方案,每个事件使用的位数尽可能少。

我不应该说位,因为如果在交叉熵的计算中使用基数2,我们只能使用位作为度量。但是TensorFlow使用自然对数,因此让我们来测量 nat中
的交叉熵。

假设我们有一个错误的语言模型,该模型说明词汇表中的每个标记(字符/单词)都很可能成为下一个标记。对于1000个令牌的词汇表,此模型将具有
log(1000)= 6.9 nats 的交叉熵。在预测下一个令牌时,它必须在每个步骤中在1000个令牌之间进行统一选择。

更好的语言模型将确定更接近P的概率分布Q。因此,交叉熵较低-我们可能会得到3.9 nats的交叉熵。如果现在要测量困惑度,我们只需对交叉熵求幂:

exp(3.9)= 49.4

因此,在我们为之计算损失的样本上,好的模型非常复杂,就好像它必须在大约50个代币中统一选择一样。



 类似资料:
  • 我下面的代码产生了常规的tensorflow模型,但当我试图将其转换为tensorflow lite时,它不起作用,我遵循了以下文档。 https://www.tensorflow.org/tutorials/estimator/linear1 https://www.tensorflow.org/lite/guide/get_started 错误信息 文档摘录 TensorFlow Lite转换

  • 问题内容: 我试图在Spring中了解BeanPostProcessor,但我不了解它的作用。BeanPostProcessor定义在这些点上调用的两个方法是否正确: 初始化之前(init方法或afterPropertiesSet),但是实例已创建。 在调用init方法或afterPropertiesSet方法之后 那是对的吗?给定示例和第118页上的文字,这进一步令人困惑。我认为我不能从文本中复

  • 我试图在张量流图中使用条件随机场损失。 我正在执行序列标记任务: 我有一系列元素作为输入。每个元素可以属于三个不同类中的一个。类以一种热编码方式表示:属于类0的元素由向量[表示。 我的输入标签(y)有大小(xx)。 我的网络产生相同形状的日志。 假设我所有的序列都有长度4。 这是我的代码: 我得到以下错误: 文件“/usr/local/lib/python2.7/dist-packages/ten

  • 我正在学习DDD概念,为了加强我的理解,我正在研究一些现实世界的例子。 我知道一个聚合应该只有一个通过根实体的入口点,一个聚合应该只有一个存储库(如果我完全理解错了,请纠正我) 现在假设有特定类型的消耗品,并且这些消耗品是从配送中心发送的。发送特定类型的消耗品取决于它们的数量,我的意思是,如果其中一个消费者对A型和B型的临界数量为10,并且这些项目的数量低于10,那么配送中心发送A型和B型消耗品。

  • 问题内容: 我有两个标准化张量,我需要计算这些张量之间的余弦相似度。如何使用TensorFlow做到这一点? 问题答案: 这将完成工作: 此打印