对抗学习概念、基本思想、方法综述

article/2025/8/14 14:26:11

代码实现篇

对抗学习常见方法代码实现篇

对抗学习的基本概念

要认识对抗训练,首先要了解 “对抗样本”,在论文 Intriguing properties of neural networks 之中有关于对抗样本的阐述。简单来说,它是指对于人类来说 “看起来” 几乎一样,但对于模型来说预测结果却完全不一样的样本,比如下面的经典例子(一只熊猫加了点扰动就被识别成了长臂猿)
在这里插入图片描述

对抗学习的基本思想

Min-Max公式:

max函数指的是,我们要找到一组在样本空间内、使Loss最大的的对抗样本(该对抗样本由原样本x和经过某种手段得到的扰动项r_adv共同组合得到)。这样一组样本组成的对抗样本集,它们所体现出的数据分布,就是该中括号中所体现的。
min()函数指的是,我们面对这种数据分布的样本集,要通过对模型参数的更新,使模型在该对抗样本集上的期望loss最小。

FGSM(Fast Gradient Sign Method)

Goodfellow等人在这篇论文中提出了FGSM对抗方法:
EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES
论文主要结论:

  • 对抗样本可以被解释为高维点积运算的一个属性,是模型过于线性,而非过于非线性导致的;
  • 围绕不同模型之间的对抗样本泛化可以被解释为和模型权重向量高度对齐的对抗干扰,在相同任务上训练的不同模型学习了相似的功能;
  • 干扰的方向,而不是空间中的一个具体的点,才是最重要的。空间中的对抗样例是不足的,不能像有理数那样表示实数;
  • 因为它是最重要的方向,对抗性扰动在不同干净样本之间起到泛化的作用;
  • 介绍了一些列快速生成对抗样本的方法;
  • 对抗性训练可以起到正则化的作用,且比dropout正则化作用更大;
  • 易于优化的模型更容易受到对抗干扰;
  • 线性模型缺乏抵抗干扰的能力,仅带有隐藏层的网络,通过训练后可以抵抗干扰;
  • RBF网络可以抵抗干扰;
  • 对输入分布进行建模的模型没有抵抗干扰的能力;
  • 组合模型无法对抗干扰;

FGSM是一种白箱攻击方法,该方法认为攻击就是添加扰动使得模型的loss增大,所以沿着梯度方向生成攻击样本应该是最佳的(注意:传统情况下我们是固定样本,通过梯度改变权值,现在就是固定权值,通过梯度改变样本。),具体公式如下图所示:
在这里插入图片描述

FGM(Fast Gradient Method)

ADVERSARIAL TRAINING METHODS FOR SEMI-SUPERVISED TEXT CLASSIFICATION

对于 CV 领域的任务,在输入上添加一个连续的扰动,这种对抗训练的流程可以顺利执行下来,因为图像可以视为普通的连续实数向量, Δ x \Delta x Δx也是一个实数向量,因此 x + Δ x x + \Delta x x+Δx依然可以是有意义的图像。但 NLP 不一样,NLP 的输入是文本,它本质上是 one-hot 向量,而两个不同的 one-hot 向量,其欧式距离恒为 ,因此对于理论上不存在什么 “小扰动”,因此本文中提出将扰动添加到Embedding层。

For text classification, the input is discrete, and usually represented as a series of highdimensional one-hot vectors. Because the set of high-dimensional one-hot vectors does not admit infinitesimal perturbation, we define the perturbation on continuous word embeddings instead of discrete word inputs.

在这里插入图片描述
此外,为避免出现不合理的优化解,在应用对抗训练前,先对embedding进行正则化处理, v k , v ‾ k 分 别 表 示 r a w e m b e d d i n g 、 n o r m a l i z e d e m b e d d i n g v_k,\overline v_k分别表示raw \ embedding、normalized \ embedding vk,vkraw embeddingnormalized embedding如下:
在这里插入图片描述
FSGM是每个方向上都走相同的一步,Goodfellow后续提出的FGM则是根据具体的梯度进行scale,得到更好的对抗样本:
在这里插入图片描述
FGSM&FGM 对抗步骤:

  1. 一切照常,计算前向loss,然后反向传播计算grad(注意这里不要更新梯度,即没有optimizer.step());
  2. 拿到embedding层的梯度,计算其norm,然后根据公式计算出r_adv,再将r_adv累加到原始embedding的样本上,即 x+r ,得到对抗样本;
  3. 根据新对抗样本 x+r ,计算新loss,在backward()得到对抗样本的梯度。由于是在step(1)之后又做了一次反向传播,所以该对抗样本的梯度是累加在原始样本的梯度上的;
  4. 将被修改的embedding恢复到原始状态(没加上r_adv 的时候);
  5. 使用step(3)的梯度(原始梯度+对抗梯度),对模型参数进行更新(optimizer.step()/scheduler.step()).

PGD(Projected Gradient Descent)

Paper:Towards Deep Learning Models Resistant to Adversarial Attacks
FGM 的思路是梯度上升,本质上来说没有什么问题,但是 FGM 简单粗暴的 “一步到位” 是不是有可能并不能走到约束内的最优点呢?当然是有可能的。于是,一个新的想法诞生了,Madry 在 18 年的 ICLR 中提出了 Projected Gradient Descent(PGD)方法,简单的说,就是 “小步走,多走几步”,如果走出了扰动半径为 的空间,就重新映射回 “球面” 上,以保证扰动不要过大:
在这里插入图片描述
PGD对抗具体步骤

对于每个x:
1.计算x的前向loss,反向传播得到梯度并备份;
对于每步t:
a)根据Embedding矩阵的梯度计算出r,并加到当前Embedding上,相当于x+r(超出范围则投影回epsilon内)
b)t不是最后一步: 将梯度归0,根据(1)的x+r计算前后向并得到梯度
c)t是最后一步: 恢复(1)的梯度,计算最后的x+r并将梯度累加到(1)上
2.将Embedding恢复为(1)时的值;
3.根据©的梯度对参数进行更新;

FreeAT (Free Adversarial Training)

Adversarial Training for Free!
在这里插入图片描述

FreeLB (Free Large-Batch Adversarial Training)

FREELB: ENHANCED ADVERSARIAL TRAINING FOR NATURAL LANGUAGE UNDERSTANDING
在这里插入图片描述

YOPO (You Only Propagate Once)

You Only Propagate Once: Accelerating Adversarial Training Using Maximal Principle
在这里插入图片描述
在这里插入图片描述

ALUM (Adversarial training for large neural LangUage Models)

Adversarial Training for Large Neural Language Models
在这里插入图片描述

SMART (SMoothness inducing Adversarial Regularization and BRegman pRoximal poinT opTimization)

SMART
在这里插入图片描述

Virtual Adversarial Training【虚拟对抗训练】

Virtual Adversarial Training: A Regularization Method for Supervised and Semi-Supervised Learning
在这里插入图片描述

下一篇,我们来看几种对抗方法的具体代码实现。

参考文献:
https://wmathor.com/index.php/archives/1537/


http://chatgpt.dhexx.cn/article/VDG59fGK.shtml

相关文章

【Python】MySQL数据库(安装MySQL、创建数据库、在Python中使用MySQL数据库)

MySQL是一个小巧的多用户、多线程SQL数据库服务器。MySQ是以客户机/服务器结构来实现的,它由一个服务器守护进程和客户程序组成。在Python中,可以使用pymysql模块连接到数据库,对MySQL数据库进行操作。 本文内容: 一、安装MySQL…

Python结合MySQL数据库编写简单信息管理系统

1,项目整体逻辑及使用工具 1.1 项目整体逻辑 本项目主要是使用Python进行编写,利用Python中的pymysql库进行连接数据库,将信息存入MySQL数据库中,然后实现对信息进行增删改查等一系列操作。 1.2 使用工具 (1&#…

十四、python学习之MySQL数据库(一):安装MySQL数据库

一、数据库概述: 1.数据库概述: 数据库是在数据管理和程序开发过程中,一种非常重要的数据管理软件,通过数据库,可以非常方便的对数据进行管理操作。 2.什么是数据: 数据用来描述事物的特征,…

Python操作MySQL库结(MySQL详细下载、安装、操控及第三方库中的使用)

​ 活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 学习日记(4) 目录 学习日记(4) 一、下载和安装MySQL 1、下载MySQL 2…

阿里云钉钉应用python后端开发之安装MySQL数据库

阿里云钉钉应用python后端开发之安装mysqlclient 在本系列文章中,项目需要选择MySQL作为默认数据库。 本篇为在Windows上安装mysqlclient。 在python后端开发中,可以选择的数据库有PostgreSQL, MariaDB, MySQL, or Oracle等,一般情况下&…

使用python对mysql数据库进行添加数据的操作

使用python连接mysql进行添加数据的操作 使用的是python3.6pymysql 1、导入pymysql,并创建数据库连接 import pymysql# 使用python连接mysql数据库,并对数据库添加数据的数据的操作 # 创建连接,数据库主机地址 数据库用户名称 密码 数据库…

基于PYTHON语言的工资管理系统制作(一)--MYSQL数据库的下载和安装

去官网下载MySQL Community Server社区免费版,网址如下:MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 因为我的开发环境是WINDOWS64位操作系统,所以我选了Windows版。 下载完毕后直接傻瓜化无脑全部安装…

Python数据库:MySQL数据库的详细介绍与安装

一、数据库的介绍 数据库(Database)是存储与管理数据的软件系统,就像一个存入数据的物流仓库。每个数据库都有一个或多个不同的API接口用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在…

python安装出现modify_Python安装MySQL数据库模块

背景 折腾: 的过程中,需要去安装MySQLdb。 下载MySQLdb 去官网: 看到有1.2.4和1.2.3 所以去最新的1.2.4: 下载对应的编译好的版本: 得到1MB的 MySQL-python-1.2.4.win32-py2.7.exe 安装MySQLdb 双击安装&am…

python+mysql搭建信息管理系统(内含源码)

效果展示: 一、环境 开头直接交代环境了 python 3.6pyqt5hashlibsipsystime 都是小包,容易倒,一般不会遇到坑,这里不做过多介绍。 二、搭建步骤与代码实例 2.1 首先需要一个主控台,界面如下: 2.2 登…

Python中使用MySQL

Python中使用MySQL 一、前言二、下载安装MySQL1.下载MySQL2.安转MySQL3.设置环境变量4.启动MySQL5.使用Navicat for MySQL管理软件 三、安装PyMySQL四、连接数据库五、创建数据表六、操作MySQL数据表 一、前言 MySQL是一款开源的数据库软件,由于其免费特性得到了全世…

总结:ubuntu或是win7系统下,利用python语言来使用数据库mysql一

准备:我用的是ubuntu12.04,win7系统。在这ubuntu系统下使用的python2.7.3,MySQL5.5;win7系统下使用的是python2.7.5,MySQL5.6。 这两个系统下,可能ubuntu系统更容易实现,所以先总结ubuntu系统下python使用数据库mysql。 一、ubuntu系统下python使用数据库mysql 1.如果…

Python之MYSQL数据库基础操作(DBeaver安装方法)

Python之MYSQL数据库基础操作 一、基本介绍1.驱动程序2.DBeaver(1)关于DBeaver(2)安装(3)配置镜像和建立连接(4)连接可能出现失败的原因及解决方法 二、数据库基础操作1.数据库连接操…

Python 操作MySql数据库(封装、优雅)

Python 记录操作MySql数据库(封装)——优雅 前言封装代码进行测试结果展示 前言 学了pymysql第三方库(pip install pymysql)来操作MySql数据库后,浅记一下对MySql进行 《关于我的MySql之优雅封装这件事儿》。这里只涉…

【100天精通python】Day32:使用python操作数据库_MySQL下载、安装、配置、使用实战

目录 专栏导读 1 MySQL概述 2 MySQL下载安装 2.1 下载 2.2 安装 2.3 配置 2.3.1 服务类型和网络配置: 2.3.2 连接配置: 2.3.3 账户和权限配置: 2.3.4 配置Windows Service : 2.3.5 服务器文件权限配置: 2.3…

Python 安装mysql数据库模块

方法一:命令行安装mysql模块 先找到Python安装目录下的Script文件 2.当前路径下进入cmd命令窗口,输入pip3 install pymysql 3.如上图所示就是安装成功 方法二:PyCharm下安装mysql数据库模块 1.点击File里的Settings 2.点击Project Interperte…

性能测试报告包括哪些内容?模板范文哪里找?看这里

目录 1 概述 2 系统简介 3 测试指标 4 测试工具和测试策略 5 测试结果数据以及截图 6 测试结论 1 概述 1.1性能测试概念 性能测试是通过自动化的测试工具模拟多种正常峰值及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两…

阿里云MaxCompute存取性能测试报告

阿里云MaxCompute存取性能测试报告 文章目录 阿里云MaxCompute存取性能测试报告前言MaxCompute介绍查询测试报告测试方案一测试方案二使用建议 写入测试报告测试方案一生成SQL的类 测试方案二测试方案三测试方案四使用建议 后记 前言 前几天公司给我安排了个任务,让…

【测试报告】Java文档搜索引擎性能测试报告

【测试报告】Java文档搜索引擎性能测试报告 10个线程---300秒(5分钟)概要吞吐量响应时间随时间变化 20个线程---300秒(5分钟)概要吞吐量响应时间随时间变化 10个线程—300秒(5分钟) 概要 吞吐量 响应时间 …

Jmeter导出性能测试报告

在电脑任意一个盘创建一个存放Jmeter文件的文件夹。我这里创建在F盘 2. 打开Jmeter你需要导出的执行文件的工程文件,连计划一起保存到创建的Jmeter_project文件夹里面。(如果不是计划一起保存会出现报错) 编写Jmeter导入测试报告语句。 jme…