This repository contains the official Pytorch implementation of our paper "Improving Intervention Efficacy via Concept Realignment in Concept Bottleneck Models" accepted at ECCV 2024.
This work was done by Nishad Singhi, Jae Myung Kim, Karsten Roth, Zeynep Akata.
Concept Bottleneck Models (CBMs) ground image classification on human-understandable concepts to allow for interpretable model decisions. Crucially, the CBM design inherently allows for human interventions, in which expert users are given the ability to modify potentially misaligned concept choices to influence the decision behavior of the model in an interpretable fashion. However, existing approaches often require numerous human interventions per image to achieve strong performances, posing practical challenges in scenarios where obtaining human feedback is expensive. In this paper, we find that this is noticeably driven by an independent treatment of concepts during intervention, wherein a change of one concept does not influence the use of other ones in the model's final decision. To address this issue, we introduce a trainable concept intervention realignment module, which leverages concept relations to realign concept assignments post-intervention. Across standard, real-world benchmarks, we find that concept realignment can significantly improve intervention efficacy; significantly reducing the number of interventions needed to reach a target classification performance or concept prediction accuracy. In addition, it easily integrates into existing concept-based architectures without requiring changes to the models themselves. This reduced cost of human-model collaboration is crucial to enhancing the feasibility of CBMs in resource-constrained environments.
This repository builds on the Github repository for Concept Embedding Models. We recommend reading their README.
You can locally install this package by first cloning this repository:
$ git clone https://github.com/ExplainableML/concept_realignment
Move into the cloned directory via cd concept_realignment
Set up the conda environment:
$ conda env create --name CEM --file=conda_environment.yml
Then install the cem
package using:
$ python setup.py install
After running this, you should be able to import the package locally using
import cem
In order to be able to properly run our experiments, you will
have to download the pre-processed CUB dataset found here to
cem/data/CUB200/
and the CelebA dataset found
here to cem/data/celeba
.
You may opt to download them to different locations but their paths will have to
be modified in the respective experiment configs (via the root_dir
parameter)
or via the DATASET_DIR
environment variable.
The scripts to run experiments are in this directory:
$ cd concept-realignment-experiments
In train_base_models_and_save_predictions.py
, specify the config file to the model you want to train. The config files are located in experiments/configs
. After this, run the script as:
$ python train_base_models_and_save_predictions.py
This script trains the base CBM or CEM model, then runs the model on the train and test datasets, and stores its predictions (and some other stuff) in a dictionary. This dictionary is typically saved in results_dir
in the config file.
Next, we train the model that updates concept predictions after intervention. To do so, specify the relevant paths in run_optuna.sh
. Then, compile it:
$ chmod +x run_optuna.sh
Then, run it as:
$ ./run_optuna.sh <model_name>
where <model_name>
could be CUB_CEM
, CUB_IntCEM
, ...
This script will perform hyperparameter optimization using the optuna
package, and train the concept realignment model. The trained model is saved in the checkpoint_save_dir
specified in concept-realignment-experiments/configs/<dataset>/base.yml
.
In concept_loss_vs_num_interventions.py
, specify the path to the predictions from the base model in predictions_dict_path
, and the path to the concept realignment model in concept_corrector_path
.
Then, you can run it as:
$ python3 concept_loss_vs_num_interventions.py
For posthoc realignment, the procedure to train the concept realignment model and generate plots is the same as mentioned above.
For joint training of the concept realignment model and the IntCEM, you can use the appropriate config from experiments/configs/intcem_configs/<dataset>.yaml
.
Then, you can generate the plots using intcem_concept_loss_vs_num_interventions.py
. vanilla_predictions_dict_path
refers to the predictions of the IntCEM model trained without concept realignment, and predictions_dict_path
refers to the model trained jointly with concept realignment.
First, you need to train the concept realignment models with the different architectures. You can do so by using the appropriate model_name
in Step 2.
Then, you need to specify paths to the checkpoints of these models in architecture_ablations.py
and run it.
This script trains the base CBM or CEM model, then runs the model on the train and test datasets, and stores its predictions (and some other stuff) in a dictionary. This dictionary is typically saved in results_dir
in the config file.
$ python3 coupling_ablation.py
If you would like to cite this repository, or the accompanying paper, please use the following citation:
@article{singhi2024improving,
title={Improving Intervention Efficacy via Concept Realignment in Concept Bottleneck Models},
author={Singhi, Nishad and Kim, Jae Myung and Roth, Karsten and Akata, Zeynep},
journal={European Conference on Computer Vision},
year={2024}
}