我一直在尝试评估语言模型,我需要跟踪困惑度量。
我尝试的是:由于困惑是2^-J,其中J是交叉熵:
def perplexity(y_true, y_pred):
oneoverlog2 = 1.442695
return K.pow(2.0,K.mean(-K.log(y_pred)*oneoverlog2))但奇怪的是,在几个批次的训练过程中,这是无限的。
有没有什么错误的实现方式或者其他方式来实现perplexity?
发布于 2017-06-22 19:15:36
你在计算交叉熵公式,这个公式对于y_pred=0来说是未定义的,而且它在数值上是不稳定的。
我建议您使用tf.sparse_cross_entropy_with_logits,而不是编写您自己的公式。该函数为您处理数值不稳定问题和输入为零的情况。
如果你真的想自己写公式,可以在t_pred中添加少量的值,以使其不同于0,或者从非常小的值和1中裁剪y_pred。
发布于 2018-12-01 04:00:11
我已经提出了两个版本,并附上了相应的源代码,请随时查看链接。
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发布于 2019-05-14 18:18:12
我已经在这个主题上做了一些研究,我想我可以在这个问题上提供一些启发。
如果你想使用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)))https://stackoverflow.com/questions/44697318
复制相似问题