大模型中的困惑度(Perplexity)是个啥?:小白都能看懂的讲解

困惑度(perplexity)

在这里插入图片描述

作用:

  1. 在模型预测时进行生成文本的质量评估。
  2. 因此经常用于Text-to-Text这类文本生成任务。比较常用的架构就是Encoder-Decoder或者Decoder-only。只要这个模型是通过Next-Token-Prediction的范式来生成文本的,那都可以用困惑度来判定质量(包括生成的文本质量以及模型本身的质量)。
  3. 我们也可以利用困惑度判断模型在训练的过程中是否收敛,或者我们也可以把他作为早停(提早停止训练)的标准阈值。

注意:

  1. 不同领域的困惑度不能直接比较,需要再相同的测试集上评估。比如,如果一个任务是English-French translation, 另一个是Text Summary, 这两种任务的困惑度就没有可比性。
  • 原因:不同任务的目标文本和输出空间差异巨大。例如,翻译任务的输出是目标语言的句子,而摘要任务的输出是浓缩内容的文本。而困惑度反映的是模型输出分布和真实分布之间的匹配度,但我们这里的目标分布的定义因任务而异,肯定是不一样的,因此把两个任务的困惑度拿来直接比较就没有意义。
  1. 另外,困惑度不完全反映实际效果,低困惑度不一定意味着生成的文本质量高,需要结合其他指标(如BLEU、ROUGE等)。

先把公式混个脸熟,等下会讲

P P L ( S ) = 1 P ( w 1 , w 2 , . . . , w N ) N = 1 Π i = 1 N P ( w i ∣ w 1 , w 2 . . . w i − 1 ) N PPL(S) = \sqrt[N]{\frac{1}{P(w_1,w_2,...,w_N)}} = \sqrt[N]{\frac{1}{\Pi_{i=1}^NP(w_i | w_1,w_2...w_{i-1})}} PPL(S)=NP(w1,w2,...,wN)1 =NΠi=1NP(wiw1,w2...wi1)1

  • 成句概率高,表明该语言模型生成的这句话的合理性高
  • 困惑度的大小与成句概率成反比

PPL的写法2
P P L ( S ) = 2 − 1 N ∑ i = 1 N l o g ( P ( w i ) ) PPL(S) = 2^{-\frac{1}{N} \sum_{i=1}^N log(P(w_i))} PPL(S)=2N1i=1Nlog(P(wi))
本质和上面相同

举个例子

想象你在玩一个猜词游戏。你的朋友正在说一个句子,说到一半突然停下来,让你猜下一个词是什么。比如:

  • “今天天气真…”
  • “我想吃一碗…”

如果你能很容易地猜出下一个词(比如"好"或者"面"),说明这个句子对你来说"困惑度很低"。
如果你完全猜不到下一个词会是什么,那么这个句子对你来说"困惑度很高"。

在人工智能和语言模型中,困惑度就是用来衡量模型对文本的预测能力:

  1. 困惑度越低 = 模型越自信 = 预测越准确
  • 就像你很容易猜到"今天天气真好"中的"好"一样
  1. 困惑度越高 = 模型越困惑 = 预测越不确定
  • 就像面对"今天我遇到了一只…" 这样的句子,下一个词可能是"猫"、“狗”、"兔子"等很多可能,很难准确预测

用数学的角度来说,困惑度的计算公式是:
困惑度 = 2 ( − 平均对数似然 ) 困惑度 = 2^{(-平均对数似然)} 困惑度=2(平均对数似然)

但是不用担心这个复杂的公式!你只需要记住:

  • 困惑度的值越小越好
  • 困惑度通常用来比较不同语言模型的性能
  • 一个优秀的语言模型在预测文本时应该有较低的困惑度

举个实际的例子:
假设有两个AI模型在预测"我很喜欢吃…"后面的词:

  • 模型A给出:{“面条”:90%, “石头”:10%}
  • 模型B给出:{“面条”:30%, “石头”:30%, “天空”:40%}

显然模型A的预测更合理,因为人类确实更可能说"我很喜欢吃面条"。
这种情况下,模型A的困惑度就比模型B低,说明模型A的预测能力更强。

需要补充说明的是:

  1. 困惑度主要用于评估语言模型生成的文本的质量
  2. 它反映了模型对语言的理解程度
  3. 在实际应用中,它是模型训练和优化的重要指标之一

困惑度公式

困惑度(Perplexity)的完整数学表达如下:

Perplexity = 2 − 1 N ∑ i = 1 N log ⁡ 2 P ( w i ∣ w 1 , … , w i − 1 ) \text{Perplexity} = 2^{-\frac{1}{N}\sum_{i=1}^{N}\log_2 P(w_i|w_1,\ldots,w_{i-1})} Perplexity=2N1i=1Nlog2P(wiw1,,wi1)

或者等价地:

Perplexity = exp ⁡ ( − 1 N ∑ i = 1 N ln ⁡ P ( w i ∣ w 1 , … , w i − 1 ) ) \text{Perplexity} = \exp\left(-\frac{1}{N}\sum_{i=1}^{N}\ln P(w_i|w_1,\ldots,w_{i-1})\right) Perplexity=exp(N1i=1NlnP(wiw1,,wi1))

其中:

  • N N N 是序列中的词(或标记)的总数
  • P ( w i ∣ w 1 , … , w i − 1 ) P(w_i|w_1,\ldots,w_{i-1}) P(wiw1,,wi1) 是在给定前面所有词的条件下,预测当前词 w i w_i wi 的概率
  • ∑ i = 1 N \sum_{i=1}^{N} i=1N 表示对序列中所有位置的求和
  • 1 N \frac{1}{N} N1 用于计算平均值

为了更好理解,我们也可以用交叉熵的形式来表示困惑度:$\text{Perplexity} = 2^{H§} $

其中 H ( P ) H(P) H(P) 是交叉熵:

H ( P ) = − 1 N ∑ i = 1 N log ⁡ 2 P ( w i ∣ w 1 , … , w i − 1 ) H(P) = -\frac{1}{N}\sum_{i=1}^{N}\log_2 P(w_i|w_1,\ldots,w_{i-1}) H(P)=N1i=1Nlog2P(wiw1,,wi1)

这些公式看起来可能有点复杂,但本质上它们都在度量:

  1. 模型预测每个词的准确程度
  2. 模型的不确定性程度

一步一步计算困惑度

假设我们有一个非常简单的语言模型,它在预测这个句子:“我 喜欢 吃 面条”

1. 逐步预测概率

假设模型对每个词的预测概率如下:

  1. 第一个词"我"(假设是句子开始):
  • P(“我”|开始) = 0.2
  1. 第二个词"喜欢":
  • P(“喜欢”|“我”) = 0.3
  1. 第三个词"吃":
  • P(“吃”|“我 喜欢”) = 0.6
  1. 第四个词"面条":
  • P(“面条”|“我 喜欢 吃”) = 0.4

2. 计算过程

让我们按照公式逐步计算:

Perplexity = 2 − 1 N ∑ i = 1 N log ⁡ 2 P ( w i ∣ w 1 , … , w i − 1 ) \text{Perplexity} = 2^{-\frac{1}{N}\sum_{i=1}^{N}\log_2 P(w_i|w_1,\ldots,w_{i-1})} Perplexity=2N1i=1Nlog2P(wiw1,,wi1)

  1. 首先计算每个词的 log ⁡ 2 \log_2 log2 概率:
log₂(0.2) = -2.32
log₂(0.3) = -1.74
log₂(0.6) = -0.74
log₂(0.4) = -1.32
  1. 求和:
总和 = (-2.32) + (-1.74) + (-0.74) + (-1.32) = -6.12
  1. 计算平均值(N=4):
平均值 = -6.12 ÷ 4 = -1.53
  1. 最后计算困惑度:
Perplexity = 2^1.53 ≈ 2.89

3. 结果解释

这个2.89的困惑度意味着什么?

  • 如果困惑度是1,表示模型完全确定(100%确信)它的预测
  • 我们得到的2.89表示模型有一定的不确定性,但相对来说还算不错
  • 如果困惑度很大(比如50),就说明模型非常不确定,预测能力差
  1. 实际应用中的注意事项

在实际的大语言模型中:

  1. 词表可能包含几万到几十万个词
  2. 每个位置的预测都要考虑所有可能的词
  3. 概率通常会更小,导致困惑度更大
  4. GPT-3等现代语言模型在英语文本上的困惑度通常在15-20之间

5. 代码示例

让我用Python代码展示这个计算过程:

import numpy as np

# 我们的预测概率
probs = [0.2, 0.3, 0.6, 0.4]

# 计算困惑度
log_probs = [np.log2(p) for p in probs]
avg_log_prob = -np.mean(log_probs)
perplexity = 2 ** avg_log_prob

print(f"困惑度: {perplexity:.2f}")

困惑度是否能作为目标函数?

实际上,在现代语言模型训练中,主要目标函数通常使用交叉熵损失 (Cross Entropy Loss)
L CE = − 1 N ∑ i = 1 N log ⁡ P ( w i ∣ w 1 , … , w i − 1 ) \mathcal{L}_{\text{CE}} = -\frac{1}{N}\sum_{i=1}^{N}\log P(w_i|w_1,\ldots,w_{i-1}) LCE=N1i=1NlogP(wiw1,,wi1)

困惑度与交叉熵的关系

  • 困惑度是交叉熵的指数形式:
    Perplexity = 2 L CE \text{Perplexity} = 2^{\mathcal{L}_{\text{CE}}} Perplexity=2LCE
  • 最小化交叉熵等价于最小化困惑度
  • 但直接使用交叉熵作为目标函数更方便(数值更稳定)

困惑度可以应用的任务领域

1. 预训练任务
  • 因果语言建模(Causal Language Modeling)
    • 用于实时监控模型在训练中的性能变化
    • 用于早停
2. 下游任务:
  • 文本摘要
    • 衡量摘要与原文的语义连贯性,但一般都将困惑度作为摘要质量的辅助指标,需要结合ROUGE。
  • 机器翻译,但通常需要结合 BLEU 等专门的翻译评估指标
    • 使用困惑度对多个翻译结果进行排序
    • 也用于质量估计:预测翻译质量而无需参考译文
    • 困惑度可以与BLEU形成互补关系:BLEU关注n-gram匹配,困惑度关注语言流畅度。
  • 语音识别
    • 评估语音转文本结果的语言通顺度
    • 用于语言模型重打分(rescoring)
      • 使用语言模型计算N-best 候选列表中每个候选的困惑度
      • 结合声学模型分数和语言模型分数进行最终排序
      • 在 N-best 候选列表中选择最优结果
      • 效果:提升识别结果的语言质量,改善长句识别效果和罕见字识别准确度。
    • 可以集成别的框架
      • 可以配合 WER(衡量词错误率)等指标,再用困惑度评估语言通顺度。
      • 主要用于后处理优化阶段。

具体应用示例

  1. 模型训练(text-to-text 任务)
# 典型的训练循环
for epoch in range(num_epochs):
    for batch in dataloader:
        outputs = model(batch)
        loss = criterion(outputs, targets)  # 交叉熵损失
        perplexity = torch.exp(loss)       # 计算困惑度
        
        # 用于监控训练
        print(f"Epoch {epoch}, Perplexity: {perplexity}")
  1. 机器翻译评估
def evaluate_translation_model(model, test_data):
    total_loss = 0
    for source, target in test_data:
        pred = model(source)
        loss = criterion(pred, target)
        perplexity = math.exp(loss.item())
        total_loss += perplexity
    return total_loss / len(test_data)

困惑度在各个阶段的作用

  1. 预训练阶段
  • 使用困惑度监控训练进展
  • 结合其他指标(如准确率、F1等)
  1. 微调阶段
  • 更关注任务特定的指标
  • 困惑度作为辅助监控指标
  1. 评估阶段
  • 使用多维度评估指标
  • 困惑度是其中重要的一环

Text-to-Text 模型的指令评估指标

1. 通用评估指标

BLEU (Bilingual Evaluation Understudy)
  • 最广泛使用的指标之一

  • 公式
    B L E U = B P ∗ exp ⁡ ( Σ w n ∗ l o g ( p n ) ) BLEU = BP * \exp(Σw_n * log(p_n)) BLEU=BPexp(Σwnlog(pn))

    • pn是n-gram精确率
    • wn是权重(通常均匀分布)
  • 计算原理:
    精确率计算:匹配的n-gram数量/生成文本中n-gram总数
    简短惩罚(Brevity Penalty):BP = min(1, exp(1-r/c))
    r是参考文本长度
    c是生成文本长度

  • 总结:计算生成文本与参考文本的n-gram重叠度

  • 特点:

    • 对短文本效果较好
    • 考虑词序
    • 惩罚过长或过短的生成结果
  • 局限性:

    • 不能很好处理同义词
    • 对语义理解有限
ROUGE (Recall-Oriented Understudy for Gisting Evaluation)
  • 主要用于评估摘要生成质量
  • 常用变体:
    • ROUGE-N:
      • 计算n-gram的召回率
      • 常用n=1,2,3,4
    • ROUGE-L:
      • 基于最长公共子序列(LCS)
      • 考虑句子结构
    • ROUGE-W:
      • 加权LCS
      • 考虑连续匹配
    • ROUGE-S:
      • 跳跃二元组
      • 允许词间隔
  • 优势:
    • 关注召回率
    • 适合评估长文本生成
Perplexity (困惑度)
  • 评估模型对语言的建模能力
  • 适用场景:
    • 语言模型评估
    • 生成文本流畅度评估
  • 特点:
    • 越低越好
    • 直接反映预测准确性

2. 任务特定指标

机器翻译
  • METEOR:
    精确匹配,
    词干匹配,
    同义词匹配,
    释义匹配。
    M E T E O R = ( 10 P R ) / ( R + 9 P ) ∗ ( 1 − P e n a l t y ) METEOR = (10PR)/(R+9P) * (1-Penalty) METEOR=(10PR)/(R+9P)(1Penalty)
    • P为精确率
    • R为召回率
    • Penalty为分块惩罚
  • chrF:基于字符级别的F-score
  • TER (Translation Edit Rate):最小编辑距离
文本摘要
  • BERTScore:使用BERT编码计算相似度
  • ROUGE变体:
    • ROUGE-1:单词级别
    • ROUGE-2:二元组
    • ROUGE-L:最长公共子序列
问答系统
  • Exact Match (EM):完全匹配率
  • F1 Score:部分匹配评分
  • SQuAD评分:结合EM和F1
对话系统专用指标
  • USR (Unified Semantic Response):
    • 理解度评估
    • 相关性评估
    • 参与度评估
  • FED (Fine-grained Evaluation of Dialogue):
    • 上下文连贯性
    • 回应自然度
    • 信息丰富度
代码生成评估指标
  • Pass@k:
    • 功能正确性
    • 编译成功率
  • CodeBLEU:
    • 语法匹配
    • 抽象语法树匹配
    • 数据流图匹配

3. 高级语义评估指标

BERTScore
  • 基于预训练语言模型的评估方法
  • 三个核心指标:
    • Precision_bert
    • Recall_bert
    • F1_bert
  • 计算流程:
    • BERT编码获取词向量
    • 计算余弦相似度矩阵
    • 贪婪匹配
    • 归一化处理
  • 特点:
    • 更好的语义理解
    • 处理同义表达
    • 对上下文敏感
BLEURT
  • 基于BERT的学习型评估指标
  • 训练数据:
    • 人工评分数据
    • 自动生成的合成数据
  • 评估维度:
    • 语法正确性
    • 语义准确性
    • 风格一致性
  • 优势:
    • 更接近人类判断
    • 考虑语义和语法质量

4. 人工评估维度

流畅度 (Fluency)
  • 评估生成文本的语言自然度
  • 语法正确性
  • 表达连贯性
充实度 (Adequacy)
  • 信息完整性
  • 语义准确性
  • 与源文本的对应关系
连贯性 (Coherence)
  • 逻辑连贯性
  • 上下文一致性
  • 主题连续性

5. 最新发展趋势

基于大模型的评估方法:
  • GPT-4作为评估器
  • 交叉模型验证
  • 对抗性评估
多模态评估指标:
  • 跨模态一致性
  • 多模态融合质量
  • 模态间对齐度
可解释性评估:
  • 决策路径分析
  • 置信度评估
  • 错误归因分析
### BLEU、ROUGE 和 PPL 指标的解释 #### BLEU (Bilingual Evaluation Understudy) BLEU 是一种用于评估机器翻译质量的量标准。该方法通过比较候选译文与一个或多个参考译文之间的 n-gram 重叠来计算得分。具体来说,BLEU 计算的是精确匹配的比例,并对其进行一些平滑处理以避免极端情况下的零分[^1]。 对于自然语言生成任务而言,BLEU 广泛应用于自动评价模型产生的文本质量和准确性。然而值得注意的是,尽管高 BLEU 值通常意味着更好的性能,但它并不能完全反映人类感知上的流畅性和语义一致性。 ```python from nltk.translate.bleu_score import sentence_bleu reference = [['this', 'is', 'a', 'test']] candidate = ['this', 'is', 'a', 'test'] score = sentence_bleu(reference, candidate) print(score) ``` #### ROUGE (Recall-Oriented Understudy for Gisting Evaluation) ROUGE 主要关注召回率而非精,即衡量生成的内容中有多少部分能够覆盖到参照文档中的片段。它同样基于n元语法(n-grams),词序列(Word Sequence)以及加权共现(Wighted Cooccurrence)[^2]。此量常被用来评测摘要提取的效果,在信息检索领域也有一定应用价值。 ROUGE 家族有多种变体,比如 ROUGE-N 表示考虑 N 阶 n-gram;而 ROUGE-L 则侧重于最长公共子串(Longest Common Subsequence,LCS)相似测量。 ```python from rouge import Rouge ref_summary = "the quick brown fox jumps over the lazy dog" gen_summary = "quick brown fox jump over dog" rouge = Rouge() scores = rouge.get_scores(gen_summary, ref_summary) print(scores) ``` #### PPL (Perplexity) 困惑(perplexity)是统计语言建模中常用的一个概念,表示给定上下文中预测下一个单词难的一种量化方式。较低的困惑表明模型更擅长预测实际发生的词语分布,因此可以认为其表现更好。PPL 被广泛应用于评估预训练语言模型的能力,尤其是在开放域对话系统和文本续写方面具有重要意义[^3]。 ```python import torch.nn.functional as F import math def calculate_perplexity(logits, labels): loss = F.cross_entropy(logits.view(-1, logits.size(-1)), labels.view(-1), ignore_index=-100) perplexity = math.exp(loss.item()) return perplexity ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值