Spaces:
Runtime error
Runtime error
""" | |
Particle Swarm Optimization | |
================================== | |
(Word-level Textual Adversarial Attacking as Combinatorial Optimization) | |
""" | |
from textattack import Attack | |
from textattack.constraints.pre_transformation import ( | |
InputColumnModification, | |
RepeatModification, | |
StopwordModification, | |
) | |
from textattack.goal_functions import UntargetedClassification | |
from textattack.search_methods import ParticleSwarmOptimization | |
from textattack.transformations import WordSwapHowNet | |
from .attack_recipe import AttackRecipe | |
class PSOZang2020(AttackRecipe): | |
"""Zang, Y., Yang, C., Qi, F., Liu, Z., Zhang, M., Liu, Q., & Sun, M. | |
(2019). | |
Word-level Textual Adversarial Attacking as Combinatorial Optimization. | |
https://www.aclweb.org/anthology/2020.acl-main.540.pdf | |
Methodology description quoted from the paper: | |
"We propose a novel word substitution-based textual attack model, which reforms | |
both the aforementioned two steps. In the first step, we adopt a sememe-based word | |
substitution strategy, which can generate more candidate adversarial examples with | |
better semantic preservation. In the second step, we utilize particle swarm optimization | |
(Eberhart and Kennedy, 1995) as the adversarial example searching algorithm." | |
And "Following the settings in Alzantot et al. (2018), we set the max iteration time G to 20." | |
""" | |
def build(model_wrapper): | |
# | |
# Swap words with their synonyms extracted based on the HowNet. | |
# | |
transformation = WordSwapHowNet() | |
# | |
# Don't modify the same word twice or stopwords | |
# | |
constraints = [RepeatModification(), StopwordModification()] | |
# | |
# | |
# During entailment, we should only edit the hypothesis - keep the premise | |
# the same. | |
# | |
input_column_modification = InputColumnModification( | |
["premise", "hypothesis"], {"premise"} | |
) | |
constraints.append(input_column_modification) | |
# | |
# Use untargeted classification for demo, can be switched to targeted one | |
# | |
goal_function = UntargetedClassification(model_wrapper) | |
# | |
# Perform word substitution with a Particle Swarm Optimization (PSO) algorithm. | |
# | |
search_method = ParticleSwarmOptimization(pop_size=60, max_iters=20) | |
return Attack(goal_function, constraints, transformation, search_method) | |