Perplexity(困惑度)

转载请注明出处,谢谢。
#什么是Perplexity(困惑度)?

在信息论中,perplexity(困惑度)用来度量一个概率分布或概率模型预测样本的好坏程度。它也可以用来比较两个概率分布或概率模型。(译者:应该是比较两者在预测样本上的优劣)低困惑度的概率分布模型或概率模型能更好地预测样本。

1.概率分布的困惑度
2.概率模型的困惑度
3.每个分词的困惑度

##1.概率分布的困惑度
定义离散概率分布的困惑度如下:
2H(p)=2−∑xp(x)log⁡2p(x){\displaystyle 2^{H(p)}=2^{-\sum _{x}p(x)\log _{2}p(x)}} 2H(p)=2xp(x)log2p(x)
其中H§是概率分布p的熵,x是样本点。因此一个随机变量X的困惑度是定义在X的概率分布上的(X所有"可能"取值为x的部分)。(译者:x不能包含零测集的点,不然p(x)logp(x)没定义)

一个特殊的例子是k面均匀骰子的概率分布,它的困惑度恰好是k。一个拥有k困惑度的随机变量有着和k面均匀骰子一样多的不确定性,并且可以说该随机变量有着k个困惑度的取值(k-ways perplexed)。(在有限样本空间离散随机变量的概率分布中,均匀分布有着最大的熵)

困惑度有时也被用来衡量一个预测问题的难易程度。但这个方法不总是精确的。例如:在概率分布B(1,P=0.9)中,即取得1的概率是0.9,取得0的概率是0.1。可以计算困惑度是:

2−0.9log20.9−0.1log20.1=1.382^{-0.9 log_2 0.9 - 0.1 log_2 0.1}= 1.3820.9log20.90.1log20.1=1.38

同时自然地,我们预测下一样本点的策略将是:预测其取值为1,那么我们预测正确的概率是0.9。而困惑度的倒数是1/1.38=0.72而不是0.9。(但当我们考虑k面骰子上的均匀分布时,困惑度是k,困惑度的倒数是1/k,正好是预测正确的概率)

困惑度是信息熵的指数。

##2.概率模型的困惑度
用一个概率模型q去估计真实概率分布p,那么可以通过测试集中的样本来定义这个概率模型的困惑度。

b−1N∑i=1Nlog⁡bq(xi)b^{{-{\frac {1}{N}}\sum _{{i=1}}^{N}\log _{b}q(x_{i})}}bN1i=1Nlogbq(xi)

其中测试样本x1, x2, …, xN是来自于真实概率分布p的观测值,b通常取2。因此,低的困惑度表示q对p拟合的越好,当模型q看到测试样本时,它会不会“感到”那么“困惑”。

我们指出,指数部分是交叉熵。

H(p^,q)=−∑xp^(x)log⁡2q(x) H({\hat {p}},q)=-\sum _{x}{\hat {p}}(x)\log _{2}q(x)H(p^,q)=xp^(x)log2q(x)

其中 p^{\hat {p}}p^ 表示我们对真实分布下样本点x出现概率的估计。比如用p(x)=n/N

##3.每个分词的困惑度

在自然语言处理中,困惑度是用来衡量语言概率模型优劣的一个方法。一个语言概率模型可以看成是在整过句子或者文段上的概率分布。(译者:例如每个分词位置上有一个概率分布,这个概率分布表示了每个词在这个位置上出现的概率;或者每个句子位置上有一个概率分布,这个概率分布表示了所有可能句子在这个位置上出现的概率)

比如,i这个句子位置上的概率分布的信息熵可能是190,或者说,i这个句子位置上出现的句子平均要用190 bits去编码,那么这个位置上的概率分布的困惑度就是2(190)。(译者:相当于投掷一个2(190)面筛子的不确定性)通常,我们会考虑句子有不同的长度,所以我们会计算每个分词上的困惑度。比如,一个测试集上共有1000个单词,并且可以用7.95个bits给每个单词编码,那么我们可以说这个模型上每个词有2^(7.95)=247 困惑度。相当于在每个词语位置上都有投掷一个247面骰子的不确定性。

在Brown corpus (1 million words of American English of varying topics and genres) 上报告的最低的困惑度就是247per word,使用的是一个trigram model(三元语法模型)。在一个特定领域的语料中,常常可以得到更低的困惑度。

要注意的是,这个模型用的是三元语法。直接预测下一个单词是"the"的正确率是7%。但如果直接应用上面的结果,算出来这个预测是正确的概率是1/247=0.4%,这就错了。(译者:不是说算出来就一定是0.4%,而是说这样算本身是错的)因为直接预测下一个词是”the“的话,我们是在使用一元语法,而247是来源于三元语法的。当我们在使用三元语法的时候,会考虑三元语法的统计数据,这样做出来的预测会不一样并且通常有更好的正确率。

翻译:https://en.wikipedia.org/wiki/Perplexity
作者:microstrong
转载请注明出处,谢谢。

### 深学习中困惑的概念 在深学习领域,尤其是自然语言处理(NLP)困惑(Perplexity)是一个常用的评价指标。该指标用于衡量语言模型的好坏,能够反映模型对于给定数据集的不确定性程[^4]。 具体来说,语言模型可以预测序列(例如一个句子)中每个时间步词元(例如一个句子中的逐个单词)的概率分布,并据此计算整个序列的概率。较低的困惑意味着模型更精确地捕捉到了文本的真实概率分布,即模型表现更好。 ### 困惑的定义与意义 困惑被定义为: \[ \text{PPL} = \exp\left(-\frac{\sum_{i=1}^{N}\log p(w_i|w_1,...,w_{i-1})}{N}\right)\] 其中 \( w_i \) 表示第 i 个词语,\( N \) 是总词数,\( p(w_i|w_1,...,w_{i-1}) \) 则表示基于前序上下文条件下当前词语出现的概率。这个表达式实际上是对所有位置上词语条件概率取平均后的指数化结果[^2]。 当训练好的语言模型应用于测试集时,如果它能较好地拟合实际的语言模式,则会给出较高的似然估计值;反之则不然。通过上述公式可以看出,随着分子部分求和项增大(即负对数值减小),最终得到的结果也会越接近于理想状态下的最小值——也就是1。因此,在实践中人们往往追求更低水平的困惑作为优化目标之一。 ### 实现代码展示 下面是一段 Python 代码片段,展示了如何利用 PyTorch 库实现对预训练好或自定义构建完成之后的语言模型进行困惑评测的过程: ```python import torch.nn.functional as F from tqdm import tqdm def calculate_perplexity(model, dataloader, device='cpu'): model.eval() total_loss = 0. with torch.no_grad(): for batch in tqdm(dataloader): inputs, targets = map(lambda x: x.to(device), batch) outputs = model(inputs) loss = F.cross_entropy(outputs.view(-1, outputs.size(-1)), targets.view(-1)) total_loss += loss.item() avg_loss = total_loss / len(dataloader.dataset) perplexity = np.exp(avg_loss) return perplexity ``` 此函数接收三个参数:`model`(已加载权重并准备就绪待测验的目标网络实例)`dataloader`(封装有批量样本及其标签的数据迭代器对象)`device`(指定运算设备,默认CPU)。内部逻辑主要分为两大部分:一是遍历输入批次执行推理操作获得损失累积量;二是依据所得均方误差反推出对应的困惑得分返回调用端显示输出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值