
我们通常使用困惑度(perplexity)来评价语言模型的好坏。通过理解困惑度,也可以让我们更加深入的理解交叉熵(CrossEntropy)的意义,也可以轻易量化模型的性能。
回顾交叉熵以及多分类问题的损失函数。假设现有
N
N
N 个数据样本,其中样本的标签为
Y
i
(
i
=
1
,
2
,
⋯
,
N
)
Y_i(i=1,2,cdots,N)
Yi(i=1,2,⋯,N),而模型对样本的预测值记为
Y
i
^
(
i
=
1
,
2
,
⋯
,
N
)
widehat{Y_i}(i=1,2,cdots,N)
Yi
(i=1,2,⋯,N),则我们可以计算交叉熵损失:
C
r
o
s
s
E
n
t
r
o
p
y
(
Y
,
Y
^
)
=
−
∑
i
=
1
N
Y
i
l
o
g
(
Y
^
i
)
CrossEntropy(Y,widehat{Y})=-sum_{i=1}^NY_{i}log(widehat{Y}_i)
CrossEntropy(Y,Y
)=−i=1∑NYilog(Y
i)
这个公式并不那么直观,我们再从一个更加具体的例子来体会一下交叉熵损失的计算过程。
在多分类问题中,
Y
i
Y_i
Yi 表示的是一个独热编码(0-1类别)的向量,比如对于三分类的某一个样本标签为:
Y
=
[
0
(
y
1
)
0
(
y
2
)
1
(
y
3
)
]
Y=begin{bmatrix}0 & (y_1) \ 0 & (y_2) \ 1 & (y_3) \ end{bmatrix}
Y=⎣⎡001(y1)(y2)(y3)⎦⎤,而预测值
Y
^
widehat{Y}
Y
表示多类别预测的概率值:
Y
=
[
y
1
^
y
2
^
y
3
^
]
Y=begin{bmatrix}hat{y_1} \ hat{y_2} \ hat{y_3} \ end{bmatrix}
Y=⎣⎡y1^y2^y3^⎦⎤,无论是二分类问题,还是多分类问题,属于的那个类别是1,其余是0。所以上面的交叉熵计算式可以写成:
J
(
θ
)
=
−
∑
i
=
1
N
Y
i
l
o
g
(
Y
^
i
)
=
1
∗
−
l
o
g
(
y
^
c
)
J(theta)=-sum_{i=1}^NY_{i}log(widehat{Y}_i)=1*-log(widehat{y}_c)
J(θ)=−i=1∑NYilog(Y
i)=1∗−log(y
c)
注意上式中,我们假设
Y
Y
Y 是一个独热编码(one-hot) 向量,则除了一个1以外,其他是 0 的元素会把等式后面的
l
o
g
(
y
^
)
log(widehat{y})
log(y
) 的归零,只剩下一个
y
^
c
widehat{y}_c
y
c(
y
c
=
1
y_c=1
yc=1)。例如在上面的矩阵中,只剩下
y
^
3
hat{y}_3
y^3。
假如我们的模型没有学到任何东西,输入一个数据样本,模型输出的每个分类的概率是均等的,比如说一个分类器,输入一张水果的照片,要输出这张图片是苹果,还是橙子,还是梨。结果模型输出的是苹果的概率为
1
3
dfrac{1}{3}
31,橙子的概率为
1
3
dfrac{1}{3}
31,梨的概率也是
1
3
dfrac{1}{3}
31,我们如果从实际经验出发,对于一个未知事物的判断,都认为每种情况的概率都是均等的,而这相当于没有做出任何判断,就像在没有先验知识的情况下,去做一道高考选择题,我们认为每个选项的概率各占
1
4
dfrac{1}{4}
41。那么在这种情况下,
y
^
c
=
1
N
widehat{y}_c=dfrac{1}{N}
y
c=N1,其中
N
N
N 表示类别标签数。我们再将这个导入上面的式子,就可以得到:
J
(
θ
)
=
−
l
o
g
(
1
N
)
=
−
(
l
o
g
(
1
)
−
l
o
g
(
N
)
)
=
l
o
g
(
N
)
J(theta)=-log(frac{1}{N})=-(log(1)-log(N))=log(N)
J(θ)=−log(N1)=−(log(1)−log(N))=log(N)
如果某次模型训练的损失函数:
J
(
θ
)
≥
l
o
g
(
N
)
J(theta) ge log(N)
J(θ)≥log(N),我们就可以认为是无效训练,就像你面对未知的事物做出判断时,每一种情况都是等概率的,我们认为这样的模型是没有任何意义的。
再打个比方,有人问你明天的天气是下雨还是不下雨,你给出的回答是明天有50%的概率下雨,50%的概率不下雨,这时别人认为你的意见是毫无参考价值的,因为投掷一枚硬币来做决策和你的回答好像没有什么差别。当然,比这种情况更差的就是,把选择题的选择为A、B、C、D,但是有些人还要去选E、F,这种情况就更差了,我们认为模型连正常人的思维都不具备。
再对两边同时取
e
e
e 为底的指数,我们就可以得到无效学习的情况下:
e
J
(
θ
)
≥
N
e^{J(theta)} ge N
eJ(θ)≥N
这个结果说明,如果模型学到了东西,那么
e
J
(
θ
)
e^{J(theta)}
eJ(θ) 的值应该小于类别数
N
N
N。我们将这个就称为困惑度。
从上面的讨论出发,我们给出困惑度(perplexity)的定义,即困惑度是对交叉熵损失函数做指数运算后得到的值。
J
(
θ
)
=
−
∑
i
=
1
N
Y
i
l
o
g
(
Y
^
i
)
p
e
r
p
l
e
x
i
t
y
=
e
J
(
θ
)
=
e
−
l
o
g
(
y
c
)
=
1
y
c
J(theta)=-sum_{i=1}^NY_{i}log(widehat{Y}_i) \ perplexity=e^{J(theta)}=e^{-log(y_c)}=dfrac{1}{y_c}
J(θ)=−i=1∑NYilog(Y
i)perplexity=eJ(θ)=e−log(yc)=yc1
困惑度就是对样本标签类别的预测概率的倒数。特别地
- 最佳情况下,模型总是把标签类别的概率预测为1,此时困惑度为1(最小);
- 最坏情况下,模型总是把标签类别的概率预测为0,此时困惑度为正无穷(最差);
- 基线情况下,模型总是预测所有类别的概率都相同,此时困惑度为类别个数;
显然,任何一个有效模型的困惑度必须小于类别个数。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)