Concept Bottleneck Models
概念瓶颈模型(CBM)先预测以人类命名的概念,再仅根据这些概念预测标签,让专家能够检查并纠正每项决策。
概念瓶颈模型(CBM)是一种神经网络,它先从输入中预测一组以人类命名的概念,再仅使用这些概念预测最终标签。对于膝关节 X 光片,概念可以是关节间隙变窄和骨赘;对于鸟类照片,概念可以是翅膀颜色和喙的形状。由于每次预测都要经过这个狭窄且带标签的层,人们可以看到哪些概念影响了决策,也可以纠正错误概念来改变结果,因此 CBM 是一种内置于架构中的可解释人工智能(XAI)。斯坦福大学和 Google 的 Pang Wei Koh、Thao Nguyen、Yew Siang Tang、Stephen Mussmann、Emma Pierson、Been Kim 和 Percy Liang 在 ICML 2020 上发表的 Concept Bottleneck Models 中引入了这一术语,并展示了其在两项任务上的准确率可与标准端到端模型相媲美:根据 X 光片评估膝骨关节炎等级,以及识别鸟类物种。
概念瓶颈模型的工作原理#
CBM 包含两部分:将输入(例如图像)映射为概念值的概念预测器,以及将概念值映射为输出的标签预测器。Koh 等人比较了三种训练方式:
- 独立训练:概念预测器根据概念标注进行学习,标签预测器根据真实概念进行学习,两者分别训练。
- 顺序训练:先训练概念预测器,再让标签预测器根据预测出的概念进行学习。
- 联合训练:两部分共同训练,优化概念损失与标签损失的加权和。
在骨关节炎倡议(Osteoarthritis Initiative)数据中,36,369 张膝关节 X 光片根据 Kellgren-Lawrence 严重程度分级进行标注;概念包括放射科医生已经会评估的 10 种序数发现,例如关节间隙变窄、骨赘和骨硬化。在包含 11,788 张、涵盖 200 个物种的照片的 Caltech-UCSD Birds 数据集中,概念包括 112 种二元属性,例如翅膀颜色和喙的形状。每个训练样本都需要同时提供概念和标签标注,这是这种方法的主要成本。
瓶颈结构支持测试时干预:专家发现预测概念有误时,可以将其替换为正确值,然后由标签预测器重新计算输出。在 X 光片任务中,只提供两个概念的真实值,就能将预测严重程度的误差从 0.4 以上降至约 0.3 RMSE。
这个 PyTorch 示例在玩具数据上训练一个独立 CBM:六个二元概念生成带噪声的输入,标签仅取决于这些概念;随后,示例会测量专家逐个提供置信度最低的概念的真实值时,标签准确率如何变化:
import torch
from torch import nn
torch.manual_seed(0)
# Toy data: 6 binary concepts generate noisy 20-D inputs, and the label depends only on the concepts
concepts = torch.randint(0, 2, (3000, 6)).float()
inputs = concepts @ torch.randn(6, 20) + 2 * torch.randn(3000, 20)
labels = (concepts @ torch.tensor([3.0, 2, 2, 1, 1, 1]) >= 5).float()
train, test = slice(0, 2000), slice(2000, None)
# Independent training: inputs -> concepts, and concepts -> label, each against its own ground truth
concept_model, label_model = nn.Linear(20, 6), nn.Linear(6, 1)
optimizer = torch.optim.Adam([*concept_model.parameters(), *label_model.parameters()], lr=0.05)
bce = nn.functional.binary_cross_entropy_with_logits
for _ in range(500):
optimizer.zero_grad()
loss = bce(concept_model(inputs[train]), concepts[train]) + bce(label_model(concepts[train])[:, 0], labels[train])
loss.backward()
optimizer.step()
with torch.no_grad():
probs = concept_model(inputs[test]).sigmoid()
print(f"Concept accuracy: {((probs > 0.5) == concepts[test]).float().mean():.3f}")
for k in range(4):
# Test-time intervention: replace the k least certain predicted concepts with their true values
uncertain = (probs - 0.5).abs().argsort(dim=1)[:, :k]
fixed = probs.scatter(1, uncertain, concepts[test].gather(1, uncertain))
accuracy = ((label_model(fixed)[:, 0] > 0) == labels[test].bool()).float().mean()
print(f"Intervene on {k} of 6 concepts: label accuracy {accuracy:.3f}")概念预测器在 6,000 个测试概念中正确预测了 0.834 个,CBM 在 1,000 个测试样本中正确预测了 0.819 个标签。对每个样本提供置信度最低的一个、两个和三个概念的真实值后,标签准确率分别提升至 0.861、0.915 和 0.951,且两个模型都不需要改动。
CBM 的应用场景#
CBM 适用于专家本来就会依据明确命名的发现进行判断的领域。在医学图像分析中,上述 X 光研究使用了放射科医生记录的相同发现,因此临床医生可以逐项检查。安全监控也具有相同结构:在Construction-PPE 数据集上训练的 Ultralytics YOLO26 模型会检测以名称标注的类别,例如 helmet、no_helmet、vest 和 no_boots;只读取这些检测结果的合规规则就构成了一个概念瓶颈,审核人员可以追溯其决策所依据的具体缺失物品。
后续研究放宽了标注要求。无标签 CBM使用语言模型生成概念列表,并使用 CLIP为概念打分,无需概念标签便将这一思路扩展到 ImageNet;事后 CBM 则通过将嵌入投影到概念方向上,把已训练好的模型转换为 CBM。
局限性#
概念集合很少能涵盖决定标签的所有因素,因此 CBM 的准确率会受到限制。当标签预测器接收的是概念概率而非硬值时,这些概率可能携带超出各概念含义本身的标签信息;这种现象称为概念泄漏,会降低解释和干预的可信度。概念嵌入模型会将每个概念表示为一个学习得到的向量,以在保持准确率的同时支持干预。定义不清或彼此相关的概念会导致解释不可靠,而存在偏差的概念标注会将偏差传递到依赖这些标注的每项决策中。










