对抗样本之FGSM原理&coding

1、FGSM原理

论文 Explaining and harnessing adversarial examples. 这篇论文由Goodfellow等人发表在ICLR2015会议上,是对抗样本生成领域的经典论文。

  • FGSM(fast gradient sign method)是一种基于梯度生成对抗样本的算法,属于对抗攻击中的无目标攻击(即不要求对抗样本经过model预测指定的类别,只要与原样本预测的不一样即可)
  • 我们在理解简单的dp网络结构的时候,在求损失函数最小值,我们会沿着梯度的反方向移动,使用减号,也就是所谓的梯度下降算法;而FGSM可以理解为梯度上升算法,也就是使用加号,使得损失函数最大化。先看下图效果,goodfellow等人通过对一个大熊猫照片加入一定的扰动(即噪音点),输入model之后就被判断为长臂猿
    FGSM样本生成
公式
  1. 如下图,其中 x 是原始样本θ 是模型的权重参数(即w),y是x的真实类别。输入原始样本,权重参数以及真实类别,通过 J 损失函数求得神经网络的损失值,∇x 表示对 x 求偏导,即损失函数 J 对 x 样本求偏导。sign是符号函数,即sign(-2),sign(-1.5)等都等于 -1;sign(3),sign(4.7)等都等于 1。sign函数图如下。
  2. ϵ(epsilon)的值通常是人为设定 ,可以理解为学习率,一旦扰动值超出阈值,该对抗样本会被人眼识别。

在这里插入图片描述在这里插入图片描述

  1. 之后,原始图像x + 扰动值 η = 对抗样本 x + η 。
  2. 理解公式后,感觉FGSM并不难。其思想也和dp神经网络类似,但它更像是一个逆过程。我们机器学习算法中无论如何都希望损失函数能越小越好;那对抗样本就不一样了,它本身就是搞破坏的东西,当然是希望损失值越大越好,这样算法就预测不出来,就会失效。

2、pytorch实现

声明:代码来源于pytorch官网,跳转;你要是想看官网直接跳转即可,但是以下的内容我会讲解代码以及自己的理解。

2.1 建立模型
from __future__ import print_function
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import numpy as np
import matplotlib.pyplot as plt

# 这里的epsilon先设定为几个值,到时候后面可视化展示它的影响如何
epsilons = [0, .05, .1, .15, .2, .25, .3]
# 这个预训练的模型需要提前下载,放在如下url的指定位置,下载链接如上
pretrained_model = "data/lenet_mnist_model.pth"
use_cuda=True

# 就是一个简单的模型结构
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(
### 关于SM2I Algorithm和FGSM Technique #### SM2I Algorithm SM2I 是一种基于椭圆曲线密码学(Elliptic Curve Cryptography, ECC)的改进型算法,主要应用于中国国家密码标准中的 **SM2 密码算法** 的扩展领域。它通常用于增强数据的安全性和隐私保护能力,在某些特定场景下提供更高的计算效率或更优的安全性能。 在中国国家标准 GB/T 32905-2016 中提到,SM2 算法是一种公钥密码体制,涵盖了数字签名、密钥交换以及公钥加密等功能[^1]。而 SM2I 可能是对该算法的一种变体或者优化版本,具体实现细节可能涉及以下方面: - 更高效的密钥生成机制。 - 针对物联网设备或其他资源受限环境下的轻量化设计。 - 提高抗攻击能力,特别是在量子计算机威胁逐渐显现的情况下。 然而需要注意的是,“SM2I” 并未被广泛提及作为正式术语存在于公开资料中;如果存在这样的定义,则可能是某个研究团队提出的专有概念或者是行业内的内部叫法。 以下是 C++ 实现的一个简单例子展示如何利用 SM2 进行基本操作(虽然这里并未直接体现所谓的 “SM2I”,但它可以帮助理解基础逻辑)。 ```cpp #include <iostream> using namespace std; // 解密函数简化版示意代码 int sm2_decrypt_example() { unsigned char *plaintext; int msg_len = 16; // 假设消息长度为固定值 string c2str = "example_cipher"; // 加密后的字符串表示形式 if (!(plaintext = (unsigned char *)malloc(c2str.length()))) { cout << "Memory allocation failed!" << endl; return -1; } // 调用实际解密方法 int error_code = sm2_decrypt(/* 参数列表 */); if (error_code != 0) { cout << "Decrypt SM2 ciphertext by using private key defined in standard failed!" << endl; free(plaintext); // 清理内存防止泄漏 return -2; } return 0; } ``` #### FGSM Technique Fast Gradient Sign Method (FGSM),即快速梯度符号方法,属于对抗样本生成技术之一,主要用于测试机器学习模型尤其是深度神经网络对于微小扰动输入变化时的行为反应情况。通过这种方法能够评估系统的鲁棒性并发现潜在漏洞。 其核心原理在于根据目标分类器输出相对于输入变量求导数方向施加一定量级噪声来制造误导信息从而改变预测结果。例如给定一张图片经过训练好的 CNN 后得到正确标签概率分布向量 p=[p₁,...,pk], 我们希望找到最小幅度修改 δ 使得新图像 x′=x+δ 对应另一类别 q 成立最大可能性。 下面是 Python 版本演示如何应用 PyTorch 库构建简单的 FGSM 攻击过程: ```python import torch from torchvision import models def fgsm_attack(image, epsilon, data_grad): sign_data_grad = data_grad.sign() perturbed_image = image + epsilon*sign_data_grad perturbed_image = torch.clamp(perturbed_image, 0, 1) return perturbed_image model = models.resnet18(pretrained=True).eval() # Assume 'input_tensor' is your input tensor and 'target_label' is the label you want to misclassify towards. output = model(input_tensor) loss_fn = nn.CrossEntropyLoss() loss = loss_fn(output, target_label.unsqueeze(0)) model.zero_grad() loss.backward() data_grad = input_tensor.grad.data perturbed_input = fgsm_attack(input_tensor, eps_value, data_grad) ``` 上述脚本展示了如何针对 ResNet 架构执行一次典型的 FGSM 攻击尝试。 --- ###
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值