在自然语言处理中,困惑度是用来衡量语言模型优劣的一个方法。它的值是对交叉熵损失函数做指数运算后得到的结果。
交叉熵损失函数
单个训练样本的损失:
l o s s = − 1 n ∑ i = 1 n y i l o g y i ^ = − l o g y j ^ loss=-\frac{1}{n}\sum_{i=1}^{n}y_{i}log\hat{y_{i}}=-log\hat{y_{j}} loss=−n1∑i=1nyilogyi^=−logyj^
n n n是标签数量,在语言模型中指的是字符总数。 y i ^ \hat{y_{i}} yi^是预测概率, y i y_{i} yi是预测正确概率。假如标签数为3,每个样本只有一个标签,正确预测结果为类别1,则 y 1 = 1 y_{1}=1 y1=1, y 2 = 0 y_{2}=0 y2=0, y 3 = 0 y_{3}=0 y3=0,代入公式得到 l o s s = − l o g y 1 ^ loss=-log\hat{y_{1}} loss=−logy1^。可以看到交叉熵损失函数只关心预测正确的概率。
困惑度
p e r p l e x i t y = e l o s s = 1 y i ^ perplexity=e^{loss}=\frac{1}{\hat{y_{i}}} perplexity=eloss=yi^1
- 最佳情况下,模型总是把标签类别的概率预测为1,此时困惑度为1;
- 最坏情况下,模型总是把标签类别的概率预测为0,此时困惑度为正无穷;
- 基线情况下,模型总是预测所有类别的概率都相同。 y i ^ = 1 n \hat{y_{i}}=\frac{1}{n} yi^=n1, p e r p l e x i t y = n perplexity=n perplexity=n。此时困惑度为类别个数。
显然,任何一个有效模型的困惑度必须小于类别个数。在语言模型中,困惑度必须小于词典大小vocab_size
。