本篇文章发表于ICLR 2023。
论文链接:https://arxiv.org/abs/2304.06129
代码链接:
一、概述
前几篇文章已经介绍了CBM的主要缺点,即annotation以及accuracy-interpretability之间的 compromise(几乎每一篇文章都会说一遍,CBM确实挖了一个深坑)。在这里就不对CBM的特点做重复讨论了。
本篇文章从题目就可以看出是不需要标注的一种CBM,此外,它是第一个扩展到ImageNet的CBM。与PCBM类似,它也允许将任何神经网络转化为Label-free CBM,主要优点有:
- scalable: the first CBM that scales to ImageNet;
- efficient: creating a CBM takes only a few hours even for very large datasets;
- automated: training it for a new dataset requires minimal human effort.
二、方法
- 相关方法:
(i) Post-hoc explanations
- LIME
- SHAP
- 这些方法大多提供的都是local explanation,并且是近似的,并不总是准确的、忠于原模型的;此外,提供像素级别的解释也许没那么helpful,还需要后续大量的人为主观分析。
(ii) More interpretable final layer
- Making the FC layer sparse
- Concept Whitening
- CEM
(iii) CBM
- PCBM
- TCAV
- 作者提到PCBM同样需要annotated concept data;并且在不需要annotated data的情况下,必须使用CLIP的text encoder;此外,不带有残差块的PCBM的performance远远低于standard DNNs。
(iv) Model editing/debugging
(v) CLIP-Dissect
👆Label-free CBM与其它模型在不同维度的比较。
- 本文方法
Label-free CBM的建立需要以下四个步骤:
- Step 1: Create the initial concept set and filter undesired concepts;
- Step 2: Compute embeddings from the backbone and the concept matrix on the training dataset;
- Step 3: Learn projection weights
to create a Concept Bottleneck Layer (CBL);
- Step 4: Learn the weights
to the sparse final layer to make predictions.
接下来让我们看一下每个步骤具体的实现方式。
(i) Step 1: Concept set creation and filtering
A. Initial set creation
在原始的CBM中,concept的定义是由domain experts给出的,而本文使用GPT-3来生成concept. 具体来说,使用以下prompt询问GPT-3:
1. List the most important features for recognizing something as a {class}:
2. List the things most commonly seen around a {class}:
3. Give superclasses for the word {class}:
(完整的prompts以及example outputs可以在Appendix Fig.10和Fig.11中找到。)
为了减少结果的方差,询问GPT-3两次并把所有得到的结果整合起来;可以预见的是,整合在一起的这些结果是是很庞大的,并且会存在冗余、噪声,因此需要在B步骤中对其进行filtering;此外,作者发现使用GPT-3产生的结果好于在PCBM论文中使用的ConceptNet,具体原因分析见Appendix A.6。
B.Concept set filtering
使用filtering以improve the quality and reduce the size of the concept set:
1. 删除长度过长的概念: 删除了所有长度超过30个字符的concepts,以保证概念simple并且避免不必要的complication;
2. 删除与类别过于相似的concepts:通过使用CLIP ViT-B/16 text encoder以及all-mpnet-base-v2 sentence encoder,将concept与class映射到text embedding space中,进一步比较二者在该空间中的cosine similarity;综合考虑计算得到的两个相似度(一个CLIP text encoder,一个all-mpnet),并删除所有similarity大于0.85的concepts;
3. 删除彼此相似的concepts:方法同2,删除与已经存在于概念集中的concept相似度大于0.9的concepts;
4. 删除在训练集中不存在的concepts:因为GPT并没有看到training set,因此它给出的concept也许并不存在于当前training set;设置一个dataset-specific cut-off,然后remove any concepts that don't activate CLIP highly (delete all concepts with average top-5 activation below the cut-off)
5. 删除无法正确projection的concepts:Remove neurons that are not interpretable from the CBL. 这一步在Step 3之后进行,会在稍后详细说明。
(ii) Step 2 and 3:Learning the concept bottleneck layer (CBL)
现在我们已经有了经过filtering后的合适的interpretable concept set,接下来需要learn a projection from the bakbone model's feature space into a space where axis directions correspond to interpretable concepts. 即,从feature space到concepts的projection,对应的参数为。
具体来说,由Step 1产生的瓶颈层的目标概念 ;
由下游任务提供的训练集(图片);
接着,计算并保存CLIP concept activation matrix :
其中 和
分别是CLIP image and text encoders;
is initialized as a random
matrix where
is the dimensionality of backbone features
,i.e.
;
We define ,where
;
Use to denote a neuron of interest in the projection layer, and its activation pattern is denoted as
and
.
即, 是bottleneck layer第
个神经元对应的所有图像样本的activation(一共
个神经元,与概念的数量对应起来);
为了使bottleneck layer的activation可以有效代表concept,需要对它的activation也就是 做一些限制;以往的CBM做法是将此activation与ground-truth concept label(0或者1)对应起来,而在本篇文章中,作者使用一种相似性度量以限制
与对应的concept之间的强相关性,具体为:
代表归一化的
(均值为0方差为1),
代表cos cubed similarity(其实就是cosine similarity升到3次并归一化);升到3次可以使similarity对highly activating inputs更敏感;由于本质还是余弦相似度,所以得到的结果介于-1到1之间;我们来仔细分析一下这个式子(为了让我以后还能看懂所以这个地方写的比较啰嗦...):
是什么?
是第
个concept对应的描述文本;
是什么?
是在所有图像
上第
个neuron产生的activation;
因此也就理解了为什么要最大化 与
的余弦相似度了——要尽量使第
个neuron产生的activation
与第
个concept对应的描述文本
相匹配;
而具体做法就是最小化矩阵 的第
列
与
的距离——
又是什么?
代表矩阵
的第
列,可以观察一下矩阵
:
的第
列
是文本
的encoding与所有图像
的encoding的乘积;
是bottleneck layer第
个neuron在所有图像
上产生的activation;
最小化 与
的距离就是使第
个neuron在每一个图像上产生的activation与concept matrix的第
列尽可能一致;
再具体一点:
回顾在CLIP的Concept Matrix中,位于以下蓝色方框的值应该很大,其它的位置值很小:
对角线一定是最相关的(蓝色),因为CLIP输入的image和text是成对的,本身就是匹配的;而其它位置大概率是不相关的,但因为不同图片中可能包含共享的概念,因此也有配对的情况(图中没有画出来);
Label-free CBM使用的是预训练好的CLIP text and image encoders,但由于此任务是无监督的,即,图片的顺序和概念的顺序不是一一对应的,因此分布情况不一定就在对角线上。比如:
第1张图像中是一个足球,第3张图像是一个香蕉,第6张图像是一个柠檬...
第1个text是“黄色”,第4个text是“酸的”,第5个text是“圆的”...
那么对应的矩阵 :
并且,我们还可以发现CLIP的matrix是N行N列的,而 的行与列不一定相等,一般而言
,即概念数量远多于图片数量(一张图片可以有很多概念)。
再回顾一下 :是第
个神经元在所有图像
上产生的activation;比如现在我们希望Concept Bottleneck Layer的第1个神经元要与“黄色”这一concept对应起来,那么第1个神经元就要在输入为“香蕉”与“柠檬”的时候产生大的激活值,而在输入为“足球”的时候产生较小的激活值,而这恰好与我们使用CLIP已经计算得到的
的第1列十分相近,因此,只需要拉近它们二者的距离就能保证我们的神经元与概念一一对应。
OK,到此为止真相大白了!CLIP有点像一个老师,教Label-free CBM使CBL的neurons与concepts对应起来。
本文使用Adam训练 ,并在validation时删除所有相似度小于0.45的concepts(这一步对应了concept filtering中的Step 5,即,删除无法正确projection的concepts)无法正确地projection的原因可能是pretrained CLIP无法将我们提供的图片、概念很好地编码到embedding space中,因为我们毕竟只是把CLIP的encoders拿过来用,以实现无监督,而并没有训练或fine-tune;
删除这些concepts之后, 的维度也应该相应变化,即
。
(iii) Step 4: Learning the sparse final layer
现在的目标是训练final predictor with the FC layer ,where
is the number of output classes. 我们希望
是sparse的(因为sparse已经被证明是更具有可解释性的);
训练更新 时,固定backbone
以及学习好的concept projection
,优化目标如下:
前一项是交叉熵损失,后一项是一个正则项,用以控制 是sparse的:
使用GLM-SAGA solver来optimize目标函数,选择 ,"
was chosen such that each model has 25 to 35 nonzero weights per output class",这相当于0.7~15%的weights是nonzero的。
三、实验及结果
在多个数据集上的表现超越了PCBM以及sparse standard black-box.
Final layer weights的visualization,并展示模型如何区分两个相似的类,比如橘子与柠檬。
由于权重是sparse的,因此很容易将权重可视化。
在实验过程中,作者发现模型所犯的四种不同类型的错误:
- Type 1: Incorrect/ambiguous label. 即Noisy labels,是数据本身的问题,作者没有关注这类错误;
- Type 2: No sufficient concept in CBL. 这个问题在CBM模型中普遍存在,还是之前谈到过dinformation bottleneck的问题,比如我们要区分两条蛇的具体种类,这可能需要特别精细的概念,有些概念甚至无法用语言描述;作者也没有关注这一类错误,因为需要重新训练projection
以及final layer;
- Type 3: Incorrect concept activations. 类似于CBM针对specific example的local intervention.可以使用test-time intervention进行干预:
- Type 4: Incorrect final layer weight
. 类似于PCBM针对model的global intervention:
- 找到预测错误的例子。这个例子对concept的预测是正确的,但是对最终结果的越策确实错误的,这就说明最后一层的权重是有问题的;
- 找到哪一个concept对应的权重是有问题的。这是最困难的一步,因为很可能改变了某一个concept对应的权重之后,原来错误的预测变成了正确的,但是原来正确的也可能变成错误的...
- 调整weights。需要注意的就是不要把原来正确的给改错了,要用validation检验一下。