趋近智
投入大量计算资源并精心整理海量数据集来预训练 (pre-training)大语言模型 (LLM)后,随之而来的紧迫问题是:它的效果如何?仅仅完成训练过程并不能保证得到一个有用或有效的模型。我们需要严格的方法来评估其表现,了解其能力,并找出其不足。评估大语言模型是一个多方面的过程,因为“好”本身在不同情境下有不同含义,可以是从原始预测准确性,到对话中的实用性,或在特定下游应用中的表现。
用于大语言模型评估的技术通常分为几大类:
大语言模型评估方法的主要类别。
“本章主要关注内部评估。尽管与评估任务表现相比,它可能显得有限,但内部评估在大语言模型开发周期中扮演着重要角色。其主要优点包括:”
训练损失与内部评估之间有直接关联。在训练期间,模型通常被优化以最小化交叉熵损失,这在数学上与困惑度相关。在PyTorch中,为评估目的计算此损失涉及在保留数据集上进行前向传播,而不进行反向传播 (backpropagation)。
import torch
import torch.nn.functional as F
# 假设 'model' 是您预训练的大语言模型
# 假设 'eval_dataloader' 提供 input_ids 和 attention_mask 的批次
# 评估循环步骤示例(简化)
model.eval() # 将模型设置为评估模式
total_loss = 0
total_tokens = 0
with torch.no_grad(): # 禁用梯度计算
for batch in eval_dataloader:
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
labels = input_ids.clone() # 通常,预测下一个词元
outputs = model(input_ids=input_ids,
attention_mask=attention_mask,
labels=labels)
# 模型输出通常直接包含损失
# 在内部使用交叉熵计算
loss = outputs.loss
# 备选方案:如果模型返回 logits,则手动计算损失
# logits = outputs.logits
# 移动 logits 和 labels 以进行下一个词元预测任务
# shift_logits = logits[..., :-1, :].contiguous()
# shift_labels = labels[..., 1:].contiguous()
# 仅计算非填充词元的损失
# loss_fct = torch.nn.CrossEntropyLoss()
# loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)),
# shift_labels.view(-1))
# 累加损失,按批次中的词元数量加权
# (需要仔细处理填充词元以获得准确的困惑度)
num_tokens = attention_mask.sum() # 简单计数,需改进
total_loss += loss.item() * num_tokens # 按词元数量加权损失
total_tokens += num_tokens
# 平均损失与困惑度相关
average_loss = total_loss / total_tokens
# 困惑度 = exp(平均损失) - 详细信息请见下一节
# print(f"Average Cross-Entropy Loss: {average_loss}")
简化的 PyTorch 代码片段,说明评估期间的损失计算,与困惑度相关。
然而,承认内部评估的局限性很重要。低困惑度分数并不能自动意味着模型能生成有用、真实、连贯或安全的文本。模型可以通过过拟合 (overfitting)训练数据的统计模式来实现低困惑度,可能学会生成概率高但信息量少的重复或通用序列。此外,正如本章后面会看到的那样,困惑度值对所用的特定词元化方案和评估数据集的性质高度敏感,使得跨不同设置的比较变得困难。
因此,内部评估应被视为全面评估策略的一个必要组成部分。它提供对模型语言模型能力的基本检查,但必须辅以外部评估和可能的人工评估,以全面了解大语言模型的表现及其对特定应用的适用性。我们现在将继续详细定义和分析困惑度。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造