ML Atlas

Kurs: sieci neuronowe od środka · Lekcja 10 z 12 · 14 min

Konwolucja: ten sam filtr w każdym miejscu

W skrócie

Jądro 3×3 sprawdza każde miejsce obrazu tymi samymi 9 wagami. Mapa cech, padding i współdzielenie wag: 80 liczb zamiast 2080, a na cyfrach 8×8 trafność podobna.

Rozgrzewka Dwa pytania z kursu ML, na których ta lekcja się opiera. Minuta, a lekcji nie blokuje.
Z kursu ML, lekcja 7.1: Sieci neuronowe: wiele prostych elementów razem Co daje dodanie neuronów ukrytych?

Pokaż odpowiedź

Poprawna odpowiedź: Daje elastyczność: złożone granice, ale też ryzyko uczenia się na pamięć

Więcej neuronów to więcej możliwych zgięć, które mogą uchwycić prawdziwą strukturę albo przeuczyć model, zależnie od danych.

Z kursu ML, lekcja 4.4: Inżynieria cech Prawda czy fałsz: „więcej cech to lepszy model”.

Pokaż odpowiedź

Poprawna odpowiedź: Fałsz, bo cechy bez informacji dokładają szum i potrafią obniżyć trafność

200 kolumn szumu obniża kNN z 98,1% do 77,4%. Pomaga cecha z informacją w dobrym kształcie, jak x² dla odmiany 2.

MLP z lekcji 2 traktuje 64 piksele cyfry jak 64 osobne liczby. Każdy piksel ma własne wagi, a sieć nie wie, które piksele leżą obok siebie. Konwolucja (splot) działa inaczej. Małe jądro (filtr) 3×3 przesuwa się po obrazie. W każdym położeniu mnoży 9 pikseli przez te same 9 wag i sumuje. Wyniki składają się w mapę cech: obraz tego, gdzie jądro znalazło swój wzorzec.

Przewidź, potem sprawdź Jądro krawędzi pionowych ma po lewej wagi ujemne, a po prawej dodatnie. Przesuwa się po cyfrze zero. Gdzie odpowiedź będzie najsilniejsza?
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: jądro 3×3 przesuwa się po cyfrze 8×8 i tworzy mapę cech 6×6 (8×8 z paddingiem 1); dla zera jądro krawędzi pionowych daje wartości od −47 do 55, a najsilniejsza odpowiedź leży na lewym brzegu kreski.

Pokaż odpowiedź

Poprawna odpowiedź: Na lewym brzegu kreski, gdzie jasność rośnie w prawo

Na lewym brzegu kreski: 55. Cała mapa ma wartości od −47 do 55. Wartość ujemna znaczy, że jasność maleje w prawo, czyli prawy brzeg kreski. Środkowa kolumna jądra ma wagi 0, więc jasność samego piksela w środku okna nic nie zmienia.

Spróbuj

  • Lab startuje na zerze z jądrem krawędzi pionowych. Najsilniejsza odpowiedź, 55, ma żółtą ramkę na obrazie i na mapie.
  • Cel: wybierz cyfrę 7 i znajdź jądro, które najmocniej reaguje na jej poziomą kreskę.
  • Przełącz padding. Bez niego mapa ma 6×6, bo okno 3×3 mieści się w 6 położeniach na 8 pikselach. Z paddingiem 1 obraz dostaje ramkę zer, a mapa ma 8×8.

Pomysł w prostych słowach

Jądro to mały wzorzec do szukania. Jądro krawędzi pionowych ma po lewej wagi −1, −2, −1, a po prawej 1, 2, 1. Gdzie po prawej jest jaśniej niż po lewej, wynik jest duży i dodatni. Gdzie obie strony są tak samo jasne, wynik to 0. To samo jądro sprawdza każde miejsce obrazu, więc znajdzie kreskę wszędzie, także tam, gdzie w treningu jej nie było.

W sieci splotowej (CNN) wag jądra nikt nie ustawia ręcznie. Sieć uczy się ich propagacją wsteczną, tak jak wag MLP. Warstwa ma kilka jąder: każde szuka innego wzorca i daje własną mapę.

Dlaczego to działa

Splot wbudowuje w sieć dwie właściwości obrazów. Piksele obok siebie są ze sobą powiązane, więc wystarczy małe okno. Ten sam wzorzec może być w dowolnym miejscu, więc jedno jądro obsługuje wszystkie miejsca. To współdzielenie wag: filtr 3×3 ma 9 wag i 1 wyraz wolny bez względu na rozmiar obrazu. 8 filtrów to 80 liczb. Warstwa gęsta 64 → 32 ma 64 · 32 + 32 = 2080.

Druga ilustracja uczy dwie sieci na tych samych cyfrach. MLP 64 → 32 → 10 ma 2410 wag. Sieć splotowa (8 filtrów 3×3, max pooling 2×2, warstwa 128 → 10) ma ich 1370. Po 15 epokach sieć splotowa rozpoznaje 97,2% cyfr testowych, a MLP 96,7%: różnica to 2 cyfry z 359. Na wyśrodkowanych cyfrach 8×8 splot nie bije MLP wyraźnie. Daje podobną trafność mniejszą liczbą wag.

Ten interaktywny eksperyment działa w przeglądarce z włączonym JavaScriptem. Tekst wokół opisuje, co w nim widać.

Teraz przesuń cyfry testowe o 1 piksel w prawo. Sieć splotowa spada do 50,4%, MLP do 43,5%. Przy 2 pikselach obie są bliżej zgadywania (10%) niż dobrego wyniku: 15,0% i 18,4%. Filtr przesuwa mapę cech razem z cyfrą, ale warstwa gęsta na końcu ma osobną wagę dla każdego miejsca mapy. Sam splot daje więc tylko część odporności na przesunięcie.

Częsty błąd

Prawda czy fałsz: „Sieć splotowa ma osobną wagę dla każdego piksela, jak MLP.” Fałsz. Jeden filtr 3×3 ma 9 wag i 1 wyraz wolny i działa w każdym miejscu obrazu. 8 filtrów to 80 liczb, a warstwa gęsta 64 → 32 ma 2080. Cała sieć splotowa z ilustracji ma 1370 wag, MLP 2410. Na pięciu startach wag ich trafności różnią się o mniej niż 2 pkt proc. Przy cyfrach przesuniętych o 1 piksel sieć splotowa za każdym razem wyprzedza MLP o co najmniej 5 pkt proc., choć obie spadają poniżej 70%.

Quiz

Trzy pytania na sprawdzenie się. Wybierz odpowiedź albo rozwiń odpowiedź pod pytaniem. Z klawiatury: strzałki wybierają, Enter albo spacja zatwierdza.

1. Ile liczb ma warstwa 8 filtrów 3×3 na obrazie w odcieniach szarości?
Pokaż odpowiedź

Poprawna odpowiedź: 80, bo każdy filtr ma 9 wag i 1 wyraz wolny

Filtr ma te same 10 liczb w każdym miejscu obrazu, więc rozmiar obrazu nie zmienia liczby wag.

2. Jądro krawędzi pionowych daje w jakimś oknie 0. Co to znaczy?
Pokaż odpowiedź

Poprawna odpowiedź: Że lewa i prawa kolumna okna, ważone 1, 2, 1, są tak samo jasne

Ciemne okno też daje 0, ale tak samo daje je okno równo jasne: jądro mierzy różnicę jasności, nie samą jasność.

3. Po 15 epokach sieć splotowa ma 97,2%, a MLP 96,7%, przy 1370 i 2410 wagach. Co z tego wynika?
Pokaż odpowiedź

Poprawna odpowiedź: Na tych cyfrach splot daje podobną trafność mniejszą liczbą wag

Różnica to 2 cyfry z 359, a na pięciu startach wag nie przekracza 2 pkt proc.

Najważniejsze wnioski

  • Jądro 3×3 sprawdza każde miejsce obrazu tymi samymi 9 wagami i daje mapę cech.
  • Współdzielenie wag: 8 filtrów 3×3 to 80 liczb, warstwa gęsta 64 → 32 to 2080.
  • Padding 1 zachowuje rozmiar: mapa 8×8 zamiast 6×6.
  • Na wyśrodkowanych cyfrach 8×8 sieć splotowa nie bije MLP wyraźnie. Oszczędza wagi i lepiej znosi przesunięcie o 1 piksel, ale też nie w pełni.

Głębiej: wzór, kod, praktyka

Matematyka

Splot w sieciach to formalnie korelacja, bez odwracania jądra: y[r, c] = b + Σₐ Σ_b k[a, b] · x[r + a, c + b], gdzie a, b = 0, 1, 2.

  • Rozmiar mapy: obraz n × n, jądro k × k, padding p, krok 1, więc mapa ma (n − k + 2p + 1) × (n − k + 2p + 1). Dla n = 8, k = 3, p = 0 to 6 × 6, dla p = 1 to 8 × 8.
  • Parametry warstwy splotowej: F · (k² · C + 1) dla F filtrów i C kanałów wejścia. Dla F = 8, k = 3, C = 1 to 80. Warstwa gęsta: n_in · n_out + n_out, czyli 2080 dla 64 → 32.
  • Przesunięcie: obraz przesunięty o piksel daje mapę cech przesuniętą o piksel (poza brzegiem). Max pooling 2×2 bierze największą wartość z każdego okna 2×2, więc mapa 8×8 staje się 4×4.
W kodzie (Python)

Splot napisany od zera w numpy, na sztucznej kresce 8×8:

import numpy as np

def conv2d(img, k, pad=0):
    # the same 3×3 kernel in every position (cross-correlation, as CNN layers compute it)
    img = np.pad(img, pad)
    n = img.shape[0] - 2
    return np.array([[np.sum(img[r:r + 3, c:c + 3] * k) for c in range(n)] for r in range(n)])

img = np.zeros((8, 8))
img[1:7, 2:6] = [8, 16, 16, 8]  # a vertical stroke, brighter in the middle
sobel = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])  # vertical edges

m = conv2d(img, sobel)
print("map", m.shape, "values", m.min(), "to", m.max())
print("row 2 of the map:", m[2])
print("with padding 1:", conv2d(img, sobel, pad=1).shape)

moved = np.roll(img, 1, axis=1)  # the stroke 1 pixel to the right
print("the map moves with the stroke:", np.array_equal(conv2d(moved, sobel)[:, 1:], m[:, :-1]))
print("8 filters 3x3:", 8 * (3 * 3 + 1), "numbers; dense 64 -> 32:", 64 * 32 + 32)

Wynik

map (6, 6) values -64.0 to 64.0
row 2 of the map: [ 32.  64.  32. -32. -64. -32.]
with padding 1: (8, 8)
the map moves with the stroke: True
8 filters 3x3: 80 numbers; dense 64 -> 32: 2080

Mapa jest dodatnia na lewym brzegu kreski i ujemna na prawym. Przesunięta kreska daje tę samą mapę przesuniętą o jedną kolumnę. Uruchomione w numpy 2.1.3.

Dla praktyka
  • W każdej bibliotece warstwa splotowa ma cztery główne ustawienia: liczbę filtrów, rozmiar jądra, padding i krok. Rozmiar mapy policz wzorem z warstwy „Matematyka”, zanim zbudujesz sieć.
  • Na małych, wyśrodkowanych obrazkach sprawdź też zwykły MLP albo regresję logistyczną. Splot nie musi wygrać.
  • Odporność na przesunięcie dają dopiero razem: splot, pooling (także po całej mapie) i przesunięte przykłady w treningu.
  • Przy prawdziwych zdjęciach zacznij od gotowej, wytrenowanej sieci splotowej i dostrój ją (transfer learning). Uczenie od zera wymaga dużo danych.

Więcej w Atlasie

Hasła encyklopedii o pojęciach z tej lekcji: