Select perturbed values without arithmetic masking (#1921) - #1921
Open
craymichael wants to merge 2 commits into
Open
craymichael wants to merge 2 commits into
craymichael wants to merge 2 commits into
Conversation
craymichael
force-pushed
the
export-D117601315
branch
from
August 28, 2026 17:21
c96f8a3 to
3ad6812
Compare
craymichael
force-pushed
the
export-D117601315
branch
from
August 28, 2026 17:25
3ad6812 to
2d39143
Compare
Contributor
|
@craymichael has exported this pull request. If you are a Meta employee, you can view the originating Diff in D117601315. |
craymichael
added a commit
to craymichael/captum
that referenced
this pull request
Aug 28, 2026
Summary: Summary Perturbation paths combined original and replacement values as `old * (1 - mask) + new * mask`. IEEE arithmetic makes `NaN * 0` and `Inf * 0` non-finite, so values outside the selected feature could corrupt model inputs and attributions. Counterexample For input `[1, 2]`, baseline `[0, NaN]`, and mask `[0, 1]`, ablating feature 0 should evaluate `[0, 2]`. Arithmetic masking instead produced `[0, NaN]`, so feature 0 incorrectly received a `NaN` attribution. Fix * Use `torch.where` for Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation. * Apply the same selection semantics to within-group baseline construction, add-back, and permutation helpers. * Mirror the fix in the legacy UFO implementations so alternate call paths cannot retain the corruption. * Keep masks and donor indices on the destination tensor device. Test Plan Before: six focused regressions failed across core and within-group paths (`Pass 159, Fail 6`). After: * `buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation` — Pass 178, Fail 0. * Regressions cover `NaN`, `+Inf`, and `-Inf` in selected and inactive positions. * `arc lint -a` on all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged. * `arc lint -a --engine extra --take CITRINEAGENT` on implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601315
craymichael
added a commit
to craymichael/captum
that referenced
this pull request
Aug 28, 2026
Summary: Summary Perturbation paths combined original and replacement values as `old * (1 - mask) + new * mask`. IEEE arithmetic makes `NaN * 0` and `Inf * 0` non-finite, so values outside the selected feature could corrupt model inputs and attributions. Counterexample For input `[1, 2]`, baseline `[0, NaN]`, and mask `[0, 1]`, ablating feature 0 should evaluate `[0, 2]`. Arithmetic masking instead produced `[0, NaN]`, so feature 0 incorrectly received a `NaN` attribution. Fix * Use `torch.where` for Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation. * Apply the same selection semantics to within-group baseline construction, add-back, and permutation helpers. * Mirror the fix in the legacy UFO implementations so alternate call paths cannot retain the corruption. * Keep masks and donor indices on the destination tensor device. Test Plan Before: six focused regressions failed across core and within-group paths (`Pass 159, Fail 6`). After: * `buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation` — Pass 178, Fail 0. * Regressions cover `NaN`, `+Inf`, and `-Inf` in selected and inactive positions. * `arc lint -a` on all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged. * `arc lint -a --engine extra --take CITRINEAGENT` on implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601315
craymichael
force-pushed
the
export-D117601315
branch
from
August 28, 2026 17:48
2d39143 to
4e6dafc
Compare
craymichael
added a commit
to craymichael/captum
that referenced
this pull request
Aug 28, 2026
Summary: Summary Perturbation paths combined original and replacement values as `old * (1 - mask) + new * mask`. IEEE arithmetic makes `NaN * 0` and `Inf * 0` non-finite, so values outside the selected feature could corrupt model inputs and attributions. Counterexample For input `[1, 2]`, baseline `[0, NaN]`, and mask `[0, 1]`, ablating feature 0 should evaluate `[0, 2]`. Arithmetic masking instead produced `[0, NaN]`, so feature 0 incorrectly received a `NaN` attribution. Fix * Use `torch.where` for Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation. * Apply the same selection semantics to within-group baseline construction, add-back, and permutation helpers. * Mirror the fix in the legacy UFO implementations so alternate call paths cannot retain the corruption. * Keep masks and donor indices on the destination tensor device. Test Plan Before: six focused regressions failed across core and within-group paths (`Pass 159, Fail 6`). After: * `buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation` — Pass 178, Fail 0. * Regressions cover `NaN`, `+Inf`, and `-Inf` in selected and inactive positions. * `arc lint -a` on all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged. * `arc lint -a --engine extra --take CITRINEAGENT` on implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601315
craymichael
added a commit
to craymichael/captum
that referenced
this pull request
Aug 28, 2026
Summary: Summary Perturbation paths combined original and replacement values as `old * (1 - mask) + new * mask`. IEEE arithmetic makes `NaN * 0` and `Inf * 0` non-finite, so values outside the selected feature could corrupt model inputs and attributions. Counterexample For input `[1, 2]`, baseline `[0, NaN]`, and mask `[0, 1]`, ablating feature 0 should evaluate `[0, 2]`. Arithmetic masking instead produced `[0, NaN]`, so feature 0 incorrectly received a `NaN` attribution. Fix * Use `torch.where` for Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation. * Apply the same selection semantics to within-group baseline construction, add-back, and permutation helpers. * Mirror the fix in the legacy UFO implementations so alternate call paths cannot retain the corruption. * Keep masks and donor indices on the destination tensor device. Test Plan Before: six focused regressions failed across core and within-group paths (`Pass 159, Fail 6`). After: * `buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation` — Pass 178, Fail 0. * Regressions cover `NaN`, `+Inf`, and `-Inf` in selected and inactive positions. * `arc lint -a` on all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged. * `arc lint -a --engine extra --take CITRINEAGENT` on implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601315
craymichael
added a commit
to craymichael/captum
that referenced
this pull request
Aug 28, 2026
Summary: Summary Perturbation paths combined original and replacement values as `old * (1 - mask) + new * mask`. IEEE arithmetic makes `NaN * 0` and `Inf * 0` non-finite, so values outside the selected feature could corrupt model inputs and attributions. Counterexample For input `[1, 2]`, baseline `[0, NaN]`, and mask `[0, 1]`, ablating feature 0 should evaluate `[0, 2]`. Arithmetic masking instead produced `[0, NaN]`, so feature 0 incorrectly received a `NaN` attribution. Fix * Use `torch.where` for Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation. * Apply the same selection semantics to within-group baseline construction, add-back, and permutation helpers. * Mirror the fix in the legacy UFO implementations so alternate call paths cannot retain the corruption. * Keep masks and donor indices on the destination tensor device. Test Plan Before: six focused regressions failed across core and within-group paths (`Pass 159, Fail 6`). After: * `buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation` — Pass 178, Fail 0. * Regressions cover `NaN`, `+Inf`, and `-Inf` in selected and inactive positions. * `arc lint -a` on all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged. * `arc lint -a --engine extra --take CITRINEAGENT` on implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601315
craymichael
added a commit
to craymichael/captum
that referenced
this pull request
Aug 28, 2026
Summary: Summary Perturbation paths combined original and replacement values as `old * (1 - mask) + new * mask`. IEEE arithmetic makes `NaN * 0` and `Inf * 0` non-finite, so values outside the selected feature could corrupt model inputs and attributions. Counterexample For input `[1, 2]`, baseline `[0, NaN]`, and mask `[0, 1]`, ablating feature 0 should evaluate `[0, 2]`. Arithmetic masking instead produced `[0, NaN]`, so feature 0 incorrectly received a `NaN` attribution. Fix * Use `torch.where` for Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation. * Apply the same selection semantics to within-group baseline construction, add-back, and permutation helpers. * Mirror the fix in the legacy UFO implementations so alternate call paths cannot retain the corruption. * Keep masks and donor indices on the destination tensor device. Test Plan Before: six focused regressions failed across core and within-group paths (`Pass 159, Fail 6`). After: * `buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation` — Pass 178, Fail 0. * Regressions cover `NaN`, `+Inf`, and `-Inf` in selected and inactive positions. * `arc lint -a` on all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged. * `arc lint -a --engine extra --take CITRINEAGENT` on implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601315
craymichael
added a commit
to craymichael/captum
that referenced
this pull request
Sep 11, 2026
Summary: Summary Perturbation paths combined original and replacement values as `old * (1 - mask) + new * mask`. IEEE arithmetic makes `NaN * 0` and `Inf * 0` non-finite, so values outside the selected feature could corrupt model inputs and attributions. Counterexample For input `[1, 2]`, baseline `[0, NaN]`, and mask `[0, 1]`, ablating feature 0 should evaluate `[0, 2]`. Arithmetic masking instead produced `[0, NaN]`, so feature 0 incorrectly received a `NaN` attribution. Fix * Use `torch.where` for Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation. * Apply the same selection semantics to within-group baseline construction, add-back, and permutation helpers. * Mirror the fix in the legacy UFO implementations so alternate call paths cannot retain the corruption. * Keep masks and donor indices on the destination tensor device. Test Plan Before: six focused regressions failed across core and within-group paths (`Pass 159, Fail 6`). After: * `buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation` — Pass 178, Fail 0. * Regressions cover `NaN`, `+Inf`, and `-Inf` in selected and inactive positions. * `arc lint -a` on all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged. * `arc lint -a --engine extra --take CITRINEAGENT` on implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601315
craymichael
added a commit
to craymichael/captum
that referenced
this pull request
Sep 15, 2026
Summary: Summary Perturbation paths combined original and replacement values as `old * (1 - mask) + new * mask`. IEEE arithmetic makes `NaN * 0` and `Inf * 0` non-finite, so values outside the selected feature could corrupt model inputs and attributions. Counterexample For input `[1, 2]`, baseline `[0, NaN]`, and mask `[0, 1]`, ablating feature 0 should evaluate `[0, 2]`. Arithmetic masking instead produced `[0, NaN]`, so feature 0 incorrectly received a `NaN` attribution. Fix * Use `torch.where` for Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation. * Apply the same selection semantics to within-group baseline construction, add-back, and permutation helpers. * Mirror the fix in the legacy UFO implementations so alternate call paths cannot retain the corruption. * Keep masks and donor indices on the destination tensor device. Test Plan Before: six focused regressions failed across core and within-group paths (`Pass 159, Fail 6`). After: * `buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation` — Pass 178, Fail 0. * Regressions cover `NaN`, `+Inf`, and `-Inf` in selected and inactive positions. * `arc lint -a` on all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged. * `arc lint -a --engine extra --take CITRINEAGENT` on implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601315
craymichael
added a commit
to craymichael/captum
that referenced
this pull request
Sep 15, 2026
Summary: Summary Perturbation paths combined original and replacement values as `old * (1 - mask) + new * mask`. IEEE arithmetic makes `NaN * 0` and `Inf * 0` non-finite, so values outside the selected feature could corrupt model inputs and attributions. Counterexample For input `[1, 2]`, baseline `[0, NaN]`, and mask `[0, 1]`, ablating feature 0 should evaluate `[0, 2]`. Arithmetic masking instead produced `[0, NaN]`, so feature 0 incorrectly received a `NaN` attribution. Fix * Use `torch.where` for Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation. * Apply the same selection semantics to within-group baseline construction, add-back, and permutation helpers. * Mirror the fix in the legacy UFO implementations so alternate call paths cannot retain the corruption. * Keep masks and donor indices on the destination tensor device. Test Plan Before: six focused regressions failed across core and within-group paths (`Pass 159, Fail 6`). After: * `buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation` — Pass 178, Fail 0. * Regressions cover `NaN`, `+Inf`, and `-Inf` in selected and inactive positions. * `arc lint -a` on all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged. * `arc lint -a --engine extra --take CITRINEAGENT` on implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601315
craymichael
force-pushed
the
export-D117601315
branch
from
September 15, 2026 18:42
4e6dafc to
901c490
Compare
Summary: Summary Feature Ablation and Shapley formatted baselines but did not validate tuple arity or tensor shape before running the model. `_tensorize_baseline` also paired inputs and baselines with `zip`, silently discarding extra baselines. Problem For two inputs, a one-element baseline tuple reached the model with a missing argument, while a three-element tuple silently ignored its final baseline. A baseline pool with shape `[2, 1]` for a three-row input was neither a per-example baseline nor a singleton baseline and failed later through opaque broadcasting errors. Fix * Validate baselines in both synchronous and future Feature Ablation and Shapley entry points. * Defensively reject arity mismatches in `_tensorize_baseline`. * Require Shapley tensor baselines to match the input or use a singleton leading dimension with matching trailing dimensions. * Preserve Feature Ablation’s documented support for any tensor shape that broadcasts exactly to the input, including `[F]` and 0-D tensors. Test Plan Before: the new regressions failed through late `IndexError`, missing-forward-argument, and broadcast errors; the extra-baseline case did not raise at all. After: * `buck test fbcode//pytorch/captum/tests/attr:test_common fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_shapley` — Pass 131, Fail 0. * `arc lint -a` on changed Python files — no source lint issues; focused autodeps updates applied. * `arc lint -a --engine extra --take CITRINEAGENT` on changed Captum implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601314
Summary: Summary Perturbation paths combined original and replacement values as `old * (1 - mask) + new * mask`. IEEE arithmetic makes `NaN * 0` and `Inf * 0` non-finite, so values outside the selected feature could corrupt model inputs and attributions. Counterexample For input `[1, 2]`, baseline `[0, NaN]`, and mask `[0, 1]`, ablating feature 0 should evaluate `[0, 2]`. Arithmetic masking instead produced `[0, NaN]`, so feature 0 incorrectly received a `NaN` attribution. Fix * Use `torch.where` for Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation. * Apply the same selection semantics to within-group baseline construction, add-back, and permutation helpers. * Mirror the fix in the legacy UFO implementations so alternate call paths cannot retain the corruption. * Keep masks and donor indices on the destination tensor device. Test Plan Before: six focused regressions failed across core and within-group paths (`Pass 159, Fail 6`). After: * `buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation` — Pass 178, Fail 0. * Regressions cover `NaN`, `+Inf`, and `-Inf` in selected and inactive positions. * `arc lint -a` on all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged. * `arc lint -a --engine extra --take CITRINEAGENT` on implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601315
craymichael
added a commit
to craymichael/captum
that referenced
this pull request
Sep 15, 2026
Summary: Summary Perturbation paths combined original and replacement values as `old * (1 - mask) + new * mask`. IEEE arithmetic makes `NaN * 0` and `Inf * 0` non-finite, so values outside the selected feature could corrupt model inputs and attributions. Counterexample For input `[1, 2]`, baseline `[0, NaN]`, and mask `[0, 1]`, ablating feature 0 should evaluate `[0, 2]`. Arithmetic masking instead produced `[0, NaN]`, so feature 0 incorrectly received a `NaN` attribution. Fix * Use `torch.where` for Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation. * Apply the same selection semantics to within-group baseline construction, add-back, and permutation helpers. * Mirror the fix in the legacy UFO implementations so alternate call paths cannot retain the corruption. * Keep masks and donor indices on the destination tensor device. Test Plan Before: six focused regressions failed across core and within-group paths (`Pass 159, Fail 6`). After: * `buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation` — Pass 178, Fail 0. * Regressions cover `NaN`, `+Inf`, and `-Inf` in selected and inactive positions. * `arc lint -a` on all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged. * `arc lint -a --engine extra --take CITRINEAGENT` on implementation files — no issues. * `arc pyre check-owning-targets` on changed files — no type errors. Differential Revision: D117601315
craymichael
force-pushed
the
export-D117601315
branch
from
September 15, 2026 21:29
901c490 to
719b153
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary:
Summary
Perturbation paths combined original and replacement values as
old * (1 - mask) + new * mask. IEEE arithmetic makesNaN * 0andInf * 0non-finite, so values outside the selected feature could corrupt model inputs and attributions.Counterexample
For input
[1, 2], baseline[0, NaN], and mask[0, 1], ablating feature 0 should evaluate[0, 2]. Arithmetic masking instead produced[0, NaN], so feature 0 incorrectly received aNaNattribution.Fix
torch.wherefor Feature Ablation, Feature Permutation, Shapley feature updates, and attribution-mask accumulation.Test Plan
Before: six focused regressions failed across core and within-group paths (
Pass 159, Fail 6).After:
buck test fbcode//pytorch/captum/tests/attr:test_feature_ablation fbcode//pytorch/captum/tests/attr:test_feature_permutation fbcode//pytorch/captum/tests/attr:test_shapley fbcode//pytorch/captum/tests/attr/fb:test_within_groups_utils fbcode//pytorch/captum/tests/attr/fb:test_shapley_value_permutation— Pass 178, Fail 0.NaN,+Inf, and-Infin selected and inactive positions.arc lint -aon all changed Python files — no new lint issues; existing legacy UFO line-length advice remains unchanged.arc lint -a --engine extra --take CITRINEAGENTon implementation files — no issues.arc pyre check-owning-targetson changed files — no type errors.Differential Revision: D117601315