26.1.1. FGSM, PGD, C&W implementációk

2025.10.06.
AI Biztonság Blog

Tévhit vs. Valóság

A tévhit: A képosztályozók elleni adverzális támadások csak véletlenszerű zajt adnak a képhez, amíg a modell meg nem zavarodik.

Kapcsolati űrlap

AI Biztonság kérdésed van? Itt elérsz minket:

A valóság: A leghatékonyabb támadások matematikailag precízen kiszámított, a modell belső működését (a gradienseit) kihasználó, célzott perturbációk. Nem zajok, hanem a modell Achilles-sarkát célzó, láthatatlanul apró módosítások. Ebben a fejezetben három klasszikus, gradienalapú módszer implementációját nézzük meg.

FGSM: A gyors első lépés (Fast Gradient Sign Method)

Az FGSM a legegyszerűbb és leggyorsabb gradienalapú támadás. Lényege, hogy egyetlen lépésben módosítja a bemeneti képet. Kiszámolja a veszteségi függvény gradiensét a bemeneti képhez képest, majd veszi a gradiens előjelét. Ezt az előjel-mátrixot megszorozza egy kicsi ε (epszilon) értékkel, és hozzáadja az eredeti képhez. Gyors, de gyakran könnyen kivédhető.

A képlet egyszerű: x' = x + ε · sign(∇xJ(θ, x, y)), ahol x' a perturbált kép, x az eredeti, ε a perturbáció mértéke, J a veszteségi függvény, θ a modell súlyai és y a valódi címke.


import torch
import torch.nn.functional as F

def fgsm_attack(image, epsilon, data_grad):
 # Gyűjtsük össze a gradiens előjelét
 sign_data_grad = data_grad.sign()
 
 # Hozzuk létre a perturbált képet a gradiens előjelének felhasználásával
 perturbed_image = image + epsilon * sign_data_grad
 
 # A pixelértékeket tartsuk a [0,1] tartományban
 perturbed_image = torch.clamp(perturbed_image, 0, 1)
 
 # Adjuk vissza a megtámadott képet
 return perturbed_image

# ... a modell előrecsatolása és a veszteség kiszámítása után ...
# image.requires_grad = True
# loss.backward()
# data_grad = image.grad.data
# perturbed_data = fgsm_attack(image, epsilon, data_grad)

PGD: Az iteratív erő (Projected Gradient Descent)

A PGD az FGSM iteratív, erősebb változata. Ahelyett, hogy egyetlen nagy lépést tenne, a PGD több apró lépést tesz. Minden lépés után „visszavetíti” (project) a perturbációt egy adott norma (általában L) által definiált gömbbe. Ez biztosítja, hogy a teljes perturbáció ne lépje túl a megengedett ε értéket. Sokkal hatékonyabb, mint az FGSM, és gyakran használják a modellek robusztusságának tesztelésére.


import torch

def pgd_attack(model, images, labels, eps=0.3, alpha=2/255, iters=40):
 images = images.clone().detach()
 labels = labels.clone().detach()
 
 loss = torch.nn.CrossEntropyLoss()
 
 original_images = images.clone().detach()
 
 for i in range(iters):
 images.requires_grad = True
 outputs = model(images)

 model.zero_grad()
 cost = loss(outputs, labels).to(device)
 cost.backward()

 # Az FGSM lépés iteratív alkalmazása
 adv_images = images + alpha * images.grad.sign()
 
 # Visszavetítés az epszilon-környezetbe
 eta = torch.clamp(adv_images - original_images, min=-eps, max=eps)
 images = torch.clamp(original_images + eta, min=0, max=1).detach()
 
 return images

C&W: Az optimalizált precizitás (Carlini & Wagner)

A Carlini & Wagner támadás egy teljesen más megközelítést alkalmaz. Ez egy optimalizáció-alapú támadás, amelynek célja, hogy megtalálja a lehető legkisebb perturbációt, ami a modellt téves osztályozásra készteti, ráadásul nagy magabiztossággal. Sokkal lassabb, mint az FGSM vagy a PGD, de rendkívül hatékony és nehezen detektálható, mivel a létrehozott perturbációk minimálisak. Ahelyett, hogy a veszteséget maximalizálná, egy olyan célfüggvényt minimalizál, ami egyszerre bünteti a perturbáció nagyságát és a helyes osztály valószínűségét.

Az implementációja komplex, ezért a gyakorlatban általában meglévő keretrendszereket, mint az Adversarial Robustness Toolbox (ART), használunk a futtatásához.


# Példa az ART (Adversarial Robustness Toolbox) könyvtár használatával
from art.attacks.evasion import CarliniL2Method
from art.estimators.classification import PyTorchClassifier

# 1. Készítsünk egy ART-kompatibilis wrapper-t a PyTorch modellünkhöz
classifier = PyTorchClassifier(
 model=model,
 clip_values=(0, 1),
 loss=torch.nn.CrossEntropyLoss(),
 optimizer=optimizer,
 input_shape=(1, 28, 28),
 nb_classes=10,
)

# 2. Hozzunk létre egy C&W támadási objektumot
attack = CarliniL2Method(classifier=classifier, max_iter=100, confidence=0.0)

# 3. Generáljuk le az adverzális példákat
x_test_adv = attack.generate(x=x_test)

Gyors összehasonlítás

Az alábbi táblázat összefoglalja a három támadás legfontosabb tulajdonságait, hogy segítsen eldönteni, melyiket mikor érdemes használnod a red teaming feladatok során.

Támadás Sebesség Hatékonyság Komplexitás Fő jellemző
FGSM Nagyon gyors Alacsony Alacsony Egyetlen gradiens lépés. Jó kiindulási alap.
PGD Mérsékelt Magas Mérsékelt Iteratív, robusztus támadás. Standard benchmark.
C&W Lassú Nagyon magas Magas Optimalizáció-alapú, a legkisebb perturbációt keresi.

Melyiket mikor használd?

A red teaming során a sebesség és a hatékonyság közötti kompromisszum a döntő. Kezdj egy gyors FGSM támadással, hogy felmérd a modell alapvető sebezhetőségét. Ha ez sikertelen, vagy egy erősebb ellenállást feltételezel, a PGD a következő logikus lépés – ez egyfajta ipari sztenderd a robusztusság mérésére. Ha pedig a cél a modell abszolút korlátainak feltérképezése, és a lehető legészrevétlenebb támadás generálása, akkor a számításigényesebb C&W a megfelelő eszköz.