Machine learning 如何在Keras中实现困惑?

Machine learning 如何在Keras中实现困惑?,machine-learning,tensorflow,nlp,deep-learning,keras,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)) 但奇怪的是,在几个批次的训练中,这一点会无限大 实现或任何其他实现困惑的方法是否有错误?您正在计算交叉熵公式,该公式未定义为y_pred=0,并且在数值

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

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

def perplexity(y_true, y_pred):
        oneoverlog2 = 1.442695
        return K.pow(2.0,K.mean(-K.log(y_pred)*oneoverlog2))
但奇怪的是,在几个批次的训练中,这一点会无限大


实现或任何其他实现困惑的方法是否有错误?

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

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


如果你真的想自己编写这个公式,可以在
t_pred
中加入少量,使其与0不同,或者将
y_pred
从非常小的1中剪裁出来。

你在计算交叉熵公式,它对于
y_pred=0
是未定义的,而且在数值上是不稳定的

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


如果你真的想自己编写这个公式,可以在
t_pred
中添加少量,以使其与零不同,或者将
y_pred
从一个非常小的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

抄袭自我在

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

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

抄袭了我在

上的答案,我一直在研究这个话题,我想我可以对此有所启发

如果你想用Keras计算困惑度,根据你的定义,应该是这样的:

def ppl_2(y_true,y_pred):
返回K.pow(2.0,K.mean(K.categorical_crossentropy(y_true,y_pred)))
然而,基数是e,而不是2。那么困惑是:

def ppl_e(y_true,y_pred):
返回K.exp(K.mean(K.categorical\u crossentropy(y\u true,y\u pred)))

我一直在研究这个话题,我想我可以对此有所启发

如果你想用Keras计算困惑度,根据你的定义,应该是这样的:

def ppl_2(y_true,y_pred):
返回K.pow(2.0,K.mean(K.categorical_crossentropy(y_true,y_pred)))
然而,基数是e,而不是2。那么困惑是:

def ppl_e(y_true,y_pred):
返回K.exp(K.mean(K.categorical\u crossentropy(y\u true,y\u pred)))

谢谢你的回答。因此,最后,困惑函数将是K.pow(2.0,K.mean(K.nn.softmax\u cross\u entropy\u with_logits(y\u true,y\u pred,name=None)))。你能看看这是否正确吗?非常感谢:)我从未使用过Keras,但是如果
K
tf
相同,那么它是有意义的。只需确保
y_pred
未标度即可。Unscaled=它是一组线性神经元的输出,而不是应用于这些神经元的softmax函数的输出。感谢回复。是的,K=tf。y_pred应该是无标度的,不管是什么原因,我认为logits意味着softmax的输出,所以我有一个softmax层来生成最终的预测(在我的例子中,softmax覆盖词汇表单词)。你能在这里解释一下吗?非常感谢。softmax是输出层的激活函数(为每个类生成“概率”)。移除它,然后使用tensorflow方法计算softmax+交叉熵。是的,logits通常表示“logistic回归输出”,而在此上下文中,未标度logits表示没有任何激活功能的输出神经元。tensorflow方法以更好(且数值稳定)的方式为您计算softmax,就像logisti回归一样。但是,如果我解决了你的问题,请记住将我的答案标记为已接受!谢谢你的回答。因此,最后,困惑函数将是K.pow(2.0,K.mean(K.nn.softmax\u cross\u entropy\u with_logits(y\u true,y\u pred,name=None)))。你能看看这是否正确吗?非常感谢:)我从未使用过Keras,但是如果
K
tf
相同,那么它是有意义的。只需确保
y_pred
未标度即可。Unscaled=它是一组线性神经元的输出,而不是应用于这些神经元的softmax函数的输出。感谢回复。是的,K=tf。y_pred应该是无标度的,不管是什么原因,我认为logits意味着softmax的输出,所以我有一个softmax层来生成最终的预测(在我的例子中,softmax覆盖词汇表单词)。你能在这里解释一下吗?非常感谢。softmax是输出层的激活函数(为每个类生成“概率”)。移除它,然后使用tensorflow方法计算softmax+交叉熵。是的,logits通常表示“logistic回归输出”,而在此上下文中,未标度logits表示没有任何激活功能的输出神经元。tensorflow方法以更好(且数值稳定)的方式为您计算softmax,就像logisti回归一样。但是,如果我解决了你的问题,请记住将我的答案标记为已接受!