mindformers.core.PerplexityMetric

查看源文件
class mindformers.core.PerplexityMetric[源代码]

困惑度定义为模型对测试集中每个词分配的负对数概率的指数平均值。对于一个词序列 \(W = (w_1, w_2, \ldots, w_N)\) ,困惑度 (PP) 可以表示为:

\[PP(W) = P(w_1, w_2, \ldots, w_N)^{-\frac{1}{N}} = \sqrt[N]{\frac{1}{P(w_1, w_2, \ldots, w_N)}}\]

其中, \(P(w_1, w_2, \ldots, w_N)\) 表示该序列在模型下的概率。

在实际应用中,困惑度可以重写为:

\[PP(W) = \exp\left(-\frac{1}{N} \sum_{i=1}^{N} \log P(w_i | w_1, w_2, \ldots, w_{i-1})\right)\]

该公式表明,较低的困惑度意味着语言模型性能更好,因为这表示模型对实际的词序赋予了更高的概率。

样例:

>>> import numpy as np
>>> from mindspore import Tensor
>>> from mindformers.core.metric.metric import PerplexityMetric
>>> x = Tensor(np.array([[[0.2, 0.5], [0.3, 0.1], [0.9, 0.6]]]))
>>> y = Tensor(np.array([[1, 0, 1]]))
>>> mask = Tensor(np.array([[1, 1, 1]]))
>>> metric = PerplexityMetric()
>>> metric.clear()
>>> metric.update(x, y, mask)
>>> perplexity = metric.eval()
>>> print(perplexity)
'loss': 0.8262470960617065, 'PPL': 2.284728265028813}
clear()[源代码]

清除局部评估结果。

eval()[源代码]

计算评估结果。

返回:

评估结果字典,包含 loss 和 PPL 分数。

update(*inputs)[源代码]

更新局部评估结果。

参数:
  • *inputs (List) - 逻辑值、标签和输入掩码。其中逻辑值是形状为 \([N,S,W]\) 的张量,数据类型为Float16或Float32;标签和输入掩码是形状为 \([N,S]\) 的张量,数据类型为Int32或Int64。其中 \(N\) 为批次大小, \(S\) 为序列长度, \(W\) 为词表大小。