この記事は、ブロガーがAI、ドローン、強化学習などの分野を勉強する際に、個人的な勉強や研究、鑑賞のために記録した研究の抜粋およびメモであり、ブロガーの人工知能およびその他の分野についての理解に基づいています。万が一、不正・違反があった場合には、ご指摘を受け次第、速やかに修正させていただきますので、ご理解賜りますようお願い申し上げます。AI学習における記事分類:
AI学習記(6) ---「FGSM、PGD、BIM敵対的攻撃アルゴリズムの実装」
FGSM、PGD、BIM 敵対的攻撃アルゴリズムの実装
目次
1 はじめに
PGD および BIM 敵対的攻撃アルゴリズムの実装は、一般的に使用される多くの敵対的攻撃アルゴリズムが含まれる torchattachs ライブラリに直接インポートできます。
pip install torchattacks
次に、直接呼び出す関連コードを追加します。
perturbed_data = torchattacks.PGD(model, epsilon, 0.2, steps=4)
# perturbed_data = (torchattacks.BIM(model, epsilon, 0.2, steps=4))
perturbed_data = perturbed_data(data, target)
FGSM 敵対的サンプル認識のコードについては、この記事を参照してください。
この記事では主に、FGSM、PGD、および BIM 敵対的攻撃アルゴリズムを使用して手書き数字認識を実現する方法について説明します。プロジェクト コードは以下のリンクにあります。
FGSM、PGD、および BIM 敵対的攻撃アルゴリズムの実装リソース
CSDN からダウンロードできない場合は、公開アカウントをフォローして無料で入手できます。Xiaopa Cai ではサツマイモのみを販売しています。
2 PGD を使用して敵対的サンプルを生成する
2.1 PGD 敵対的サンプル生成コード
class PGD(Attack):
def __init__(self, model, eps=8 / 255, alpha=2 / 255, steps=10, random_start=True):
super().__init__("PGD", model)
self.eps = eps
self.alpha = alpha
self.steps = steps
self.random_start = random_start
self.supported_mode = ["default", "targeted"]
def forward(self, images, labels):
r"""
Overridden.
"""
images = images.clone().detach().to(self.device)
labels = labels.clone().detach().to(self.device)
if self.targeted:
target_labels = self.get_target_label(images, labels)
loss = nn.CrossEntropyLoss()
adv_images = images.clone().detach()
if self.random_start:
# Starting at a uniformly random point
adv_images = adv_images + torch.empty_like(adv_images).uniform_(
-self.eps, self.eps
)
adv_images = torch.clamp(adv_images, min=0, max=1).detach()
for _ in range(self.steps):
adv_images.requires_grad = True
outputs = self.get_logits(adv_images)
# Calculate loss
if self.targeted:
cost = -loss(outputs, target_labels)
else:
cost = loss(outputs, labels)
# Update adversarial images
grad = torch.autograd.grad(
cost, adv_images, retain_graph=False, create_graph=False
)[0]
adv_images = adv_images.detach() + self.alpha * grad.sign()
delta = torch.clamp(adv_images - images, min=-self.eps, max=self.eps)
adv_images = torch.clamp(images + delta, min=0, max=1).detach()
return adv_images
2.2 PGD 敵対的サンプル生成テストの結果
3 BIM を使用して敵対的サンプルを生成する
3.1 BIM 敵対的サンプル生成コード
class BIM(Attack):
def __init__(self, model, eps=8 / 255, alpha=2 / 255, steps=10):
super().__init__("BIM", model)
self.eps = eps
self.alpha = alpha
if steps == 0:
self.steps = int(min(eps * 255 + 4, 1.25 * eps * 255))
else:
self.steps = steps
self.supported_mode = ["default", "targeted"]
def forward(self, images, labels):
r"""
Overridden.
"""
images = images.clone().detach().to(self.device)
labels = labels.clone().detach().to(self.device)
if self.targeted:
target_labels = self.get_target_label(images, labels)
loss = nn.CrossEntropyLoss()
ori_images = images.clone().detach()
for _ in range(self.steps):
images.requires_grad = True
outputs = self.get_logits(images)
# Calculate loss
if self.targeted:
cost = -loss(outputs, target_labels)
else:
cost = loss(outputs, labels)
# Update adversarial images
grad = torch.autograd.grad(
cost, images, retain_graph=False, create_graph=False
)[0]
adv_images = images + self.alpha * grad.sign()
a = torch.clamp(ori_images - self.eps, min=0)
b = (adv_images >= a).float() * adv_images + (
adv_images < a
).float() * a # nopep8
c = (b > ori_images + self.eps).float() * (ori_images + self.eps) + (
b <= ori_images + self.eps
).float() * b # nopep8
images = torch.clamp(c, max=1).detach()
return images
3.2 BIM 敵対的サンプル生成テストの結果
4 まとめ
上記の実験結果から、イプシロンが同じ場合、FGSM の精度率 > PGD の精度率 > BIM の精度低下率であることがわかります。
画像の傾斜角度から、FGSM の精度低下率 < PGD の精度低下率 < BIM の精度低下率であることがわかります。
人間の目で検出するのが難しいほど摂動の量が制限されている場合、敵対的サンプル生成方法を改善し、異なる敵対的サンプル生成方法を使用して敵対的サンプルの敵対的性質を改善することができます。
記事内に不適切や不正確な点がございましたら、ご理解の上ご指摘いただければ幸いです。一部の文章、画像等はインターネット上から取得したものであるため、出典が確認できませんので、紛争等がございましたらブロガーに連絡の上、削除していただきますようお願いいたします。間違い、質問、権利侵害がある場合は、コメントを残して著者に連絡するか、VX 公開アカウントRain21321をフォローして著者に連絡してください。