赞
踩
论文探讨了深度学习中的一种新型数据投毒方法,旨在降低机器学习模型的测试精度。研究挑战了当前对于对抗性训练(Adversarial Training, AT)作为防御手段的共识。当前普遍认为,当AT的预算不小于投毒预算时,投毒攻击难以对AT模型造成伤害。然而,这篇论文提出的新攻击策略,通过引入相互纠缠的特征(Entangled Features, EntF),使得被投毒的数据在训练中变得无效,无论是否应用AT。
论文提出了EntF,这是一种新型的数据投毒方法,通过在潜在空间中引入纠缠特征来攻击AT模型。EntF分为两种变体:EntF-push和EntF-pull,这两种方法分别使训练样本在潜在特征空间中远离或靠近其类别中心。这种方法与以往依赖于交叉熵损失的攻击策略不同,后者通常在针对标准模型时更有效。
中心点的计算:
类别的中心点通常是通过计算特定类别所有样本在特征空间中表示的平均值来确定的。在EntF攻击策略中,这个中心点是在参考模型(预先训练好的模型)的潜在特征空间中为每个类别定义的。
具体计算步骤如下:
选择参考模型:首先,需要一个已经训练好的模型(参考模型),这个模型用于将输入数据(例如图像)映射到潜在的特征空间。
处理训练数据:将属于同一类别的所有训练样本通过参考模型转换成潜在特征表示。这通常意味着获取模型的倒数第二层(即在输出层之前的层)的输出。
计算类别中心:对于每个类别,计算其所有样本的潜在特征表示的平均值。具体来说,如果
F
L
∗
−
1
(
x
)
F_{L*−1}(x)
FL∗−1(x)表示参考模型对样本
x
x
x的潜在特征表示,那么类别
y
y
y 的中心点
µ
y
µ_y
µy可以通过以下公式计算得出:
µ
y
=
1
∣
X
y
∣
∑
x
∈
X
y
F
L
∗
−
1
(
x
)
µ_y = \frac{1}{|X_y|} \sum_{x \in X_y} F_{L*−1}(x)
µy=∣Xy∣1∑x∈XyFL∗−1(x)
其中
X
y
X_y
Xy是类别
y
y
y的所有训练样本集合,
∣
X
y
∣
|X_y|
∣Xy∣ 是该集合中样本的数量。
这种方法可以确保每个类别的中心点代表了该类别在参考模型特征空间中的典型或平均特征。在EntF攻击中,这些中心点用于指导扰动的添加,目的是使得训练样本在特征空间中离开(EntF-push)或靠近(EntF-pull)这些中心点,从而破坏模型的学习过程。
python代码示例
import torch import torch.nn as nn import torch.nn.functional as F class EntFPush(nn.Module): def __init__(self, num_classes, feature_dim): super(EntFPush, self).__init__() # Assume we have the centroid for each class (e.g., precomputed or given). self.class_centroids = nn.Parameter(torch.randn(num_classes, feature_dim)) self.feature_dim = feature_dim def forward(self, features, target): # Compute the distance between features and their corresponding class centroids batch_size = features.size(0) centroids = self.class_centroids[target] # Shape: [batch_size, feature_dim] distance = F.pairwise_distance(features, centroids) # Shape: [batch_size] # Create a push vector that will move features away from the centroid push_vector = F.normalize(features - centroids, dim=1) # Shape: [batch_size, feature_dim] # Multiply by distance to ensure that farther points are pushed more push_vector = push_vector * distance.view(batch_size, 1) # Add perturbation to the original features perturbed_features = features + push_vector return perturbed_features # Example usage: num_classes = 10 # For example, CIFAR-10 feature_dim = 512 # Example feature dimension # Create a batch of dummy features and targets dummy_features = torch.randn(32, feature_dim) # Batch size of 32 dummy_targets = torch.randint(0, num_classes, (32,)) # Instantiate the EntF-Push attack module entf_push = EntFPush(num_classes=num_classes, feature_dim=feature_dim) # Perform the attack perturbed_features = entf_push(dummy_features, dummy_targets) print(perturbed_features)
EntF-Push 的应用场景
python代码示例:
import torch import torch.nn as nn import torch.nn.functional as F class EntFPull(nn.Module): def __init__(self, num_classes, feature_dim): super(EntFPull, self).__init__() # Define the centroids for each class, these could be learned or predefined. self.class_centroids = nn.Parameter(torch.randn(num_classes, feature_dim)) self.feature_dim = feature_dim def forward(self, features, targets): # Calculate the distances to all centroids except the centroid of the current class batch_size = features.size(0) centroids = self.class_centroids.unsqueeze(0).expand(batch_size, -1, -1) features_expanded = features.unsqueeze(1).expand(-1, centroids.size(1), -1) distances = torch.norm(features_expanded - centroids, dim=2) distances.scatter_(1, targets.unsqueeze(1), float('inf')) # Ignore the distance to the centroid of the true class # Find the closest centroid for each feature _, closest_centroid_indices = distances.min(dim=1) closest_centroids = self.class_centroids[closest_centroid_indices] # Calculate the pull vector that will move features towards the closest centroid pull_vector = F.normalize(closest_centroids - features, dim=1) # Apply the pull vector to the features to perturb them perturbed_features = features + pull_vector return perturbed_features # Example usage: num_classes = 10 # For CIFAR-10 feature_dim = 512 # Example feature dimension # Create a batch of dummy features and targets dummy_features = torch.randn(32, feature_dim) # Batch size of 32 dummy_targets = torch.randint(0, num_classes, (32,)) # Instantiate the EntF-Pull attack module entf_pull = EntFPull(num_classes=num_classes, feature_dim=feature_dim) # Perform the attack perturbed_features = entf_pull(dummy_features, dummy_targets) print(perturbed_features)
EntF-Pull 的应用场景
假设我们有一个图像分类任务,分类目标是狗和猫。在正常情况下,狗的图像会聚集在特征空间中的一个区域,猫的图像在另一个区域。在应用EntF-push攻击时,通过添加扰动,狗的图像在特征空间中被推离原本狗类别的中心点,使得模型难以从这些扰动的图像中学习到区分狗和猫的有效特征。在EntF-pull的情况下,狗的图像则被扰动以在特征空间中靠近猫的类别中心,导致模型在分类时混淆这两个类别。
通过这种方法,EntF策略有效地降低了模型在未受攻击的测试数据上的准确性,因为模型无法从被纠缠的训练数据中学习到区分不同类别的有效特征。
混合攻击策略是一种针对标准训练模型(ST models)和对抗训练模型(AT models)同时有效的数据投毒方法。这种策略的目的是同时破坏模型对于鲁棒特征和非鲁棒特征的学习能力。以下是混合攻击策略的详细过程:
混合攻击策略首先需要选择两种类型的参考模型:
对于每个类别,使用这两种参考模型分别计算类别的中心点。这些中心点基于模型在潜在特征空间中的表示。
接下来,为每个训练样本生成扰动。扰动的生成考虑两方面:
混合攻击策略通过平衡针对ST和AT模型的扰动来优化这些扰动。具体来说,它通过一个混合损失函数来实现,该函数同时考虑了两种类型的参考模型:
L
h
y
b
r
i
d
=
max
δ
p
o
i
(
∥
F
L
∗
−
1
S
T
(
x
+
δ
p
o
i
)
−
µ
y
S
T
∥
2
+
∑
i
λ
i
∥
F
L
∗
−
1
A
T
i
(
x
+
δ
p
o
i
)
−
µ
y
A
T
i
∥
2
)
L_{hybrid} = \max_{\delta_{poi}} \left( \|F_{L*−1}^{ST}(x + \delta_{poi}) − µ_{y}^{ST}\|_2 + \sum_i λ_i \|F_{L*−1}^{AT_i}(x + \delta_{poi}) − µ_{y}^{AT_i}\|_2 \right)
Lhybrid=δpoimax(∥FL∗−1ST(x+δpoi)−µyST∥2+i∑λi∥FL∗−1ATi(x+δpoi)−µyATi∥2)
其中,$F_{L*−1}^{ST} $ 和 F L ∗ − 1 A T i F_{L*−1}^{AT_i} FL∗−1ATi 分别表示ST和AT参考模型的倒数第二层输出,$µ_{y}^{ST} $ 和 µ y A T i µ_{y}^{AT_i} µyATi 是对应的类别中心,而 λ i λ_i λi 是用于平衡不同AT模型影响的系数。
最后,将优化后的扰动应用到训练数据集上,生成被投毒的训练数据集。
通过这种方法,混合攻击策略能够有效地干扰模型对鲁棒和非鲁棒特征的学习,从而在不同类型的模型上降低性能。这种策略特别适用于防御者可能调整其对抗训练预算以达到最佳准确度的情况。
EntF-Push 和 EntF-Pull 的整体性能:
EntF-Push 和 EntF-Pull 的效率对比:
部分数据投毒的效果:
综上所述,EntF-Push 和 EntF-Pull 都能有效降低模型在各种数据集上的准确率,但在实施效率上,EntF-Push优于EntF-Pull。同时,即使只对部分训练数据进行投毒,EntF攻击也能显著降低模型的性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。