Spaces:
Sleeping
Sleeping
""" | |
Improved Genetic Algorithm | |
============================= | |
(Natural Language Adversarial Attacks and Defenses in Word Level) | |
""" | |
from textattack import Attack | |
from textattack.constraints.overlap import MaxWordsPerturbed | |
from textattack.constraints.pre_transformation import StopwordModification | |
from textattack.constraints.semantics import WordEmbeddingDistance | |
from textattack.goal_functions import UntargetedClassification | |
from textattack.search_methods import ImprovedGeneticAlgorithm | |
from textattack.transformations import WordSwapEmbedding | |
from .attack_recipe import AttackRecipe | |
class IGAWang2019(AttackRecipe): | |
"""Xiaosen Wang, Hao Jin, Kun He (2019). | |
Natural Language Adversarial Attack and Defense in Word Level. | |
http://arxiv.org/abs/1909.06723 | |
""" | |
def build(model_wrapper): | |
# | |
# Swap words with their embedding nearest-neighbors. | |
# Embedding: Counter-fitted Paragram Embeddings. | |
# Fix the hyperparameter value to N = Unrestricted (50)." | |
# | |
transformation = WordSwapEmbedding(max_candidates=50) | |
# | |
# Don't modify the stopwords | |
# | |
constraints = [StopwordModification()] | |
# | |
# Maximum words perturbed percentage of 20% | |
# | |
constraints.append(MaxWordsPerturbed(max_percent=0.2)) | |
# | |
# Maximum word embedding euclidean distance δ of 0.5. | |
# | |
constraints.append( | |
WordEmbeddingDistance(max_mse_dist=0.5, compare_against_original=False) | |
) | |
# | |
# Goal is untargeted classification | |
# | |
goal_function = UntargetedClassification(model_wrapper) | |
# | |
# Perform word substitution with an improved genetic algorithm. | |
# Fix the hyperparameter values to S = 60, M = 20, λ = 5." | |
# | |
search_method = ImprovedGeneticAlgorithm( | |
pop_size=60, | |
max_iters=20, | |
max_replace_times_per_index=5, | |
post_crossover_check=False, | |
) | |
return Attack(goal_function, constraints, transformation, search_method) | |