Mielőtt egyetlen sor kódot is írnánk az FGSM (Fast Gradient Sign Method) implementálásához, elengedhetetlen megérteni a mögötte rejlő logikát. Miért működik? Mi az a „gradiens”, és miért pont az előjelét használjuk? Ez a fejezet nem egy száraz matematikaóra, hanem egy intuitív alapozás, ami a gyakorlati implementációt is sokkal világosabbá teszi.
A gradiens, mint a megtévesztés iránytűje
Képzelj el egy neurális hálót, ami egy képet próbál osztályozni. A hálózat „döntésének” magabiztossága egyfajta többdimenziós tájként fogható fel. Ezen a tájon a völgyek a helyes, magabiztos döntéseket jelentik, a hegycsúcsok pedig a hibásakat. A bemeneti képünk – mondjuk egy macska fotója – egy pont ebben a tájban, ami ideális esetben egy mély völgyben helyezkedik el, a „macska” feliratú völgyben.
A célunk az, hogy ezt a pontot (a képet) a lehető legkisebb módosítással átmozgassuk egy másik, hibás völgybe vagy egy hegytetőre, ahol a modell már bizonytalan, vagy teljesen rossz döntést hoz. De merre induljunk?
Itt jön képbe a gradiens. A gradiens egy vektor, ami a táj adott pontján a legnagyobb meredekségű emelkedő irányába mutat. Vagyis megmondja, hogy a bemeneti képpontokat (pixeleket) hogyan kellene megváltoztatnunk ahhoz, hogy a modell hibája (a veszteségfüggvény, angolul loss function) a leggyorsabban növekedjen. Lényegében a gradiens a leghatékonyabb út a „hegyre fel”, a hibás döntés felé.
Az FGSM képlete és annak lebontása
Az elméletet a gyakorlatba a következő egyszerű képlet ülteti át:
Lehet, hogy elsőre ijesztőnek tűnik, de valójában minden elemének világos, logikus jelentése van. Bontsuk szét!
| Jelölés | Magyarázat |
|---|---|
| x’ | Az új, módosított (adversarial) bemenet. Ez lesz az a kép, amivel megpróbáljuk átverni a modellt. |
| x | Az eredeti, „tiszta” bemenet (pl. a macskás kép). |
| ε (epszilon) | Egy kicsi, skalár érték, ami a zaj mértékét szabályozza. Ez a mi „tekerőgombunk”: nagyobb ε erősebb, de jobban észrevehető támadást eredményez, míg a kisebb ε finomabb, de potenciálisan gyengébb módosítást jelent. |
| J(θ, x, y) | A modell veszteségfüggvénye. Ez méri, hogy a modell (paraméterei: θ) mennyire téved az x bemenet és az igazi címke (y) alapján. A célunk ennek az értéknek a növelése. |
| ∇x J(…) | A veszteségfüggvény gradiense a bemeneti kép (x) szerint. Ahogy tárgyaltuk, ez a vektor mutat abba az irányba, amerre a pixeleket változtatva a veszteség a leggyorsabban nő. |
| sign(…) | Az előjelfüggvény (signum). Ez a támadás „gyors” (Fast) része. Ahelyett, hogy a gradiens vektor pontos értékeit használnánk, csak az irányát vesszük figyelembe: minden elemét +1-re, -1-re vagy 0-ra cseréljük. Ezzel a számítás drasztikusan leegyszerűsödik, és egy egységes „zajmintázatot” kapunk. |
Miért pont az előjel (sign)?
A gradiens vektor egyes elemei nagyon különböző nagyságúak lehetnek. Ha egyszerűen csak hozzáadnánk a gradiens egy kis részét a képhez, akkor egyes pixelek alig, mások pedig drasztikusan változnának. A sign függvény használatával ezt elkerüljük. Minden pixelhez vagy hozzáadunk +ε-t, vagy kivonunk belőle -ε-t (vagy nem változtatjuk, ha a gradiens nulla). Ez egyenletes, finom szemcséjű zajt eredményez, ami kevésbé feltűnő az emberi szem számára, miközben hatékonyan „löki” a képet a döntési határ rossz oldalára.
Lényegében az FGSM mögött az a feltételezés áll, hogy a neurális hálózatok lokálisan lineárisan viselkednek. Ezt a linearitást használjuk ki azzal, hogy egyetlen, jól irányzott lépést teszünk a hiba maximalizálásának irányába. A következő fejezetekben meglátod, hogy ez a meglepően egyszerű elv a gyakorlatban milyen hatékony tud lenni.