Skip to content

Low correlation when using DataInf #256

Open

Description

@Huining-Wang

When using DataInf, the resulting correlation remains consistently low (r < 0.3).
Parameter adjustments do not lead to noticeable improvement. The correlation stays within a similar range after modification.
The slope also deviates from 1.

import argparse

import torch
from torch import nn
from torch.utils.data import DataLoader

from dattri.algorithm.influence_function import IFAttributorDataInf
from dattri.benchmark.load import load_benchmark
from dattri.metric import loo_corr
from dattri.task import AttributionTask

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--device", default="cpu", type=str)
    args = parser.parse_args()

    # download the pre-trained benchmark
    # includes some trained model and ground truth
    model_details, groundtruth = load_benchmark(
        model="lr", dataset="mnist", metric="loo"
    )

    def f(params, data_target_pair):
        image, label = data_target_pair
        loss = nn.CrossEntropyLoss()
        yhat = torch.func.functional_call(model_details["model"], params, image)
        return loss(yhat, label.long())
    
    task = AttributionTask(
        model=model_details["model"].to(args.device), 
        loss_func=f,
        checkpoints=model_details["models_full"][0],  # here we use one full model
        checkpoints_load_func=lambda model, 
        ckpt: (model.load_state_dict(torch.load(ckpt, map_location=args.device)), model)[1],
    )

    attributor = IFAttributorDataInf(
        task=task, device=args.device, 
    )
    attributor.cache(
        DataLoader(
            model_details["train_dataset"],
            batch_size=64,
            sampler=model_details["train_sampler"],
        )
    )

    score = attributor.attribute(
        DataLoader(
            model_details["train_dataset"],
            batch_size=1000,
            sampler=model_details["train_sampler"],
        ),
        DataLoader(
            model_details["test_dataset"],
            batch_size=5000,
            sampler=model_details["test_sampler"],
        ),
    )

    loo_score = loo_corr(score.detach().cpu(), groundtruth)[0]
    print("loo:", torch.mean(torch.as_tensor(loo_score)).item())  

    import matplotlib.pyplot as plt
    import numpy as np

    x = groundtruth[0].detach().cpu().numpy()[:, 0]
    y = score.detach().cpu().numpy()[:, 0]

    a, b = np.polyfit(x, y, 1)
    r = np.corrcoef(x, y)[0, 1]
    
    plt.scatter(x, y, alpha=0.3)
    plt.plot(x, a * x + b)

    plt.xlabel("ground truth")
    plt.ylabel("score")
    plt.title(f"slope={a}, r={r}")
    plt.grid(True)
    plt.show()
Image

Activity

  1. TheaperDeng commented on May 25, 2026

    @TheaperDeng
    Collaborator

    @charles-pyj Could you have a look at this issue when you have time?

  2. charles-pyj commented on Jun 3, 2026

    @charles-pyj
    Collaborator

    @TheaperDeng Yes will take a look soon.
    Theoretically it should be useful for all models using cross entropy as loss, but DataInf was designed for LLMs and there might be some factors hurting the correlation. @Huining-Wang I was wondering if you have results for GPT-2 as well?

  3. self-assigned this
    on Jun 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions