0 · 导读:一条把两条路线焊在一起的铁律
Zero-shot(零样本)的字面意思很简单:测试/推理时面对的「类别」或「任务」,在训练阶段一个样本都没见过。但「没见过类别」不等于「没见过相关信号」——这是理解零样本的全部钥匙。两条历史路线其实在做同一件事:
零样本 = 借助一个训练时见过、但任务标签未见过的「语义空间」,把输入和「未见过的标签/任务」对齐,从而在不更新权重的前提下做预测。
- 经典 ZSL(视觉为主):训练时见过「马、老虎、熊猫」和一组属性(有毛/会飞/水生/体型…)。测试时给一个从没见过的类「斑马」,但给了它的属性向量——模型靠「属性」这个语义空间,把「带条纹的马」这种没见过的类对齐到输入上。
- LLM 零样本(语言为主):模型在预训练时见过海量文本,但没为「情感分类」这任务调过参数。推理时你用自然语言描述任务(“这句话是正面的吗?”),模型靠「语言」这个语义空间,把任务对齐到下一词预测的分布上。
两条路线的差异只是「语义空间」的来源不同(人工属性 vs 语言 token),底层机制是同构的:都归结为 score(x, y) = sim(enc_x(x), enc_y(y))。第 4 节会把这个同构讲透,第 6 节用一个 numpy 玩具和第 4 节的可视化把它跑出来。
相关篇章(本系列):next-token-prediction-deep-dive(§6.3 的 ICL 贝叶斯解释是 LLM 零样本的地基)、nlp-deep-dive(词向量与语义空间)、llm-deep-dive(预训练与对齐)、bert-pretraining-deep-dive(MLM 双向表征,与 NTP 单向的对比)。
1 · 定义与统一视角
1.1 什么是「零样本」:先划清三条边界
| 监督学习(含标准微调) | 见过 | 同类分布下的新样本 | 用带标签猫狗图训练猫狗分类器 |
| Few-shot / ICL(少样本/上下文学习) | 未见权重但提示里给少量示例 | 几个示例 + 查询 | GPT-3 给 3 个 QA 样例再问第 4 个 |
| Zero-shot(零样本) | 未见,且提示里也不给示例 | 任务描述 / 类属性 / 模板 | “判断这句话的情感:…”;给未见类的属性向量 |
| Open-set recognition | 见过已知类 | 已知类 + 「未知」兜底 | 人脸识别里把陌生人判为 unknown |
关键区分:zero-shot 与 few-shot 都不更新权重,差别在提示里有没有示例;zero-shot 与 open-set 都被迫处理未见类别,但 open-set 只要求「认出没见过」而不要求「分到某个具体未见类」。本文的 zero-shot 取最严格的定义——测试标签空间 YtestY_{test}Ytest 与训练标签空间 YtrainY_{train}Ytrain 不相交(Ytrain∩Ytest=∅Y_{train} \\cap Y_{test} = \\emptysetYtrain∩Ytest=∅),即「真正没见过」。
1.2 统一抽象:把「输入」和「标签/任务」都塞进一个共享空间
零样本没法直接学 P(y | x)(因为训练时某些 yyy 从没出现)。解法是引入一个中间语义空间 S\\mathcal{S}S,把两边都投影进去:
x→ ϕ ϕ(x)∈S,y→ ψ ψ(y)∈Sx \\xrightarrow{\\ \\phi\\ } \\phi(x) \\in \\mathcal{S}, \\qquad y \\xrightarrow{\\ \\psi\\ } \\psi(y) \\in \\mathcal{S}x ϕ
ϕ(x)∈S,y ψ
ψ(y)∈S
预测时不再直接比较 (x,y)(x, y)(x,y),而是比较它们在 S\\mathcal{S}S 里的向量靠近程度:
y^=argmaxy∈Y score(ϕ(x), ψ(y)),score(u,v)≜u⊤v 或 cos(u,v)\\hat{y} = \\arg\\max_{y \\in \\mathcal{Y}} \\; \\mathrm{score}\\big(\\phi(x),\\, \\psi(y)\\big), \\qquad \\mathrm{score}(u, v) \\triangleq u^\\top v \\;\\text{或}\\; \\cos(u, v)y^=argy∈Ymaxscore(ϕ(x),ψ(y)),score(u,v)≜u⊤v或cos(u,v)
为什么这能实现零样本:ψ(y)\\psi(y)ψ(y) 这个投影函数(属性向量、词向量、文本模板编码…)对「未见过的 yyy」同样可用——只要我们能写出「斑马」的属性或文本描述,哪怕训练时从没见过斑马图,也能把它投影进 S\\mathcal{S}S 参与打分。训练只需让 ϕ\\phiϕ(视觉/文本编码器)和 ψ\\psiψ(语义编码器)把见过的样本对齐好,泛化到未见 yyy 由「共享空间」保证。
1.3 两条路线,一种机制:实例化对照
| 输入编码器 ϕ\\phiϕ | CNN / ViT(图像→向量) | Transformer(token→向量) |
| 语义编码器 ψ\\psiψ | 人工属性向量 / 词向量 / 文本描述编码 | 自然语言模板 → token 分布 |
| 语义空间 S\\mathcal{S}S | 属性空间(如 85 维 AWA 属性)或词向量空间 | 语言模型隐空间 / token 概率空间 |
| 评分 | ϕ(x)⊤Wψ(y)\\phi(x)^\\top W \\psi(y)ϕ(x)⊤Wψ(y)(兼容性) | 在 prompt 条件上 PPP(target token ∣\\mid∣ context) |
| 未见信息来源 | 类的属性/词向量(标注或外部知识库) | 预训练语料里蕴含的任务描述 |
| 典型失败 | 属性噪声、hubness、GZSL 偏见 | prompt 敏感、calibration 差、推理短板 |
1.4 与相邻概念划界
- Transfer learning / 域适应:源域有标签、目标域有(或无)标签,但标签空间通常相同;zero-shot 强制标签空间不同。
- Domain generalization:标签空间相同,只是测试分布偏移;zero-shot 没有「见过同类标签」这回事。
- Metric learning / 检索:都在学一个空间里的距离,但检索不要求「训练时没见过查询类」。
2 · 经典零样本学习(ZSL)
2.1 属性基方法:DAP 与 IAP
Lampert et al. 2009 / 2014 的开创性工作把 ZSL 形式化为属性转移:每个类由一组语义属性描述(「有毛」「会飞」「水生」…)。两类推断策略:
-
DAP(Direct Attribute Prediction,直接属性预测):先学每个属性的二分类器 P(a∣x)P(a \\mid x)P(a∣x),再聚合:
P(y∣x)=∑aP(y∣a) P(a∣x)P(y \\mid x) = \\sum_{a} P(y \\mid a)\\, P(a \\mid x)P(y∣x)=a∑




