From e460e446052c8bd1c324158ce50123cefff7f8ff Mon Sep 17 00:00:00 2001 From: pat-alt <altmeyerpat@gmail.com> Date: Mon, 13 Feb 2023 10:05:45 +0100 Subject: [PATCH] work on proposal and extended abstract --- .../dev/proposal/execute-results/html.json | 4 +- bib.bib | 22 +++ build/dev/proposal.html | 165 ++++++++++++------ build/dev/www/mnist_9to4_latent.png | Bin 0 -> 13939 bytes build/dev/www/you_may_not_like_it.png | Bin 0 -> 17193 bytes dev/proposal.qmd | 145 ++++++++++++--- dev/www/you_may_not_like_it.png | Bin 0 -> 17193 bytes 7 files changed, 256 insertions(+), 80 deletions(-) create mode 100644 build/dev/www/mnist_9to4_latent.png create mode 100644 build/dev/www/you_may_not_like_it.png create mode 100644 dev/www/you_may_not_like_it.png diff --git a/_freeze/dev/proposal/execute-results/html.json b/_freeze/dev/proposal/execute-results/html.json index 7363fbbe..1d98ce87 100644 --- a/_freeze/dev/proposal/execute-results/html.json +++ b/_freeze/dev/proposal/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "a2ac106a6b675eafee9a47455706943d", + "hash": "d7b4f9bf7f4bff7ce610fc8be4dcfb8b", "result": { - "markdown": "---\ntitle: Conformal Counterfactual Explanations\nsubtitle: Research Proposal\nabstract: |\n We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data generating process. While this an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces an significant engineering overhead, but also reallocates the task of creating realistic model explanations from the model itsel to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion.\n---\n\n\n\n## Motivation\n\nCounterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models, but also enable affected individuals to challenge them though the means of Algorithmic Recourse. \n\n### From Adversarial Examples to Counterfactual Explanations\n\nMost state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs $x\\in\\mathcal{X}$ into a black-box model $f: \\mathcal{X} \\mapsto \\mathcal{Y}$ in order to change the model output $f(x)$ to some pre-specified target value $t\\in\\mathcal{Y}$. Formally, this boils down to defining some loss function $\\ell(f(x),t)$ and taking gradient steps in the minimizing direction. The so generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped down counterfactual explanation is therefore little different from an adversarial example.\n\n> You may not like it, but this is what counterfactuals look like\n\n\n\n\n\nThe crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intened to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be \"plausible\" or \"realistic\". To fulfill this latter goal, researchers have come up with a myriad of ways. @joshi2019realistic were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. This ensures that the generated counterfactuals comply with the (learned) data-generating process (DGB). Similarly, @poyiadzi2020face use density ...\n\n- Show DiCE for weak MLP\n- Show Latent for same weak MLP\n- Latent can be manipulated: \n - train biased model\n - train VAE with biased variable removed/attacked (use Boston housing dataset)\n - hypothesis: will generate bias-free explanations\n\n::: {#prp-surrogate}\n\n## Avoid Surrogates\n\nSince we are in the business of explaining a black-box model, the task of learning realistic representations of the data should not be reallocated from the model itself to some surrogate model.\n\n:::\n\n## Introduction to Conformal Prediction\n\n- distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification\n\n### Post-hoc\n\n- Take any fitted model and turn it into a conformal model using calibration data.\n\n### Intrinsic --- Conformal Training [MAYBE]\n\n- Model explicitly trained for conformal prediction.\n\n## Conformal Counterfactuals\n\n- Realistic counterfactuals by minimizing predictive uncertainty [@schut2021generating].\n- Problem: restricted to Bayesian models.\n- Solution: post-hoc predictive uncertainty quantification. \n- Conformal prediction is instance-based. So is CE. \n- Does the coverage guarantee carry over to counterfactuals?\n\n### Research Questions\n\n- Is CP alone enough to ensure realistic counterfactuals?\n- Do counterfactuals improve further as the models get better?\n- Do counterfactuals get more realistic as coverage\n- What happens as we vary coverage and setsize?\n- What happens as we improve the model robustness?\n- What happens as we improve the model's ability to incorporate predictive uncertainty (deep ensemble, laplace)?\n\n## Experiments\n\n- Maybe: conformalised Laplace\n- Benchmarking:\n - add PROBE into the mix\n - compare travel costs to domain shits.\n\n## References\n\n", + "markdown": "---\ntitle: High-Fidelity Counterfactual Explanations through Conformal Prediction\nsubtitle: Research Proposal\nabstract: |\n We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data-generating process. While this is an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces a significant engineering overhead but also reallocates the task of creating realistic model explanations from the model itself to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion.\n---\n\n\n\n## Motivation\n\nCounterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models but also enable affected individuals to challenge them through the means of Algorithmic Recourse. \n\n### Counterfactual Explanations or Adversarial Examples?\n\nMost state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs $x\\in\\mathcal{X}$ into a black-box model $f: \\mathcal{X} \\mapsto \\mathcal{Y}$ in order to change the model output $f(x)$ to some pre-specified target value $t\\in\\mathcal{Y}$. Formally, this boils down to defining some loss function $\\ell(f(x),t)$ and taking gradient steps in the minimizing direction. The so-generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped-down counterfactual explanation is therefore little different from an adversarial example. In @fig-adv, for example, generic counterfactual search as in @wachter2017counterfactual has been applied to MNIST data.\n\n\n\n\n\n{#fig-adv}\n\nThe crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intended to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be \"plausible\", \"realistic\" or \"feasible\". To fulfil this latter goal, researchers have come up with a myriad of ways. @joshi2019realistic were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. Similarly, @poyiadzi2020face use density ... Finally, @karimi2021algorithmic argues that counterfactuals should comply with the causal model that generates them [CHECK IF WE CAN PHASE THIS LIKE THIS]. Other related approaches include ... All of these different approaches have a common goal: they aim to ensure that the generated counterfactuals comply with the (learned) data-generating process (DGB). \n\n::: {#def-plausible}\n\n## Plausible Counterfactuals\n\nFormally, if $x \\sim \\mathcal{X}$ and for the corresponding counterfactual we have $x^{\\prime}\\sim\\mathcal{X}^{\\prime}$, then for $x^{\\prime}$ to be considered a plausible counterfactual, we need: $\\mathcal{X} \\approxeq \\mathcal{X}^{\\prime}$.\n\n:::\n\nIn the context of Algorithmic Recourse, it makes sense to strive for plausible counterfactuals, since anything else would essentially require individuals to move to out-of-distribution states. But it is worth noting that our ambition to meet this goal, may have implications on our ability to faithfully explain the behaviour of the underlying black-box model (arguably our principal goal). By essentially decoupling the task of learning plausible representations of the data from the model itself, we open ourselves up to vulnerabilities. Using a separate generative model to learn $\\mathcal{X}$, for example, has very serious implications for the generated counterfactuals. @fig-latent compares the results of applying REVISE [@joshi2019realistic] to MNIST data using two different Variational Auto-Encoders: while the counterfactual generated using an expressive (strong) VAE is compelling, the result relying on a less expressive (weak) VAE is not even valid. In this latter case, the decoder step of the VAE fails to yield values in $\\mathcal{X}$ and hence the counterfactual search in the learned latent space is doomed. \n\n{#fig-latent}\n\n> Here it would be nice to have another example where we poison the data going into the generative model to hide biases present in the data (e.g. Boston housing).\n\n- Latent can be manipulated: \n - train biased model\n - train VAE with biased variable removed/attacked (use Boston housing dataset)\n - hypothesis: will generate bias-free explanations\n\n### From Plausible to High-Fidelity Counterfactuals {#sec-fidelity}\n\nIn light of the findings, we propose to generally avoid using surrogate models to learn $\\mathcal{X}$ in the context of Counterfactual Explanations.\n\n::: {#prp-surrogate}\n\n## Avoid Surrogates\n\nSince we are in the business of explaining a black-box model, the task of learning realistic representations of the data should not be reallocated from the model itself to some surrogate model.\n\n:::\n\nIn cases where the use of surrogate models cannot be avoided, we propose to weigh the plausibility of counterfactuals against their fidelity to the black-box model. In the context of Explainable AI, fidelity is defined as describing how an explanation approximates the prediction of the black-box model [@molnar2020interpretable]. Fidelity has become the default metric for evaluating Local Model-Agnostic Models, since they often involve local surrogate models whose predictions need not always match those of the black-box model. \n\nIn the case of Counterfactual Explanations, the concept of fidelity has so far been ignored. This is not altogether surprising, since by construction and design, Counterfactual Explanations work with the predictions of the black-box model directly: as stated above, a counterfactual $x^{\\prime}$ is considered valid if and only if $f(x^{\\prime})=t$, where $t$ denote some target outcome. \n\nDoes fidelity even make sense in the context of CE, and if so, how can we define it? In light of the examples in the previous section, we think it is urgent to introduce a notion of fidelity in this context, that relates to the distributional properties of the generated counterfactuals. In particular, we propose that a high-fidelity counterfactual $x^{\\prime}$ complies with the class-conditional distribution $\\mathcal{X}_{\\theta} = p_{\\theta}(X|y)$ where $\\theta$ denote the black-box model parameters. \n\n::: {#def-fidele}\n\n## High-Fidelity Counterfactuals\n\nLet $\\mathcal{X}_{\\theta}|y = p_{\\theta}(X|y)$ denote the class-conditional distribution of $X$ defined by $\\theta$. Then for $x^{\\prime}$ to be considered a high-fidelity counterfactual, we need: $\\mathcal{X}_{\\theta}|t \\approxeq \\mathcal{X}^{\\prime}$ where $t$ denotes the target outcome.\n\n:::\n\nIn order to assess the fidelity of counterfactuals, we propose the following two-step procedure:\n\n1) Generate samples $X_{\\theta}|y$ and $X^{\\prime}$ from $\\mathcal{X}_{\\theta}|t$ and $\\mathcal{X}^{\\prime}$, respectively.\n2) Compute the Maximum Mean Discrepancy (MMD) between $X_{\\theta}|y$ and $X^{\\prime}$. \n\nIf the computed value is different from zero, we can reject the null-hypothesis of fidelity.\n\n> Two challenges here: 1) implementing the sampling procedure in @grathwohl2020your; 2) it is unclear if MMD is really the right way to measure this. \n\n## Conformal Counterfactual Explanations\n\nIn @sec-fidelity, we have advocated for avoiding surrogate models in the context of Counterfactual Explanations. In this section, we introduce an alternative way to generate high-fidelity Counterfactual Explanations. In particular, we propose Conformal Counterfactual Explanations (CCE), that is Counterfactual Explanations that minimize the predictive uncertainty of conformal models. \n\n### Minimizing Predictive Uncertainty\n\n@schut2021generating demonstrated that the goal of generating realistic (plausible) counterfactuals can also be achieved by seeking counterfactuals that minimize the predictive uncertainty of the underlying black-box model. Similarly, @antoran2020getting ...\n\n- Problem: restricted to Bayesian models.\n- Solution: post-hoc predictive uncertainty quantification. In particular, Conformal Prediction. \n\n### Background on Conformal Prediction\n\n- Distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification.\n- Conformal prediction is instance-based. So is CE. \n- Take any fitted model and turn it into a conformal model using calibration data.\n- Our approach, therefore, relaxes the restriction on the family of black-box models, at the cost of relying on a subset of the data. Arguably, data is often abundant and in most applications practitioners tend to hold out a test data set anyway. \n\n> Does the coverage guarantee carry over to counterfactuals?\n\n### Generating Conformal Counterfactuals\n\nWhile Conformal Prediction has recently grown in popularity, it does introduce a challenge in the context of classification: the predictions of Conformal Classifiers are set-valued and therefore difficult to work with, since they are, for example, non-differentiable. Fortunately, @stutz2022learning introduced carefully designed differentiable loss functions that make it possible to evaluate the performance of conformal predictions in training. We can leverage these recent advances in the context of gradient-based counterfactual search ...\n\n> Challenge: still need to implement these loss functions. \n\n## Experiments\n\n### Research Questions\n\n- Is CP alone enough to ensure realistic counterfactuals?\n- Do counterfactuals improve further as the models get better?\n- Do counterfactuals get more realistic as coverage\n- What happens as we vary coverage and setsize?\n- What happens as we improve the model robustness?\n- What happens as we improve the model's ability to incorporate predictive uncertainty (deep ensemble, laplace)?\n- What happens if we combine with DiCE, ClaPROAR, Gravitational?\n- What about CE robustness to endogenous shifts [@altmeyer2023endogenous]?\n\n- Benchmarking:\n - add PROBE [@pawelczyk2022probabilistically] into the mix.\n - compare travel costs to domain shits.\n\n> Nice to have: What about using Laplace Approximation, then Conformal Prediction? What about using Conformalised Laplace? \n\n## References\n\n", "supporting": [ "proposal_files/figure-html" ], diff --git a/bib.bib b/bib.bib index 1b1dca6b..6aab437e 100644 --- a/bib.bib +++ b/bib.bib @@ -2403,4 +2403,26 @@ shorttitle = {Probabilistically {Robust} {Recourse}}, } +@InProceedings{stutz2022learning, + author = {Stutz, David and Dvijotham, Krishnamurthy Dj and Cemgil, Ali Taylan and Doucet, Arnaud}, + date = {2022-05}, + title = {Learning {Optimal} {Conformal} {Classifiers}}, + language = {en}, + url = {https://openreview.net/forum?id=t8O-4LKFVx}, + urldate = {2023-02-13}, + abstract = {Modern deep learning based classifiers show very high accuracy on test data but this does not provide sufficient guarantees for safe deployment, especially in high-stake AI applications such as medical diagnosis. Usually, predictions are obtained without a reliable uncertainty estimate or a formal guarantee. Conformal prediction (CP) addresses these issues by using the classifier's predictions, e.g., its probability estimates, to predict confidence sets containing the true class with a user-specified probability. However, using CP as a separate processing step after training prevents the underlying model from adapting to the prediction of confidence sets. Thus, this paper explores strategies to differentiate through CP during training with the goal of training model with the conformal wrapper end-to-end. In our approach, conformal training (ConfTr), we specifically "simulate" conformalization on mini-batches during training. Compared to standard training, ConfTr reduces the average confidence set size (inefficiency) of state-of-the-art CP methods applied after training. Moreover, it allows to "shape" the confidence sets predicted at test time, which is difficult for standard CP. On experiments with several datasets, we show ConfTr can influence how inefficiency is distributed across classes, or guide the composition of confidence sets in terms of the included classes, while retaining the guarantees offered by CP.}, + file = {:stutz2022learning - Learning Optimal Conformal Classifiers.pdf:PDF}, +} + +@InProceedings{grathwohl2020your, + author = {Grathwohl, Will and Wang, Kuan-Chieh and Jacobsen, Joern-Henrik and Duvenaud, David and Norouzi, Mohammad and Swersky, Kevin}, + date = {2020-03}, + title = {Your classifier is secretly an energy based model and you should treat it like one}, + language = {en}, + url = {https://openreview.net/forum?id=Hkxzx0NtDB}, + urldate = {2023-02-13}, + abstract = {We propose to reinterpret a standard discriminative classifier of p(y{\textbar}x) as an energy based model for the joint distribution p(x, y). In this setting, the standard class probabilities can be easily computed as well as unnormalized values of p(x) and p(x{\textbar}y). Within this framework, standard discriminative architectures may be used and the model can also be trained on unlabeled data. We demonstrate that energy based training of the joint distribution improves calibration, robustness, and out-of-distribution detection while also enabling our models to generate samples rivaling the quality of recent GAN approaches. We improve upon recently proposed techniques for scaling up the training of energy based models and present an approach which adds little overhead compared to standard classification training. Our approach is the first to achieve performance rivaling the state-of-the-art in both generative and discriminative learning within one hybrid model.}, + file = {:grathwohl2020your - Your Classifier Is Secretly an Energy Based Model and You Should Treat It like One.pdf:PDF}, +} + @Comment{jabref-meta: databaseType:biblatex;} diff --git a/build/dev/proposal.html b/build/dev/proposal.html index eea1c51f..afcdf814 100644 --- a/build/dev/proposal.html +++ b/build/dev/proposal.html @@ -7,7 +7,7 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> -<title>Conformal Counterfactual Explanations</title> +<title>High-Fidelity Counterfactual Explanations through Conformal Prediction</title> <style> code{white-space: pre-wrap;} span.smallcaps{font-variant: small-caps;} @@ -67,18 +67,19 @@ div.csl-indent { <ul> <li><a href="#motivation" id="toc-motivation" class="nav-link active" data-scroll-target="#motivation">Motivation</a> <ul class="collapse"> - <li><a href="#from-adversarial-examples-to-counterfactual-explanations" id="toc-from-adversarial-examples-to-counterfactual-explanations" class="nav-link" data-scroll-target="#from-adversarial-examples-to-counterfactual-explanations">From Adversarial Examples to Counterfactual Explanations</a></li> + <li><a href="#counterfactual-explanations-or-adversarial-examples" id="toc-counterfactual-explanations-or-adversarial-examples" class="nav-link" data-scroll-target="#counterfactual-explanations-or-adversarial-examples">Counterfactual Explanations or Adversarial Examples?</a></li> + <li><a href="#sec-fidelity" id="toc-sec-fidelity" class="nav-link" data-scroll-target="#sec-fidelity">From Plausible to High-Fidelity Counterfactuals</a></li> </ul></li> - <li><a href="#introduction-to-conformal-prediction" id="toc-introduction-to-conformal-prediction" class="nav-link" data-scroll-target="#introduction-to-conformal-prediction">Introduction to Conformal Prediction</a> + <li><a href="#conformal-counterfactual-explanations" id="toc-conformal-counterfactual-explanations" class="nav-link" data-scroll-target="#conformal-counterfactual-explanations">Conformal Counterfactual Explanations</a> <ul class="collapse"> - <li><a href="#post-hoc" id="toc-post-hoc" class="nav-link" data-scroll-target="#post-hoc">Post-hoc</a></li> - <li><a href="#intrinsic-conformal-training-maybe" id="toc-intrinsic-conformal-training-maybe" class="nav-link" data-scroll-target="#intrinsic-conformal-training-maybe">Intrinsic — Conformal Training [MAYBE]</a></li> + <li><a href="#minimizing-predictive-uncertainty" id="toc-minimizing-predictive-uncertainty" class="nav-link" data-scroll-target="#minimizing-predictive-uncertainty">Minimizing Predictive Uncertainty</a></li> + <li><a href="#background-on-conformal-prediction" id="toc-background-on-conformal-prediction" class="nav-link" data-scroll-target="#background-on-conformal-prediction">Background on Conformal Prediction</a></li> + <li><a href="#generating-conformal-counterfactuals" id="toc-generating-conformal-counterfactuals" class="nav-link" data-scroll-target="#generating-conformal-counterfactuals">Generating Conformal Counterfactuals</a></li> </ul></li> - <li><a href="#conformal-counterfactuals" id="toc-conformal-counterfactuals" class="nav-link" data-scroll-target="#conformal-counterfactuals">Conformal Counterfactuals</a> + <li><a href="#experiments" id="toc-experiments" class="nav-link" data-scroll-target="#experiments">Experiments</a> <ul class="collapse"> <li><a href="#research-questions" id="toc-research-questions" class="nav-link" data-scroll-target="#research-questions">Research Questions</a></li> </ul></li> - <li><a href="#experiments" id="toc-experiments" class="nav-link" data-scroll-target="#experiments">Experiments</a></li> <li><a href="#references" id="toc-references" class="nav-link" data-scroll-target="#references">References</a></li> </ul> </nav> @@ -87,7 +88,7 @@ div.csl-indent { <header id="title-block-header" class="quarto-title-block default"> <div class="quarto-title"> -<h1 class="title">Conformal Counterfactual Explanations</h1> +<h1 class="title">High-Fidelity Counterfactual Explanations through Conformal Prediction</h1> <p class="subtitle lead">Research Proposal</p> </div> @@ -103,7 +104,7 @@ div.csl-indent { <div> <div class="abstract"> <div class="abstract-title">Abstract</div> - <p>We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data generating process. While this an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces an significant engineering overhead, but also reallocates the task of creating realistic model explanations from the model itsel to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion.</p> + <p>We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data-generating process. While this is an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces a significant engineering overhead but also reallocates the task of creating realistic model explanations from the model itself to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion.</p> </div> </div> @@ -111,17 +112,31 @@ div.csl-indent { <section id="motivation" class="level2"> <h2 class="anchored" data-anchor-id="motivation">Motivation</h2> -<p>Counterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models, but also enable affected individuals to challenge them though the means of Algorithmic Recourse.</p> -<section id="from-adversarial-examples-to-counterfactual-explanations" class="level3"> -<h3 class="anchored" data-anchor-id="from-adversarial-examples-to-counterfactual-explanations">From Adversarial Examples to Counterfactual Explanations</h3> -<p>Most state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs <span class="math inline">\(x\in\mathcal{X}\)</span> into a black-box model <span class="math inline">\(f: \mathcal{X} \mapsto \mathcal{Y}\)</span> in order to change the model output <span class="math inline">\(f(x)\)</span> to some pre-specified target value <span class="math inline">\(t\in\mathcal{Y}\)</span>. Formally, this boils down to defining some loss function <span class="math inline">\(\ell(f(x),t)\)</span> and taking gradient steps in the minimizing direction. The so generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped down counterfactual explanation is therefore little different from an adversarial example.</p> +<p>Counterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models but also enable affected individuals to challenge them through the means of Algorithmic Recourse.</p> +<section id="counterfactual-explanations-or-adversarial-examples" class="level3"> +<h3 class="anchored" data-anchor-id="counterfactual-explanations-or-adversarial-examples">Counterfactual Explanations or Adversarial Examples?</h3> +<p>Most state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs <span class="math inline">\(x\in\mathcal{X}\)</span> into a black-box model <span class="math inline">\(f: \mathcal{X} \mapsto \mathcal{Y}\)</span> in order to change the model output <span class="math inline">\(f(x)\)</span> to some pre-specified target value <span class="math inline">\(t\in\mathcal{Y}\)</span>. Formally, this boils down to defining some loss function <span class="math inline">\(\ell(f(x),t)\)</span> and taking gradient steps in the minimizing direction. The so-generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped-down counterfactual explanation is therefore little different from an adversarial example. In <a href="#fig-adv">Figure 1</a>, for example, generic counterfactual search as in <span class="citation" data-cites="wachter2017counterfactual">Wachter, Mittelstadt, and Russell (<a href="#ref-wachter2017counterfactual" role="doc-biblioref">2017</a>)</span> has been applied to MNIST data.</p> +<div id="fig-adv" class="quarto-figure quarto-figure-center anchored"> +<figure class="figure"> +<p><img src="www/you_may_not_like_it.png" class="img-fluid figure-img"></p> +<p></p><figcaption class="figure-caption">Figure 1: You may not like it, but this is what stripped-down counterfactuals look like. Here we have used <span class="citation" data-cites="wachter2017counterfactual">Wachter, Mittelstadt, and Russell (<a href="#ref-wachter2017counterfactual" role="doc-biblioref">2017</a>)</span> to generate multiple counterfactuals for turning an 8 (eight) into a 3 (three).</figcaption><p></p> +</figure> +</div> +<p>The crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intended to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be “plausibleâ€, “realistic†or “feasibleâ€. To fulfil this latter goal, researchers have come up with a myriad of ways. <span class="citation" data-cites="joshi2019realistic">Joshi et al. (<a href="#ref-joshi2019realistic" role="doc-biblioref">2019</a>)</span> were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. Similarly, <span class="citation" data-cites="poyiadzi2020face">Poyiadzi et al. (<a href="#ref-poyiadzi2020face" role="doc-biblioref">2020</a>)</span> use density … Finally, <span class="citation" data-cites="karimi2021algorithmic">Karimi, Schölkopf, and Valera (<a href="#ref-karimi2021algorithmic" role="doc-biblioref">2021</a>)</span> argues that counterfactuals should comply with the causal model that generates them [CHECK IF WE CAN PHASE THIS LIKE THIS]. Other related approaches include … All of these different approaches have a common goal: they aim to ensure that the generated counterfactuals comply with the (learned) data-generating process (DGB).</p> +<div id="def-plausible" class="theorem definition"> +<p><span class="theorem-title"><strong>Definition 1 (Plausible Counterfactuals) </strong></span>Formally, if <span class="math inline">\(x \sim \mathcal{X}\)</span> and for the corresponding counterfactual we have <span class="math inline">\(x^{\prime}\sim\mathcal{X}^{\prime}\)</span>, then for <span class="math inline">\(x^{\prime}\)</span> to be considered a plausible counterfactual, we need: <span class="math inline">\(\mathcal{X} \approxeq \mathcal{X}^{\prime}\)</span>.</p> +</div> +<p>In the context of Algorithmic Recourse, it makes sense to strive for plausible counterfactuals, since anything else would essentially require individuals to move to out-of-distribution states. But it is worth noting that our ambition to meet this goal, may have implications on our ability to faithfully explain the behaviour of the underlying black-box model (arguably our principal goal). By essentially decoupling the task of learning plausible representations of the data from the model itself, we open ourselves up to vulnerabilities. Using a separate generative model to learn <span class="math inline">\(\mathcal{X}\)</span>, for example, has very serious implications for the generated counterfactuals. <a href="#fig-latent">Figure 2</a> compares the results of applying REVISE <span class="citation" data-cites="joshi2019realistic">(<a href="#ref-joshi2019realistic" role="doc-biblioref">Joshi et al. 2019</a>)</span> to MNIST data using two different Variational Auto-Encoders: while the counterfactual generated using an expressive (strong) VAE is compelling, the result relying on a less expressive (weak) VAE is not even valid. In this latter case, the decoder step of the VAE fails to yield values in <span class="math inline">\(\mathcal{X}\)</span> and hence the counterfactual search in the learned latent space is doomed.</p> +<div id="fig-latent" class="quarto-figure quarto-figure-center anchored"> +<figure class="figure"> +<p><img src="www/mnist_9to4_latent.png" class="img-fluid figure-img"></p> +<p></p><figcaption class="figure-caption">Figure 2: Counterfactual explanations for MNIST using a Latent Space generator: turning a nine (9) into a four (4).</figcaption><p></p> +</figure> +</div> <blockquote class="blockquote"> -<p>You may not like it, but this is what counterfactuals look like</p> +<p>Here it would be nice to have another example where we poison the data going into the generative model to hide biases present in the data (e.g. Boston housing).</p> </blockquote> -<p>The crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intened to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be “plausible†or “realisticâ€. To fulfill this latter goal, researchers have come up with a myriad of ways. <span class="citation" data-cites="joshi2019realistic">Joshi et al. (<a href="#ref-joshi2019realistic" role="doc-biblioref">2019</a>)</span> were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. This ensures that the generated counterfactuals comply with the (learned) data-generating process (DGB). Similarly, <span class="citation" data-cites="poyiadzi2020face">Poyiadzi et al. (<a href="#ref-poyiadzi2020face" role="doc-biblioref">2020</a>)</span> use density …</p> <ul> -<li>Show DiCE for weak MLP</li> -<li>Show Latent for same weak MLP</li> <li>Latent can be manipulated: <ul> <li>train biased model</li> @@ -129,60 +144,84 @@ div.csl-indent { <li>hypothesis: will generate bias-free explanations</li> </ul></li> </ul> +</section> +<section id="sec-fidelity" class="level3"> +<h3 class="anchored" data-anchor-id="sec-fidelity">From Plausible to High-Fidelity Counterfactuals</h3> +<p>In light of the findings, we propose to generally avoid using surrogate models to learn <span class="math inline">\(\mathcal{X}\)</span> in the context of Counterfactual Explanations.</p> <div id="prp-surrogate" class="theorem proposition"> <p><span class="theorem-title"><strong>Proposition 1 (Avoid Surrogates) </strong></span>Since we are in the business of explaining a black-box model, the task of learning realistic representations of the data should not be reallocated from the model itself to some surrogate model.</p> </div> +<p>In cases where the use of surrogate models cannot be avoided, we propose to weigh the plausibility of counterfactuals against their fidelity to the black-box model. In the context of Explainable AI, fidelity is defined as describing how an explanation approximates the prediction of the black-box model <span class="citation" data-cites="molnar2020interpretable">(<a href="#ref-molnar2020interpretable" role="doc-biblioref">Molnar 2020</a>)</span>. Fidelity has become the default metric for evaluating Local Model-Agnostic Models, since they often involve local surrogate models whose predictions need not always match those of the black-box model.</p> +<p>In the case of Counterfactual Explanations, the concept of fidelity has so far been ignored. This is not altogether surprising, since by construction and design, Counterfactual Explanations work with the predictions of the black-box model directly: as stated above, a counterfactual <span class="math inline">\(x^{\prime}\)</span> is considered valid if and only if <span class="math inline">\(f(x^{\prime})=t\)</span>, where <span class="math inline">\(t\)</span> denote some target outcome.</p> +<p>Does fidelity even make sense in the context of CE, and if so, how can we define it? In light of the examples in the previous section, we think it is urgent to introduce a notion of fidelity in this context, that relates to the distributional properties of the generated counterfactuals. In particular, we propose that a high-fidelity counterfactual <span class="math inline">\(x^{\prime}\)</span> complies with the class-conditional distribution <span class="math inline">\(\mathcal{X}_{\theta} = p_{\theta}(X|y)\)</span> where <span class="math inline">\(\theta\)</span> denote the black-box model parameters.</p> +<div id="def-fidele" class="theorem definition"> +<p><span class="theorem-title"><strong>Definition 2 (High-Fidelity Counterfactuals) </strong></span>Let <span class="math inline">\(\mathcal{X}_{\theta}|y = p_{\theta}(X|y)\)</span> denote the class-conditional distribution of <span class="math inline">\(X\)</span> defined by <span class="math inline">\(\theta\)</span>. Then for <span class="math inline">\(x^{\prime}\)</span> to be considered a high-fidelity counterfactual, we need: <span class="math inline">\(\mathcal{X}_{\theta}|t \approxeq \mathcal{X}^{\prime}\)</span> where <span class="math inline">\(t\)</span> denotes the target outcome.</p> +</div> +<p>In order to assess the fidelity of counterfactuals, we propose the following two-step procedure:</p> +<ol type="1"> +<li>Generate samples <span class="math inline">\(X_{\theta}|y\)</span> and <span class="math inline">\(X^{\prime}\)</span> from <span class="math inline">\(\mathcal{X}_{\theta}|t\)</span> and <span class="math inline">\(\mathcal{X}^{\prime}\)</span>, respectively.</li> +<li>Compute the Maximum Mean Discrepancy (MMD) between <span class="math inline">\(X_{\theta}|y\)</span> and <span class="math inline">\(X^{\prime}\)</span>.</li> +</ol> +<p>If the computed value is different from zero, we can reject the null-hypothesis of fidelity.</p> +<blockquote class="blockquote"> +<p>Two challenges here: 1) implementing the sampling procedure in <span class="citation" data-cites="grathwohl2020your">Grathwohl et al. (<a href="#ref-grathwohl2020your" role="doc-biblioref">2020</a>)</span>; 2) it is unclear if MMD is really the right way to measure this.</p> +</blockquote> </section> </section> -<section id="introduction-to-conformal-prediction" class="level2"> -<h2 class="anchored" data-anchor-id="introduction-to-conformal-prediction">Introduction to Conformal Prediction</h2> -<ul> -<li>distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification</li> -</ul> -<section id="post-hoc" class="level3"> -<h3 class="anchored" data-anchor-id="post-hoc">Post-hoc</h3> -<ul> -<li>Take any fitted model and turn it into a conformal model using calibration data.</li> -</ul> -</section> -<section id="intrinsic-conformal-training-maybe" class="level3"> -<h3 class="anchored" data-anchor-id="intrinsic-conformal-training-maybe">Intrinsic — Conformal Training [MAYBE]</h3> +<section id="conformal-counterfactual-explanations" class="level2"> +<h2 class="anchored" data-anchor-id="conformal-counterfactual-explanations">Conformal Counterfactual Explanations</h2> +<p>In <a href="#sec-fidelity">Section 1.2</a>, we have advocated for avoiding surrogate models in the context of Counterfactual Explanations. In this section, we introduce an alternative way to generate high-fidelity Counterfactual Explanations. In particular, we propose Conformal Counterfactual Explanations (CCE), that is Counterfactual Explanations that minimize the predictive uncertainty of conformal models.</p> +<section id="minimizing-predictive-uncertainty" class="level3"> +<h3 class="anchored" data-anchor-id="minimizing-predictive-uncertainty">Minimizing Predictive Uncertainty</h3> +<p><span class="citation" data-cites="schut2021generating">Schut et al. (<a href="#ref-schut2021generating" role="doc-biblioref">2021</a>)</span> demonstrated that the goal of generating realistic (plausible) counterfactuals can also be achieved by seeking counterfactuals that minimize the predictive uncertainty of the underlying black-box model. Similarly, <span class="citation" data-cites="antoran2020getting">Antorán et al. (<a href="#ref-antoran2020getting" role="doc-biblioref">2020</a>)</span> …</p> <ul> -<li>Model explicitly trained for conformal prediction.</li> +<li>Problem: restricted to Bayesian models.</li> +<li>Solution: post-hoc predictive uncertainty quantification. In particular, Conformal Prediction.</li> </ul> </section> -</section> -<section id="conformal-counterfactuals" class="level2"> -<h2 class="anchored" data-anchor-id="conformal-counterfactuals">Conformal Counterfactuals</h2> +<section id="background-on-conformal-prediction" class="level3"> +<h3 class="anchored" data-anchor-id="background-on-conformal-prediction">Background on Conformal Prediction</h3> <ul> -<li>Realistic counterfactuals by minimizing predictive uncertainty <span class="citation" data-cites="schut2021generating">(<a href="#ref-schut2021generating" role="doc-biblioref">Schut et al. 2021</a>)</span>.</li> -<li>Problem: restricted to Bayesian models.</li> -<li>Solution: post-hoc predictive uncertainty quantification.</li> +<li>Distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification.</li> <li>Conformal prediction is instance-based. So is CE.</li> -<li>Does the coverage guarantee carry over to counterfactuals?</li> -</ul> -<section id="research-questions" class="level3"> -<h3 class="anchored" data-anchor-id="research-questions">Research Questions</h3> -<ul> -<li>Is CP alone enough to ensure realistic counterfactuals?</li> -<li>Do counterfactuals improve further as the models get better?</li> -<li>Do counterfactuals get more realistic as coverage</li> -<li>What happens as we vary coverage and setsize?</li> -<li>What happens as we improve the model robustness?</li> -<li>What happens as we improve the model’s ability to incorporate predictive uncertainty (deep ensemble, laplace)?</li> +<li>Take any fitted model and turn it into a conformal model using calibration data.</li> +<li>Our approach, therefore, relaxes the restriction on the family of black-box models, at the cost of relying on a subset of the data. Arguably, data is often abundant and in most applications practitioners tend to hold out a test data set anyway.</li> </ul> +<blockquote class="blockquote"> +<p>Does the coverage guarantee carry over to counterfactuals?</p> +</blockquote> +</section> +<section id="generating-conformal-counterfactuals" class="level3"> +<h3 class="anchored" data-anchor-id="generating-conformal-counterfactuals">Generating Conformal Counterfactuals</h3> +<p>While Conformal Prediction has recently grown in popularity, it does introduce a challenge in the context of classification: the predictions of Conformal Classifiers are set-valued and therefore difficult to work with, since they are, for example, non-differentiable. Fortunately, <span class="citation" data-cites="stutz2022learning">Stutz et al. (<a href="#ref-stutz2022learning" role="doc-biblioref">2022</a>)</span> introduced carefully designed differentiable loss functions that make it possible to evaluate the performance of conformal predictions in training. We can leverage these recent advances in the context of gradient-based counterfactual search …</p> +<blockquote class="blockquote"> +<p>Challenge: still need to implement these loss functions.</p> +</blockquote> </section> </section> <section id="experiments" class="level2"> <h2 class="anchored" data-anchor-id="experiments">Experiments</h2> +<section id="research-questions" class="level3"> +<h3 class="anchored" data-anchor-id="research-questions">Research Questions</h3> <ul> -<li>Maybe: conformalised Laplace</li> -<li>Benchmarking: +<li><p>Is CP alone enough to ensure realistic counterfactuals?</p></li> +<li><p>Do counterfactuals improve further as the models get better?</p></li> +<li><p>Do counterfactuals get more realistic as coverage</p></li> +<li><p>What happens as we vary coverage and setsize?</p></li> +<li><p>What happens as we improve the model robustness?</p></li> +<li><p>What happens as we improve the model’s ability to incorporate predictive uncertainty (deep ensemble, laplace)?</p></li> +<li><p>What happens if we combine with DiCE, ClaPROAR, Gravitational?</p></li> +<li><p>What about CE robustness to endogenous shifts <span class="citation" data-cites="altmeyer2023endogenous">(<a href="#ref-altmeyer2023endogenous" role="doc-biblioref">Altmeyer et al. 2023</a>)</span>?</p></li> +<li><p>Benchmarking:</p> <ul> -<li>add PROBE into the mix</li> +<li>add PROBE <span class="citation" data-cites="pawelczyk2022probabilistically">(<a href="#ref-pawelczyk2022probabilistically" role="doc-biblioref">Pawelczyk et al. 2022</a>)</span> into the mix.</li> <li>compare travel costs to domain shits.</li> </ul></li> </ul> +<blockquote class="blockquote"> +<p>Nice to have: What about using Laplace Approximation, then Conformal Prediction? What about using Conformalised Laplace?</p> +</blockquote> +</section> </section> <section id="references" class="level2 unnumbered"> @@ -190,15 +229,39 @@ div.csl-indent { </section> <div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" role="doc-bibliography"><h2 class="anchored quarto-appendix-heading">References</h2><div id="refs" class="references csl-bib-body hanging-indent" role="doc-bibliography"> +<div id="ref-altmeyer2023endogenous" class="csl-entry" role="doc-biblioentry"> +Altmeyer, Patrick, Giovan Angela, Aleksander Buszydlik, Karol Dobiczek, Arie van Deursen, and Cynthia Liem. 2023. <span>“Endogenous <span>Macrodynamics</span> in <span>Algorithmic</span> <span>Recourse</span>.â€</span> In <em>First <span>IEEE</span> <span>Conference</span> on <span>Secure</span> and <span>Trustworthy</span> <span>Machine</span> <span>Learning</span></em>. +</div> +<div id="ref-antoran2020getting" class="csl-entry" role="doc-biblioentry"> +Antorán, Javier, Umang Bhatt, Tameem Adel, Adrian Weller, and José Miguel Hernández-Lobato. 2020. <span>“Getting a Clue: <span>A</span> Method for Explaining Uncertainty Estimates.â€</span> <a href="https://arxiv.org/abs/2006.06848">https://arxiv.org/abs/2006.06848</a>. +</div> +<div id="ref-grathwohl2020your" class="csl-entry" role="doc-biblioentry"> +Grathwohl, Will, Kuan-Chieh Wang, Joern-Henrik Jacobsen, David Duvenaud, Mohammad Norouzi, and Kevin Swersky. 2020. <span>“Your Classifier Is Secretly an Energy Based Model and You Should Treat It Like One.â€</span> In. <a href="https://openreview.net/forum?id=Hkxzx0NtDB">https://openreview.net/forum?id=Hkxzx0NtDB</a>. +</div> <div id="ref-joshi2019realistic" class="csl-entry" role="doc-biblioentry"> Joshi, Shalmali, Oluwasanmi Koyejo, Warut Vijitbenjaronk, Been Kim, and Joydeep Ghosh. 2019. <span>“Towards Realistic Individual Recourse and Actionable Explanations in Black-Box Decision Making Systems.â€</span> <a href="https://arxiv.org/abs/1907.09615">https://arxiv.org/abs/1907.09615</a>. </div> +<div id="ref-karimi2021algorithmic" class="csl-entry" role="doc-biblioentry"> +Karimi, Amir-Hossein, Bernhard Schölkopf, and Isabel Valera. 2021. <span>“Algorithmic Recourse: From Counterfactual Explanations to Interventions.â€</span> In <em>Proceedings of the 2021 <span>ACM Conference</span> on <span>Fairness</span>, <span>Accountability</span>, and <span>Transparency</span></em>, 353–62. +</div> +<div id="ref-molnar2020interpretable" class="csl-entry" role="doc-biblioentry"> +Molnar, Christoph. 2020. <em>Interpretable Machine Learning</em>. <span>Lulu. com</span>. +</div> +<div id="ref-pawelczyk2022probabilistically" class="csl-entry" role="doc-biblioentry"> +Pawelczyk, Martin, Teresa Datta, Johannes van-den-Heuvel, Gjergji Kasneci, and Himabindu Lakkaraju. 2022. <span>“Probabilistically <span>Robust</span> <span>Recourse</span>: <span>Navigating</span> the <span>Trade</span>-Offs Between <span>Costs</span> and <span>Robustness</span> in <span>Algorithmic</span> <span>Recourse</span>.â€</span> <em>arXiv Preprint arXiv:2203.06768</em>. +</div> <div id="ref-poyiadzi2020face" class="csl-entry" role="doc-biblioentry"> Poyiadzi, Rafael, Kacper Sokol, Raul Santos-Rodriguez, Tijl De Bie, and Peter Flach. 2020. <span>“<span>FACE</span>: <span>Feasible</span> and Actionable Counterfactual Explanations.â€</span> In <em>Proceedings of the <span>AAAI</span>/<span>ACM Conference</span> on <span>AI</span>, <span>Ethics</span>, and <span>Society</span></em>, 344–50. </div> <div id="ref-schut2021generating" class="csl-entry" role="doc-biblioentry"> Schut, Lisa, Oscar Key, Rory Mc Grath, Luca Costabello, Bogdan Sacaleanu, Yarin Gal, et al. 2021. <span>“Generating <span>Interpretable Counterfactual Explanations By Implicit Minimisation</span> of <span>Epistemic</span> and <span>Aleatoric Uncertainties</span>.â€</span> In <em>International <span>Conference</span> on <span>Artificial Intelligence</span> and <span>Statistics</span></em>, 1756–64. <span>PMLR</span>. </div> +<div id="ref-stutz2022learning" class="csl-entry" role="doc-biblioentry"> +Stutz, David, Krishnamurthy Dj Dvijotham, Ali Taylan Cemgil, and Arnaud Doucet. 2022. <span>“Learning <span>Optimal</span> <span>Conformal</span> <span>Classifiers</span>.â€</span> In. <a href="https://openreview.net/forum?id=t8O-4LKFVx">https://openreview.net/forum?id=t8O-4LKFVx</a>. +</div> +<div id="ref-wachter2017counterfactual" class="csl-entry" role="doc-biblioentry"> +Wachter, Sandra, Brent Mittelstadt, and Chris Russell. 2017. <span>“Counterfactual Explanations Without Opening the Black Box: <span>Automated</span> Decisions and the <span>GDPR</span>.â€</span> <em>Harv. JL & Tech.</em> 31: 841. +</div> </div></section></div></main> <!-- /main column --> <script id="quarto-html-after-body" type="application/javascript"> diff --git a/build/dev/www/mnist_9to4_latent.png b/build/dev/www/mnist_9to4_latent.png new file mode 100644 index 0000000000000000000000000000000000000000..8f6b3a53c7295ef3678d841e79dc5e0bd38f6e3c GIT binary patch literal 13939 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 IdH31>0e~*Y^#A|> literal 0 HcmV?d00001 diff --git a/build/dev/www/you_may_not_like_it.png b/build/dev/www/you_may_not_like_it.png new file mode 100644 index 0000000000000000000000000000000000000000..4b48e585ebcd285c9aa0b2bfabe1c1ff627bbbba GIT binary patch literal 17193 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 literal 0 HcmV?d00001 diff --git a/dev/proposal.qmd b/dev/proposal.qmd index 0987858c..08bdb0e7 100644 --- a/dev/proposal.qmd +++ b/dev/proposal.qmd @@ -1,41 +1,100 @@ --- -title: Conformal Counterfactual Explanations +title: High-Fidelity Counterfactual Explanations through Conformal Prediction subtitle: Research Proposal abstract: | - We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data generating process. While this an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces an significant engineering overhead, but also reallocates the task of creating realistic model explanations from the model itsel to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion. + We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data-generating process. While this is an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces a significant engineering overhead but also reallocates the task of creating realistic model explanations from the model itself to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion. --- +```{julia} +using CounterfactualExplanations +using CounterfactualExplanations.Data: load_mnist +using CounterfactualExplanations.Models: load_mnist_mlp +using Images +using MLDatasets +using MLDatasets: convert2image +using Plots +www_path = "dev/www" +``` + ## Motivation -Counterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models, but also enable affected individuals to challenge them though the means of Algorithmic Recourse. +Counterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models but also enable affected individuals to challenge them through the means of Algorithmic Recourse. ### Counterfactual Explanations or Adversarial Examples? -Most state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs $x\in\mathcal{X}$ into a black-box model $f: \mathcal{X} \mapsto \mathcal{Y}$ in order to change the model output $f(x)$ to some pre-specified target value $t\in\mathcal{Y}$. Formally, this boils down to defining some loss function $\ell(f(x),t)$ and taking gradient steps in the minimizing direction. The so generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped down counterfactual explanation is therefore little different from an adversarial example. - -> You may not like it, but this is what counterfactuals look like ... - -The crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intened to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be "plausible", "realistic" or "feasible". To fulfill this latter goal, researchers have come up with a myriad of ways. @joshi2019realistic were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. Similarly, @poyiadzi2020face use density ... Finally, @karimi2021algorithmic argue that counterfactuals should comply with the causal model that generates them [CHECK IF WE CAN PHASE THIS LIKE THIS]. Other related approaches include ... All of these different approaches have a common goal: they aim to ensure that the generated counterfactuals comply with the (learned) data-generating process (DGB). +Most state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs $x\in\mathcal{X}$ into a black-box model $f: \mathcal{X} \mapsto \mathcal{Y}$ in order to change the model output $f(x)$ to some pre-specified target value $t\in\mathcal{Y}$. Formally, this boils down to defining some loss function $\ell(f(x),t)$ and taking gradient steps in the minimizing direction. The so-generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped-down counterfactual explanation is therefore little different from an adversarial example. In @fig-adv, for example, generic counterfactual search as in @wachter2017counterfactual has been applied to MNIST data. + +```{julia} +# Data: +counterfactual_data = load_mnist() +X, y = CounterfactualExplanations.DataPreprocessing.unpack_data(counterfactual_data) +input_dim, n_obs = size(counterfactual_data.X) +M = load_mnist_mlp() +# Target: +factual_label = 8 +x = reshape(X[:,rand(findall(predict_label(M, counterfactual_data).==factual_label))],input_dim,1) +target = 3 +factual = predict_label(M, counterfactual_data, x)[1] +# Search: +n_ce = 3 +generator = GenericGenerator() +ces = generate_counterfactual(x, target, counterfactual_data, M, generator; num_counterfactuals=n_ce) +``` + +```{julia} +image_size = 200 +p1 = plot( + convert2image(MNIST, reshape(x,28,28)), + axis=nothing, + size=(image_size, image_size), + title="Factual" +) +plts = [p1] + +counterfactuals = CounterfactualExplanations.counterfactual(ces) +phat = target_probs(ces) +for x in zip(eachslice(counterfactuals; dims=3), eachslice(phat; dims=3)) + ce, _phat = (x[1],x[2]) + _title = "p(y=$(target)|x′)=$(round(_phat[1]; digits=3))" + plt = plot( + convert2image(MNIST, reshape(ce,28,28)), + axis=nothing, + size=(image_size, image_size), + title=_title + ) + plts = [plts..., plt] +end +plt = plot(plts...; size=(image_size * (n_ce + 1),image_size), layout=(1,(n_ce + 1))) +savefig(plt, joinpath(www_path, "you_may_not_like_it.png")) +``` + +{#fig-adv} + +The crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intended to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be "plausible", "realistic" or "feasible". To fulfil this latter goal, researchers have come up with a myriad of ways. @joshi2019realistic were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. Similarly, @poyiadzi2020face use density ... Finally, @karimi2021algorithmic argues that counterfactuals should comply with the causal model that generates them [CHECK IF WE CAN PHASE THIS LIKE THIS]. Other related approaches include ... All of these different approaches have a common goal: they aim to ensure that the generated counterfactuals comply with the (learned) data-generating process (DGB). ::: {#def-plausible} ## Plausible Counterfactuals -Since we are in the business of explaining a black-box model, the task of learning realistic representations of the data should not be reallocated from the model itself to some surrogate model. +Formally, if $x \sim \mathcal{X}$ and for the corresponding counterfactual we have $x^{\prime}\sim\mathcal{X}^{\prime}$, then for $x^{\prime}$ to be considered a plausible counterfactual, we need: $\mathcal{X} \approxeq \mathcal{X}^{\prime}$. ::: -Formally, if $x \sim \mathcal{X}$ and for the corresponding counterfactual we have $x^{\prime}\sim\mathcal{X}x^{\prime}$, then +In the context of Algorithmic Recourse, it makes sense to strive for plausible counterfactuals, since anything else would essentially require individuals to move to out-of-distribution states. But it is worth noting that our ambition to meet this goal, may have implications on our ability to faithfully explain the behaviour of the underlying black-box model (arguably our principal goal). By essentially decoupling the task of learning plausible representations of the data from the model itself, we open ourselves up to vulnerabilities. Using a separate generative model to learn $\mathcal{X}$, for example, has very serious implications for the generated counterfactuals. @fig-latent compares the results of applying REVISE [@joshi2019realistic] to MNIST data using two different Variational Auto-Encoders: while the counterfactual generated using an expressive (strong) VAE is compelling, the result relying on a less expressive (weak) VAE is not even valid. In this latter case, the decoder step of the VAE fails to yield values in $\mathcal{X}$ and hence the counterfactual search in the learned latent space is doomed. - +{#fig-latent} + +> Here it would be nice to have another example where we poison the data going into the generative model to hide biases present in the data (e.g. Boston housing). -- Show DiCE for weak MLP -- Show Latent for same weak MLP - Latent can be manipulated: - train biased model - train VAE with biased variable removed/attacked (use Boston housing dataset) - hypothesis: will generate bias-free explanations +### From Plausible to High-Fidelity Counterfactuals {#sec-fidelity} + +In light of the findings, we propose to generally avoid using surrogate models to learn $\mathcal{X}$ in the context of Counterfactual Explanations. + ::: {#prp-surrogate} ## Avoid Surrogates @@ -44,25 +103,56 @@ Since we are in the business of explaining a black-box model, the task of learni ::: -## Introduction to Conformal Prediction +In cases where the use of surrogate models cannot be avoided, we propose to weigh the plausibility of counterfactuals against their fidelity to the black-box model. In the context of Explainable AI, fidelity is defined as describing how an explanation approximates the prediction of the black-box model [@molnar2020interpretable]. Fidelity has become the default metric for evaluating Local Model-Agnostic Models, since they often involve local surrogate models whose predictions need not always match those of the black-box model. -- distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification +In the case of Counterfactual Explanations, the concept of fidelity has so far been ignored. This is not altogether surprising, since by construction and design, Counterfactual Explanations work with the predictions of the black-box model directly: as stated above, a counterfactual $x^{\prime}$ is considered valid if and only if $f(x^{\prime})=t$, where $t$ denote some target outcome. -### Post-hoc +Does fidelity even make sense in the context of CE, and if so, how can we define it? In light of the examples in the previous section, we think it is urgent to introduce a notion of fidelity in this context, that relates to the distributional properties of the generated counterfactuals. In particular, we propose that a high-fidelity counterfactual $x^{\prime}$ complies with the class-conditional distribution $\mathcal{X}_{\theta} = p_{\theta}(X|y)$ where $\theta$ denote the black-box model parameters. -- Take any fitted model and turn it into a conformal model using calibration data. +::: {#def-fidele} + +## High-Fidelity Counterfactuals + +Let $\mathcal{X}_{\theta}|y = p_{\theta}(X|y)$ denote the class-conditional distribution of $X$ defined by $\theta$. Then for $x^{\prime}$ to be considered a high-fidelity counterfactual, we need: $\mathcal{X}_{\theta}|t \approxeq \mathcal{X}^{\prime}$ where $t$ denotes the target outcome. + +::: + +In order to assess the fidelity of counterfactuals, we propose the following two-step procedure: + +1) Generate samples $X_{\theta}|y$ and $X^{\prime}$ from $\mathcal{X}_{\theta}|t$ and $\mathcal{X}^{\prime}$, respectively. +2) Compute the Maximum Mean Discrepancy (MMD) between $X_{\theta}|y$ and $X^{\prime}$. + +If the computed value is different from zero, we can reject the null-hypothesis of fidelity. -### Intrinsic --- Conformal Training [MAYBE] +> Two challenges here: 1) implementing the sampling procedure in @grathwohl2020your; 2) it is unclear if MMD is really the right way to measure this. -- Model explicitly trained for conformal prediction. +## Conformal Counterfactual Explanations -## Conformal Counterfactuals +In @sec-fidelity, we have advocated for avoiding surrogate models in the context of Counterfactual Explanations. In this section, we introduce an alternative way to generate high-fidelity Counterfactual Explanations. In particular, we propose Conformal Counterfactual Explanations (CCE), that is Counterfactual Explanations that minimize the predictive uncertainty of conformal models. + +### Minimizing Predictive Uncertainty + +@schut2021generating demonstrated that the goal of generating realistic (plausible) counterfactuals can also be achieved by seeking counterfactuals that minimize the predictive uncertainty of the underlying black-box model. Similarly, @antoran2020getting ... -- Realistic counterfactuals by minimizing predictive uncertainty [@schut2021generating]. - Problem: restricted to Bayesian models. -- Solution: post-hoc predictive uncertainty quantification. +- Solution: post-hoc predictive uncertainty quantification. In particular, Conformal Prediction. + +### Background on Conformal Prediction + +- Distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification. - Conformal prediction is instance-based. So is CE. -- Does the coverage guarantee carry over to counterfactuals? +- Take any fitted model and turn it into a conformal model using calibration data. +- Our approach, therefore, relaxes the restriction on the family of black-box models, at the cost of relying on a subset of the data. Arguably, data is often abundant and in most applications practitioners tend to hold out a test data set anyway. + +> Does the coverage guarantee carry over to counterfactuals? + +### Generating Conformal Counterfactuals + +While Conformal Prediction has recently grown in popularity, it does introduce a challenge in the context of classification: the predictions of Conformal Classifiers are set-valued and therefore difficult to work with, since they are, for example, non-differentiable. Fortunately, @stutz2022learning introduced carefully designed differentiable loss functions that make it possible to evaluate the performance of conformal predictions in training. We can leverage these recent advances in the context of gradient-based counterfactual search ... + +> Challenge: still need to implement these loss functions. + +## Experiments ### Research Questions @@ -72,14 +162,15 @@ Since we are in the business of explaining a black-box model, the task of learni - What happens as we vary coverage and setsize? - What happens as we improve the model robustness? - What happens as we improve the model's ability to incorporate predictive uncertainty (deep ensemble, laplace)? +- What happens if we combine with DiCE, ClaPROAR, Gravitational? +- What about CE robustness to endogenous shifts [@altmeyer2023endogenous]? -## Experiments - -- Maybe: conformalised Laplace - Benchmarking: - - add PROBE into the mix + - add PROBE [@pawelczyk2022probabilistically] into the mix. - compare travel costs to domain shits. +> Nice to have: What about using Laplace Approximation, then Conformal Prediction? What about using Conformalised Laplace? + ## References diff --git a/dev/www/you_may_not_like_it.png b/dev/www/you_may_not_like_it.png new file mode 100644 index 0000000000000000000000000000000000000000..4b48e585ebcd285c9aa0b2bfabe1c1ff627bbbba GIT binary patch literal 17193 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 literal 0 HcmV?d00001 -- GitLab