在进行参数高效微调(PERF/PEFT)时,QUESTION_ANS 和 FEATURE_EXTRACTION 这两种任务类型看似都需要特征提取,但实际上它们在训练过程中有本质的不同。
核心差异
任务目标
- QUESTION_ANS:生成式任务,需要根据输入生成特定答案
- FEATURE_EXTRACTION:表示学习任务,目标是提取高质量的语义嵌入向量
微调的网络部分
基于注意力机制:
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right)V
- QUESTION_ANS:主要优化 Q(Query)和 V(Value)
- Q:理解输入问题
- V:生成合适输出
- FEATURE_EXTRACTION:优化 Q、K、V 全部
- K(Key)对捕获特征间的相似性关系特别重要
- 需要全面调整以获得更好的语义表示
代码层面的具体影响
1. 损失函数
# QUESTION_ANS
loss = CrossEntropyLoss(logits, labels)
# FEATURE_EXTRACTION
loss = ContrastiveLoss(anchor, positive, negative)
2. 目标模块(LoRA配置)
# QUESTION_ANS
target_modules = ["q_proj", "v_proj"]
# FEATURE_EXTRACTION
target_modules = ["q_proj", "k_proj", "v_proj"]
3. 输出处理
# QUESTION_ANS - 保留语言模型头
output = model.lm_head(hidden_states) # 生成token
# FEATURE_EXTRACTION - 直接使用隐藏状态
features = hidden_states[:, -1, :] # 提取嵌入向量
4. 评估指标
- QUESTION_ANS:准确率、BLEU、困惑度
- FEATURE_EXTRACTION:余弦相似度、检索准确率
快速对比表
| 维度 | QUESTION_ANS | FEATURE_EXTRACTION |
|---|---|---|
| 损失函数 | CrossEntropy / Seq2Seq | Contrastive / Triplet |
| 训练模块 | Q, V | Q, K, V |
| 输出层 | 保留 LM Head | 冻结/移除 LM Head |
| 输出类型 | Token logits | Feature embeddings |
| 典型应用 | 问答、对话、文本生成 | 语义搜索、相似度计算 |
总结
任务类型的指定不仅仅是个标签,它会实质性地影响:
- 哪些参数被更新
- 使用什么损失函数
- 如何处理模型输出
- 采用什么评估标准
选择正确的任务类型对于获得好的微调效果至关重要。如果你的目标是让模型生成答案,选择 QUESTION_ANS;如果是为了获得更好的文本表示用于检索或相似度计算,选择 FEATURE_EXTRACTION。