有影响力的示例

DataInfluence

class captum.influence.DataInfluence[source]

一个用于定义模型数据影响骨架的抽象类。

classmethod get_name()[source]

创建可读的类名。由于 TracInCPBase 子类名称的特性,仅返回类名。例如,对于名为 TracInCP 的类,我们返回字符串 TracInCP。

返回:

一个可读的类名

返回类型:

name (str)

abstract influence(inputs=None, **kwargs)[source]
参数:
  • inputs (Any) – 用于计算有影响力实例的样本批次。它们会被传递给 forward_func。如果 inputs 是张量或张量元组,则张量的第一维对应于 batch 维度。

  • **kwargs (Any) – 特定 DataInfluence 抽象类实现所需的附加键值对参数。

返回:

目前我们不对返回类型添加限制,

尽管将来可能会发生变化。

返回类型:

influences (Any)

SimilarityInfluence

class captum.influence.SimilarityInfluence(module, layers, influence_src_dataset, activation_dir, model_id='', similarity_metric=cosine_similarity, similarity_direction='max', batch_size=1, **kwargs)[source]
参数:
  • module (torch.nn.Module) – PyTorch 模型实例。该模型应将其所有层定义为模型的属性。

  • layers (strlist[str]) – 用于计算激活向量的全限定层名称。

  • influence_src_dataset (torch.utils.data.Dataset) – 用于创建 PyTorch Dataloader 以迭代数据集及其标签的 PyTorch 数据集。我们将在此数据集中寻找有影响力的实例。在大多数情况下,这是训练数据集。

  • activation_dir (str) – 存储和检索激活计算结果的目录路径。最佳实践是使用绝对路径。

  • model_id (str) – 正在计算其层激活的模型名称/版本。如果提供,激活将存储和加载到该名称下的子目录中。

  • similarity_metric (Callable) –

    这是一个可调用函数,用于计算两个表示之间的相似度度量。例如,表示对可能分别来自训练集和测试集。

    此函数必须遵守某些标准。输入应为形状为 (batch_size_i/j, 特征维度) 的 torch 张量。输出张量的形状应为 (batch_size_i, batch_size_j),标量值对应于两个批次的每个成对组合所使用的相似度度量。

    例如,假设我们使用 batch_size_1 = 16 遍历 influence_src_dataset,而对于 inputs 参数,我们传入一个包含 3 个示例的张量,即 batch_size_2 = 3。此外,假设我们的输入和整个模型中的中间激活具有维度 (N, C, H, W)。那么,特征维度应在此函数内展平。例如:

    >>> av_test.shape
    torch.Size([3, N, C, H, W])
    >>> av_src.shape
    torch.Size([16, N, C, H, W])
    >>> av_test = torch.view(av_test.shape[0], -1)
    >>> av_test.shape
    torch.Size([3, N x C x H x W])
    

    对于 av_src 也是如此。similarity_metric 应随后使用这些展平的张量返回成对相似度矩阵。例如,similarity_metric(av_test, av_src) 应返回形状为 (3, 16) 的张量。

  • similarity_direction (str) – 指定选择前 k 个相似示例的方向。如果设置为 "max",则选择相似度分数最高的示例(最相似)。如果设置为 "min",则选择相似度分数最低的示例(最不相似/距离最远)。默认值:"max"

  • batch_size (int) – 遍历 influence_src_dataset 的批次大小。

  • **kwargs (Any) – 特定 DataInfluence 抽象类实现所需的附加键值对参数。

influence(inputs, top_k=1, additional_forward_args=None, load_src_from_disk=True, **kwargs)[source]
参数:
  • inputs (Tensortuple[Tensor, ...]) – 计算有影响力实例的示例批次。它们会被传递给 forward_func。inputs 张量或张量元组的第一维对应于批次大小。仅当 module 接受元组形式的输入时,才会传入张量元组。

  • top_k (int) – 要返回的最匹配激活的数量

  • additional_forward_args (Any, 可选) – 在输入之后传递给 forward_func 的其他参数。

  • load_src_from_disk (bool) – 尽可能从磁盘加载 influence_src_dataset 的激活。设置为 False 将强制重新生成激活。

  • load_input_from_disk (bool) – 默认重新生成输入的激活,并删除标记有 inputs_id 的先前 inputs 激活。设置为 True 将加载先前匹配的输入激活。请注意,如果 inputs_id 配置不当且加载了不同、先前的 inputs 激活,这可能会导致意外行为。

  • inputs_id (str) – 用于标识加载激活的输入。

  • **kwargs (Any) – 特定 DataInfluence 抽象类实现所需的附加键值对参数。

返回:

返回从下述位置检索到的有影响力实例:

对于 inputs 中以张量或张量元组表示的每个测试示例,从 influence_src_dataset 检索。返回的有影响力示例表示为字典,其键对应于在 layers 中传递的层名称。字典中的每个值都是一个元组,包含根据所选度量从 influence_src_dataset 获得的前 k 个相似度的索引和值。元组中的第一个值对应于前 k 个最相似示例的索引,第二个值是相似度分数。批次维度对应于 inputs 的批次维度。如果 inputs.shape[0] == 5,则 dict[layer_name][0].shape[0] == 5。这些张量的形状将为 (inputs.shape[0], top_k)。

返回类型:

influences (dict)

TracInCPBase

class captum.influence.TracInCPBase(model, train_dataset, checkpoints, checkpoints_load_func=_load_flexible_state_dict, loss_fn=None, batch_size=1, test_loss_fn=None)[source]

为了实现 influence 方法,继承自 TracInCPBase 的类将分别实现私有的 _self_influence_get_k_most_influential_influence 方法。公开的 influence 方法是这些私有方法的包装器。

参数:
  • model (torch.nn.Module) – PyTorch 模型实例。该模型应将其所有层定义为模型的属性。

  • train_dataset (torch.utils.data.Datasettorch.utils.data.DataLoader) – 在 influence 方法中,我们计算训练样本对测试批次中样本的影响分数。此参数表示包含这些训练样本的训练数据集。为了计算这些影响分数,我们将创建一个产生训练样本批次的 PyTorch DataLoader,然后将其用于处理。如果此参数已经是 PyTorch DataLoader,则可以直接将其用于处理。如果它是 PyTorch Dataset,我们将使用它创建一个 DataLoader,批次大小由 batch_size 指定。为了提高效率,用于处理的 DataLoader 的批次大小应尽可能大,但不要太大,以便从批次创建的某些中间量仍能容纳在内存中。因此,如果 train_dataset 是 Dataset,则 batch_size 应较大。如果 train_dataset 已经是 DataLoader,则它应被构造为具有较大的批次大小。假设 Dataloader(无论是否从 PyTorch Dataset 创建)产生元组。对于产生的一个长度为 Lbatch,假设 model 的前向传播函数接受 L-1 个参数,并且 batch 的最后一个元素是标签。换句话说,model(*batch[:-1]) 给出 model 的输出,而 batch[-1] 是该批次的标签。

  • checkpoints (str, list[str], 或 Iterator) – 存储和检索模型检查点的目录路径、包含要加载检查点文件路径的列表,或者返回要加载检查点对象的迭代器。

  • checkpoints_load_func (Callable, 可选) – 将保存的检查点加载到模型中以更新其参数并获取学习率(如果已保存)的函数。默认使用将模型保存为状态字典(state dict)的加载实用工具。默认值:_load_flexible_state_dict

  • loss_fn (Callable, 可选) – 应用于模型的损失函数。默认值:None

  • batch_size (intNone, 可选) – 如果 train_dataset 是 Dataset,则为创建用于迭代它的 DataLoader 的批次大小。batch_size 应选择尽可能大,以便从批次创建的某些中间量仍能容纳在内存中。TracInCPBase 的具体实现将详述中间量的大小。如果 train_dataset 是 Dataset,则 batch_size 必须是整数。如果 train_dataset 是 DataLoader,则忽略 batch_size 参数。默认值:1

  • test_loss_fn (Callable, 可选) – 在某些情况下,可能希望对训练样本(即 train_dataset 中的样本)和测试样本(即由 influence 方法的 inputstargets 参数表示的样本)使用单独的损失函数。例如,如果想要计算训练样本对测试样本固定类别的预测的影响分数,test_loss_fn 可以将所有类别的 Logits 映射到固定类别的 Logits。test_loss_fn 需要满足与 loss_fn 相同的约束。如果未提供,则假定测试样本的损失函数与训练样本的损失函数相同,即 loss_fn。默认值:None

classmethod get_name()[source]

创建可读的类名。由于 TracInCPBase 子类名称的特性,仅返回类名。例如,对于名为 TracInCP 的类,我们返回字符串 TracInCP。

返回:

一个可读的类名

返回类型:

name (str)

abstract influence(inputs, k=None, proponents=True, unpack_inputs=True, show_progress=False)[source]

这是该类的关键方法,可以在 2 种不同的模式下运行,具体运行哪种模式取决于传递给此方法的参数

  • 影响分数(influence score)模式:如果 k 为 None,则使用此模式。此模式计算训练数据集 train_dataset 中的每个样本对 inputs 表示的测试批次中的每个样本的影响分数。

  • k 个最有影响力(k-most influential)模式:如果 k 不为 None 且为整数,则使用此模式。此模式计算 inputs 表示的测试批次中每个样本的支持者(proponents)或反对者(opponents)。特别地,对于测试批次中的每个测试样本,此模式会计算其支持者(或反对者),即在训练数据集 train_dataset 中对该测试样本具有前 k 个最高(或最低)影响分数的训练样本索引。如果 proponents 为 True,则计算支持者。否则计算反对者。对于每个测试样本,此方法还返回每个支持者(或反对者)对该测试样本的实际影响分数。

参数:
  • inputs (tuple) – inputs 是测试批次,是一个元组,其中最后一个元素假定为批次的标签。也就是说,model(*batch[0:-1]) 生成 model 的输出,而 batch[-1] 是标签(如果有)。这与对训练数据集 train_dataset 产生的每个批次的假设相同——请参阅 __init__ 中的文档以了解批次假设结构的更多细节。

  • k (int, 可选) – 如果未提供或为 None,将运行影响分数模式。否则将运行 k 个最有影响力模式,k 是测试批次中每个样本要返回的支持者/反对者数量。默认值:None

  • proponents (bool, 可选) – 如果在 k 个最有影响力模式下运行,是寻求支持者 (proponents=True) 还是反对者 (proponents=False)。默认值:True

  • unpack_inputs (bool, 可选) – 如果为 True 且 inputs 是元组或列表,则元素被解包为模型的单独位置参数。如果为 False,则 inputs 被包装在一个元组中并作为单个参数传递。默认值:True

  • show_progress (bool, 可选) – 对于所有模式,计算结果都需要进行“训练数据集计算”:对训练数据集 train_dataset 中的每个批次进行计算,这可能需要很长时间。如果 show_progress 为真,将显示“训练数据集计算”的进度。特别地,将显示已执行计算的批次数量。如果 tqdm 可用,它将尝试使用 tqdm 以获得高级功能(如时间估算)。否则,它将退回到简单的进度输出。默认值:False

返回类型:

Union[Tensor, KMostInfluentialResults]

返回:

此方法的返回值取决于运行哪种模式。

  • 影响分数模式:如果运行此模式(k 为 None),返回形状为 (input_size, train_dataset_size) 的二维张量 influence_scores,其中 input_size 是测试批次中的样本数,train_dataset_size 是训练数据集 train_dataset 中的样本数。换句话说,influence_scores[i][j]train_dataset 中的第 j 个样本对测试批次中的第 i 个样本的影响分数。

  • k 个最有影响力模式:如果运行此模式(k 为整数),返回一个名为 (indices, influence_scores) 的 namedtuple。indices 是形状为 (input_size, k) 的二维张量,其中 input_size 是测试批次中的样本数。如果计算支持者(或反对者),indices[i][j] 是训练数据集 train_dataset 中对测试数据集中的第 i 个样本具有第 j 高(或最低)影响分数的样本索引。influence_scores 包含相应的影响分数。具体而言,influence_scores[i][j]train_dataset 中索引为 indices[i][j] 的样本对由 inputs 表示的测试批次中样本 i 的影响分数。

abstract self_influence(inputs=None, show_progress=False)[source]

如果未指定 inputs,则计算训练数据集 train_dataset 的自影响(self influence)分数。否则,计算 inputs 中样本的自影响分数,inputs 可以是单个批次或产生批次的 PyTorch DataLoader。因此在这种情况下,计算的自影响分数 *不是* 针对训练数据集 train_dataset 中的样本。请注意,如果 inputs 是单个批次,这将对该单个批次调用 model;如果 inputs 产生批次,这将对产生的每个批次调用 model。因此,请确保这两种情况下调用 model 的批次不要太大,以免出现内存溢出错误。

参数:
  • inputs (tupleDataLoader, 可选) – 这指定了要计算自影响分数的数据集。可以是单个任意类型的元组,也可以是 DataLoader(其中产生的每个批次都是任意类型的元组)。在任何一种情况下,元组都代表一个批次,其中最后一个元素假定为该批次的标签。也就是说,model(*batch[0:-1]) 生成 model 的输出,而 batch[-1] 是标签(如果有)。这与训练数据集 train_dataset 产生的每个批次的假设相同。请参阅 TracInCP.__init__train_dataset 参数文档,以了解批次结构的更多细节。如果未提供或为 None,将为满足上述假设的训练数据集 train_dataset 计算自影响分数。默认值:None。

  • show_progress (bool, 可选) – 如果 inputs 代表许多样本,自影响分数的计算可能会花费很长时间。如果 show_progress 为真,将显示此计算的进度。更具体地说,此计算将在外层循环中迭代所有检查点(作为 checkpoints 初始化参数提供),并在内层循环中迭代 inputs 代表的所有批次。因此,需要迭代的 (检查点, 批次) 组合总数为 (检查点数量 x inputs 代表的批次数量)。如果 show_progress 为 True,则会显示对外层检查点迭代和内层批次迭代的总进度。如果 tqdm 可用,它将尝试使用它以获得高级功能(如时间估算)。否则,它将退回到简单的进度输出。默认值:False

返回:

这是一个包含下述内容的 1D 张量:

inputs 中所有样本的自影响分数,无论它代表单个批次还是产生批次的 DataLoader

返回类型:

self_influence_scores (Tensor)

TracInCP

class captum.influence.TracInCP(model, train_dataset, checkpoints, checkpoints_load_func=_load_flexible_state_dict, layers=None, loss_fn=None, batch_size=1, test_loss_fn=None, sample_wise_grads_per_batch=False)[source]
参数:
  • model (torch.nn.Module) – PyTorch 模型实例。该模型应将其所有层定义为模型的属性。

  • train_dataset (torch.utils.data.Datasettorch.utils.data.DataLoader) – 在 influence 方法中,我们计算训练样本对测试批次中样本的影响分数。此参数表示包含这些训练样本的训练数据集。为了计算这些影响分数,我们将创建一个产生训练样本批次的 PyTorch DataLoader,然后将其用于处理。如果此参数已经是 PyTorch DataLoader,则可以直接将其用于处理。如果它是 PyTorch Dataset,我们将使用它创建一个 DataLoader,批次大小由 batch_size 指定。为了提高效率,用于处理的 DataLoader 的批次大小应尽可能大,但不要太大,以便从批次创建的某些中间量仍能容纳在内存中。因此,如果 train_dataset 是 Dataset,则 batch_size 应较大。如果 train_dataset 已经是 DataLoader,则它应被构造为具有较大的批次大小。假设 Dataloader(无论是否从 PyTorch Dataset 创建)产生元组。对于产生的一个长度为 Lbatch,假设 model 的前向传播函数接受 L-1 个参数,并且 batch 的最后一个元素是标签。换句话说,model(*batch[:-1]) 给出 model 的输出,而 batch[-1] 是该批次的标签。

  • checkpoints (str, list[str], 或 Iterator) – 存储和检索模型检查点的目录路径、包含要加载检查点文件路径的列表,或者返回要加载检查点对象的迭代器。

  • checkpoints_load_func (Callable, 可选) – 将保存的检查点加载到模型中以更新其参数并获取学习率(如果已保存)的函数。默认使用将模型保存为状态字典(state dict)的加载实用工具。默认值:_load_flexible_state_dict

  • layers (list[str] 或 None, 可选) – 应为其计算梯度的层名称列表。如果 layers 为 None,则将为所有层计算梯度。否则,仅为 layers 中指定的层计算梯度。默认值:None

  • loss_fn (Callable, 可选) – 应用于模型的损失函数。loss_fn 的返回类型有两个选项。首先,loss_fn 可以是“逐样本”损失函数——为批次中的每个样本返回损失的 1D 张量。nn.BCELoss(reduction="none") 就是一种“逐样本”损失函数。其次,loss_fn 可以是“归约”损失函数,它对批次中的逐样本损失进行归约并返回单个标量张量。对于此选项,归约必须是逐样本损失的 *总和(sum)* 或 *平均值(mean)*。例如,nn.BCELoss(reduction="sum") 是可以接受的。请注意,对于第一个选项,sample_wise_grads_per_batch 参数必须为 False;对于第二个选项,sample_wise_grads_per_batch 必须为 True。还要注意,对于第二个选项,如果 loss_fn 没有 "reduction" 属性,实现将假定归约为逐样本损失的 *总和*。如果情况并非如此(即归约为 *平均值*),请将 loss_fn 的 "reduction" 属性设置为 "mean",即 loss_fn.reduction = "mean"。默认值:None

  • batch_size (intNone, 可选) – 如果 train_dataset 是 Dataset,则为创建用于迭代它的 DataLoader 的批次大小。batch_size 应选择尽可能大,以便从批次创建的某些中间量仍能容纳在内存中。TracInCPBase 的具体实现将详述中间量的大小。如果 train_dataset 是 Dataset,则 batch_size 必须是整数。如果 train_dataset 是 DataLoader,则忽略 batch_size 参数。默认值:1

  • test_loss_fn (Callable, 可选) – 在某些情况下,可能希望对训练样本(即 train_dataset 中的样本)和测试样本(即由 influence 方法的 inputstargets 参数表示的样本)使用单独的损失函数。例如,如果想要计算训练样本对测试样本固定类别的预测的影响分数,test_loss_fn 可以将所有类别的 Logits 映射到固定类别的 Logits。test_loss_fn 需要满足与 loss_fn 相同的约束。因此,如果提供了 test_loss_fn,我们对 loss_fn 应用的检查也会应用于 test_loss_fn。请注意,对 loss_fntest_loss_fn 的约束都取决于 sample_wise_grads_per_batch。这意味着 loss_fntest_loss_fn 必须同为“逐样本”损失函数,或同为“归约”损失函数。如果未提供,则假定测试样本的损失函数与训练样本的损失函数相同,即 loss_fn。默认值:None

  • sample_wise_grads_per_batch (bool, 可选) – PyTorch 原生的模型参数梯度计算会聚合批次结果,不允许访问模型参数的逐样本梯度。如果我们想要逐样本梯度,这会迫使我们迭代批次中的每个样本,这在计算上是低效的。我们提供了一种相对于模型参数的批次梯度计算实现,其计算效率更高。可以通过将 sample_wise_grad_per_batch 参数设置为 True 来启用此实现,并且仅当 loss_fn 参数为“归约”损失函数时才应启用。例如,如果启用了此实现,nn.BCELoss(reduction="sum") 将是一个有效的 loss_fn(有关更多详细信息,请参见 loss_fn 的文档)。请注意,我们当前的实现仅针对有限数量的 PyTorch nn.Modules 启用批次梯度计算:Conv2D 和 Linear。此列表将在不久的将来扩大。因此,如果将为其他类型的层计算梯度,请不要启用此实现。默认值:False

compute_intermediate_quantities(inputs, aggregate=False)[source]

为单个批次或产生批次的 Dataloader 中的所有样本计算“嵌入(embedding)”向量。这些嵌入向量的构造使得训练样本对测试样本的影响分数仅仅是它们对应向量的点积。允许传入产生批次的 DataLoader(而不是单个批次)有可能提高效率,因为在此方法调用中我们只需加载每个检查点一次。因此,如果传入产生批次的 DataLoader,与传入单个批次相比,这将减少数据集加载每个检查点的总次数。我们不只是增加批次大小的原因是,对于大型模型,大批次无法容纳在内存中。

如果 aggregate 为 True,则返回所有样本向量的 *总和*,而不是每个样本的向量。这对于计算给定训练样本对验证数据集上总损失的影响非常有用,因为由于点积的性质,这种影响是训练样本向量与验证数据集中向量总和的点积。此外,通过在此方法内部(而不是外部,即先计算验证数据集的所有向量再求和)执行求和聚合,可以减少内存使用。

参数:
  • inputs (Tuple 或 DataLoader) – 单个任意类型的元组,或产生元组批次的 DataLoader。无论哪种情况,元组都代表一个批次,其中最后一个元素假定为该批次的标签。也就是说,model(*batch[0:-1]) 生成 model 的输出,而 batch[-1] 是标签(如果有)。这里的 model 是初始化时提供的模型。这与训练数据集 train_dataset 产生的每个批次的假设相同。

  • aggregate (bool) – 是否返回所有样本向量的总和,而不是每个样本的向量。

返回:

形状如下的张量:

(N, D * C)。这里,如果 aggregate 为 False,N 是 inputs 中的样本总数,否则 N 为 1(因此始终返回 2D 张量)。C 是作为 TracInCP.__init__checkpoints 参数传递的检查点数量,每一行代表一个样本的向量。关于 D:设 I 为最后一个全连接层输出维度乘以最后一个全连接层输入维度。如果在初始化中指定了 self.projection_dim,则 D = min(I * C, self.projection_dim * C)。否则 D = I * C。总之,如果 self.projection_dim 为 None,则每个向量的维度将由 model 最后一个全连接层的输入和输出大小决定。否则,self.projection_dim 必须是整数,并且将执行随机投影以确保向量维度不超过 self.projection_dim * C。self.projection_dim 对应于 TracIn 论文第 15 页顶部的变量 d:https://arxiv.org/pdf/2002.08484.pdf

返回类型:

intermediate_quantities (Tensor)

influence(inputs, k=None, proponents=True, show_progress=False, aggregate=False)[source]

这是该类的关键方法,可以在 2 种不同的模式下运行,具体取决于传递给此方法的参数。下面我们将描述当 aggregate 为 False 时的 2 种模式

  • 影响分数模式:如果 k 为 None,则使用此模式。此模式计算训练数据集 train_dataset 中的每个样本对由 inputs 表示的测试数据集中的每个样本的影响分数。

  • k 个最有影响力模式:如果 k 不为 None 且为整数,则使用此模式。此模式计算由 inputs 表示的测试数据集中每个样本的支持者或反对者。特别地,对于测试数据集中的每个测试样本,此模式会计算其支持者(或反对者),即在训练数据集 train_dataset 中对该测试样本具有前 k 个最高(或最低)影响分数的训练样本索引。如果 proponents 为 True,则计算支持者。否则计算反对者。对于每个测试样本,此方法还返回每个支持者(或反对者)对该测试样本的实际影响分数。

aggregate 为 True 时,此方法计算“聚合”影响分数,对于给定的训练样本,该分数是其在测试数据集中所有样本上的影响分数之 *和*。下面我们描述当 aggregate 为 True 时的 2 种模式

  • 影响分数模式:如果 k 为 None,则使用此模式。此模式计算训练数据集 train_dataset 中每个样本在测试数据集上的聚合影响分数。

  • k 个最有影响力模式:如果 k 不为 None 且为整数,则使用此模式。此模式计算“聚合”支持者(或反对者),即在训练数据集 train_dataset 中对测试数据集具有前 k 个最高(或最低)聚合影响分数的样本索引。如果 proponents 为 True,则计算支持者。否则计算反对者。此方法还返回每个支持者(或反对者)在测试数据集上的实际聚合影响分数。

参数:
  • inputs (Tuple 或 DataLoader) – 单个任意类型的元组,或产生元组批次的 DataLoader。无论哪种情况,元组都代表一个批次,其中最后一个元素假定为该批次的标签。也就是说,model(*batch[0:-1]) 生成 model 的输出,而 batch[-1] 是标签(如果有)。这里的 model 是初始化时提供的模型。这与训练数据集 train_dataset 产生的每个批次的假设相同。请参阅 TracInCPFastRandProj.__init__train_dataset 参数文档,以了解批次结构的更多细节。

  • k (int, 可选) – 如果未提供或为 None,将运行影响分数模式。否则将运行 k 个最有影响力模式,k 是测试批次中每个样本要返回的支持者/反对者数量。默认值:None

  • proponents (bool, 可选) – 如果在 k 个最有影响力模式下运行,是寻求支持者 (proponents=True) 还是反对者 (proponents=False)。默认值:True

  • show_progress (bool, 可选) – 对于所有模式,计算结果都需要进行“训练数据集计算”:对训练数据集 train_dataset 中的每个批次进行计算,这可能需要很长时间。如果 show_progress 为真,将显示“训练数据集计算”的进度。特别地,将显示已执行计算的批次数量。如果 tqdm 可用,它将尝试使用 tqdm 以获得高级功能(如时间估算)。否则,它将退回到简单的进度输出。默认值:False

  • aggregate (bool, 可选) – 如果为 True,则根据模式返回测试数据集上的“聚合”影响分数,或具有最高/最低聚合影响分数的样本。

返回类型:

Union[Tensor, KMostInfluentialResults]

返回:

此方法的返回值取决于运行哪种模式,以及 aggregate 为 True 还是 False。

下面是当 aggregate 为 False 时两种模式的返回值

  • 影响分数模式:如果运行此模式(k 为 None),返回形状为 (input_size, train_dataset_size) 的二维张量 influence_scores,其中 input_size 是测试数据集中的样本数,train_dataset_size 是训练数据集 train_dataset 中的样本数。换句话说,influence_scores[i][j]train_dataset 中的第 j 个样本对测试数据集中的第 i 个样本的影响分数。

  • k 个最有影响力模式:如果运行此模式(k 为整数),返回一个名为 (indices, influence_scores) 的 namedtuple。indices 是形状为 (input_size, k) 的二维张量,其中 input_size 是测试数据集中的样本数。如果计算支持者(或反对者),indices[i][j] 是训练数据集 train_dataset 中对测试数据集中的第 i 个样本具有第 j 高(或最低)影响分数的样本索引。influence_scores 包含相应的影响分数。具体而言,influence_scores[i][j]train_dataset 中索引为 indices[i][j] 的样本对由 inputs 表示的测试数据集中样本 i 的影响分数。

下面是当 aggregate 为 True 时两种模式的返回值

  • 影响分数模式:如果运行此模式(k 为 None),返回形状为 (1, train_dataset_size) 的二维张量 influence_scores,其中 influence_scores[0][j]train_dataset 中第 j 个样本在测试数据集上的聚合影响分数。

  • k 个最有影响力模式:如果运行此模式(k 为整数),返回一个名为 (indices, influence_scores) 的 namedtuple。indices 是形状为 (1, k) 的二维张量。如果计算支持者(或反对者),indices[0][j] 是训练数据集 train_dataset 中对测试数据集具有第 j 高(或最低)聚合影响分数的样本索引。influence_scores 包含相应的聚合影响分数。具体而言,influence_scores[0][j] 是样本 indices[0][j] 在测试数据集上的聚合影响分数。

self_influence(inputs=None, show_progress=False, outer_loop_by_checkpoints=False)[source]

计算 inputs 中样本的自影响分数,inputs 可以是单个批次或产生批次的 PyTorch DataLoader。如果未指定 inputs 或其为 None,则计算训练数据集 train_dataset 的自影响分数。请注意,如果 inputs 是单个批次,这将对该单个批次调用 model;如果 inputs 产生批次,这将对产生的每个批次调用 model。因此,请确保这两种情况下调用 model 的批次不要太大,以免出现内存溢出错误。在内部,此计算需要迭代 inputs 中的批次以及不同的模型检查点。这种迭代可以通过两种方式完成。如果 outer_loop_by_checkpoints 为 False,则外层迭代将针对批次,内层迭代将针对检查点。这样做的好处是显示计算进度更直观,可以显示已计算自影响分数的批次数量。如果 outer_loop_by_checkpoints 为 True,则外层迭代将针对检查点,内层迭代将针对批次。这样做的好处是对于每个批次都不需要重新加载检查点。对于大型模型,加载检查点可能非常耗时。

参数:
  • inputs (tupleDataLoader, 可选) – 这指定了要计算自影响分数的数据集。可以是单个任意类型的元组,也可以是 DataLoader(其中产生的每个批次都是任意类型的元组)。在任何一种情况下,元组都代表一个批次,其中最后一个元素假定为该批次的标签。也就是说,model(*batch[0:-1]) 生成 model 的输出,而 batch[-1] 是标签(如果有)。这与训练数据集 train_dataset 产生的每个批次的假设相同。请参阅 TracInCP.__init__train_dataset 参数文档,以了解批次结构的更多细节。如果未提供或为 None,将为满足上述假设的训练数据集 train_dataset 计算自影响分数。默认值:None。

  • show_progress (bool, 可选) – 如果 inputs 代表许多样本,自影响分数的计算可能会花费很长时间。如果 show_progress 为真,将显示此计算的进度。更具体地说,如果 outer_loop_by_checkpoints 为 False,此计算将在外层循环中迭代所有批次。因此,如果 show_progress 为 True,将显示已计算自影响分数的批次数量。如果 outer_loop_by_checkpoints 为 True,此计算将在外层循环中迭代所有检查点(作为 checkpoints 初始化参数提供),并在内层循环中迭代 inputs 代表的所有批次。因此,如果 show_progress 为 True,将显示外层检查点迭代和内层批次迭代的进度。为了显示进度,如果 tqdm 可用,它将尝试使用它以获得高级功能(如时间估算)。否则,它将退回到简单的进度输出。默认值:False

  • outer_loop_by_checkpoints (bool, 可选) – 是否对外层检查点执行迭代;详情请参见方法说明。默认值:False

返回类型:

张量 (Tensor)

test_reduction_type: str

是在完成后恢复模型状态(必须在 influence 内部放置功能以便在每次 influence 调用后恢复)?还是制作一个副本,以便在使用 TracIn 后对 grad_requires 的更改不会持久化。

类型:

TODO

TracInCPFast

class captum.influence.TracInCPFast(model, final_fc_layer, train_dataset, checkpoints, checkpoints_load_func=_load_flexible_state_dict, loss_fn=None, batch_size=1, test_loss_fn=None, vectorize=False)[source]

在 TracIn 论文的附录 F 第 14 页中,作者表明在仅考虑最后一个全连接层梯度的特殊情况下,测试样本 x' 和训练样本 x 之间影响分数的计算可以比朴素反向传播快得多。此类计算该特殊情况下的影响分数。请注意,计算出的影响分数与使用朴素反向传播时完全相同——精度没有损失。

关于影响分数计算的更多细节:对于训练样本,令 :math`x` 和 :math`nabla_y f(y)` 分别为最后一个全连接层的输入和输出梯度。同样,令 :math`x'` 和 :math`nabla_{y'} f(y')` 为测试样本的对应量。那么,训练样本对测试样本的影响分数是每个检查点贡献的总和。给定检查点的贡献为 :math`(x^T x')(nabla_y f(y)^T nabla_{y'} f(y'))`。

参数:
  • model (torch.nn.Module) – PyTorch 模型实例。该模型应将其所有层定义为模型的属性。

  • final_fc_layer (torch.nn.Module) – 网络中最后一个全连接层,其梯度将通过快速随机投影方法进行近似。

  • train_dataset (torch.utils.data.Datasettorch.utils.data.DataLoader) – 在 influence 方法中,我们计算训练样本对测试批次中样本的影响分数。此参数表示包含这些训练样本的训练数据集。为了计算这些影响分数,我们将创建一个产生训练样本批次的 PyTorch DataLoader,然后将其用于处理。如果此参数已经是 PyTorch DataLoader,则可以直接将其用于处理。如果它是 PyTorch Dataset,我们将使用它创建一个 DataLoader,批次大小由 batch_size 指定。为了提高效率,用于处理的 DataLoader 的批次大小应尽可能大,但不要太大,以便从批次创建的某些中间量仍能容纳在内存中。因此,如果 train_dataset 是 Dataset,则 batch_size 应较大。如果 train_dataset 已经是 DataLoader,则它应被构造为具有较大的批次大小。假设 Dataloader(无论是否从 PyTorch Dataset 创建)产生元组。对于产生的一个长度为 Lbatch,假设 model 的前向传播函数接受 L-1 个参数,并且 batch 的最后一个元素是标签。换句话说,model(*batch[:-1]) 给出 model 的输出,而 batch[-1] 是该批次的标签。

  • checkpoints (str, list[str], 或 Iterator) – 存储和检索模型检查点的目录路径、包含要加载检查点文件路径的列表,或者返回要加载检查点对象的迭代器。

  • checkpoints_load_func (Callable, 可选) – 将保存的检查点加载到模型中以更新其参数并获取学习率(如果已保存)的函数。默认使用将模型保存为状态字典(state dict)的加载实用工具。默认值:_load_flexible_state_dict

  • loss_fn (Callable, 可选) – 应用于模型的损失函数。loss_fn 必须是一个“归约”损失函数,它对批次中的逐样本损失进行归约,并返回单个标量张量。此外,归约必须是逐样本损失的 *总和* 或 *平均值*。例如,nn.BCELoss(reduction="sum") 是可以接受的。还要注意,如果 loss_fn 没有 "reduction" 属性,实现将假定归约为逐样本损失的 *总和*。如果情况并非如此(即归约为 *平均值*),请将 loss_fn 的 "reduction" 属性设置为 "mean",即 loss_fn.reduction = "mean"。默认值:None

  • batch_size (intNone, 可选) – 如果 train_dataset 是 Dataset,则为创建用于迭代它的 DataLoader 的批次大小。batch_size 应选择尽可能大,以便从批次创建的某些中间量仍能容纳在内存中。TracInCPBase 的具体实现将详述中间量的大小。如果 train_dataset 是 Dataset,则 batch_size 必须是整数。如果 train_dataset 是 DataLoader,则忽略 batch_size 参数。默认值:1

  • test_loss_fn (Callable, 可选) – 在某些情况下,可能希望对训练样本(即 train_dataset 中的样本)和测试样本(即由 influence 方法的 inputstargets 参数表示的样本)使用单独的损失函数。例如,如果想要计算训练样本对测试样本固定类别的预测的影响分数,test_loss_fn 可以将所有类别的 Logits 映射到固定类别的 Logits。test_loss_fn 需要满足与 loss_fn 相同的约束。因此,如果提供了 test_loss_fn,我们对 loss_fn 应用的检查也会应用于 test_loss_fn。如果未提供,则假定测试样本的损失函数与训练样本的损失函数相同,即 loss_fn。默认值:None

  • vectorize (bool, 可选) – 是否对 torch.autograd.functional.jacobian 使用实验性的向量化(vectorize)功能。默认值:False

influence(inputs, k=1, proponents=True, show_progress=False)[source]

这是该类的关键方法,可以在 2 种不同的模式下运行,具体运行哪种模式取决于传递给此方法的参数

  • 影响分数(influence score)模式:如果 k 为 None,则使用此模式。此模式计算训练数据集 train_dataset 中的每个样本对 inputs 表示的测试批次中的每个样本的影响分数。

  • k 个最有影响力(k-most influential)模式:如果 k 不为 None 且为整数,则使用此模式。此模式计算 inputs 表示的测试批次中每个样本的支持者(proponents)或反对者(opponents)。特别地,对于测试批次中的每个测试样本,此模式会计算其支持者(或反对者),即在训练数据集 train_dataset 中对该测试样本具有前 k 个最高(或最低)影响分数的训练样本索引。如果 proponents 为 True,则计算支持者。否则计算反对者。对于每个测试样本,此方法还返回每个支持者(或反对者)对该测试样本的实际影响分数。

参数:
  • inputs (tupleDataLoader) – inputs 是测试批次,是一个元组,其中最后一个元素假定为该批次的标签。也就是说,model(*batch[0:-1]) 生成 model 的输出,而 batch[-1] 是标签(如果有)。这与对训练数据集 train_dataset 产生的每个批次的假设相同——请参阅 __init__ 中的文档以了解批次结构的更多细节。

  • k (int, 可选) – 如果未提供或为 None,将运行影响分数模式。否则将运行 k 个最有影响力模式,k 是测试批次中每个样本要返回的支持者/反对者数量。默认值:None

  • proponents (bool, 可选) – 如果在 k 个最有影响力模式下运行,是寻求支持者 (proponents=True) 还是反对者 (proponents=False)。默认值:True

  • show_progress (bool, 可选) – 对于所有模式,计算结果都需要进行“训练数据集计算”:对训练数据集 train_dataset 中的每个批次进行计算,这可能需要很长时间。如果 show_progress 为真,将显示“训练数据集计算”的进度。特别地,将显示已执行计算的批次数量。如果 tqdm 可用,它将尝试使用 tqdm 以获得高级功能(如时间估算)。否则,它将退回到简单的进度输出。默认值:False

返回类型:

Union[Tensor, KMostInfluentialResults]

返回:

此方法的返回值取决于运行哪种模式。

  • 影响分数模式:如果运行此模式(k 为 None),返回形状为 (input_size, train_dataset_size) 的二维张量 influence_scores,其中 input_size 是测试批次中的样本数,train_dataset_size 是训练数据集 train_dataset 中的样本数。换句话说,influence_scores[i][j]train_dataset 中的第 j 个样本对测试批次中的第 i 个样本的影响分数。

  • k 个最有影响力模式:如果运行此模式(k 为整数),返回一个名为 (indices, influence_scores) 的 namedtuple。indices 是形状为 (input_size, k) 的二维张量,其中 input_size 是测试批次中的样本数。如果计算支持者(或反对者),indices[i][j] 是训练数据集 train_dataset 中对测试批次中的第 i 个样本具有第 j 高(或最低)影响分数的样本索引。influence_scores 包含相应的影响分数。具体而言,influence_scores[i][j]train_dataset 中索引为 indices[i][j] 的样本对由 inputs 表示的测试批次中样本 i 的影响分数。

self_influence(inputs=None, show_progress=False, outer_loop_by_checkpoints=False)[source]

计算 inputs 中样本的自影响分数,inputs 可以是单个批次或产生批次的 PyTorch DataLoader。如果未指定 inputs 或其为 None,则计算训练数据集 train_dataset 的自影响分数。请注意,如果 inputs 是单个批次,这将对该单个批次调用 model;如果 inputs 产生批次,这将对产生的每个批次调用 model。因此,请确保这两种情况下调用 model 的批次不要太大,以免出现内存溢出错误。在内部,此计算需要迭代 inputs 中的批次以及不同的模型检查点。这种迭代可以通过两种方式完成。如果 outer_loop_by_checkpoints 为 False,则外层迭代将针对批次,内层迭代将针对检查点。这样做的好处是显示计算进度更直观,可以显示已计算自影响分数的批次数量。如果 outer_loop_by_checkpoints 为 True,则外层迭代将针对检查点,内层迭代将针对批次。这样做的好处是对于每个批次都不需要重新加载检查点。对于大型模型,加载检查点可能非常耗时。

参数:
  • inputs (tupleDataLoader, 可选) – 这指定了要计算自影响分数的数据集。可以是单个任意类型的元组,也可以是 DataLoader(其中产生的每个批次都是任意类型的元组)。在任何一种情况下,元组都代表一个批次,其中最后一个元素假定为该批次的标签。也就是说,model(*batch[0:-1]) 生成 model 的输出,而 batch[-1] 是标签(如果有)。这与训练数据集 train_dataset 产生的每个批次的假设相同。请参阅 TracInCP.__init__train_dataset 参数文档,以了解批次结构的更多细节。如果未提供或为 None,将为满足上述假设的训练数据集 train_dataset 计算自影响分数。默认值:None。

  • show_progress (bool, 可选) – 如果 inputs 代表许多样本,自影响分数的计算可能会花费很长时间。如果 show_progress 为真,将显示此计算的进度。更具体地说,如果 outer_loop_by_checkpoints 为 False,此计算将在外层循环中迭代所有批次。因此,如果 show_progress 为 True,将显示已计算自影响分数的批次数量。如果 outer_loop_by_checkpoints 为 True,此计算将在外层循环中迭代所有检查点(作为 checkpoints 初始化参数提供),并在内层循环中迭代 inputs 代表的所有批次。因此,如果 show_progress 为 True,将显示外层检查点迭代和内层批次迭代的进度。为了显示进度,如果 tqdm 可用,它将尝试使用它以获得高级功能(如时间估算)。否则,它将退回到简单的进度输出。默认值:False

  • outer_loop_by_checkpoints (bool, 可选) – 是否对外层检查点执行迭代;详情请参见方法说明。默认值:False

返回类型:

张量 (Tensor)

TracInCPFastRandProj

class captum.influence.TracInCPFastRandProj(model, final_fc_layer, train_dataset, checkpoints, checkpoints_load_func=_load_flexible_state_dict, loss_fn=None, batch_size=1, test_loss_fn=None, vectorize=False, nearest_neighbors=None, projection_dim=None, seed=0)[source]

TracInCPFast 的一个版本,针对“交互式”调用 influence 以计算支持者/反对者或影响分数进行了优化。“交互式”意味着会有多次 influence 调用,每次调用针对不同的测试样本批次,且后续调用依赖于先前调用的结果。此类的实现经过优化,使得每次对 influence 的调用都很快,从而可用于交互式分析。此类仅应用于交互式用例。如果 influence 仅被调用一次,则不应使用此类,因为为了实现快速调用 influence,在 __init__ 中需要进行耗费时间和内存的预处理。此外,它不应用于计算自影响分数——应改用 TracInCPFast。为了实现交互式分析,此实现为 train_dataset 中的所有训练样本计算并保存“嵌入”向量。关键点在于,训练样本对测试样本的影响分数仅仅是它们对应向量的点积,并且可以通过先将训练样本向量存储在最近邻数据结构中,然后根据点积寻找测试样本的最近邻来找到支持者/反对者(参见 TracIn 论文的附录 F)。仅当以“交互式”方式调用 influence 以获取支持者/反对者或影响分数,并且有足够的内存存储整个 train_dataset 的向量时,才应使用此类。这是因为为了实现交互式分析,此实现会在 __init__ 中产生开销以建立最近邻数据结构,这既耗费时间又耗费内存,因为需要存储所有训练样本对应的向量。为了减少内存使用,此实现支持这些向量的随机投影。请注意,使用随机投影计算出的影响分数虽然在期望上是正确的,但准确度会降低。

关于“嵌入”向量的更多细节——在仅考虑最后一个全连接层的梯度时,训练样本对测试样本的影响是每个检查点贡献的总和。使用 TracInCPFast 描述中的符号,给定检查点的贡献为 :math`(x^T x')(nabla_y f(y)^T nabla_{y'} f(y'))`。照此看来,这不是两个向量的点积。然而,我们可以将该贡献重写为 :math`(x nabla_y f(y)^T) dot (x' f(y')^T)`。该乘积中的两项都是 2D 矩阵,因为它们是外积,而这里的“乘积”实际上是点积,将两个矩阵都视为向量。因此,对于给定的检查点,它对样本“嵌入”的贡献就是外积 :math`(x nabla_y f(y)^T)` 的展平。此外,为了降低该贡献的维度,我们可以用两个独立的投影矩阵对该外积进行右乘和左乘。这些矩阵将 :math`nabla_y f(y)` 和 :math`x` 转换为低维向量。虽然这两个低维向量的维度不一定相同,但在我们的实现中,我们让它们相同,均等于所需投影维度的平方根。最后,一个样本的嵌入是来自每个检查点的贡献的串联。

参数:
  • model (torch.nn.Module) – PyTorch 模型实例。该模型应将其所有层定义为模型的属性。

  • final_fc_layer (torch.nn.Module) – 网络中最后一个全连接层,其梯度将通过快速随机投影方法进行近似。

  • train_dataset (torch.utils.data.Datasettorch.utils.data.DataLoader) – 在 influence 方法中,我们计算训练样本对测试批次中样本的影响分数。此参数表示包含这些训练样本的训练数据集。为了计算这些影响分数,我们将创建一个产生训练样本批次的 PyTorch DataLoader,然后将其用于处理。如果此参数已经是 PyTorch DataLoader,则可以直接将其用于处理。如果它是 PyTorch Dataset,我们将使用它创建一个 DataLoader,批次大小由 batch_size 指定。为了提高效率,用于处理的 DataLoader 的批次大小应尽可能大,但不要太大,以便从批次创建的某些中间量仍能容纳在内存中。因此,如果 train_dataset 是 Dataset,则 batch_size 应较大。如果 train_dataset 已经是 DataLoader,则它应被构造为具有较大的批次大小。假设 Dataloader(无论是否从 PyTorch Dataset 创建)产生元组。对于产生的一个长度为 Lbatch,假设 model 的前向传播函数接受 L-1 个参数,并且 batch 的最后一个元素是标签。换句话说,model(*batch[:-1]) 给出 model 的输出,而 batch[-1] 是该批次的标签。

  • checkpoints (str, list[str], 或 Iterator) – 存储和检索模型检查点的目录路径、包含要加载检查点文件路径的列表,或者返回要加载检查点对象的迭代器。

  • checkpoints_load_func (Callable, 可选) – 将保存的检查点加载到模型中以更新其参数并获取学习率(如果已保存)的函数。默认使用将模型保存为状态字典(state dict)的加载实用工具。默认值:_load_flexible_state_dict

  • loss_fn (Callable, 可选) – 应用于模型的损失函数。loss_fn 必须是一个“归约”损失函数,它对批次中的逐样本损失进行归约,并返回单个标量张量。此外,归约必须是逐样本损失的 *总和*。例如,nn.BCELoss(reduction="sum") 是可以接受的,但 nn.BCELoss(reduction="mean") 是 *不可* 接受的。默认值:None

  • batch_size (intNone, 可选) – 如果 train_dataset 是 Dataset,则为创建用于迭代它的 DataLoader 的批次大小。batch_size 应选择尽可能大,以便从批次创建的某些中间量仍能容纳在内存中。TracInCPBase 的具体实现将详述中间量的大小。如果 train_dataset 是 Dataset,则 batch_size 必须是整数。如果 train_dataset 是 DataLoader,则忽略 batch_size 参数。默认值:1

  • test_loss_fn (Callable, 可选) – 在某些情况下,可能希望对训练样本(即 train_dataset 中的样本)和测试样本(即由 influence 方法的 inputstargets 参数表示的样本)使用单独的损失函数。例如,如果想要计算训练样本对测试样本固定类别的预测的影响分数,test_loss_fn 可以将所有类别的 Logits 映射到固定类别的 Logits。test_loss_fn 需要满足与 loss_fn 相同的约束。因此,如果提供了 test_loss_fn,我们对 loss_fn 应用的检查也会应用于 test_loss_fn。如果未提供,则假定测试样本的损失函数与训练样本的损失函数相同,即 loss_fn

  • vectorize (bool) – 是否对 torch.autograd.functional.jacobian 使用实验性的向量化功能。默认值:False

  • nearest_neighbors (NearestNeighbors, 可选) – 用于查找最近邻的 NearestNeighbors 实例。如果为 None,则默认为 AnnoyNearestNeighbors(n_trees=10)。默认值:None

  • projection_dim (int, 可选) – 每个样本将在最近邻数据结构中用一个向量表示。该向量是多个“检查点向量”的级联,每个检查点向量使用 checkpoints 参数中不同的检查点计算得出。如果 projection_dim 是一个整数,它代表我们将每个“检查点向量”投影到的维度,因此每个样本的向量维度至多为 projection_dim * C,其中 C 是检查点的数量。关于每个向量的维度 D:设 I 为最后一个全连接层的输出维度乘以最后一个全连接层的输入维度。如果 projection_dim 不为 None,则 D = min(I * C, projection_dim * C)。否则,D = I * C。综上所述,如果 projection_dim 为 None,则该向量的维度将由 model 最后一个全连接层的输入和输出大小以及检查点数量决定。否则,projection_dim 必须是一个整数,并且将执行随机投影以确保向量维度不超过 projection_dim * C。projection_dim 对应于 TracIn 论文第 15 页顶部的变量 d:https://arxiv.org/abs/2002.08484。默认值:None

  • seed (int, 可选) – 由于此实现选择了随机投影,其输出具有随机性。设置此种子可指定选择随机投影时的随机种子。默认值:0

compute_intermediate_quantities(inputs)[源代码]

计算单个批次或产生批次的 Dataloader 中所有样本的“嵌入”向量。这些嵌入向量的构建方式使得训练样本对测试样本的影响分数仅为它们对应向量的点积。更多详情请参阅 TracInCPFastRandProj.__init__ 的文档。允许传入产生批次的 DataLoader(而非单个批次)有可能提高效率,因为在此方法调用中,我们对每个检查点仅加载一次。因此,如果传入产生批次的 DataLoader,与传入单个批次相比,这将减少数据集中每个检查点被加载的总次数。我们不直接增加批次大小的原因是,对于大型模型,大批次无法放入内存中。

参数:

inputs (Tuple 或 DataLoader) – 单个任意类型的元组,或产生元组批次的 DataLoader。无论哪种情况,元组都代表一个批次,其中最后一个元素假定为该批次的标签。也就是说,model(*batch[0:-1]) 生成 model 的输出,而 batch[-1] 是标签(如果有)。这里的 model 是初始化时提供的模型。这与训练数据集 train_dataset 产生的每个批次的假设相同。请参阅 TracInCPFastRandProj.__init__train_dataset 参数文档,以了解批次结构的更多细节。

返回:

形状如下的张量:

(N, D * C),其中 N 是 inputs 中的总样本数,C 是作为 TracInCPFastRandProj.__init__checkpoints 参数传入的检查点数量,每一行代表一个样本的向量。关于 D:设 I 为最后一个全连接层的输出维度乘以最后一个全连接层的输入维度。如果在初始化中指定了 self.projection_dim,则 D = min(I * C, self.projection_dim * C)。否则,D = I * C。综上所述,如果 self.projection_dim 为 None,则每个向量的维度将由 model 最后一个全连接层的输入和输出大小决定。否则,self.projection_dim 必须是一个整数,并且将执行随机投影以确保向量维度不超过 self.projection_dim * C。self.projection_dim 对应于 TracIn 论文第 15 页顶部的变量 d:https://arxiv.org/pdf/2002.08484.pdf

返回类型:

intermediate_quantities (Tensor)

influence(inputs=None, k=5, proponents=True)[源代码]

这是该类的关键方法,可以在 2 种不同的模式下运行,具体运行哪种模式取决于传递给此方法的参数

  • 影响分数(influence score)模式:如果 k 为 None,则使用此模式。此模式计算训练数据集 train_dataset 中的每个样本对 inputs 表示的测试批次中的每个样本的影响分数。

  • k 个最有影响力(k-most influential)模式:如果 k 不为 None 且为整数,则使用此模式。此模式计算 inputs 表示的测试批次中每个样本的支持者(proponents)或反对者(opponents)。特别地,对于测试批次中的每个测试样本,此模式会计算其支持者(或反对者),即在训练数据集 train_dataset 中对该测试样本具有前 k 个最高(或最低)影响分数的训练样本索引。如果 proponents 为 True,则计算支持者。否则计算反对者。对于每个测试样本,此方法还返回每个支持者(或反对者)对该测试样本的实际影响分数。

参数:
  • inputs (tuple) – inputs 是测试批次,是一个元组,其中最后一个元素假定为批次的标签。也就是说,model(*batch[0:-1]) 生成 model 的输出,而 batch[-1] 是标签(如果有)。这与对训练数据集 train_dataset 产生的每个批次的假设相同——请参阅 __init__ 中的文档以了解批次假设结构的更多细节。

  • k (int, 可选) – 如果未提供或为 None,将运行影响分数模式。否则将运行 k 个最有影响力模式,k 是测试批次中每个样本要返回的支持者/反对者数量。默认值:None

  • proponents (bool, 可选) – 如果在 k 个最有影响力模式下运行,是寻求支持者 (proponents=True) 还是反对者 (proponents=False)。默认值:True

返回类型:

Union[Tensor, KMostInfluentialResults]

返回:

此方法的返回值取决于运行哪种模式。

  • 影响分数模式:如果运行此模式(k 为 None),返回形状为 (input_size, train_dataset_size) 的二维张量 influence_scores,其中 input_size 是测试批次中的样本数,train_dataset_size 是训练数据集 train_dataset 中的样本数。换句话说,influence_scores[i][j]train_dataset 中的第 j 个样本对测试批次中的第 i 个样本的影响分数。

  • k 个最有影响力模式:如果运行此模式(k 为整数),返回一个名为 (indices, influence_scores) 的 namedtuple。indices 是形状为 (input_size, k) 的二维张量,其中 input_size 是测试批次中的样本数。如果计算支持者(或反对者),indices[i][j] 是训练数据集 train_dataset 中对测试批次中的第 i 个样本具有第 j 高(或最低)影响分数的样本索引。influence_scores 包含相应的影响分数。具体而言,influence_scores[i][j]train_dataset 中索引为 indices[i][j] 的样本对由 inputs 表示的测试批次中样本 i 的影响分数。

self_influence(inputs=None, show_progress=False, outer_loop_by_checkpoints=False)[源代码]

未实现 - 无需实现 TracInCPFastRandProj.self_influence,因为 TracInCPFast.self_influence 已足够 —— 后者不会从随机投影中受益,因为除了自影响分数外,不存储与训练样本相关的任何量。

计算单个批次或产生批次的 Pytorch DataLoader 的自影响分数。注意,如果 inputs 是单个批次,这将在该批次上调用 model;如果 inputs 产生多个批次,这将在产生的每个批次上调用 model。因此,请确保在两种情况下,调用 model 时使用的批次不要太大,以免出现内存溢出错误。

参数:
  • inputs (tupleDataLoader) – 可以是任意内容的单个元组,也可以是一个 DataLoader(其中产生的每个批次都是任意内容的元组)。在任何一种情况下,元组都代表一个批次,其中最后一个元素被假定为该批次的标签。也就是说,model(*batch[0:-1]) 产生 model 的输出,而 batch[-1] 是标签(如果有的话)。这与训练数据集 train_dataset 产生的每个批次的假设相同。关于批次结构的更多细节,请参阅 TracInCP.__init__train_dataset 参数文档。

  • show_progress (bool, 可选) – 如果 inputs 代表许多样本,自影响分数的计算可能会花费很长时间。如果 show_progress 为 true,则将显示计算进度。具体来说,此计算将遍历所有检查点(作为 checkpoints 初始化参数提供)以及 inputs 代表的所有批次。因此,需要迭代的 (检查点, 批次) 组合的总数为(检查点数量 x inputs 代表的批次数量)。如果 show_progress 为 True,则显示已迭代的此类组合的总数。如果可用,它将尝试使用 tqdm 以获得高级功能(例如时间估计)。否则,它将退回到简单的进度输出。默认值:False

  • outer_loop_by_checkpoints (bool, 可选) – 是否对外层检查点执行迭代;详情请参见方法说明。默认值:False

返回:

这是一个包含下述内容的 1D 张量:

inputs 中所有样本的自影响分数,无论它代表单个批次还是产生批次的 DataLoader

返回类型:

self_influence_scores (Tensor)