Skip to content

tstring413/NPPrompt

 
 

Repository files navigation

NPPrompt 复现报告:零样本分类的工程复现与性能分析

汇报人: 陈一鸣 时间: 2025-12-23 模型骨座: DistilRoBERTa-base (CPU Optimized)


1. 背景:零样本学习的挑战

1.1 任务目标

无训练数据 (Zero-Shot) 的场景下,利用预训练语言模型 (PLM) 对 AGNews 新闻数据集进行分类。

1.2 核心难题:语义鸿沟 (Semantic Gap)

  • 标签空间 (Label Space): {World, Sports, Business, Sci/Tech}
  • 词表空间 (Vocabulary Space): 50,265 个单词
  • 挑战: 如何将抽象的标签映射到模型能理解的具体词汇?

1.3 Prompt Learning 核心思路

将分类任务转化为完形填空 (Cloze Test) 任务:

  • 模板 (Template): "It is a [MASK] news."
  • 映射 (Verbalizer): 建立 Label Word 的映射关系。

2. 基线复现与性能分析 (Baseline Reproduction)

我们首先运行了 Manual Baseline (人工定义映射),复现数据如下:

2.1 实验数据复现

类别 F1 Score Recall (召回率) 状态
World 0.002 0.1% ❌ 崩盘
Sports 0.745 99.5% ✅ 正常

2.2 失败原因定位

通过检查 manual_verbalizer.txt 文件,发现人工规则强制规定:

World "politics"

2.3 复现结论

实验证实,单一映射具有极大的局限性。仅依靠人工定义的一个锚点("politics")无法覆盖复杂的标签语义(如灾难、文化、社会新闻),导致模型在 World 类别上出现严重的性能瓶颈


3. NPPrompt 核心原理 (Methodology)

NPPrompt 通过无需参数微调的方式,利用 BERT 的静态知识进行自动化语义扩展。

3.1 标签分词 (Label Tokenization)

针对复合标签(如 "Sci/Tech"),代码自动将其拆解为独立语义单元,实现多锚点召回。

# 代码位置:emb_verbalizer.py
for c in classes:
    # 例如:"Science Technology" 被拆解为 ["Science", "Technology"]
    split_c = c.split(' ') 
    class_names.append(split_c)

3.2 语义扩展 (Semantic Expansion)

基于 BERT 词向量计算余弦相似度 (Cosine Similarity),构建扩展词表 (即 Top-K 近邻词)。

3.3 加权聚合 (Weighted Aggregation)

利用相似度权重对扩展词的预测分数进行聚合。核心公式如下:

  • : 扩展词 与原始标签的相似度权重
  • : 模型对 的预测概率 (Logits)

4. 代码实现逻辑 (Implementation)

Phase 1: 离线预计算 (Offline)

在此阶段,BERT 充当 Static Knowledge Base (静态知识库)。

# 遍历 5万词表计算 Cosine Similarity
sim_mat[i][j] = util.cos_sim(temp_emb, base_emb)
# 获取 Top-K 扩展词及其权重
values, indices = torch.topk(sim_mat[i], select_num)

Phase 2: 在线推理 (Online)

在此阶段,BERT 充当 Contextual Predictor (上下文解题者)。

# 加权求和实现 (process_logits)
new_label_words_stat = (
    label_words_logits * label_words_mask * label_words_weights
).sum(-1)

5. 工程挑战与环境复现 (Engineering Efforts)

在本地 CPU (AMD 8845HS) + 32G RAM + WSL 环境下,我们解决了以下工程问题:

5.1 推理内存控制 (Memory Control)

  • 挑战: 代码内硬编码参数导致 WSL 环境下出现 OOM (内存溢出) 风险。
  • 解决: 修正 Python 传参逻辑,验证 batch_size=8 为 32G 内存下的最佳推理平衡点,确保了推理过程的稳定性。

5.2 模型选型优化 (Model Substitution)

  • 挑战: 原论文默认的 roberta-large 参数量巨大,在 CPU 上推理延迟过高,不适合本地复现。
  • 解决: 将骨干模型迁移至 distilroberta-base
  • 效果: 在保证语义理解能力的前提下,显著降低了计算负载,成功适配本地硬件环境。

6. 实验结果对比 (Quantitative Analysis)

数据集: AGNews (4 classes)

指标 Manual Baseline NPPrompt (Ours) 变化幅度
Accuracy 50.82% 60.89% 🔼 +10.07%
World F1 0.002 (崩盘) 0.573 (正常) 显著提高
Sports F1 0.745 0.905 精细化提升

关键发现: NPPrompt 自动扩展出 Global, International 等词,成功修复了 World 类别的语义缺失,证明了基于向量空间的自动映射优于人工规则。


7. 深度讨论与总结 (Discussion & Conclusion)

Q: NPPrompt 在 QA (问答) 任务上的表现?

  • 机制: QA 任务中,Verbalizer 是由题目选项动态给定的 (Dynamic Class)。
  • 结论: NPPrompt 在 QA 上主要起到 "格式统一" 的作用,验证了框架处理变长答案 (Multi-token) 的通用性,而非核心算法创新。

总结

  1. 复现成功: 在低资源环境下跑通了 NPPrompt,各项指标符合预期。
  2. 方法验证: 实验证明人工定义的 Verbalizer 存在严重的 Human Bias,是导致 Zero-shot 性能低下的主要原因。
  3. 核心贡献: NPPrompt 通过公式 实现了无参数的语义自适应,提升了 10% 的准确率。

About

NNP课程要求复现论文

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 99.6%
  • Shell 0.4%