ML Atlas

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.
Z kursu ML, lekcja 4.5: Wyciek danych Wybór 10 kolumn na wszystkich 60 próbkach daje w walidacji krzyżowej 81,7% na czystym szumie. Skąd ten wynik?

Pokaż odpowiedź

Poprawna odpowiedź: Kolumny wybrano także pod etykiety próbek, które potem udają test

Przy wyborze w każdym foldzie tylko na danych do nauki ten sam model ma 43,3%. W 20 nowych zbiorach szumu średnio 86,6% z wyciekiem i 49,8% uczciwie.

Z kursu ML, lekcja 1.3: Punkt odniesienia: z czym porównujesz model? W teście jest 108 biopsji, w tym 1 złośliwa. „Zawsze łagodny” ma 99,1%, reguła 90,7%. Który model jest lepszy do badań przesiewowych?

Pokaż odpowiedź

Poprawna odpowiedź: Reguła, bo wykrywa złośliwą, a „zawsze łagodny” nie wykryje nigdy

Przy rzadkiej klasie trafność nagradza ignorowanie jej. „Zawsze łagodny” nie wykryje żadnej złośliwej biopsji, niezależnie od tego, ile ich będzie.

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.

Przewidź, potem sprawdź Sieć 64 → 64 → 10 rozpoznaje 97,5% cyfr testowych. Atak przesuwa każdy piksel o 2 poziomy jasności (z 16) w stronę, która najbardziej zwiększa błąd. Ile cyfr sieć rozpozna po ataku?
Jak bardzo jesteś pewny(-a)?

Eksperyment

Ten interaktywny eksperyment działa w przeglądarce z włączonym JavaScriptem. Tekst wokół opisuje, co w nim widać. W eksperymencie: Sieć 64→64→10 rozpoznaje 97,5% z 359 cyfr testowych; atak FGSM przesuwający każdy piksel o 1 poziom jasności (z 16) obniża trafność do 78,3%, o 2 poziomy do 41,8%, a losowy szum ±2 tylko do 95,0%.

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.

1. Co robi atak FGSM?
Pokaż odpowiedź

Poprawna odpowiedź: Liczy gradient straty względem pikseli i przesuwa każdy piksel o ε w stronę jego znaku

Wagi zostają bez zmian; zmienia się tylko wejście, w kierunku, który najszybciej zwiększa błąd.

2. Atak o sile 2 poziomów: 41,8%. Losowy szum tej samej siły: 95,0%. Co z tego wynika?
Pokaż odpowiedź

Poprawna odpowiedź: Liczy się kierunek zmiany, nie jej wielkość

Oba przesuwają piksele o tyle samo; atak dokłada wszystkie zmiany w stronę błędu, szum w przypadkowe strony.

3. Model ma 96,4% na teście, ale 71,9%, gdy znak wodny trafia na inne cyfry. Co się stało?
Pokaż odpowiedź

Poprawna odpowiedź: Model nauczył się skrótu: znaku w rogu zamiast kształtu trójki

84 z 322 cyfr ze znakiem model bierze za „3”, bo w treningu znak miały tylko trójki.

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 o w·δ = ε · Σ|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.

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: