Speech and Language Processing之评估语言模型

       评估语言模型性能的最佳方法是将其嵌入到应用程序中,并度量应用程序的改进程度。这种端到端评价被称为外在评价。外部评估是了解组件的特定改进是否真的有助于手头任务的唯一方法。因此,对于语音识别,我们可以通过两次运行语音识别器来比较两种语言模型的性能,每种语言模型运行一次,并查看哪个提供更准确的转录。

       不幸的是,端到端运行大型NLP系统通常非常昂贵。相反,如果有一个度量标准可以用来快速评估语言模型的潜在改进,那就更好了。内在评价度量是指独立于任何应用程序的模型质量的度量。对于语言模型的内在评价,我们需要一个测试集。与我们领域中的许多统计模型一样,n-gram模型的概率来自它所训练的语料库,训练集或训练语料库。然后,我们可以通过n-gram模型在称为测试集或测试语料库的一些看不见的数据上的性能来衡量n-gram模型的质量。我们有时也会把测试集和其他不在训练集内的数据集称为语料库,因为我们把它们从训练数据中分离出来。

       因此,如果我们有一个文本语料库,想要比较两个不同的n-gram模型,我们将数据分为训练集和测试集,在训练集上训练两个模型的参数,然后比较两个训练模型对测试集的拟合程度。

       但是“符合测试集”是什么意思呢?答案很简单:哪个模型给测试集分配了更高的概率——意味着它更准确地预测了测试集——哪个模型就更好。给定两个概率模型,更好的模型是与测试数据更紧密匹配的模型,或者更好地预测测试数据的细节的模型,因此将为测试数据分配更高的概率。

       这里需要注意的一点是,既然是测试集合上面的测试,那就要求测试集合和训练集合不能出现重合,也就是样本不能重复,不然就没意义了。

困惑度

 那么如何评估语言模型的好坏呢,这里引入了一个概念,叫困惑度。在实践中,我们不使用原始概率作为评估语言模型的度量,而是使用一种称为困惑度的变量。语言模型在测试集上的困惑度(有时简称PP)是测试集的逆概率,通过单词数归一化。对于测试集W = w1w2…wN。

        如上,就是困惑度,也就是联合概率倒数的开N次方根,根据上面公式可以看出,最小化困惑度的过程,相当于最大化测试集合上面的联合概率分布,也就是说困惑度越小,联合概率分布越大,模型效果就越好。

       讲了这么多,如何计算困惑度呢,下面给一个demo:

import math
import numpy as np
import torch
import transformers

# 加载预训练的GPT-3模型
model = transformers.pipeline('text-generation', model='EleutherAI/gpt-neo-2.7B')

# 定义一个待评估的字符串
text = "The quick brown fox jumps over the lazy dog."

# 计算字符串的困惑度
input_ids = torch.tensor(model.tokenizer.encode(text)).unsqueeze(0)
with torch.no_grad():
    outputs = model.model(input_ids)
logits = outputs.logits[0, :-1, :]
probs = torch.softmax(logits, dim=-1).cpu().numpy()
p_next = probs[-1]
perplexity = math.exp(-np.log(p_next))
print("Perplexity of the text is:", perplexity)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITIRONMAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值