Kurs: sieci neuronowe od środka · Lekcja 9 z 12 · 13 min
Co sieć naprawdę widzi: skróty i ataki
W skrócie
Wysoka trafność testowa nie dowodzi, że sieć nauczyła się zadania. Celowana drobna zmiana pikseli myli ją bardziej niż szum, a model chętnie uczy się skrótu.
Rozgrzewka Dwa pytania z kursu ML, na których ta lekcja się opiera. Minuta, a lekcji nie blokuje.
Test z odłożonych danych mówi, jak sieć radzi sobie z przykładami podobnymi do treningowych. Nie mówi, na co patrzy. Są dwa proste sprawdziany. Atak szuka najmniejszej zmiany wejścia, która myli sieć. Test, w którym podejrzaną zależność zrywasz albo odwracasz, sprawdza, czy model nie nauczył się skrótu: cechy, która w danych przypadkiem towarzyszy klasie.
Wybierz odpowiedź i pewność.
Odpowiedz, żeby odblokować lab.
Pokaż odpowiedź
Poprawna odpowiedź: Mniej niż połowę
41,8%. Losowy szum tej samej siły, każdy piksel o 2 poziomy w górę albo w dół, obniża trafność tylko do 95,0%.
Spróbuj
- Lab startuje bez ataku: 97,5%. Przesuwaj suwak ε. Cel: najmniejsza siła ataku, przy której trafność spada poniżej 80%.
- Przy każdej sile porównaj dwie linie wykresu: atak i losowy szum ±ε. Szum prawie nie szkodzi, atak tak.
- Kliknij „inna cyfra testowa” i spójrz na środkowy obrazek. Zmiana wygląda jak szum, ale nim nie jest.
Pomysł w prostych słowach
Atak FGSM to propagacja wsteczna z lekcji 5 z jedną zmianą: gradient straty liczy się względem pikseli, nie wag. Mówi, w którą stronę przesunąć każdy piksel, żeby błąd rósł najszybciej. Atak przesuwa każdy piksel o ε w tę stronę. Każdy piksel dokłada mało, ale wszystkie 64 dokładają w tę samą stronę. Losowy szum przesuwa piksele w przypadkowe strony, więc większość zmian się znosi.
Skrót działa inaczej. Model uczy się każdej zależności, która obniża stratę. Jeśli w treningu prawie każda trójka ma w rogu pieczątkę, pieczątka jest łatwiejsza do nauczenia niż kształt trójki.
Dlaczego to działa
Weź liniowy wynik z = w·x. Atak zmienia go o ε · Σ|wᵢ|, bo każdy składnik dokłada się z tym samym znakiem. Losowe znaki dają typowo tylko ε · √(Σwᵢ²). Stosunek rośnie jak pierwiastek z liczby pikseli. W kodzie atak jest 7,2 raza silniejszy od szumu przy 64 pikselach, 25,2 raza przy obrazku 28×28 i 349,3 raza przy zdjęciu 224×224×3. Duże obrazy dają atakowi więcej miejsca.
Skrót pokazuje widżet ze znakiem wodnym z działu „Prawa”. To regresja logistyczna, nie sieć, ale mechanizm jest ten sam: model nie wie, która zależność jest zamierzona. Kwadrat 2×2 w rogu ma 90% treningowych trójek i żadna inna cyfra. Na teście z tą samą zależnością model ma 96,4%. Gdy znak trafia na inne cyfry, trafność spada do 71,9%, a 84 z 322 cyfr model bierze za „3”.
Częsty błąd
Prawda czy fałsz: „97% na teście znaczy, że sieć rozumie cyfry.” Fałsz. Test z tego samego źródła sprawdza tylko przykłady podobne do treningu. Atak o sile 2 poziomów obniża trafność sieci z 97,5% do 41,8%. Na pięciu startach wag ten atak zostawia mniej niż 45%, a szum tej samej siły ponad 90%. Model ze znakiem wodnym ma 96,4% na teście z tą samą zależnością, 93,0% na cyfrach bez znaku i 71,9%, gdy znak trafia na inne cyfry. Już bez znaku rozpoznaje tylko 23 z 37 trójek, a model bez znaku w treningu 33, bo uczył się znaku zamiast kształtu. Na pięciu losowaniach trójek ze znakiem test bez znaku daje 92–94% i najwyżej 25 z 37 trójek, a test ze znakiem na innych cyfrach za każdym razem spada poniżej 75%.
Quiz
Trzy pytania na sprawdzenie się. Wybierz odpowiedź albo rozwiń odpowiedź pod pytaniem. Z klawiatury: strzałki wybierają, Enter albo spacja zatwierdza.
Najważniejsze wnioski
- Trafność na teście z tego samego źródła nie mówi, na co model patrzy.
- Atak w kierunku gradientu myli sieć zmianą, której szum tej samej siły nie robi: 41,8% kontra 95,0%.
- Skrót to zależność, która działa w danych, ale nie w świecie; ujawnia go test, w którym podejrzaną zależność zrywasz albo odwracasz.
- Odporność i brak skrótów trzeba sprawdzić osobno, zwykły test tego nie zrobi.
Głębiej: wzór, kod, praktyka
Matematyka
Atak FGSM (fast gradient sign method): x' = clip(x + ε · sign(∇ₓ L(x, y)), 0, 1), gdzie ε to poziomy jasności podzielone przez 16.
- Wynik liniowy
z = w·x: atakδ = ε · sign(w)zmienia z ow·δ = ε · Σ|wᵢ|. - Losowe znaki
sᵢ = ±1:E[Σ wᵢ sᵢ] = 0, a odchylenie standardowe to√(Σ wᵢ²), więc typowa zmiana toε · √(Σ wᵢ²). - Stosunek
Σ|wᵢ| / √(Σ wᵢ²)leży między 1 a√n, gdzie n to liczba pikseli; dla wag podobnej wielkości jest bliski√n. - Skrót: gdy cecha s towarzyszy klasie w treningu, model obniża stratę, korzystając z s. Gdy na nowych danych ta zależność znika albo się odwraca, błąd rośnie, choć test z tą samą zależnością wyglądał dobrze.
W kodzie (Python)
Atak i szum na liniowym wyniku z = w·x w numpy. Wagi są bez losowania, a typową zmianę przy losowych znakach daje wzór z warstwy „Matematyka”:
import numpy as np
# liniowy wynik z = w·x: atak przesuwa każdy piksel o eps w stronę znaku jego wagi, szum w losowe strony
eps = 2 / 16 # 2 poziomy jasności z 16
for n in [64, 784, 150528]: # cyfra 8×8, obrazek 28×28, zdjęcie 224×224×3
w = np.cos(np.arange(n)) # wagi bez losowania, każda między −1 a 1
attack = eps * np.abs(w).sum() # zmiana z po ataku: w·(eps·sign(w))
noise = eps * np.sqrt((w ** 2).sum()) # typowa zmiana z przy losowych znakach (odchylenie standardowe)
print(f"n = {n:6d}: attack {attack:8.1f}, noise {noise:6.2f}, ratio {attack / noise:5.1f}")
Wynik
n = 64: attack 5.1, noise 0.71, ratio 7.2
n = 784: attack 62.4, noise 2.48, ratio 25.2
n = 150528: attack 11978.7, noise 34.29, ratio 349.3
Przy tej samej sile zmiany każdego piksela atak rośnie z liczbą pikseli szybciej niż szum. Sieć nie jest liniowa, ale jej warstwy w dużej części są, i to wystarcza atakowi. Uruchomione w numpy 2.1.3.
Pobierz notebook (.ipynb). Otwórz go w Jupyterze albo wgraj do Google Colab; brakujące dane pobierze sam.
Dla praktyka
- Zanim zaufasz wynikowi, sprawdź model na danych z innego źródła: innego szpitala, aparatu albo okresu, a nie tylko na odłożonym kawałku tego samego zbioru.
- Szukaj skrótów: porównaj błędy na podgrupach i zobacz, na które piksele patrzy model (mapy wyróżnień).
- Losowy szum w augmentacji nie chroni przed atakiem, bo atak nie jest losowy. Przed atakami chroni trening adwersarialny: przykłady z ataku dokłada się do treningu.
- Raportuj osobno trafność na zwykłym teście, na teście z innego źródła i po ataku. Jedna liczba ukrywa różnice.
Więcej w Atlasie
Hasła encyklopedii o pojęciach z tej lekcji: