InfICL: 用影响函数选择最优示例

论文信息

  • 标题: In-Context Learning Demonstration Selection via Influence Analysis
  • 作者: Vinay M.S., Minh-Hao Van, Xintao Wu
  • 机构: University of Arkansas
  • 发表: arXiv preprint
  • 链接: arXiv | PDF

核心贡献

InfICL利用影响函数(Influence Functions)分析训练样本对模型预测的影响,识别最有价值的ICL示例。相比随机选择或embedding相似度,InfICL能找到真正”有影响力”的示例,在多个数据集上提升2-5%准确率,且无需模型微调。

问题与背景

示例选择的难题

ICL性能的高度敏感性

ICL效果严重依赖示例选择:

1
2
3
# 相同任务,不同示例
examples_A = [good_example_1, good_example_2] → 85% accuracy
examples_B = [bad_example_1, bad_example_2] → 62% accuracy

问题:如何自动选择最优示例?

现有方法的局限

方法 思路 局限
Random 随机采样 不稳定,方差大
Similarity Embedding相似度 相似≠有用
Diversity 最大化多样性 可能选到离群点
LLM-based 用大模型打分 成本高,不scalable

方法详解

InfICL方法

核心思想

借用影响函数(来自可解释性研究):

1
Influence(z_train, z_test) = -∇_θ L(z_test) · H^(-1) · ∇_θ L(z_train)

直观理解

  • 如果移除训练样本z_train,测试样本z_test的loss会变化多少?
  • 变化大 → z_train对z_test有高影响力

应用到ICL

  • 训练样本 → ICL示例
  • 测试样本 → 当前查询
  • 选择影响力最大的示例

简化版实现

完整影响函数计算Hessian矩阵(计算量大),作者提出简化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def compute_influence_simplified(model, demo, query):
"""
简化的影响力计算
只使用embedding,避免Hessian
"""
# 1. 获取demo和query的embedding
demo_emb = model.encode(demo, layer=-1)
query_emb = model.encode(query, layer=-1)

# 2. 计算梯度相似度(代替完整影响函数)
# 假设: 梯度方向相似的样本有高影响力
influence = cosine_similarity(demo_emb, query_emb)

# 3. 调整: 考虑demo的"代表性"
demo_diversity = compute_diversity_score(demo)
adjusted_influence = influence * (1 + 0.1 * demo_diversity)

return adjusted_influence

def select_demonstrations(model, demo_pool, query, k=5):
"""
选择top-k有影响力的示例
"""
influences = [
compute_influence_simplified(model, demo, query)
for demo in demo_pool
]

# 选择影响力最大的k个
top_k_idx = np.argsort(influences)[-k:]
return [demo_pool[i] for i in top_k_idx]

与Embedding相似度的区别

Embedding相似度

1
2
similarity = cosine(embed(demo), embed(query))
# 只考虑表面语义相似性

Influence

1
2
influence = gradient_alignment(demo, query)
# 考虑对模型预测的实际影响

示例

  • Query: “The movie was terrible”
  • Demo A: “The film was awful” (高相似度)
  • Demo B: “Not recommended, very disappointing” (低相似度但高影响力)

Demo B可能因为包含关键推理模式而更有用。

实验结果

主要性能

数据集 Random Similarity InfICL
SST-2 82.3% 85.1% 87.4%
TREC 76.5% 79.2% 81.8%
AG News 84.1% 85.7% 87.2%

平均提升:比Random高5%,比Similarity高2.3%。

效率对比

方法 计算时间(1000 queries)
Random <1s
Similarity 12s
InfICL 15s
LLM-based 340s

结论:InfICL成本略高于相似度,但远低于LLM打分。

示例数量的影响

1
2
3
4
5
6
7
8
9
10
11
12
# 固定总token预算,对比策略
budget = 500 tokens

# 策略A: 更多示例,随机选择
n_examples = 10 # 每个50 tokens
accuracy = 83.2%

# 策略B: 更少示例,InfICL选择
n_examples = 5 # 每个100 tokens
accuracy = 87.4% # 更好!

# 启示: 质量>数量

深度分析

为什么影响函数有效?

假设1:激活相关神经模式

高影响力示例激活与query相关的神经回路:

1
2
Demo(高影响力) + Query → 激活pattern X → 正确预测
Demo(低影响力) + Query → 激活pattern Y → 错误预测

假设2:提供有用的”梯度信号”

从优化角度,高影响力示例提供了正确方向的梯度:

1
2
如果要微调模型使其在query上表现好,
高影响力demo提供的梯度方向是最有帮助的

失败案例

Case: 领域偏移

Query: “This cryptocurrency is revolutionary” (金融领域)
Demo Pool: 电影评论数据集

InfICL仍选择电影评论 → 效果不佳

原因:影响函数基于embedding,跨领域时embedding不可靠。

解决:先做领域过滤,再用InfICL。

实用价值

实现建议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 生产级InfICL流程
class InfICLSelector:
def __init__(self, model, demo_pool):
self.model = model
self.demo_pool = demo_pool
# 预计算所有demo的embedding(避免重复计算)
self.demo_embeddings = [
model.encode(demo) for demo in demo_pool
]

def select(self, query, k=5, diversity_weight=0.1):
query_emb = self.model.encode(query)

# 计算影响力
influences = [
self._compute_influence(demo_emb, query_emb)
for demo_emb in self.demo_embeddings
]

# Greedy diverse selection
selected = []
for _ in range(k):
# 在剩余demo中选择影响力最大的
scores = influences.copy()

# 惩罚与已选demo相似的
for idx in selected:
for i, demo_emb in enumerate(self.demo_embeddings):
similarity = cosine(demo_emb, self.demo_embeddings[idx])
scores[i] -= diversity_weight * similarity

best_idx = np.argmax(scores)
selected.append(best_idx)
influences[best_idx] = -np.inf # 避免重复选择

return [self.demo_pool[i] for i in selected]

何时使用InfICL

推荐:

  • Demo pool较大(>100个候选)
  • 任务性能敏感
  • 有时间做预处理(离线计算embedding)

不推荐:

  • 实时场景(延迟敏感)
  • Demo pool很小(<20个)
  • 跨领域迁移

与检索增强的结合

1
2
3
4
5
6
7
8
9
10
11
# Retrieval + InfICL 两阶段
def hybrid_selection(query, large_pool, k=5):
# 阶段1: BM25/Dense检索召回候选
candidates = retriever.search(query, top_k=50)

# 阶段2: InfICL精排
final_demos = inficl.select(query, candidates, k=k)

return final_demos

# 优势: 结合召回和排序的strengths

总结

InfICL提供了一种原则性的示例选择方法:

核心优势:

  • ✓ 理论基础清晰(影响函数)
  • ✓ 效果优于baseline(+2-5%)
  • ✓ 无需模型微调
  • ✓ 可扩展性好

适用场景:

  • Few-shot分类/QA任务
  • Demo pool丰富的情况
  • 需要稳定性能

局限:

  • 跨领域泛化有限
  • 需要预计算开销

未来方向:

  • 结合主动学习(迭代收集高影响力demo)
  • 扩展到multi-modal示例选择
  • 研究influence的可解释性

资源链接

© 2026 Generative AI Discovery All Rights Reserved.
Theme by hiero