【问题标题】:How to Implement Perplexity in Keras?如何在 Keras 中实现 Perplexity?
【发布时间】:2017-11-25 14:38:50
【问题描述】:

我一直在尝试评估语言模型,我需要跟踪困惑度指标。

我尝试的是:因为困惑度是 2^-J,其中 J 是交叉熵:

def perplexity(y_true, y_pred):
        oneoverlog2 = 1.442695
        return K.pow(2.0,K.mean(-K.log(y_pred)*oneoverlog2))

但奇怪的是,在几批训练期间,这会变成无穷大。

实现或任何其他实现困惑的方式有问题吗?

【问题讨论】:

    标签: machine-learning tensorflow nlp deep-learning keras


    【解决方案1】:

    我一直在研究这个主题,我想我可以对此有所了解。

    如果您想使用 Keras 计算困惑度并根据您的定义,它会是这样的:

    def ppl_2(y_true, y_pred):
        return K.pow(2.0, K.mean(K.categorical_crossentropy(y_true, y_pred)))
    

    但是基数 should be e 不是 2。那么困惑将是:

    def ppl_e(y_true, y_pred):
        return K.exp(K.mean(K.categorical_crossentropy(y_true, y_pred)))
    

    【讨论】:

      【解决方案2】:

      我提供了两个版本并附上了它们的对应来源,请随时查看链接。

      def perplexity_raw(y_true, y_pred):
          """
          The perplexity metric. Why isn't this part of Keras yet?!
          https://stackoverflow.com/questions/41881308/how-to-calculate-perplexity-of-rnn-in-tensorflow
          https://github.com/keras-team/keras/issues/8267
          """
      #     cross_entropy = K.sparse_categorical_crossentropy(y_true, y_pred)
          cross_entropy = K.cast(K.equal(K.max(y_true, axis=-1),
                                K.cast(K.argmax(y_pred, axis=-1), K.floatx())),
                        K.floatx())
          perplexity = K.exp(cross_entropy)
          return perplexity
      
      def perplexity(y_true, y_pred):
          """
          The perplexity metric. Why isn't this part of Keras yet?!
          https://stackoverflow.com/questions/41881308/how-to-calculate-perplexity-of-rnn-in-tensorflow
          https://github.com/keras-team/keras/issues/8267
          """
          cross_entropy = K.sparse_categorical_crossentropy(y_true, y_pred)
          perplexity = K.exp(cross_entropy)
          return perplexity
      

      复制自我在Check perplexity of a Language Model的回答

      【讨论】:

        【解决方案3】:

        您正在计算 y_pred=0 未定义的交叉熵公式,而且它的数值不稳定。

        我建议您使用tf.sparse_cross_entropy_with_logits 而不是自己编写公式。该函数会为您处理数值不稳定问题以及输入为零的情况。

        如果您真的想自己编写公式,请将少量添加到 t_pred 以使其不为零或将 y_pred 剪裁为非常小的和 1。

        【讨论】:

        • 感谢您的回答。所以,最后,困惑函数将是 K.pow(2.0, K.mean(K.nn.softmax_cross_entropy_with_logits(y_true, y_pred, name=None)))。你能看看这是否正确吗?非常感谢:)
        • 我从未使用过 Keras,但如果 Ktf 相同,是的,这是有道理的。请确保 y_pred 未缩放。未缩放 = 它是一组线性神经元的输出,而不是应用于这些神经元的 softmax 函数的输出
        • 非常感谢您的回复。是的,K = tf。 y_pred 应该是未缩放的,无论出于何种原因,我认为 logits 意味着 softmax 的输出,所以我有一个 softmax 层来产生最终预测(在我的例子中,是词汇表上的 softmax)。你能在这里解释一下吗?非常感谢。
        • softmax 是输出层的激活函数(为每个类产生“概率”)。删除它,然后使用 tensorflow 方法计算 softmax + 交叉熵。是的,logits 通常表示“逻辑回归输出”,而在这种情况下未缩放的 logits 表示没有任何激活函数的输出神经元。 tensorflow 方法以更好(且数值稳定)的方式为您计算 softmax,就像logisti 回归一样。但是,如果我解决了您的问题,请记住将我的答案标记为已接受!
        猜你喜欢
        • 2023-03-28
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        • 2017-03-07
        • 2017-06-28
        • 2019-07-03
        • 2017-09-30
        • 2021-02-21
        相关资源
        最近更新 更多