FGSM(Fast Gradient Sign Method)算法源码解析

这篇具有很好参考价值的文章主要介绍了FGSM(Fast Gradient Sign Method)算法源码解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

论文链接:https://arxiv.org/abs/1412.6572
源码出处:https://github.com/Harry24k/adversarial-attacks-pytorch/tree/master


源码

import torch
import torch.nn as nn

from ..attack import Attack


class FGSM(Attack):
    r"""
    FGSM in the paper 'Explaining and harnessing adversarial examples'
    [https://arxiv.org/abs/1412.6572]

    Distance Measure : Linf

    Arguments:
        model (nn.Module): model to attack.
        eps (float): maximum perturbation. (Default: 8/255)

    Shape:
        - images: :math:`(N, C, H, W)` where `N = number of batches`, `C = number of channels`,        `H = height` and `W = width`. It must have a range [0, 1].
        - labels: :math:`(N)` where each value :math:`y_i` is :math:`0 \leq y_i \leq` `number of labels`.
        - output: :math:`(N, C, H, W)`.

    Examples::
        >>> attack = torchattacks.FGSM(model, eps=8/255)
        >>> adv_images = attack(images, labels)

    """
    def __init__(self, model, eps=8/255):
        super().__init__("FGSM", model)
        self.eps = eps
        self.supported_mode = ['default', 'targeted']

    def forward(self, images, labels):
        r"""
        Overridden.
        """
        self._check_inputs(images)

        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()

        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.eps*grad.sign()
        adv_images = torch.clamp(adv_images, min=0, max=1).detach()

        return adv_images

解析

FGSM的全称是Fast Gradient Sign Method(快速梯度下降法),在白盒环境下,通过求出损失cost对输入的导数,然后用符号函数sign()得到其具体的梯度方向,接着乘以一个步长eps,得到的“扰动”加在原来的输入上就得到了在FGSM攻击下的样本。
可以仔细回忆一下,在神经网络的反向传播当中,我们在训练过程时就是沿着梯度下降的方向来更新更新 w , b w,b w,b的值。这样做可以使得网络往损失cost减小的方向收敛。简单来说,梯度方向代表了损失cost改变速度最快的方向,FGSM算法假设目标损失函数 J ( x , y ) J(x,y) J(x,y) x x x之间是近似线性的,即 J ( x , y ) ≈ w T x J(x ,y)≈w^Tx J(x,y)wTx,所以沿着梯度上升的方向改变输入 x x x可以增大损失,从而达到使模型分类错误的目的。具体做法是在图像上加一个扰动 η \eta η η = ϵ s i g n ( ▽ x J ( θ , x , y ) ) \eta= \epsilon sign(\triangledown_{x}J(\theta,x,y)) η=ϵsign(xJ(θ,x,y)),其中 ▽ x \triangledown_{x} x即梯度, ϵ \epsilon ϵ即步长,也就是每个像素扰动的最大值。
若是无目标攻击,综上所述,公式如下: X a d v = X + ϵ s i g n ( ▽ x J ( X , y t r u e ) ) X^{adv}=X+\epsilon sign(\triangledown_xJ(X,y_{true})) Xadv=X+ϵsign(xJ(X,ytrue))其中, y t r u e y_{true} ytrue为样本 X X X的真实标签。
若是有目标攻击,则需要增加扰动去逼近目标标签,也就是要让样本与目标标签之间损失减小,公式如下: X a d v = X − ϵ s i g n ( ▽ x J ( X , y t a r g e t ) ) X^{adv}=X-\epsilon sign(\triangledown_xJ(X,y_{target})) Xadv=Xϵsign(xJ(X,ytarget))其中, y t a r g e t y_{target} ytarget即为目标标签,目标标签的选取有多种方式,例如可以选择与真实标签相差最大的标签,也可以随机选择除真实标签外的标签。

forward()函数就是攻击过程,输入图像images和标签y,即可返回对抗图像adv_images
images = images.clone().detach().to(self.device)clone()将图像克隆到一块新的内存区(pytorch默认同样的tensor共享一块内存区);detach()是将克隆的新的tensor从当前计算图中分离下来,作为叶节点,从而可以计算其梯度;to()作用就是将其载入设备。
target_labels = self.get_target_label(images, labels):若是有目标攻击的情况,获取目标标签。目标标签的选取有多种方式,例如可以选择与真实标签相差最大的标签,也可以随机选择除真实标签外的标签。
loss = nn.CrossEntropyLoss():设置损失函数为交叉熵损失。
images.requires_grad = True:将这个参数设置为True,pytorch就会在程序运行过程中自动生成计算图,供计算梯度使用。
outputs = self.get_logits(images):获得图像的在模型中的输出值。
cost = -loss(outputs, target_labels):有目标情况下计算损失
cost = loss(outputs, labels):无目标情况下计算损失
grad = torch.autograd.grad(cost, images, retain_graph=False, create_graph=False)[0]costimages求导,得到梯度grad
adv_images = images + self.eps*grad.sign():根据公式在原图像上增加一个扰动,得到对抗图像。
adv_images = torch.clamp(adv_images, min=0, max=1).detach():将images中大于1的部分设为1,小于0的部分设为0,防止越界。

思考

FGSM算法假设目标损失函数 J ( x , y ) J(x,y) J(x,y) x x x之间是近似线性的,但是这个线性假设不一定正确,如果它们之间不是线性的,那么在 ( 0 , ϵ s i g n ( ▽ x J ( θ , x , y ) ) ) (0,\epsilon sign(\triangledown_{x}J(\theta,x,y))) (0,ϵsign(xJ(θ,x,y)))之间是否存在某个扰动,使得 J J J增加的也很大,此时 x x x的修改量就可以小于 ϵ \epsilon ϵ。于是,有学者就提出迭代的方式来找各个像素点的扰动,也就是BIM算法,具体可以查看下一篇博客。文章来源地址https://www.toymoban.com/news/detail-718736.html

到了这里,关于FGSM(Fast Gradient Sign Method)算法源码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 以optee的sign_encrypt.py为例讲解argparse命令解析模块

    Argparse是 Python 标准库中推荐的命令行解析模块。该模块会自动生成提示信息,且在用户给程序传入非法参数时报错。 刚好最近在看optee的sign_encrypt.py,以它为例介绍python的argparse命令解析模块。 脚本参见:optee_os/scripts/sign_encrypt.py at master · OP-TEE/optee_os · GitHub ArgumentParser 对象

    2024年02月10日
    浏览(7)
  • Policy Gradient策略梯度算法详解

    Policy Gradient策略梯度算法详解

    Policy Gradient策略梯度(PG),是一种基于策略的强化学习算法,不少帖子会讲到从基于值的算法(Q-learning/DQN/Saras)到基于策略的算法难以理解,我的理解是两者是完全两套思路,在学习一种的时候先不要考虑另一种,更容易接受算法基本思想,了解了算法原理推导过程之后再

    2024年02月07日
    浏览(14)
  • 强化学习系列之Policy Gradient算法

    强化学习系列之Policy Gradient算法

    1.1 基础组成部分 强化学习里面包含三个部件:Actor,environment,reward function Actor : 表示角色,是能够被玩家控制的。 Policy of Actor:在人工智能中,Policy π pi π 可以表示为一个神经网络,参数为 θ theta

    2024年02月06日
    浏览(8)
  • 策略梯度算法(Policy gradient,PG)

    策略梯度算法(Policy gradient,PG)

    强化学习 有三个组成部分:演员,环境和奖励函数, 演员是我们的智能体,环境就是对手,奖励就是没走出一步环境给我们的reward,环境和奖励是我们无法控制的,但是我们可以调整演员的策略,演员的策略决定了演员的动作,即给定一个输入,它会输出演员现在应该要执

    2023年04月08日
    浏览(13)
  • FAST协议解析3 FIX Fast Tutorial翻译 HelloWorld示例

    FAST协议解析3 FIX Fast Tutorial翻译 HelloWorld示例

    Fields in FAST do not have a fixed size and do not use a field separator. Instead, there is a notion of a stop bit (the high order bit on each byte of the message acts as a stop bit) signaling the end of the field. All of the above concepts used together allow the sender to compress a message (sometimes as much as 90%) and the receiver to restore the origina

    2024年02月03日
    浏览(9)
  • 飞控学习笔记-梯度下降算法(gradient descent algorithm)

    飞控学习笔记-梯度下降算法(gradient descent algorithm)

    笔记来源于文章:An_efficient_orientation_filter_for_inertial_and_inertial_magnetic_sensor_arrays 共轭: 四元数叉乘: 式(6)为方向余弦矩阵 欧拉角等式: w:角速度

    2024年02月16日
    浏览(14)
  • 随机梯度下降算法SGD(Stochastic gradient descent)

    SGD是什么 SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这

    2024年02月11日
    浏览(9)
  • 集成学习算法梯度提升(gradient boosting)的直观看法

    集成学习算法梯度提升(gradient boosting)的直观看法

    reference: Intuitive Ensemble Learning Guide with Gradient Boosting 梯度提升算法的核心思想:使用前一个模型的残差作为下一个模型的目标。 使用单个机器学习模型可能并不总是适合数据。优化其参数也可能无济于事。一种解决方案是将多个模型组合在一起以拟合数据。本教程以梯度提

    2023年04月09日
    浏览(10)
  • RocketMQ 消费者Rebalance算法 解析——图解、源码级解析

    🍊 Java学习:Java从入门到精通总结 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2022年10月15日 🍊 个人简介:通信工程本硕💪、Java程序员🌕。做过科研paper,发过专利,优秀的程序员不应该只是

    2024年01月19日
    浏览(5)
  • 06-揭开神秘面纱:Golang method的魅力解析

    06-揭开神秘面纱:Golang method的魅力解析

    📃个人主页:个人主页 🔥系列专栏:Golang基础 💬Go(又称Golang)是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性,拥有高效的并发编程能力和简洁的语法。Go被设计用于构建可扩展、高性能的软件系统,具有优秀的内存管理和快速的编译速度

    2024年02月09日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包