困惑度(perplexity)
作用:
- 在模型预测时进行生成文本的质量评估。
- 因此经常用于Text-to-Text这类文本生成任务。比较常用的架构就是Encoder-Decoder或者Decoder-only。只要这个模型是通过Next-Token-Prediction的范式来生成文本的,那都可以用困惑度来判定质量(包括生成的文本质量以及模型本身的质量)。
- 我们也可以利用困惑度判断模型在训练的过程中是否收敛,或者我们也可以把他作为早停(提早停止训练)的标准阈值。
注意:
- 不同领域的困惑度不能直接比较,需要再相同的测试集上评估。比如,如果一个任务是English-French translation, 另一个是Text Summary, 这两种任务的困惑度就没有可比性。
- 原因:不同任务的目标文本和输出空间差异巨大。例如,翻译任务的输出是目标语言的句子,而摘要任务的输出是浓缩内容的文本。而困惑度反映的是模型输出分布和真实分布之间的匹配度,但我们这里的目标分布的定义因任务而异,肯定是不一样的,因此把两个任务的困惑度拿来直接比较就没有意义。
- 另外,困惑度不完全反映实际效果,低困惑度不一定意味着生成的文本质量高,需要结合其他指标(如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(wi∣w1,w2...wi−1)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)=2−N1∑i=1Nlog(P(wi))
本质和上面相同
举个例子
想象你在玩一个猜词游戏。你的朋友正在说一个句子,说到一半突然停下来,让你猜下一个词是什么。比如:
- “今天天气真…”
- “我想吃一碗…”
如果你能很容易地猜出下一个词(比如"好"或者"面"),说明这个句子对你来说"困惑度很低"。
如果你完全猜不到下一个词会是什么,那么这个句子对你来说"困惑度很高"。
在人工智能和语言模型中,困惑度就是用来衡量模型对文本的预测能力:
- 困惑度越低 = 模型越自信 = 预测越准确
- 就像你很容易猜到"今天天气真好"中的"好"一样
- 困惑度越高 = 模型越困惑 = 预测越不确定
- 就像面对"今天我遇到了一只…" 这样的句子,下一个词可能是"猫"、“狗”、"兔子"等很多可能,很难准确预测
用数学的角度来说,困惑度的计算公式是:
困惑度
=
2
(
−
平均对数似然
)
困惑度 = 2^{(-平均对数似然)}
困惑度=2(−平均对数似然)
但是不用担心这个复杂的公式!你只需要记住:
- 困惑度的值越小越好
- 困惑度通常用来比较不同语言模型的性能
- 一个优秀的语言模型在预测文本时应该有较低的困惑度
举个实际的例子:
假设有两个AI模型在预测"我很喜欢吃…"后面的词:
- 模型A给出:{“面条”:90%, “石头”:10%}
- 模型B给出:{“面条”:30%, “石头”:30%, “天空”:40%}
显然模型A的预测更合理,因为人类确实更可能说"我很喜欢吃面条"。
这种情况下,模型A的困惑度就比模型B低,说明模型A的预测能力更强。
需要补充说明的是:
- 困惑度主要用于评估语言模型生成的文本的质量
- 它反映了模型对语言的理解程度
- 在实际应用中,它是模型训练和优化的重要指标之一
困惑度公式
困惑度(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=2−N1∑i=1Nlog2P(wi∣w1,…,wi−1)
或者等价地:
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=1∑NlnP(wi∣w1,…,wi−1))
其中:
- N N N 是序列中的词(或标记)的总数
- P ( w i ∣ w 1 , … , w i − 1 ) P(w_i|w_1,\ldots,w_{i-1}) P(wi∣w1,…,wi−1) 是在给定前面所有词的条件下,预测当前词 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=1∑Nlog2P(wi∣w1,…,wi−1)
这些公式看起来可能有点复杂,但本质上它们都在度量:
- 模型预测每个词的准确程度
- 模型的不确定性程度
一步一步计算困惑度
假设我们有一个非常简单的语言模型,它在预测这个句子:“我 喜欢 吃 面条”
1. 逐步预测概率
假设模型对每个词的预测概率如下:
- 第一个词"我"(假设是句子开始):
- P(“我”|开始) = 0.2
- 第二个词"喜欢":
- P(“喜欢”|“我”) = 0.3
- 第三个词"吃":
- P(“吃”|“我 喜欢”) = 0.6
- 第四个词"面条":
- 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=2−N1∑i=1Nlog2P(wi∣w1,…,wi−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
- 求和:
总和 = (-2.32) + (-1.74) + (-0.74) + (-1.32) = -6.12
- 计算平均值(N=4):
平均值 = -6.12 ÷ 4 = -1.53
- 最后计算困惑度:
Perplexity = 2^1.53 ≈ 2.89
3. 结果解释
这个2.89的困惑度意味着什么?
- 如果困惑度是1,表示模型完全确定(100%确信)它的预测
- 我们得到的2.89表示模型有一定的不确定性,但相对来说还算不错
- 如果困惑度很大(比如50),就说明模型非常不确定,预测能力差
- 实际应用中的注意事项
在实际的大语言模型中:
- 词表可能包含几万到几十万个词
- 每个位置的预测都要考虑所有可能的词
- 概率通常会更小,导致困惑度更大
- 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=1∑NlogP(wi∣w1,…,wi−1)
困惑度与交叉熵的关系
- 困惑度是交叉熵的指数形式:
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(衡量词错误率)等指标,再用困惑度评估语言通顺度。
- 主要用于后处理优化阶段。
具体应用示例
- 模型训练(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}")
- 机器翻译评估
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)
困惑度在各个阶段的作用
- 预训练阶段
- 使用困惑度监控训练进展
- 结合其他指标(如准确率、F1等)
- 微调阶段
- 更关注任务特定的指标
- 困惑度作为辅助监控指标
- 评估阶段
- 使用多维度评估指标
- 困惑度是其中重要的一环
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=BP∗exp(Σwn∗log(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:
- 跳跃二元组
- 允许词间隔
- ROUGE-N:
- 优势:
- 关注召回率
- 适合评估长文本生成
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)∗(1−Penalty)- 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作为评估器
- 交叉模型验证
- 对抗性评估
多模态评估指标:
- 跨模态一致性
- 多模态融合质量
- 模态间对齐度
可解释性评估:
- 决策路径分析
- 置信度评估
- 错误归因分析