Source code for textattack.attack_recipes.iga_wang_2019

"""

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


[docs]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 """
[docs] @staticmethod 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)