|
""" |
|
|
|
Seq2Sick |
|
================================================ |
|
(Seq2Sick: Evaluating the Robustness of Sequence-to-Sequence Models with Adversarial Examples) |
|
""" |
|
from textattack import Attack |
|
from textattack.constraints.overlap import LevenshteinEditDistance |
|
from textattack.constraints.pre_transformation import ( |
|
RepeatModification, |
|
StopwordModification, |
|
) |
|
from textattack.goal_functions import NonOverlappingOutput |
|
from textattack.search_methods import GreedyWordSwapWIR |
|
from textattack.transformations import WordSwapEmbedding |
|
|
|
from .attack_recipe import AttackRecipe |
|
|
|
|
|
class Seq2SickCheng2018BlackBox(AttackRecipe): |
|
"""Cheng, Minhao, et al. |
|
|
|
Seq2Sick: Evaluating the Robustness of Sequence-to-Sequence Models with |
|
Adversarial Examples |
|
|
|
https://arxiv.org/abs/1803.01128 |
|
|
|
This is a greedy re-implementation of the seq2sick attack method. It does |
|
not use gradient descent. |
|
""" |
|
|
|
@staticmethod |
|
def build(model_wrapper, goal_function="non_overlapping"): |
|
|
|
|
|
|
|
goal_function = NonOverlappingOutput(model_wrapper) |
|
transformation = WordSwapEmbedding(max_candidates=50) |
|
|
|
|
|
|
|
constraints = [RepeatModification(), StopwordModification()] |
|
|
|
|
|
|
|
|
|
constraints.append(LevenshteinEditDistance(30)) |
|
|
|
|
|
|
|
search_method = GreedyWordSwapWIR(wir_method="unk") |
|
|
|
return Attack(goal_function, constraints, transformation, search_method) |
|
|