AI-NLP_Model_Attack-羊城杯2024
大约 3 分钟
Introduction
使用清华大学 OpenAttack 库中的 PWWS(概率加权词显著性攻击方法对类似 BERT 的语言模型执行对抗性攻击。
BERT (Bidirectional Encoder Representations from Transformers): BERT 是由 Google 开发的一种强大的语言模型,它显着提高了各种 NLP 任务的最新技术水平。它使用 Transformer 架构,并在大型文本语料库上进行了预训练,以双向理解句子中单词的上下文。
NLP 中的对抗性攻击: 对抗性攻击包括对输入数据(例如文本)进行轻微修改,以欺骗模型做出错误的预测。这些攻击通过观察 BERT 等模型处理扰动输入的能力来测试它们的鲁棒性。
PWWS: PWWS 攻击是一种单词级对抗性攻击,它根据单词对分类任务的重要性,将文本中的单词替换为同义词。目标是通过对输入文本进行最小但具有战略性的修改来更改模型的预测。
贪婪算法: PWWS 使用贪婪算法在每一步中选择要替换的最佳单词。它评估每个潜在替换对模型输出的影响,选择最能破坏模型预测置信度的替换。
Code Explanation
首先:创建csv阅读器
with open('original_text.csv', mode='r', encoding='utf-8') as file:
# 创建CSV阅读器
reader = csv.DictReader(file)
# 创建一个字典来存储转换后的数据
data_dict = {
"x": [
],
"y": [
]
}
# 遍历CSV文件中的每一行
for row in reader:
# 将'text'列的值添加到data_dict的'x'键下
data_dict['x'].append(row['text'])
# 将'original_label'列的值添加到data_dict的'y'键下
data_dict['y'].append(int(row['original_label'])) # 假设original_label是整数
- labels.csv 文件
original_text.csv
包含文本数据及其相应的标签。 - 该脚本读取此数据并将其存储在
data_dict
键为x
(文本)和y
(标签)的字典中。
tokenizer = DistilBertTokenizer.from_pretrained('Sentiment_classification_model')
model = DistilBertForSequenceClassification.from_pretrained('Sentiment_classification_model').to('cuda')
victim = oa.classifiers.TransformersClassifier(model, tokenizer, model.distilbert.embeddings.word_embeddings, 'cuda')
- 该脚本使用
Sentiment_classification_model
检查点加载预训练的DistilBERT
模型和分词器,该检查点可能已针对情感分类任务进行了微调。 - 然后,该模型被包装在 OpenAttack 的
TransformersClassifier
中,使其与 OpenAttack 框架兼容。
attacker = oa.attackers.PWWSAttacker()
dataset = datasets.Dataset.from_dict(data_dict)
attack_eval = oa.AttackEval(attacker, victim, metrics = [oa.metric.EditDistance(), oa.metric.ModificationRate()])
attack_eval.eval(dataset, visualize=True)
- PWWS 攻击者使用
oa.attackers.PWWSAttacker()
进行实例化。此对象负责通过修改 input 文本来生成对抗性示例。 - 字典
data_dict
将转换为datasets.Dataset
对象,这是运行攻击所必需的。 AttackEval
对象用于评估攻击的有效性。它采用攻击者、受害者模型和评估指标,如EditDistance
(衡量输入的更改量)和ModificationRate
(修改的单词的百分比)。- 攻击使用
attack_eval.eval
运行,并且 visualize=True
参数表示将显示结果。
流程
- 加载数据: 原始文本和相应的标签是从 CSV 文件中读取的。
- 设置模型: 加载在情感分类任务上微调的 DistilBERT 模型。此模型将充当对抗性攻击试图欺骗的 “受害者”。
- 准备攻击者: PWWS 攻击者被配置为基于贪婪算法执行对抗性单词替换。
- 运行攻击: 攻击在数据集上执行,结果(例如,攻击的成功程度、必须更改的文本量)使用预定义的指标进行评估。
完整exp:
import OpenAttack as oa
import numpy as np
import torch
import datasets
import transformers
from transformers import DistilBertTokenizer, DistilBertForSequenceClassification
import csv
from collections import defaultdict
with open('original_text.csv', mode='r', encoding='utf-8') as file:
# 创建CSV阅读器
reader = csv.DictReader(file)
# 创建一个字典来存储转换后的数据
data_dict = {
"x": [
],
"y": [
]
}
# 遍历CSV文件中的每一行
for row in reader:
# 将'text'列的值添加到data_dict的'x'键下
data_dict['x'].append(row['text'])
# 将'original_label'列的值添加到data_dict的'y'键下
data_dict['y'].append(int(row['original_label'])) # 假设original_label是整数
tokenizer = DistilBertTokenizer.from_pretrained('Sentiment_classification_model')
model = DistilBertForSequenceClassification.from_pretrained('Sentiment_classification_model').to('cuda')
victim = oa.classifiers.TransformersClassifier(model, tokenizer, model.distilbert.embeddings.word_embeddings, 'cuda')
attacker = oa.attackers.PWWSAttacker()
dataset = datasets.Dataset.from_dict(data_dict)
attack_eval = oa.AttackEval(attacker, victim, metrics = [oa.metric.EditDistance(), oa.metric.ModificationRate()])
attack_eval.eval(dataset, visualize=True)