ML Atlas

07 · Architektury · 5 min czytania · Interaktywne · aktualizacja

Czym jest splot (konwolucja) w sieciach neuronowych i jak działa filtr?

W skrócie

Splot przesuwa mały filtr wag po obrazie i w każdym miejscu liczy sumę iloczynów. Ten sam wzorzec wykrywa wszędzie, przy ułamku parametrów warstwy gęstej.

Co to jest

Splot (konwolucja) w sieciach neuronowych to operacja, w której mały filtr — siatka wag, np. 3×3 — przesuwa się po obrazie, a w każdym położeniu liczy sumę iloczynów swoich wag i pikseli pod spodem. Wynikiem jest nowa „mapa cech”, która w każdym miejscu mówi, jak bardzo lokalny fragment obrazu przypomina wzorzec zapisany w filtrze.

Intuicja: wyobraź sobie szablon z wyciętym kształtem pionowej krawędzi, który przykładasz kolejno do każdego fragmentu zdjęcia i sprawdzasz, jak dobrze pasuje. Splot robi dokładnie to, tylko „dopasowanie” mierzy iloczynem skalarnym. Tam, gdzie fragment obrazu wygląda jak filtr, wynik jest duży; tam, gdzie wygląda odwrotnie — duży i ujemny; na jednolitym tle bliski zeru.

W klasycznym przetwarzaniu obrazów filtry projektował człowiek (Sobel, Prewitt, rozmycie Gaussa). W sieci konwolucyjnej wagi filtrów są parametrami uczonymi spadkiem gradientu — sieć sama odkrywa, jakie wzorce warto wykrywać.

Mechanizm — dlaczego tak działa

Dla obrazu X i filtra K o rozmiarze k×k wartość wyjścia w punkcie (i, j) to Y(i, j) = Σ_a Σ_b K(a, b) · X(i + a, j + b). Formalnie jest to korelacja wzajemna, a nie splot z matematyki (ten odwraca filtr), ale biblioteki i literatura i tak mówią „splot” — przy uczonych wagach różnica nie ma znaczenia, bo sieć nauczy się po prostu odwróconego filtra.

Skuteczność splotu wynika z dwóch założeń o obrazach. Pierwsze to lokalność: piksele blisko siebie są ze sobą silnie powiązane, a krawędź czy róg da się rozpoznać po małym otoczeniu. Dlatego każdy neuron wyjściowy patrzy tylko na okienko k×k (tzw. pole recepcyjne), a nie na cały obraz. Drugie to niezmienniczość położenia: krawędź wygląda tak samo w lewym górnym rogu, jak w prawym dolnym. Dlatego ten sam filtr — te same wagi — jest używany w każdym miejscu. To współdzielenie wag.

Z tych dwóch założeń bierze się ogromna oszczędność. Warstwa gęsta, która z kolorowego obrazu 224×224 robi 64 cechy, potrzebuje 224·224·3·64 + 64 ≈ 9,6 mln wag. Warstwa splotowa z 64 filtrami 3×3 na 3 kanałach ma 64·(3·3·3 + 1) = 1792 parametry — około 5 tys. razy mniej — i daje 64 pełne mapy cech zamiast 64 liczb. Mniej parametrów to mniej danych potrzebnych do nauki i mniejsze ryzyko przeuczenia.

Splot jest ekwiwariantny względem przesunięcia: przesuń obraz o piksel, a mapa cech przesunie się o piksel. Nie jest natomiast sam z siebie niezmienniczy na obrót ani skalę — filtr pionowej krawędzi nie wykryje poziomej. Sieć radzi sobie z tym, ucząc wielu filtrów naraz oraz dzięki augmentacji danych.

Obrazy mają kanały (RGB, a w głębszych warstwach dziesiątki map cech). Filtr ma wtedy wymiar k×k×C_in i sumuje po wszystkich kanałach wejścia; warstwa z C_out filtrami daje C_out kanałów wyjścia. Liczba parametrów warstwy to C_out·(k·k·C_in + 1), niezależnie od rozmiaru obrazu.

Na przykładzie

Weźmy pierwszy obraz ze zbioru Digits 8×8 (cyfra 0, jasność 0–16) i filtr pionowej krawędzi Prewitta o wierszach [−1, 0, 1], powtórzonych trzy razy. Filtr odejmuje lewą kolumnę okienka od prawej. Okienko z wierszy 3–5 i kolumn 1–3 obrazu ma wartości [0, 3, 15], [0, 4, 12], [0, 5, 8]. Wynik: (15 − 0) + (12 − 0) + (8 − 0) = 35 — z ciemnego tła wchodzimy w jasną kreskę, czyli lewa krawędź zera.

Bez dopełnienia filtr 3×3 mieści się na obrazie 8×8 w 6×6 położeniach, więc mapa cech ma 6×6 = 36 wartości. Największa, 40, leży przy lewej krawędzi cyfry; najmniejsza, −35, tuż po wewnętrznej stronie lewej kreski, gdzie jasna kreska przechodzi w ciemny środek zera. Znak niesie informację o kierunku: przejście ciemne→jasne (patrząc w prawo) daje plus, jasne→ciemne — minus, a fragment o równej jasności dałby zero. Ten sam filtr obrócony o 90° (wiersze [−1, −1, −1], [0, 0, 0], [1, 1, 1]) reaguje za to na górną i dolną krawędź: najmniejsza odpowiedź, −32, wypada przy górnym łuku zera.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: 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.

Dane: Digits (ręcznie pisane cyfry 8×8)

W praktyce

  • W PyTorch: nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1); wejście ma kształt (N, C, H, W). W Keras: layers.Conv2D.
  • Typowe filtry to 3×3 (czasem 1×1 do mieszania kanałów, 5×5 lub 7×7 na samym początku sieci). Dwie warstwy 3×3 widzą okienko 5×5 przy mniejszej liczbie wag.
  • Liczba parametrów warstwy: out_channels (kernel_size*2 * in_channels + 1). Rozmiar wyjścia zależy od dopełnienia i kroku — patrz hasło o poolingu, kroku i dopełnieniu.
  • Do sygnałów jednowymiarowych (dźwięk, szeregi czasowe, tekst) używa się nn.Conv1d, do wolumenów (MRI, wideo) nn.Conv3d.
  • Częsty błąd: podanie obrazu w układzie (H, W, C) zamiast (C, H, W) — kod zadziała tylko wtedy, gdy wymiary przypadkiem pasują, i wtedy liczy bzdury.

Najczęstsze pytania

Czym różni się splot od korelacji wzajemnej?
Matematyczny splot odwraca filtr przed przesuwaniem, korelacja — nie. Warstwy „konwolucyjne” w bibliotekach liczą w rzeczywistości korelację. Ponieważ wagi są uczone, nie ma to wpływu na to, co sieć potrafi.
Skąd sieć wie, jakie filtry są potrzebne?
Nie wie z góry: wagi startują losowo i są poprawiane propagacją wsteczną tak, by zmniejszać błąd. Pierwsze warstwy zwykle same uczą się filtrów krawędzi i plam koloru, bo takie wzorce pomagają w niemal każdym zadaniu wizyjnym.
Czy splot działa tylko na obrazach?
Nie. Działa wszędzie, gdzie dane mają strukturę siatki i lokalne zależności: w dźwięku, sygnałach EKG, szeregach czasowych, sekwencjach DNA czy tekście (splot 1D po tokenach).
Ile filtrów powinna mieć warstwa?
Typowo 32–64 w pierwszych warstwach i coraz więcej w głębszych (128, 256, 512), bo tam wzorce są bardziej złożone i liczniejsze, a mapy mniejsze. To hiperparametr dobierany na zbiorze walidacyjnym.

Źródła

  • Goodfellow, Bengio, Courville „Deep Learning”, MIT Press, 2016, rozdz. 9 („Convolutional Networks”).
  • Zhang i in. „Dive into Deep Learning”, d2l.ai, rozdz. 7 („Convolutional Neural Networks”).
  • LeCun, Bottou, Bengio, Haffner „Gradient-Based Learning Applied to Document Recognition”, Proceedings of the IEEE 86(11), 1998.
  • Dumoulin, Visin „A guide to convolution arithmetic for deep learning”, arXiv:1603.07285, 2016.
  • Dokumentacja PyTorch: torch.nn.Conv2d, https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html

Zobacz też