FGSM、PGD、BIM 敵対的攻撃アルゴリズムの実装

     

       この記事は、ブロガーがAI、ドローン、強化学習などの分野を勉強する際に、個人的な勉強や研究、鑑賞のために記録した研究の抜粋およびメモであり、ブロガーの人工知能およびその他の分野についての理解に基づいています。万が一、不正・違反があった場合には、ご指摘を受け次第、速やかに修正させていただきますので、ご理解賜りますようお願い申し上げます。AI学習における記事分類

       AI学習記(6) ---「FGSM、PGD、BIM敵対的攻撃アルゴリズムの実装」

FGSM、PGD、BIM 敵対的攻撃アルゴリズムの実装

目次

1 はじめに

2 PGD を使用して敵対的サンプルを生成する

3 BIM を使用して敵対的サンプルを生成する

4 まとめ


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敵対的攻撃アルゴリズムの実装

この記事では主に、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をフォローして著者に連絡してください。

おすすめ

転載: blog.csdn.net/qq_51399582/article/details/135030590