游乐园新来的检票员小林遇到一个难题:园方给他看了十位老员工的工牌照片,让他上岗认人;可下周还有五位新同事入职,一张照片都没有。好在人事部发来五张“人物特征卡”:王姐——马尾辫、红色卫衣、圆框眼镜;阿凯——寸头、左臂纹身、帆布鞋……当新同事出现在闸机口时,小林盯着人家的脸,心里快速比对特征卡,居然一个都没认错。 小林从没“见过”这五个人,却能认出他们。秘诀在于:老员工和新同事共享同一套描述体系——发型、衣着、配饰。他把“看得见的模样”和“写得出的描述”对应起来,就能把本领迁移到没见过的人身上。 零样本迁移学习(Zero-shot Learning, ZSL)干的就是这件事:让模型在训练时只看过一部分类别(已见类别),却能在测试时识别从未出现过的类别(未见类别)。其中的桥,就是属性描述与语义嵌入。这篇文章会沿着“问题定义 → 属性描述 → 语义嵌入 → 模型训练 → 匹配推理 → 实战评估 → 局限挑战”七步,把零样本迁移的原理与实战讲透。

岗位关联

零样本迁移是开放场景识别与未知类别分类的核心技术。掌握它,你就拥有了让模型“认出没见过的东西”的能力——这是安防、电商、生态监测等 AI 落地场景中极为稀缺的工程素养。

目录
  1. 可视化演示
  2. 问题定义:从“老员工”到“新同事”
  3. 属性描述:写好一张“人物特征卡”
  4. 语义嵌入:把特征写进同一坐标系
  5. 模型训练:练出一本“认人翻译手册”
  6. 匹配推理:新同事出现的那一刻
  7. 实战评估:上岗考核怎么打分
  8. 局限挑战:认人也有翻车时
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示零样本迁移学习核心机制:语义嵌入空间中可见类与未见类的表示与桥梁、线性投影映射f(x)=Wx的学习过程与零样本推理、以及域偏移问题与Hubness现象的缓解策略。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+captions.embed+'

问题定义:从“老员工”到“新同事”

小林上岗第一天就被告知:培训材料里只有十位老员工的工牌照片,下周要来的五位新同事一张照片都没有。传统的做法是“先见人、再认人”,可新同事根本不给这个机会。零样本迁移的出发点,就是把这种看似无解的任务变成可能:训练时见过的类别,和测试时要认的类别,完全不重叠。

在机器学习里,训练时出现过样本的类别叫“已见类别”,用 $\mathcal{S}$ 表示;只有语义描述、没有图像样本的类别叫“未见类别”,用 $\mathcal{U}$ 表示。传统分类器要求测试类别必须出现在训练集里,而零样本迁移反其道而行:测试类别一个都没见过,模型照样要给出判断。它靠的是一套两个类别群体通用的中间表示——正是小林手里那张特征卡所代表的属性体系。

这个“类别不重叠”的设定,是零样本迁移与传统分类最本质的分水岭。只要已见类别和未见类别共享可泛化的语义描述,模型就能把从老员工身上学到的“长相-描述对应规律”,平移应用到新同事身上。

所以,零样本迁移不是在“记忆长相”,而是在“学习描述与模样的对应规律”。小林真正学会的,不是“王姐长什么样”,而是“马尾辫、红卫衣这些描述词,对应眼睛能看到的哪些外观线索”——这才让他面对全新面孔时依然有底气。

S∩U=∅\displaystyle \mathcal{S} \cap \mathcal{U} = \varnothing
已见类别集合与未见类别集合的交集为空:训练时知道的类别,一个都不会出现在测试任务里(反过来,测试要认的类别,训练时一个图像都看不到)。
  1. 已见类别集合$\displaystyle \mathcal{S}$ 表示训练阶段提供过图像样本的全部类别,就像小林见过工牌照片的十位老员工。
  2. 未见类别集合$\displaystyle \mathcal{U}$ 表示测试阶段才出现的类别,对模型而言只有“人物特征卡”,没有照片。
  3. 交集为空$\displaystyle \mathcal{S} \cap \mathcal{U} = \varnothing$ 说明两个集合没有任何重叠类别,这正是零样本任务与传统分类的根本差异。

属性描述:写好一张“人物特征卡”

特征卡不是随便写的。如果只写“此人中等身高”,小林根本没法区分人群;但写上“左臂有龙形纹身”“说话带东北口音”“总是背黄色双肩包”,辨识度立刻拉满。可见,描述的质量直接决定认人的上限。在零样本迁移里,这张卡叫“属性描述”(attributes),是连接两个类别世界的知识底座。

每一个属性都是一个可标注的语义概念:对动物来说可以是“有条纹”“体型大”“夜行性”;对商品来说是“材质”“风格”“功能”。一个类别的属性描述,就是把这些概念的取值拼成一个向量。比如“斑马”的属性向量可以是:有条纹=1、毛茸茸=1、夜行=0、体型大=1、温顺=0、会飞=0。

属性通常由专家标注,也可以从维基百科等文本中自动挖掘。经典数据集 AWA(Animals with Attributes)就为 50 种动物标注了 85 个属性。属性向量的意义在于:即使模型从未见过“斑马”的图像,也能通过“条纹 + 体型大”这样的描述,在语义世界里先给它占一个位置。

小林最后总结出一条经验:特征卡上写的必须是他能观察到、且有区分度的线索。属性描述同理——好的属性要“看得见、分得开、跨类别通用”,这正是零样本迁移能否成功的第一块基石。

c(y)=[c1,c2,…,cd]⊤,ci∈[0,1]\displaystyle \mathbf{c}(y) = \left[ c_1, c_2, \ldots, c_d \right]^{\top}, \quad c_i \in [0, 1]
类别 $y$ 的属性向量 $\mathbf{c}(y)$ 是一个 $d$ 维向量,每个分量表示一个属性的强弱,取值在 0 到 1 之间。这一串数字,就是“人物特征卡”的数字化版本。
  1. 类别对应的属性向量$\displaystyle \mathbf{c}(y)$ 把“斑马”这类别映射成一串属性数字,相当于给每个新同事建立一份标准档案。
  2. 每个分量是一个属性$\displaystyle c_i$ 表示第 $i$ 个属性的取值,“有条纹”就记 1,没有就记 0。
  3. 向量维度$\displaystyle d$ 是属性表的总长度,属性越丰富,档案越立体。
  4. 取值范围$\displaystyle c_i \in [0,1]$ 说明属性既可以是“有/无”的二分开关,也可以是“条纹明显程度”这样的连续强度。

语义嵌入:把特征写进同一坐标系

特征卡是文字,眼睛看到的是像素,两者怎么直接比对?小林的做法是心里建立一套“翻译坐标系”:把“红色卫衣”翻译成颜色、明度、质感的心理刻度,把眼前人的外貌也翻译成同一套刻度。零样本迁移的技术实现,就是这个思路的数学化:语义嵌入(semantic embedding)。

图片经过卷积神经网络,被压缩成一个向量,叫视觉特征 $\phi(x)$——相当于小林对“眼前这个人”的数字化观察。类别描述(属性向量或文本)经过编码,变成另一个向量 $\psi(y)$——相当于特征卡的数字化档案。如果这两个向量落在同一个空间里,就能直接比较远近。

但视觉空间和语义空间天生“语言不通”,需要一个映射矩阵 $\mathbf{W}$ 来对齐,就像小林手里的翻译手册。对齐之后,兼容函数 $F(x, y)$ 输出一个分数,表示“这张图 $x$ 和这个类别描述 $y$ 有多匹配”。分数越高,越像。

换句话说,零样本模型真正学到的不是“每个类别长什么样”,而是一套把“看见的”翻译成“描述的”通用坐标系。坐标系建得好,未曾谋面的新同事也能被准确安放到坐标里。

F(x,y)=ϕ(x)⊤W ψ(y)\displaystyle \mathbf{F}(x, y) = \phi(x)^{\top} \mathbf{W}\, \psi(y)
兼容函数把视觉特征和语义特征做了一次“翻译后内积”:先由映射矩阵把两边对齐到同一坐标系,再点乘得到一个匹配分数。
  1. 视觉嵌入$\displaystyle \phi(x)$ 是图片 $x$ 经过特征提取网络得到的向量,好比小林对来客外貌的快速印象。
  2. 语义嵌入$\displaystyle \psi(y)$ 是类别描述经过编码得到的向量,好比特征卡被翻译成数字档案。
  3. 映射矩阵$\displaystyle \mathbf{W}$ 是“翻译手册”,负责把视觉空间和语义空间旋转、缩放到彼此可比。
  4. 内积打分$\displaystyle \phi(x)^{\top} \mathbf{W} \psi(y)$ 把翻译后的两边做点乘,得到标量分数,衡量匹配程度。

模型训练:练出一本“认人翻译手册”

小林上岗前有一周实习期,他不停地看老员工的照片、对照人事档案,心里反复校正:哦,照片上这个扎马尾的女孩,就是档案里写“马尾辫、红卫衣”的王姐。零样本模型的训练阶段也完全一样:只用已见类别的图像和属性,反复调整映射矩阵,让“档案翻译出来的位置”尽量落在“照片对应的位置”附近。

训练流程通常分四步:先用预训练网络提取图像的视觉特征 $\phi(x)$;再把每个训练样本的类别属性编码成 $\psi(y)$;然后用当前映射矩阵 $\mathbf{W}$ 把语义向量投影到视觉空间;最后计算投影结果与真实视觉特征的误差,用梯度下降更新 $\mathbf{W}$。整个过程一个未见类别都不需要出现。

误差怎么衡量?常用做法是最小二乘:希望 $\mathbf{W}\psi(y_n)$ 能尽可能还原 $\phi(x_n)$。把所有训练样本的误差加起来求最小,就得到了最终的对齐矩阵。

实习结束时,小林手里这本翻译手册已经能覆盖老员工的所有描述词。更重要的是,这些词在新同事的档案里同样适用——翻译手册练成的那一刻,跨越“已见到未见”的桥就搭好了。

min⁡W∑n=1N∥W ψ(yn)−ϕ(xn)∥2\displaystyle \min_{\mathbf{W}} \sum_{n=1}^{N} \left\| \mathbf{W}\, \psi(y_n) - \phi(x_n) \right\|^{2}
训练目标是最小化“映射误差”:把每个样本的类别描述经 $\mathbf{W}$ 投影后,应当与它真实的视觉特征尽量重合。误差越小,翻译手册越准。
  1. 对全部样本求和$\displaystyle \sum_{n=1}^{N}$ 遍历训练集中的 $N$ 个样本,逐一对齐。
  2. 映射预测值$\displaystyle \mathbf{W}\, \psi(y_n)$ 是把第 $n$ 个样本的类别描述翻译成“预测的视觉特征”。
  3. 与真实特征比较$\displaystyle \phi(x_n)$ 是第 $n$ 张图真实的视觉特征,两者相减得到偏差。
  4. 平方范数与最小化$\displaystyle \left\| \cdot \right\|^{2}$ 把偏差变成非负的标量误差,$\displaystyle \min_{\mathbf{W}}$ 表示寻找让总误差最小的映射矩阵。

匹配推理:新同事出现的那一刻

周一早上,一个扎马尾、穿红卫衣、戴圆框眼镜的女生走向闸机。小林没有她的照片,但他眼睛扫过三件事:发型、衣服、眼镜,心里快速把观察值翻译成坐标,然后与五张特征卡翻译出的坐标逐一比对距离。这就是零样本推理:查询点与所有未见类别原型比远近,选最近的那个。

正式地,模型对测试图片提取视觉特征 $\phi(x)$,对每个未见类别的语义嵌入 $\psi(y)$ 用训练好的 $\mathbf{W}$ 投影,得到“该类别的虚拟视觉中心”,然后计算 $x$ 与每个中心的兼容分数。分数最高的类别,就是预测结果。

实际工程中还有两个细节。一是搜索范围:传统 ZSL 只在未见类别集合 $\mathcal{U}$ 里找;二是阈值判定:如果最高分仍然很低,说明“来者不在任何档案里”,模型应当回答“未知”,而不是硬猜一个——这正是开放场景识别所必需的拒识能力。

推理阶段没有任何训练,是一个纯粹的“比对-选优”过程。小林扫一眼、翻档案、选最近——模型同样如此:提取、投影、打分、取最大。整个过程快、稳、无需更新任何参数,这也是零样本迁移在线上场景受欢迎的原因。

y^=arg⁡max⁡y∈UF(x,y)\displaystyle \hat{y} = \arg\max_{y \in \mathcal{U}} \mathbf{F}(x, y)
预测规则:在未见类别集合中遍历所有类别,把兼容函数分数最高的那个类别作为最终答案。谁的特征卡与眼前人最“对得上”,就认定是谁。
  1. 预测结果$\displaystyle \hat{y}$ 是模型最终输出的类别,即小林喊出的那句问候。
  2. 取最大值$\displaystyle \arg\max$ 表示“找到让括号里表达式最大的那个自变量”。
  3. 搜索集合$\displaystyle y \in \mathcal{U}$ 限定候选范围只在未见类别中,比如五位新同事的档案夹。
  4. 打分函数$\displaystyle \mathbf{F}(x, y)$ 就是上一节训练的兼容函数,此刻用它给每个候选档案打分。

实战评估:上岗考核怎么打分

小王试岗一个月后迎来考核。园方出了两套卷子:A 卷只考五位新同事(纯零样本),B 卷把老员工和新同事混在一起考(广义零样本)。小林 A 卷拿了 95 分,B 卷却暴露了问题——他太习惯认老员工,遇到新同事反而犹豫。这说明考核协议不同,同一个模型的表现可能天差地别。

于是评估体系需要两把尺子:已见类别准确率 $A_s$ 和未见类别准确率 $A_u$。只看 $A_u$,模型可以靠“乱猜新同事”侥幸得分;只看 $A_s$,模型退化回传统分类器也能拿高分。真正公平的指标是两者的调和平均 $H$:它惩罚偏科生——老员工认得再好、新同事认不出来,$H$ 一样很低。

标准评测里常用两个协议:传统 ZSL(测试集只含未见类别)和广义 GZSL(测试集合包含两类)。基准数据集包括 AWA2、CUB(鸟类细粒度属性)、SUN(场景属性)等,它们都提供了完整的“图像 + 属性表”,方便研究者公平对比。

考核的意义在于倒逼模型“两条腿走路”。一个合格的零样本系统,不该是只认识老员工的偏科生,而要在熟悉的日常与陌生的新面孔之间保持平衡——这正是广义零样本评估存在的理由。

H=2×As×AuAs+Au\displaystyle H = \frac{2 \times A_{\rm s} \times A_{\rm u}}{A_{\rm s} + A_{\rm u}}
调和平均是 $A_s$ 与 $A_u$ 的“和事佬”:只有两者都高,$H$ 才高;任何一边拖后腿,$H$ 都会明显下滑。
  1. 已见类别准确率$\displaystyle A_{\rm s}$ 表示模型在老员工身上的识别正确率。
  2. 未见类别准确率$\displaystyle A_{\rm u}$ 表示模型在新同事身上的识别正确率。
  3. 乘积与求和$\displaystyle 2 \times A_{\rm s} \times A_{\rm u}$ 与 $\displaystyle A_{\rm s} + A_{\rm u}$ 构成调和平均的分子分母。
  4. 整体平衡$\displaystyle H$ 是两者的调和平均,任何一边偏科都会让结果接近较小值。

局限挑战:认人也有翻车时

小林上岗三个月,翻车几次:一次是新同事照片光线昏暗(特征看不清);一次是两位新同事都“戴黑框眼镜、穿深色外套”,特征卡太模糊;还有一次,某张特征卡长得太“大众脸”,几乎每个人都跟它有点像。这三个问题,恰好对应零样本迁移的三大挑战:领域偏移、属性不完备、枢纽度。

领域偏移指已见类别和未见类别图像的采集环境不同(光线、角度、清晰度),导致视觉特征分布整体漂移。属性不完备指特征卡上的描述维度有限,区分不了长相相似的两个类。枢纽度(hubness)则更微妙:在语义空间中,某些原型向量“过于居中”,成了大量查询点的最近邻——就像班里那个“谁都像他”的同学,被反复误认。

枢纽度可以用一个计数公式刻画:统计某个语义原型 $v$ 在多少个查询点的 $k$ 近邻列表里出现过。数值越大,说明它越“大众脸”。

针对这些问题,研究者提出了不少解法:用更多未标注数据做无监督校准、为未见类别生成伪样本、借助大语言模型挖掘更丰富的属性描述、设计更均衡的嵌入空间。小林也在成长——他学会了多问一句、多看两眼、结合工牌日志去校正判断。零样本迁移同样在向“更稳健、更开放、更实用”的方向演进。

hubk(v)=#{x:v∈NNk(x)}\displaystyle \mathrm{hub}_k(v) = \#\left\{ x : v \in \mathrm{NN}_k(x) \right\}
枢纽度统计:对每个查询点取它的 $k$ 个最近邻原型,数一数原型 $v$ 被多少查询点“点名”。点名次数越多,$v$ 越容易成为误认目标。
  1. 语义原型$\displaystyle v$ 是某个未见类别的嵌入向量,即某张特征卡的坐标点。
  2. 近邻列表$\displaystyle \mathrm{NN}_k(x)$ 是查询点 $x$ 的 $k$ 个最近邻原型集合。
  3. 计数符号$\displaystyle \#\{\cdot\}$ 统计满足条件的查询点个数。
  4. 实质含义$\displaystyle \mathrm{hub}_k(v)$ 越大,$v$ 被误认的风险越高,需要做校准或去偏。

AI 应用场景

野外生态相机的稀有物种识别

阶段:数据准备与模型推断

解决的问题:生态相机拍到的绝大多数是常见物种,而科研人员恰恰最关心罕见的、从未标注过的物种。传统方案需要先人工标注大量该类图像才能训练分类器,但稀有物种本就难以收集样本。零样本迁移用《野生动物图鉴》中的属性描述(毛色、体型、耳型、花纹、活动时间)替代图像样本,让模型“看图查手册”。

具体案例:东北虎豹国家公园部署的红外相机拍到一只不常见的猞猁。训练数据里没有猞猁图片,但属性卡写着“短尾、耳尖有黑毛、身上有斑点、体型大于家猫”。模型提取画面特征后与属性原型比对,以高置信度输出“猞猁”,并触发稀有物种告警。

电商新品冷启动分类

阶段:特征工程与在线推理

解决的问题:电商上新时,新类目在历史数据里完全没有图片样本,传统分类器无法处理“从没见过的类目”。零样本迁移用商品文本属性(材质、版型、风格、适用场景、功能)作为桥梁,让新商品一上架就能被自动分流到正确的运营类目。

具体案例:某服饰平台上线“防晒袍”这一全新类目,零样本模型读取商品详情页的结构化属性——“宽松、防晒、外穿、透气、长袖”——与已学类目的语义空间对齐,自动归入“功能性外套”的邻域,同时给运营推荐关联搭配。新品无需积累一张训练图,即可获得分类与曝光。

工业质检中的未知缺陷告警

阶段:模型部署与异常识别

解决的问题:产线质检模型只见过已知缺陷(划痕、凹坑、脏污),一旦出现从未见过的缺陷类型就会漏检。零样本迁移预先建立“缺陷属性卡”(颜色、形状、走向、纹理密度),让模型在遇到未知缺陷时能“按卡描述”而非“按图索骥”。

具体案例:光伏板 EL 检测线上,模型突然遇到一种新型隐裂——细线状、黑色、沿电池片纵向分布。该缺陷从未出现在训练集里,但属性卡命中“黑色、细线、纵向”,模型准确报出“疑似隐裂,置信度 0.87”,并转人工复核,避免整批组件流出产线。

Python 演示

python65 行
# -*- coding: utf-8 -*-import numpy as np np.random.seed(42) # 6 个语义属性:条纹, 毛茸茸, 夜行, 体型大, 温顺, 会飞attr_names = ["条纹", "毛茸茸", "夜行", "体型大", "温顺", "会飞"] seen_classes = {    "猫":   [0, 1, 0, 0, 0, 0],    "狗":   [0, 1, 0, 0, 1, 0],    "老鹰": [0, 0, 0, 0, 0, 1],    "熊":   [0, 1, 0, 1, 0, 0],    "金鱼": [0, 0, 0, 0, 1, 0],} unseen_classes = {    "斑马": [1, 1, 0, 1, 0, 0],    "蝙蝠": [0, 1, 1, 0, 0, 1],    "白鲸": [0, 0, 0, 1, 1, 0],}  def make_visual(attr):    # 模拟摄像头观测:属性被噪声干扰后变成视觉特征    return np.array(attr, dtype=float) + np.random.normal(0, 0.12, len(attr))  def build_dataset(class_attr, samples_per_class=40):    X, y = [], []    for name, attr in class_attr.items():        for _ in range(samples_per_class):            X.append(make_visual(attr))            y.append(name)    return np.array(X), np.array(y)  X_train, y_train = build_dataset(seen_classes) # 训练:用最小二乘学映射矩阵 W,使 W * 属性向量 ≈ 视觉特征attr_matrix = np.array([seen_classes[c] for c in y_train])W, _, _, _ = np.linalg.lstsq(attr_matrix, X_train, rcond=None) train_err = np.mean(np.linalg.norm(X_train - attr_matrix @ W, axis=1))print("训练集映射误差: {:.4f}".format(train_err))  def predict(X, candidates):    # 每个未见类别原型经 W 映射成虚拟视觉中心,查询点找最近者    prototypes = {name: W @ np.array(attr) for name, attr in candidates.items()}    preds = []    for x in X:        scores = {name: np.linalg.norm(x - proto) for name, proto in prototypes.items()}        preds.append(min(scores, key=scores.get))    return preds  X_test, y_test = build_dataset(unseen_classes, samples_per_class=20)preds = predict(X_test, unseen_classes)acc = float(np.mean(np.array(preds) == np.array(y_test)))print("零样本测试准确率: {:.2%}".format(acc))for name in unseen_classes:    mask = np.array(y_test) == name    hit = np.mean(np.array(preds)[mask] == name)    print("  {}: {:.2%}".format(name, hit))
目的:用最小二乘学一个从属性向量到视觉特征的映射矩阵,让模型只凭“属性卡”识别训练时从未见过的物种——一份可运行的迷你零样本迁移系统。
  1. attr_matrix = np.array([seen_classes[c] for c in y_train])把每个训练样本的类别名替换成对应的属性向量,构成“档案矩阵”。
  2. W, _, _, _ = np.linalg.lstsq(attr_matrix, X_train, rcond=None)用最小二乘求映射矩阵 W,让“档案翻译”尽量接近“照片特征”。
  3. def make_visual(attr):模拟观测过程:属性经过噪声扰动后变成视觉特征,让数据更像真实摄像头。
  4. prototypes = {name: W @ np.array(attr) for name, attr in candidates.items()}把未见类别的属性卡经 W 投影成“虚拟视觉中心”。
  5. scores = {name: np.linalg.norm(x - proto) for name, proto in prototypes.items()}对每个未见类别计算查询点与虚拟中心的距离,作为兼容分数。
  6. preds.append(min(scores, key=scores.get))选择距离最近(分数最高)的类别作为预测结果。
  7. acc = float(np.mean(np.array(preds) == np.array(y_test)))对比预测与真实标签,计算零样本准确率。

常见误区

误区既然叫“零样本”,那模型应该一张图都不用看,直接就能识别新类别吧?我是不是可以完全跳过训练阶段?

正解零样本的“零”特指未见类别没有图像样本,而不是整个系统不需要训练。模型必须先用大量已见类别的图像和属性做对齐训练,学出“视觉特征与语义描述之间的翻译规律”,才能去认未见类别。就像小林必须先认识十位老员工、反复比对档案,才能把本领迁移到新同事身上——完全跳过训练,翻译手册就是空白。

为何常见:“零样本”这个词太容易让人望文生义,以为训练数据为零,忽略了“类别层面的零样本”与“数据层面的零标注”是两回事。

误区给每个类别多写几十个属性,特征卡越厚,零样本识别应该越准,反正信息量大总不会吃亏。

正解属性不是越多越好,而是越有区分度、越可观测越好。冗余属性会稀释有效信号,噪声属性会误导对齐,与视觉无关的抽象属性(如“性情高冷”)根本没法从图像里学到对应关系。研究员在 AWA 上发现,删掉部分低质量属性后效果反而上升。这就像特征卡上写“此人星座是摩羯座”——小林看得到吗?看不到的属性就是废卡。

为何常见:直觉上信息多等于效果好,但忽略了属性必须能被视觉特征“接住”,模型学不会无法观测的描述。

误区训练好的零样本模型,拿到测试集上直接算准确率就行,跟普通分类模型评估没什么区别。

正解零样本有自己严格的评测协议:传统 ZSL 的测试集只允许出现未见类别,而广义 GZSL 的测试集是已见 + 未见混合,且必须用调和平均 H 而不是单一准确率来评估。用普通分类的“全类别测试集”去测零样本模型,会严重高估或低估效果,结论完全失真。就像考核小林必须说明白是“只考新同事”还是“新旧混考”,卷子不同,分数没有可比性。

为何常见:大多数人习惯了“训练集/测试集同分布”的传统范式,没有意识到零样本在评测协议上是另一个物种。

误区把类别名字(比如“斑马”)丢进 Word2Vec 或 BERT 拿到向量,不就有语义嵌入了吗?零样本不就解决了吗?

正解类别名的词向量只是起点,远不是全部。零样本迁移需要的是与视觉特征对齐过的语义空间:模型必须学会“条纹在图像里长什么样”和“条纹这个词在语义空间里在哪”是一回事。未经对齐的原始词向量,与视觉特征坐标系差异巨大,兼容分数没有意义。实践中常用属性向量、属性 + 名称的融合描述,并在训练中用兼容函数强制对齐。

为何常见:现代 NLP 工具太方便,让人误以为“有词向量就有语义”,忽略了跨模态对齐才是零样本的核心难点。

面试题

Q1. 零样本学习中,“训练时未见过类别”指的是什么?

单选题 · easy

  • A.测试阶段首次出现的类别← 正确答案
  • B.训练阶段出现且测试也出现
  • C.只出现在验证集里的类别
  • D.没有任何语义描述的类别

答案:A。零样本学习的核心设定是训练集与测试集类别不相交,测试时出现的类别在训练阶段完全看不到,只有语义描述可供参考。B 是传统分类的设定,C 的验证集类别仍在训练集中见过,D 描述的是“无描述”而非“未见”。

Q2. 属性向量的作用是什么?

单选题 · easy

  • A.描述类别共享的语义特征← 正确答案
  • B.直接保存图片的像素值
  • C.替代训练使用的所有样本
  • D.存储网络的超参数配置

答案:A。属性向量把类别翻译成一组可标注的语义特征,如“有条纹、体型大”,是连接已见类别与未见类别的桥。像素值属于视觉特征而非语义属性;属性不能替代训练样本,只是辅助迁移的知识;超参数与属性无关。

Q3. 兼容函数 F(x,y)=φ(x)ᵀWψ(y) 输出的含义是什么?

单选题 · mid

  • A.图片与类别描述的匹配分数← 正确答案
  • B.图片在像素级上的相似程度
  • C.某个类别的属性个数总和
  • D.训练集样本的数量总和

答案:A。兼容函数把视觉特征和语义描述映射到同一空间后做点乘,输出标量分数,衡量“这张图有多像这个类别描述”。它计算的是语义匹配程度而非像素相似度,与属性个数或样本数量无关。

Q4. 零样本训练阶段,映射误差最小化要达到什么效果?

单选题 · mid

  • A.让属性原型投影后靠近视觉特征← 正确答案
  • B.让损失函数变成负无穷
  • C.让模型完全忽略语义描述
  • D.让训练样本被全部丢弃

答案:A。训练目标是让 Wψ(y) 尽量接近 φ(x),即“档案翻译后的位置”贴住“照片特征的位置”,从而学会视觉与语义的对齐规律。损失不会无限变小,模型也不能忽略语义,训练样本更是越充分越好。

Q5. 零样本推理时,argmax 在哪个集合上进行搜索?

单选题 · mid

  • A.在全部未见类别中打分选优← 正确答案
  • B.在全部已见类别中打分选优
  • C.在所有训练样本全体中打分
  • D.在属性描述集合中打分选优

答案:A。传统 ZSL 的预测规则是 ŷ = argmax F(x,y),候选集合是未见类别 U,因为测试图片只会来自这些新类别。在已见类别或训练样本上搜索违背零样本设定,属性集合本身不是类别。

Q6. 广义零样本(GZSL)的测试集包含什么?

单选题 · easy

  • A.已见类别与未见类别混合← 正确答案
  • B.只有未见类别的图像样本
  • C.只有已见类别的图像样本
  • D.完全没有类别标签样本

答案:A。GZSL 更贴近真实开放场景,测试集同时包含已见和未见类别,因此需要调和平均 H 来平衡两类准确率。只含未见类别是传统 ZSL 协议,只含已见类别则退化为普通分类。

Q7. 调和平均 H 指标主要用来防止什么?

单选题 · hard

  • A.模型偏科,只认清已见类别← 正确答案
  • B.训练过程对已见类别过拟合
  • C.属性描述向量过于稀疏
  • D.推理阶段计算速度过慢

答案:A。H 是已见准确率与未见准确率的调和平均,任何一边严重偏低都会拉低 H。它专门防止模型在 GZSL 中“偏科”——只顾讨好训练过的类别而忽视未见类别。后三者分别属于优化、属性设计和工程问题,与 H 无关。

Q8. 下列哪些是零样本迁移的常见挑战?

多选题 · hard

  • A.领域偏移削弱模型泛化能力← 正确答案
  • B.枢纽度导致预测偏向某些类别← 正确答案
  • C.属性描述不完备且含有噪声← 正确答案
  • D.测试集与训练集类别完全相同

答案:ABC。领域偏移指未见类别图像分布与训练时不同,枢纽度指某些语义原型被过度“点名”,属性不完备则限制类别间区分度,三者都是零样本的核心难题。D 描述的恰好是传统分类的设定,不是零样本的挑战。

Q9. 语义属性通常从哪里获得?

单选题 · mid

  • A.专家标注或从文本中挖掘← 正确答案
  • B.直接从测试图像中提取
  • C.随机生成并与任务无关
  • D.训练完成后自动涌现

答案:A。属性需要人为定义或从维基百科等文本中自动挖掘,且必须与视觉特征可对齐。测试图像在训练时不可见,随机属性没有语义,模型也无法凭空涌现出可用的属性体系。

Q10. 针对枢纽度问题,下列哪些是有效的缓解方向?

多选题 · extreme

  • A.校准语义原型的先验概率← 正确答案
  • B.为未见类别生成伪样本← 正确答案
  • C.使用更丰富的属性描述← 正确答案
  • D.删除所有已见类别原型

答案:ABC。先验校准可以修正“大众脸”原型被高估的倾向,生成伪样本能补充未见类别的分布信息,丰富属性则让原型彼此更可分。删除已见类别原型既破坏训练成果,也不能解决枢纽度,反而会损失已见类别的识别能力。