引言
论文探讨了深度学习中的一种新型数据投毒方法,旨在降低机器学习模型的测试精度。研究挑战了当前对于对抗性训练(Adversarial Training, AT)作为防御手段的共识。当前普遍认为,当AT的预算不小于投毒预算时,投毒攻击难以对AT模型造成伤害。然而,这篇论文提出的新攻击策略,通过引入相互纠缠的特征(Entangled Features, EntF),使得被投毒的数据在训练中变得无效,无论是否应用AT。
EntF攻击策略
论文提出了EntF,这是一种新型的数据投毒方法,通过在潜在空间中引入纠缠特征来攻击AT模型。EntF分为两种变体:EntF-push和EntF-pull,这两种方法分别使训练样本在潜在特征空间中远离或靠近其类别中心。这种方法与以往依赖于交叉熵损失的攻击策略不同,后者通常在针对标准模型时更有效。
EntF-Push
- 目标:将每个类别的所有训练样本在潜在特征空间中推离其对应类别的中心点。
- 操作:对每个训练样本添加扰动,使得它在参考模型(一个预先训练好的模型)的潜在特征空间中远离其类别的中心点。
- 数学表达: L p u s h = max δ p o i ∥ F L ∗ − 1 ( x + δ p o i ) − µ y ∥ 2 L_{push} = \max_{\delta_{poi}} \| F_{L*−1}(x + \delta_{poi}) − µ_y \|_2 Lpush=maxδpoi∥FL∗−1(x+δpoi)−µy∥2,其中 F L ∗ − 1 F_{L*−1} FL∗−1代表参考模型的倒数第二层输出, µ y µ_y µy 是类别 y y y 的中心点。
中心点的计算:
类别的中心点通常是通过计算特定类别所有样本在特征空间中表示的平均值来确定的。在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 的应用场景
- 目标:使得模型无法从训练样本中学习到区分不同类别的有效特征。
- 场景:适用于攻击者希望破坏模型对所有类别的泛化能力,让模型在分类时表现出高度的混淆。例如,如果攻击者希望在一个图像分类任务中让模型对所有类别都难以区分,就可以使用 EntF-Push。
- 特点:通过推离类别中心,EntF-Push 使得模型在学习时难以将样本正确归类,因为样本特征与任何已知类别的典型特征都不匹配。
EntF-Pull
- 目标:将每个训练样本在潜在特征空间中拉向其最近的不同类别的中心点。
- 操作:对每个训练样本添加扰动,使其在参考模型的潜在特征空间中靠近其最近的不同类别的中心点。
- 数学表达: L p u l l = min δ p o i ∥ F L ∗ − 1 ( x + δ p o i ) − µ y ′ ∥ 2 L_{pull} = \min_{\delta_{poi}} \| F_{L*−1}(x + \delta_{poi}) − µ_{y'} \|_2 Lpull=minδpoi∥FL∗−1(x+δpoi)−µy′∥2,其中 y ′ y' y′ 是除当前样本类别外最近的类别。
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-Pull 使得模型更倾向于将这些样本分类为错误的类别。这种方法在攻击者希望特定类别样本被系统性地错误分类时特别有效。
举例说明
假设我们有一个图像分类任务,分类目标是狗和猫。在正常情况下,狗的图像会聚集在特征空间中的一个区域,猫的图像在另一个区域。在应用EntF-push攻击时,通过添加扰动,狗的图像在特征空间中被推离原本狗类别的中心点,使得模型难以从这些扰动的图像中学习到区分狗和猫的有效特征。在EntF-pull的情况下,狗的图像则被扰动以在特征空间中靠近猫的类别中心,导致模型在分类时混淆这两个类别。
通过这种方法,EntF策略有效地降低了模型在未受攻击的测试数据上的准确性,因为模型无法从被纠缠的训练数据中学习到区分不同类别的有效特征。
混合攻击策略
混合攻击策略是一种针对标准训练模型(ST models)和对抗训练模型(AT models)同时有效的数据投毒方法。这种策略的目的是同时破坏模型对于鲁棒特征和非鲁棒特征的学习能力。以下是混合攻击策略的详细过程:
- 选择参考模型
混合攻击策略首先需要选择两种类型的参考模型:
- 标准训练模型(ST Reference Model):这个模型专注于非鲁棒特征,代表了常规的、未经过对抗训练的模型。
- 对抗训练模型(AT Reference Model):这个模型强调鲁棒特征,通过对抗训练提高了对攻击的抵抗力。
- 计算类别中心
对于每个类别,使用这两种参考模型分别计算类别的中心点。这些中心点基于模型在潜在特征空间中的表示。
- 生成扰动
接下来,为每个训练样本生成扰动。扰动的生成考虑两方面:
- 针对ST模型的扰动:这些扰动旨在让样本的特征表示在ST参考模型的特征空间中偏离其原始类别的中心。
- 针对AT模型的扰动:这些扰动旨在让样本的特征表示在AT参考模型的特征空间中偏离其原始类别的中心。
- 优化扰动
混合攻击策略通过平衡针对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 的整体性能:
- 在CIFAR-10数据集上,未经攻击的模型(CLEAN)的准确率为84.88%,而应用EntF攻击(无论是EntF-Push还是EntF-Pull)后,模型的准确率降至71.57%。
- 对于CIFAR-100和TinyImageNet数据集,EntF攻击同样降低了模型的准确率,分别从59.50%降至47.29%和从51.95%降至41.32%。
- 这些结果表明EntF攻击可以显著降低模型在不同数据集上的准确率,且EntF-Push和EntF-Pull在效果上相似。
-
EntF-Push 和 EntF-Pull 的效率对比:
- EntF-Pull在实施时需要额外计算并排序每个样本与其类别中心的距离,这使得EntF-Pull在效率上不如EntF-Push。
- 此外,EntF-Pull中的类别选择策略可能会影响最终性能。
-
部分数据投毒的效果:
- 在仅对20%的训练数据进行投毒的情况下,EntF能够将模型的准确率从84.88%降至81.41%,这个结果比直接丢弃这些被投毒数据(准确率为83.66%)的效果还要好。
- 这表明即使在部分数据投毒的情况下,EntF攻击仍然有效。
综上所述,EntF-Push 和 EntF-Pull 都能有效降低模型在各种数据集上的准确率,但在实施效率上,EntF-Push优于EntF-Pull。同时,即使只对部分训练数据进行投毒,EntF攻击也能显著降低模型的性能。