求通俗解释NLP里的perplexity是什么?ppl实现代码

快速总结

1. 语言模型^(-1/m)

2. 可以表示成交叉熵的形式:log perplexity和交叉熵是等价的。

详细推导

From 求通俗解释NLP里的perplexity是什么? - 知乎

--------------------

使用Bert计算ppl

logsoftmax之后不断累加,然后exp一把

from transformers import BertTokenizer, BertForMaskedLM
import torch

def bert_ppl_without_numpy(sentence, model_path='bert-base-uncased'):
    tokenizer = BertTokenizer.from_pretrained(model_path)
    model = BertForMaskedLM.from_pretrained(model_path)
    model.eval()
    
    tokens = tokenizer.tokenize(sentence)
    input_ids = torch.tensor([tokenizer.convert_tokens_to_ids(tokens)])
    total_log_prob = 0.0

    for i in range(len(tokens)):
        masked_tokens = tokens.copy()
        masked_tokens[i] = tokenizer.mask_token
        masked_input = torch.tensor([tokenizer.convert_tokens_to_ids(masked_tokens)])
        
        with torch.no_grad():
            outputs = model(masked_input)
            logits = outputs.logits[0, i]
            log_prob = torch.log_softmax(logits, dim=0)[input_ids[0, i]]
        
        total_log_prob += log_prob.item()

    avg_log_prob = total_log_prob / len(tokens)
    ppl = torch.exp(torch.tensor(-avg_log_prob)).item()
    return ppl

bert_ppl_without_numpy("I am a student")

使用gpt2计算ppl

torch.exp(loss)即可

from transformers import GPT2Tokenizer, GPT2LMHeadModel
import torch

def gpt2_ppl_without_numpy(sentence, model_path='gpt2'):
    tokenizer = GPT2Tokenizer.from_pretrained(model_path)
    model = GPT2LMHeadModel.from_pretrained(model_path)
    model.eval()
    
    input_ids = tokenizer.encode(sentence, return_tensors='pt')
    with torch.no_grad():
        outputs = model(input_ids, labels=input_ids)
    
    ppl = torch.exp(outputs.loss).item()
    return ppl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值