想象你拿到了一张由 AI 自己绘制的城市地图。这座城市没有路名,每一条街道都是模型内部激活值构成的“语义坐标”;每一栋楼都代表一个词或一个概念。你很快会发现一个惊人规律:凡是跟“图书馆”有关的信息,在地图上都沿着某个固定方向排列——不是挤在某个街区,而是散布在一条贯穿城市的长轴上。找到这条轴,就等于握住了一把表达“知识”的指南针。概念向量技术要做的,就是把这种肉眼看不见的结构变成可审计的证据:用方向刻画概念、用夹角衡量语义远近、用投影判断概念对决策的影响。这篇内容会带你从“高维空间里的方向”出发,依次学会构建概念激活向量、计算 TCAV 归因分数、设计探测实验、搭建概念瓶颈模型,并最终用因果干预回答那个最难的问题——模型是真的在用它表达概念,还是仅仅碰巧相关。你还会看到这些工具如何被用在偏见检测与模型审计中,让 AI 决策从“黑盒猜测”变成“沿着方向的逻辑”。
对 AI 从业者而言,掌握概念向量意味着有能力回答“模型为什么这样判断”这一高价值问题,它是模型行为审计、偏见排查与可解释性研究中的核心技能。
可视化演示
展示概念向量在高维空间中的方向性表征与TCAV概念敏感性分析流程,揭示模型内部语义结构。
本节配有交互动效(进入视口后自动加载,约 3KB)。
概念向量高维空间 C1条纹方向:纹理特征方向 C2颜色方向:色相饱和度方向 C3形状方向:几何轮廓方向 v_c = mean(act(positive)) - mean(act(negative)) 概念向量是高维空间中语义方向。
高维语义空间
我们还是回到那张 AI 自绘的城市地图。普通人看神经网络,只能看到一排排数字;但如果你把某一层的激活值当作坐标,就会看到无数“建筑”自动排列出了语义地块:表示“图书馆”的样本聚集在一条轴的两侧,表示“咖啡”的样本聚集在另一条轴附近。这座城市的奇妙之处在于:概念不是某个具体的坐标点,而是一条可以无限延伸的方向。就像你站在市中心问路,别人不会说“图书馆在经纬度 (116.4, 39.9)”,而会说“沿着这条大街一直往北偏西走”——方向比位置更能概括一座城市的语义。
在技术世界里,这个“城市”就是神经网络内部的高维特征空间。模型把输入映射成一个向量 $\mathbf{l}_x$,向量的每一维没有固定含义,但整体排列却隐含规律:同概念样本的激活值会沿某个共同方向聚集。于是“概念”被形式化为空间中的一个方向,而判断两个方向是否一致,就用到余弦相似度。
有了余弦相似度这把“量角器”,地图上的任意两个方向都能比较远近。但这张地图是谁画的、方向从哪来,还没有答案。下一页我们进入正题:如何亲手制作一只指南针。
- 分子点积把两个向量的对应维度相乘再累加,度量两个方向的重合程度,方向越接近数值越大。
- 分母模长乘积分别为两个向量求模长并相乘,用于把分数归一化到固定区间,消除向量长度差异的干扰。
- 比值即夹角余弦最终值落在 $[-1,1]$。越接近 $1$ 表示两方向越同向,越接近 $-1$ 表示越反向,$0$ 表示垂直无关联。
概念激活向量
制作指南针,不能只听一个人的话。你要在市中心拦住一大群刚参观完图书馆回来的游客,再拦下一群没有去过图书馆的人,分别记录他们的行走痕迹,然后问:这两群人的出发点差异最大的方向是什么?把那个方向画成箭头,就是“图书馆概念”的指南针。概念激活向量(Concept Activation Vector, CAV)的构建思路就藏在这个场景里:找一组包含目标概念的正样本,一组明确不包含的负样本,让它们分别穿过模型,记录某一层的激活向量,然后取均值相减。
为什么是“激活向量”而不是“输入图片”?因为概念是模型内部形成的抽象表示,输入层的像素差异太杂乱,而中间层激活已经完成了语义浓缩。就像你在市中心问路时,别人不会描述每一栋楼的颜色,而是直接告诉你主干道的走向。
制作 CAV 时还有一个实践技巧:概念必须成对设计。比如“条纹”对应的负样本应该是“斑点”,而不是随机图片。因为均值差只有在两个对比概念之间才有判别性。这就像指南针必须有“北”和“南”两个极端,指针才能稳定指向。
- 正样本平均激活取所有包含该概念的样本在第 $l$ 层的激活向量求平均,得到“概念聚集中心”。
- 负样本平均激活取所有不包含该概念的样本的激活向量求平均,得到“非概念聚集中心”。
- 两者相减两个中心连线的方向,即从“非概念”指向“概念”的差异方向。
- 归一化(可选)将 $\mathbf{v}_c$ 缩放到单位长度,使方向纯粹、便于与其他向量做相似度比较。
TCAV归因
指南针造好了,可它到底有什么用?我们真正想知道的是:“这个模型判断一张图是斑马时,'条纹'这个概念起了多大作用?”类比成城市故事:警方要查明一个案件的决策路径,需要测一测“朝图书馆方向走”对最终的落脚点贡献了多少能量。这就是 TCAV(Testing with Concept Activation Vectors)要解决的问题。它不再满足于“地图上存在一条条纹轴”,而是追问“模型的输出是否沿着这条轴敏感地变化”。
TCAV 使用梯度来回答这个问题。梯度本身就携带方向信息:它指明输出变化最快的方向。如果模型对某个输入的预测在“条纹”方向上有很大的梯度分量,说明沿着这个概念方向微调内部表示会显著改变预测。把梯度向量与概念向量做点积,就是概念敏感度分数。
TCAV 的优势在于它的“探针”粒度:不是看单个神经元,而是看整条方向。就像警探调查案件时不纠结某一个路人说了什么,而是统计整条街道的监控数据,得出“这个人确实朝图书馆方向走了”的证据链。这也让 TCAV 成为模型审计中最常用的工具之一。
- 计算梯度方向求预测输出 $f_k$ 对第 $l$ 层激活向量 $\mathbf{l}_x$ 的梯度,得到“对输入敏感的上升方向”。
- 与概念向量点积把梯度方向与概念方向 $\mathbf{v}_c$ 对齐,若两者同向则分数为正,表示该概念正向推动预测。
- 分数解释分数越大,说明概念对预测的影响越强;接近零说明概念与预测方向垂直,几乎没有贡献。
概念探测实验
有了指南针,还得检验它是否在野外真的可用。概念探测实验(Concept Probing)就像把指南针带到深山老林里校准:你手里有一批带着“条纹”或“斑点”标签的样本,让它们经过模型各层提取激活,然后训练一个极简分类器——通常是一个线性逻辑回归——去预测这些概念标签。如果线性分类器能轻松分开两簇激活,就说明该层确实“编码”了这个概念;如果分不开,说明概念信息在这一层要么不存在、要么表达方式太复杂。
这个实验之所以强调“线性”,是因为线性可分性恰好对应“方向可分离”:城市地图上,两个街区如果能用一条笔直的大道分开,说明它们各自的方向足够清晰;如果必须绕很多弯才能分开,说明语义在这层还很混乱。概念探测的损失函数可以写成:
除了准确率,探测实验还关心两个指标:概念完整性——所有概念是否足够覆盖模型依赖的信息;概念鲁棒性——给激活加一点噪声或扰动后,探针是否依然稳定。这就像在风雨天测试指南针:如果稍微晃动指针就乱转,说明这个方向并不可靠。
- 线性得分给每个激活向量 $\mathbf{l}_i$ 施加权重 $\mathbf{w}$ 和偏置 $b$,把方向信息压缩成一个标量。
- Sigmoid 映射把线性得分压缩到 $(0,1)$ 区间,解释为“属于正概念的概率”。
- 交叉熵损失将预测概率与真实标签 $c_i$ 比较,两者偏差越大损失越大,训练就是不断减小这个偏差。
概念瓶颈模型
前面的方法都是“事后分析”——模型训练完后,我们再去它的内部翻找概念方向。概念瓶颈模型(Concept Bottleneck Model)换了一种更激进的思路:既然你要用概念,不如把概念变成必经之路。这就像机场安检:无论你想去哪个登机口,都得先经过唯一的安检通道,在那里被检查、被记录。模型的结构变成:输入 $x$ 先被编码成一组显式的概念评分 $h$,再基于这些人类可读的概念去做最终预测。
这种设计让 AI 的决策流程被迫透明。医生使用 AI 辅助诊断时,模型不能直接说“恶性概率 85%”,而是先给出“有肿块 = 0.9、边缘不规则 = 0.7、钙化 = 0.2”这些概念评分,再由一个轻量模型综合这些评分给出诊断。医生可以逐项审查概念分数是否合理,甚至手动修正某个概念值来探索“假如这里不是钙化,结果会怎样”。
瓶颈模型当然有代价:把信息压缩进少数几个概念维度会丢失细节,模型性能通常会略低于自由的黑箱模型。这是“透明”与“性能”之间的权衡,也是可解释 AI 领域永恒的话题。但它的价值在于:当安全关键场景需要问责时,一条看得见的决策链路远比 95% 的准确率更重要。
- 概念编码器函数 $g$ 把输入映射为概念向量 $\mathbf{h}$,每个分量对应一个人类可理解的概念评分。
- 决策器函数 $f$ 根据概念向量 $\mathbf{h}$ 生成最终预测,由于 $\mathbf{h}$ 维度低且语义明确,$f$ 通常可以是一个简单的线性模型。
- 干预条件当人类修正某个概念分量 $h_j$ 时,可通过前向传播直接观察 $\hat y$ 的变化,实现“动手修改概念”的诊断。
因果归因分析
我们在第四节的探测器里看到“这一层能分开条纹和斑点”,在第三节的 TCAV 里看到“条纹方向能推动预测”。但这都还只是相关性证据——就像你发现每次图书馆方向出现时,案件发生率也上升,却不能说明图书馆导致了案件。要真正证明因果,你需要做实验:把概念方向人为拧掉,或者强行赋值,看输出是否真的改变。这就是因果归因分析(Causal Attribution Analysis)。
在城市故事里,这相当于做一个“反事实实验”:派一支工程队把通往图书馆的大道封死,然后观察原本要去图书馆的人是不是真的改变了目的地。如果封路后大家毫无反应,说明那条路根本不是关键路径;如果交通彻底瘫痪,说明这条路承担了核心功能。在模型上,我们用干预符号 $do(\cdot)$ 表达“主动把概念设定为某个值”。
因果归因是审计偏见的关键武器。例如,要检测模型中是否存在“性别偏见”,不能只看男性样本和女性样本的预测差异(可能混淆了职业、年龄等因素),而要通过概念瓶颈或方向干预,把“性别”这一概念从相关变量中剥离出来单独操作。只有经过这样的干预实验,我们才有底气说出那句最有分量的话:“这个模型的决策确实依赖于某个概念。”
- 干预操作$do(C = c_1)$ 表示外部强制把概念变量设为 $c_1$,而不是被动地观测它自然取值。
- 反事实对照$do(C = c_0)$ 表示同样结构下把概念设为另一个参考值,形成对照实验。
- 期望差对多个样本求平均,得到概念 $C$ 从 $c_0$ 变成 $c_1$ 时输出的平均因果效应。
评估与验证
指南针造好了、实验也做了,但用户还会问一句最实在的问题:“你的概念方向到底有多可靠?”这就引出了评估与验证环节。第一个常用指标是概念完整性(Completeness):把所有概念向量收集起来,仅用这些方向上的信息去预测输出,看看预测损失下降了多少。如果概念集越完整,说明模型决策所需的信息越能被这些方向覆盖;反之说明还有大量关键概念未被发现。
除完整性外,评估还包含对齐性检查——概念方向是否与人类直觉一致;跨层概念追踪——观察概念从浅层的边缘方向逐步组合成深层的抽象方向;以及组合探索——验证“条纹 + 马形”能否组合出“斑马”这样的复合概念。这就像在全面质检指南针:不仅要测它准不准,还要测它在不同天气、不同地形下的稳定性,以及多个指南针组合起来能否导航出完整路线。
- 概念子空间预测把激活投影到概念方向集合 $\mathcal{C}$ 上,并用投影后的少量特征训练预测器,记录其最小损失。
- 完全激活预测用原始完整激活训练预测器,得到理论上限的损失下限。
- 归一化完整度两者相减并归一化,得到 $[0,1]$ 区间的完整性分数。
安全应用场景
当概念方向的可靠性得到验证,它就从学术工具变成了安全基础设施。想象城市执法部门拥有了一套经过校准的指南针系统:每只指南针指向一个敏感概念,比如“性别”“种族”“年龄”。审计员不再需要逐条翻看模型的预测案例,而是直接观测哪只指南针在特定决策场景中剧烈摆动。偏见检测因此变得可度量:如果一个贷款审批模型中,“年龄”概念方向的 TCAV 分数异常偏高,这就不再是模糊的猜疑,而是一条可展示、可复核的证据链。
在模型行为审计中,概念向量还能定位“机制开关”。想象模型像一栋大楼,每层走廊有电闸。跨层概念追踪会发现:某些偏见信号在第 8 层的特殊方向中已经形成,之后每一层都在放大它。审计员据此精确找到需要修复的层,而不是盲目微调整个模型。可解释报告则把这些发现凝结成结构化文档:“模型主要依赖条纹方向判断斑马,依赖斑点方向判断豹子;对'性别'概念的敏感度在统计上不显著。”这种报告在金融、医疗、司法等高合规场景中,是 AI 系统上线前不可或缺的通行证。
从解读一张 AI 自绘的城市地图,到亲手制作指南针、验证其可靠性,再到把它用于全城的安全巡逻——概念向量技术的价值不在于炫酷,而在于把“模型为什么这么想”从一个哲学问题变成了可操作、可检验、可问责的工程问题。这正是可解释 AI 深入产业后最需要的底层能力。
- 单样本敏感度计算一个样本 $x_i$ 上概念方向集 $\mathcal{C}$ 对类别 $k$ 的 TCAV 分数。
- 样本平均对 $n$ 个测试样本的敏感度取平均,抵消个体噪声,得到稳定的概念影响力估计。
- 阈值判定当 Bias 绝对值显著偏离 $0$ 时触发偏见告警,偏离越远说明概念对预测的操控越强。
AI 应用场景
场景一:信用贷款模型的公平性审计
阶段:模型行为审计 / 偏见检测
解决的问题:银行使用深度学习模型审批贷款,若出现歧视性结果,传统做法只能逐单人工复核,成本高且难成规模。概念向量可以把“性别”“婚姻状况”等敏感概念制成方向,用 TCAV 分数量化模型对这些概念的依赖程度,形成可追溯的审计证据。
具体案例:审计团队构造“性别敏感概念对”(男性图片 vs 女性图片),提取贷款模型最后一层激活构建 CAV,计算敏感度。发现模型对“性别”方向的 TCAV 分数在信用额度预测中显著高于阈值,随即定位到特征工程环节存在历史偏差,进而调整训练数据。
场景二:医疗影像辅助诊断的可解释报告
阶段:决策解释 / 概念瓶颈部署
解决的问题:医生不敢信任“端到端”的病灶分类黑箱,因为模型没有说明依据。概念瓶颈模型强制模型先输出“肿块形状”“边缘规则度”“钙化密度”等概念评分,再给出恶性概率,医生能逐项核对并修正概念值,实现人机协同诊断。
具体案例:某肺结节筛查系统采用概念瓶颈架构,若医生发现模型把“钙化”评分打得过高,可直接调整该概念分数重新推理,观察诊断结果是否改变。若改变明显,说明模型确实依赖该概念;若改变微弱,则提示概念层表达不完整,需要重新设计概念集。
Python 演示
import numpy as np def load_activations(seed=42): """模拟"条纹"和"斑点"两个概念在中间层的 32 维激活向量。""" rng = np.random.default_rng(seed) n_pos, n_neg, dim = 60, 60, 32 direction = rng.normal(0, 1, dim) direction /= np.linalg.norm(direction) pos = rng.normal(0, 1, (n_pos, dim)) + 1.8 * direction neg = rng.normal(0, 1, (n_neg, dim)) - 1.2 * direction return pos, neg, direction class ConceptActivationVector: def __init__(self, dim): self.dim = dim self.cav = None def fit(self, pos_feats, neg_feats): pos_mean = np.mean(pos_feats, axis=0) neg_mean = np.mean(neg_feats, axis=0) diff = pos_mean - neg_mean norm = np.linalg.norm(diff) self.cav = diff / norm if norm > 1e-8 else np.zeros(self.dim) return self.cav def sensitivity(self, grad): return float(grad @ self.cav) def main(): pos, neg, true_dir = load_activations() cav = ConceptActivationVector(pos.shape[1]) v = cav.fit(pos, neg) align = float(np.dot(v, true_dir)) print("CAV 与生成方向的余弦对齐度:", round(align, 3)) rng = np.random.default_rng(7) grads = rng.normal(0, 1, (5, pos.shape[1])) for i, g in enumerate(grads, 1): print(f"样本 {i} 的 TCAV 敏感度: {cav.sensitivity(g):.3f}") if __name__ == "__main__": main()
direction = rng.normal(0, 1, dim)随机生成一个隐藏的“真实概念方向”,用来模拟概念在特征空间中的存在。pos = rng.normal(0, 1, (n_pos, dim)) + 1.8 * direction正样本沿概念方向正向偏移,造出“有概念”的一组激活。diff = pos_mean - neg_mean正负样本类中心的差,就是 CAV 的核心公式:两个聚集中心的连线方向。self.cav = diff / norm if norm > 1e-8 else np.zeros(self.dim)归一化到单位长度,同时避免零向量除零错误。return float(grad @ self.cav)梯度与概念向量的点积,即单样本 TCAV 敏感度分数。align = float(np.dot(v, true_dir))验证构造出的 CAV 与真实概念方向的余弦对齐度,越接近 1 说明恢复越好。
常见误区
误区我们学“条纹”概念向量,是不是找几张条纹图片平均一下,或者找某个专门识别条纹的神经元,它的激活就是概念向量?
正解概念向量是空间中的一个方向,而不是任何一张图片或一个神经元。正样本平均激活只是构造方向的手段,真正的产物是“正向 vs 负向”的差异箭头。单个神经元通常混合了多种信息,而概念方向是跨越整个特征空间的整体模式。就像“图书馆方向”是所有游客足迹统计出的趋势,不是某一个游客的脚印。
为何常见:人们在直觉上习惯把概念绑定到具体实例或单个通道,因为 CNN 的神经元可视化让“某个神经元识别条纹”的说法流行过,但那是过度简化。
误区我算出“条纹”方向能很好地分开斑马和非斑马,准确率 95%,这足以证明模型判断斑马时依赖条纹概念。
正解探针准确率只能说明概念信息存在于模型中,不能证明决策真的使用了它。概念可能被存储但没被利用,也可能模型依赖的是与概念高度相关的其他混杂方向。要证明因果使用,需要 TCAV 的梯度对齐分析或概念干预实验,观察“拧掉概念方向后输出是否变化”。
为何常见:人类天然把“存在性强”等同于“因果性强”,这是最常见的认知捷径,也是相关性与因果性混淆在可解释 AI 中的典型表现。
误区把决策强制经过几个概念,肯定丢掉大量细节,模型性能必然崩盘,所以工业界不可能用。
正解当概念集设计得充分且带有监督信息时,概念瓶颈的性能损失可以很小,甚至通过概念监督获得正则化收益。关键在于概念集合是否覆盖决策所需的信息:概念越完整,性能损失越小。许多落地场景中,5% 的准确率换 100% 的可审计性是值得的。
为何常见:早期概念瓶颈论文在无监督概念集合上表现不佳,被误解为“瓶颈必然弱”,忽略了概念质量才是核心变量。
误区既然概念是方向,那随便取哪一层的激活都能构造出差不多的概念向量。
正解浅层激活编码的是边缘、颜色块等低级特征,概念方向更多指向局部模式;深层激活才编码语义类别。因此“条纹”概念在浅层和深层的方向含义是不同的,跨层追踪时能看到概念从“边缘模式”逐步组合成“物体语义”。选择哪一层构造 CAV 取决于研究目标是低层机制还是高层语义。
为何常见:人们容易把特征空间想象成均匀的容器,忽略了神经网络的层次化信息处理结构。
面试题
Q1. 概念向量的本质是什么?
- A.一组经过筛选的训练数据
- B.高维空间中代表某个概念的方向← 正确答案
- C.模型输出层的概率分布向量
- D.损失函数对权重的梯度值
答案:B。概念向量的核心是把“概念”形式化为高维特征空间中的一个方向,而不是某组数据、某个概率或某个梯度。就像指南针指向的方向才是概念,而不是某栋楼或某条路本身。
Q2. 构建概念激活向量(CAV)时,最基本的操作是?
- A.将正负样本的激活均值相减← 正确答案
- B.对输入图像做随机增广
- C.计算损失函数的二阶导数
- D.对输出概率取阈值
答案:A。CAV 的构造公式就是“正样本平均激活 − 负样本平均激活”,得到的差值方向即概念方向。其他选项都偏离了“类中心差分”这个核心思想。
Q3. 两个向量的余弦相似度为 1 说明什么?
- A.两个向量方向完全一致← 正确答案
- B.两个向量长度完全相同
- C.两个向量相互正交垂直
- D.两个向量方向完全相反
答案:A。余弦相似度只度量方向夹角,为 1 表示夹角为 0,即方向完全一致。长度、正交、反向分别对应其他数值,因此只选 A。
Q4. TCAV 敏感度分数的核心运算是什么?
- A.输出对输入的二次偏导
- B.输出对层激活的梯度与概念向量做点积← 正确答案
- C.概念向量与权重矩阵的逆相乘
- D.特征图做全局平均池化
答案:B。TCAV 分数 $S = \nabla f_k \cdot \mathbf{v}_c$ 本质是梯度方向与概念方向的对齐程度。点积结果越大,说明推动概念方向能显著改变预测。其他选项都不是 TCAV 的定义运算。
Q5. 概念探测实验通常使用哪种分类器作为探针?
- A.随机森林数百棵树
- B.深层残差卷积网络
- C.线性逻辑回归← 正确答案
- D.高斯核支持向量机
答案:C。探测实验刻意使用线性模型,因为线性可分性对应“概念在空间中沿单一方向可分离”。深层模型能分开不代表方向存在,只有线性探针的结论才能支撑“概念方向”的论证。
Q6. 概念瓶颈模型与传统黑箱模型的最大区别是什么?
- A.网络层数显著减少
- B.决策必须经过显式概念层← 正确答案
- C.完全不需要标注数据
- D.训练时使用强化学习
答案:B。概念瓶颈模型的结构是 $x \to \mathbf{h} \to \hat y$,强制决策经过人类可读的概念评分。层数、监督、训练方式都不是本质区别,透明可干预的“瓶颈”才是关键。
Q7. 因果归因分析区别于普通相关性分析的要点是?
- A.使用更多训练数据
- B.主动干预概念再观察输出变化← 正确答案
- C.计算特征之间的皮尔逊系数
- D.减小网络参数量
答案:B。因果归因通过 $do(C=c)$ 干预切断混杂因素,观察反事实输出变化。相关分析只被动观测,无法区分因果方向,因此干预是两者的分水岭。
Q8. 概念完整性(Completeness)指标衡量的是什么?
- A.模型在测试集上的准确率
- B.仅用概念方向预测输出时的损失衰减程度← 正确答案
- C.梯度下降收敛速度的快慢
- D.模型参数量占内存的比例
答案:B。完整性 = $1 - \frac{\mathcal{L}_{\text{proj}}}{\mathcal{L}_{\text{full}}}$,衡量概念方向集能解释多少预测变化。它不直接反映准确率、训练速度或模型规模,而是反映概念覆盖度。
Q9. 关于跨层概念追踪,通常哪些观察结果是对的?
- A.浅层概念更偏向低级视觉特征← 正确答案
- B.概念方向在深层逐步组合成抽象语义← 正确答案
- C.所有概念只在输出层才出现
- D.跨层分析有助于定位偏见形成的层← 正确答案
答案:ABD。浅层激活编码边缘、颜色等局部模式,深层逐步组合成物体级语义,因此 A、B 正确;跨层追踪能显示偏见信号从哪里产生并在哪些层被放大,D 也正确。C 过于绝对,概念在浅层就以低级形式存在。
Q10. 用概念向量做模型偏见检测时,合理操作包括哪些?
- A.构造敏感概念对并计算 TCAV 分数← 正确答案
- B.统计敏感概念方向对预测的平均影响← 正确答案
- C.直接删除模型的若干隐藏层
- D.用反事实干预审计不同概念赋值下的输出← 正确答案
答案:ABD。偏见检测要先构造概念对(如性别),再计算 TCAV 反映影响强度,并用干预实验验证因果效应,因此 A、B、D 正确。删除隐藏层是破坏式操作,既不能量化偏见也不具可解释性,C 错误。