如何在Keras中实现困惑?

时间:2017-06-22 10:52:48

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

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

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

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

但是,在几个批次的训练中,这奇怪地变为无限。

实施或其他任何实现困惑的方法是否有问题?

3 个答案:

答案 0 :(得分:3)

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

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

如果你真的想自己编写公式,可以向t_pred添加一小部分,以使其与零不同,或者从非常小的1和{1}中剪切y_pred

答案 1 :(得分:1)

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

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的答案中复制

答案 2 :(得分:0)

我已经对该主题进行了一些研究,我认为可以对此有所启发。

如果您想使用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)))