我一直在尝试评估语言模型,我需要跟踪困惑度量标准。
我尝试的是:因为困惑是2 ^ -J,其中J是交叉熵:
def perplexity(y_true, y_pred):
oneoverlog2 = 1.442695
return K.pow(2.0,K.mean(-K.log(y_pred)*oneoverlog2))
但是,在几个批次的训练中,这奇怪地变为无限。
实施或其他任何实现困惑的方法是否有问题?
答案 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)))