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.
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