Konwolucja: filtr i mapa cech
🎯 Po co Ci to?
Cała sieć konwolucyjna stoi na jednym pomyśle, który da się opisać w dwóch zdaniach: weź małe okienko z kilkoma wagami i przesuwaj je po całym obrazie, licząc w każdym miejscu to samo. Tyle. Wszystko, co robi CNN — od odczytywania cyfr na czekach po wykrywanie czerniaka — jest konsekwencją tej jednej operacji, powtórzonej wiele razy i ułożonej w warstwy.
Ta jednostka jest więc sercem działu. Po niej zrozumiesz, skąd bierze się magiczna redukcja: ze stu pięćdziesięciu milionów wag do trzystu dwudziestu.
✅ Czego się nauczysz
Po tej lekcji potrafisz:
- opisać krok po kroku operację konwolucji: okno, suma ważona, przesunięcie;
- wyjaśnić, czym jest filtr i czym jest mapa cech;
- policzyć wymiar mapy cech (dlaczego 28 → 26) i liczbę parametrów warstwy splotowej;
- wyjaśnić współdzielenie wag i pokazać, że daje niezmienniczość na przesunięcie;
- wyjaśnić, dlaczego jedna warstwa ma wiele filtrów naraz.
🔁 Przypomnij sobie
Z Jednostki 10.1 wiesz, czym jest sztuczny neuron: bierze wejścia, mnoży każde przez wagę, sumuje, dodaje obciążenie i przepuszcza przez funkcję aktywacji. Z Jednostki 12.1 wiesz, że obraz to siatka liczb, a sieć gęsta radzi sobie z nią źle na dwa sposoby: kosztownie i bez wykorzystania sąsiedztwa. Konwolucja jest odpowiedzią na jedno i drugie — i, co warto od razu zauważyć, nie wprowadza żadnego nowego rodzaju obliczenia. To ten sam neuron z Jednostki 10.1, tylko sprytnie użyty.
📘 Okienko, które wędruje po obrazie
Wyobraź sobie, że oglądasz obraz przez lupę pokazującą naraz tylko trzy piksele na trzy. Zaczynasz w lewym górnym rogu, przesuwasz lupę o jeden piksel w prawo, potem znowu, aż dojdziesz do brzegu — wtedy zjeżdżasz o jeden piksel niżej i wracasz do lewej krawędzi. Tak, systematycznie, oglądasz cały obraz fragment po fragmencie.

To okienko nazywa się filtrem (albo jądrem splotu). Filtr 3 × 3 to dziewięć liczb — dziewięć wag — plus jedno obciążenie. W każdym położeniu robi się dokładnie to, co robi neuron: mnoży każdą z dziewięciu jasności pod okienkiem przez odpowiadającą jej wagę, sumuje wyniki, dodaje obciążenie, przepuszcza przez funkcję aktywacji (zwykle ReLU) — i wypisuje jedną liczbę. Ta liczba trafia do nowej, mniejszej siatki, na miejsce odpowiadające położeniu okienka.
Weźmy konkretny filtr. Ten poniżej ma jasny pas w środkowym rzędzie i ciemno nad nim oraz pod nim:

Co się stanie, gdy przyłożymy go do miejsca, w którym w obrazie faktycznie biegnie jasna kreska pozioma? Jasne piksele obrazu spotkają się z dużymi wagami, suma wyjdzie wysoka — i w nowej siatce pojawi się jasny punkt. A w miejscu, gdzie kreski nie ma (na przykład w lewym górnym rogu, gdzie jest samo tło)? Suma wyjdzie niska, punkt będzie czarny. Ten filtr jest detektorem kresek poziomych — i wystarcza, żeby zapytać o nie w każdym miejscu obrazu.

Gdy okienko obejdzie cały obraz, powstaje nowa siatka liczb: mapa cech. Nie jest to już obraz w potocznym sensie, choć wygląda jak obraz — to mapa odpowiedzi na jedno konkretne pytanie: „na ile silnie w tym miejscu występuje wzorzec, którego szuka mój filtr?".

📐 DEFINICJA — filtr (jądro splotu): niewielka tablica wag (typowo 3 × 3 lub 5 × 5), przesuwana po całych danych wejściowych; w każdym położeniu liczy sumę ważoną fragmentu, dając jedną liczbę wyjściową.
Po ludzku: szablon, który przykładamy po kolei do każdego kawałka obrazu, żeby sprawdzić, czy tam jest to, czego szukamy. Czym to NIE jest: to nie filtr w sensie „efekt na zdjęciu w aplikacji" — choć historycznie chodzi o tę samą operację matematyczną.
📐 DEFINICJA — mapa cech: siatka liczb będąca wynikiem przejścia jednego filtra po całych danych wejściowych; opisuje, gdzie i jak silnie wystąpił wzorzec wykrywany przez ten filtr.
📘 Dlaczego 26, a nie 28
Okienko 3 × 3 musi zmieścić się w całości w obrazie, więc jego środek nie może stanąć na samej krawędzi. Na obrazie o szerokości 28 pikseli okienko 3 × 3 ma 26 możliwych położeń w poziomie (28 − 3 + 1 = 26) i tyle samo w pionie. Mapa cech ma więc wymiar 26 × 26: obraz „skurczył się" o jeden piksel z każdej strony.
Ogólna reguła dla przesunięcia o jeden piksel: wymiar wyjścia = wymiar wejścia − rozmiar filtra + 1. Przesunięcie nazywa się krokiem (ang. stride); przy kroku 2 okienko przeskakuje co dwa piksele i mapa cech jest około dwa razy mniejsza w każdym wymiarze. Jeśli komuś zależy na zachowaniu wymiaru, obraz obudowuje się ramką zer (uzupełnianie zerami, ang. padding) — wtedy 28 × 28 daje na wyjściu też 28 × 28. W dalszych rachunkach tego działu przyjmujemy krok 1 i brak uzupełniania.
📘 Rachunek, który wyjaśnia wszystko: 320 zamiast 150 milionów
Teraz najważniejsze. Ile parametrów ma warstwa splotowa z 32 filtrami 3 × 3 działająca na obrazku 28 × 28 × 1?
Jeden filtr: 3 · 3 · 1 = 9 wag plus 1 obciążenie = 10 parametrów. Trzydzieści dwa filtry: 32 · 10 = 320 parametrów.
Trzysta dwadzieścia. Dla porównania: warstwa gęsta z Jednostki 12.1 potrzebowała stu pięćdziesięciu milionów. A przecież warstwa splotowa wyprodukowała mnóstwo informacji — 32 mapy cech po 26 × 26 liczb, razem 21 632 wartości.
Skąd ta różnica? Z współdzielenia wag. Te same dziewięć liczb obsługuje wszystkie 676 położeń okienka. W sieci gęstej każde miejsce obrazu miało własne, niezależne wagi — i musiało uczyć się od zera, jak wygląda kreska. Tutaj wzorzec wyuczony raz działa w całym obrazie: stąd bierze się niezmienniczość na przesunięcie, o którą prosiliśmy w Jednostce 12.1. Nie jako dodatek wyuczony z danych, ale jako własność konstrukcji.
📐 DEFINICJA — współdzielenie wag: użycie tego samego zestawu wag (filtra) w wielu miejscach danych wejściowych; radykalnie zmniejsza liczbę parametrów i sprawia, że wzorzec rozpoznany w jednym miejscu jest rozpoznawany wszędzie.
Jeszcze jedna rzecz, o którą łatwo się potknąć: filtr zawsze sięga przez wszystkie kanały wejścia. Na obrazie kolorowym (3 kanały) filtr „3 × 3" ma w rzeczywistości 3 · 3 · 3 = 27 wag plus obciążenie. Jeśli wejściem jest 32 mapy cech z poprzedniej warstwy, filtr „3 × 3" ma 3 · 3 · 32 = 288 wag plus obciążenie. Głębokość filtra nie jest wyborem projektanta — narzuca ją głębokość wejścia. Wyborem jest tylko rozmiar okienka i liczba filtrów.
💭 Pomyśl
Gdybyś miał ręcznie zaprojektować regułę rozpoznawania litery „O" na obrazku, wygodniej byłoby napisać jedną regułę „szukaj zaokrąglonego kształtu" i sprawdzać ją po kolei w każdym miejscu obrazu — czy raczej pisać osobną, w pełni niezależną regułę dla każdego możliwego położenia litery?
Sprawdź odpowiedź
Zdecydowanie wygodniej napisać jedną regułę i stosować ją wielokrotnie: litera „O" wygląda tak samo, niezależnie od tego, czy jest w lewym górnym rogu, czy na środku. Osobna reguła dla każdego położenia to ogromne marnotrawstwo — trzeba by nauczyć się tego samego kształtu od nowa, setki razy, w każdym miejscu obrazu. I nie chodzi tylko o pracę: każda z tych reguł miałaby do dyspozycji mniej przykładów (tylko te obrazki, w których litera trafiła dokładnie tam), więc uczyłaby się gorzej.
Dokładnie to jest istotą konwolucji: jeden współdzielony filtr, stosowany we wszystkich położeniach. Sieć gęsta wybiera wariant drugi (osobne wagi na miejsce), sieć konwolucyjna — pierwszy.
📘 Po co wiele filtrów naraz
Jeden filtr zadaje jedno pytanie. Wykryjemy nim kreski poziome — i tyle. Do opisania obrazu potrzeba pytań wielu: o kreski pionowe, o skosy w dwie strony, o narożniki, o łuki, o kontrast jasne–ciemne, o tekstury. Dlatego warstwa splotowa ma nie jeden filtr, lecz kilkadziesiąt: 32, 64, 128. Każdy ma własne wagi i produkuje własną mapę cech.

Ten stos map cech jest „obrazem" wejściowym dla następnej warstwy — tylko że zamiast jednego kanału jasności ma teraz 32 kanały: „ile tu poziomych kresek", „ile skosów", „ile kontrastu". I to jest sedno: kolejna warstwa nie patrzy już na piksele, patrzy na odpowiedzi filtrów. Do konsekwencji tego faktu wrócimy w Jednostce 12.4.
Dwie uwagi terminologiczne. Po polsku spotkasz zamiennie „konwolucja" i „splot", a także „sieć konwolucyjna" i „sieć splotowa" — to te same rzeczy, my używamy obu form. I druga: matematyczny splot różni się od opisanej tu operacji odbiciem filtra; w uczeniu maszynowym stosuje się w praktyce korelację, ale nazwa „konwolucja" została. Dla zrozumienia działania sieci nie ma to znaczenia.
⚠️ Uwaga, pułapka
Filtrów nie projektuje człowiek. To najczęstsze nieporozumienie w tej jednostce — i zrozumiałe, bo cała powyższa opowieść mówi „ten filtr wykrywa kreski poziome", jakby ktoś go tak ustawił.
Sama operacja splotu była znana w przetwarzaniu obrazów od dziesięcioleci i istniały gotowe, ręcznie zaprojektowane filtry: Sobela do krawędzi, Gaussa do rozmycia i wiele innych. Nowość sieci konwolucyjnej nie polega więc na konwolucji. Polega na tym, że dziewięć liczb w filtrze to zwykłe parametry sieci — startują losowo i są korygowane propagacją wsteczną (Jednostka 11.3) dokładnie tak samo jak każda inna waga. Nikt nie mówi sieci „szukaj kresek poziomych". Sieć dochodzi do detektora kresek sama, bo taki filtr obniża stratę.
Zdanie „ten filtr wykrywa kreski poziome" jest więc odczytaniem po fakcie tego, co wyszło z treningu — dokładnie w tym sensie, w jakim mówiliśmy o reprezentacjach w Jednostce 10.4.
🌍 Powiązania
Konwolucja to pierwsza z dwóch operacji tworzących CNN; druga, pooling, czeka w Jednostce 12.3 — i dopiero razem dadzą hierarchię cech z Jednostki 12.4. Współdzielenie wag zobaczysz jeszcze raz w zupełnie innym miejscu: w Dziale 15 transformator będzie stosował ten sam blok obliczeń do każdej pozycji w zdaniu, z tego samego powodu (wzorzec nie zależy od miejsca). A sieć splotowa, którą tu składamy, jest tą samą architekturą, która w 2012 roku wygrała ImageNet i uruchomiła cały boom (Jednostka 13.2).
📐 Definicje tej lekcji
- Konwolucja (splot) — przesuwanie filtra po danych i liczenie w każdym położeniu sumy ważonej fragmentu.
- Filtr (jądro splotu) — mała tablica wag (3 × 3, 5 × 5) wykrywająca jeden wzorzec; jego głębokość równa się liczbie kanałów wejścia.
- Mapa cech — siatka wyników jednego filtra: gdzie i jak silnie wystąpił jego wzorzec.
- Krok (stride) — o ile pikseli przesuwa się okienko; krok 2 zmniejsza mapę cech o połowę.
- Uzupełnianie zerami (padding) — ramka zer wokół obrazu, pozwalająca zachować wymiar po splocie.
- Współdzielenie wag — użycie tego samego filtra we wszystkich położeniach; źródło taniości CNN i niezmienniczości na przesunięcie.
📌 Najważniejsze w pigułce
- Konwolucja to jedno małe okienko wag przesuwane po całym obrazie; w każdym położeniu liczy to samo, co neuron z Jednostki 10.1.
- Wynikiem przejścia jednego filtra jest mapa cech: gdzie i jak silnie wystąpił szukany wzorzec.
- Wymiar wyjścia = wejście − rozmiar filtra + 1 (przy kroku 1). Obrazek 28 × 28 z filtrem 3 × 3 daje 26 × 26.
- 32 filtry 3 × 3 na jednym kanale to 320 parametrów — wobec ~150 milionów w warstwie gęstej.
- Taniość i niezmienniczość na przesunięcie mają jedno źródło: współdzielenie wag.
- Filtr zawsze sięga przez wszystkie kanały wejścia; projektant wybiera tylko rozmiar okienka i liczbę filtrów.
- Jedna warstwa ma dziesiątki filtrów, bo jeden filtr = jedno pytanie o obraz.
- Wartości filtrów nie są projektowane, tylko uczone propagacją wsteczną; „detektor krawędzi" to nasza interpretacja wyniku treningu.
🎒 Zadania
Zadanie 12.2.1. Wejściem jest obraz 32 × 32 w kolorze (3 kanały). Warstwa splotowa ma 16 filtrów 5 × 5, krok 1, bez uzupełniania zerami. Policz: (a) wymiar map cech, (b) liczbę map cech, (c) liczbę parametrów warstwy.
Pokaż rozwiązanie
(a) 32 − 5 + 1 = 28, czyli mapy 28 × 28. (b) Tyle map, ile filtrów: 16. Wyjście warstwy ma więc wymiar 28 × 28 × 16.
(c) Każdy filtr sięga przez wszystkie 3 kanały wejścia: 5 · 5 · 3 = 75 wag + 1 obciążenie = 76 parametrów. Szesnaście filtrów: 76 · 16 = 1216 parametrów. Dla porównania warstwa gęsta o 16 neuronach na tym samym wejściu (3072 liczby) miałaby 3072 · 16 + 16 = 49 168 parametrów — czterdzieści razy więcej, a i tak nie wiedziałaby nic o sąsiedztwie pikseli.
Zadanie 12.2.2. Mamy filtr wykrywający kreski poziome o wagach:
−1 −1 −1 2 2 2 −1 −1 −1Obciążenie wynosi 0, aktywacją jest ReLU (ujemne wyniki zamienia na 0). Policz wynik konwolucji dla dwóch fragmentów obrazu, w których 1 oznacza piksel jasny, a 0 ciemny:
fragment A fragment B 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0Zinterpretuj oba wyniki.
Pokaż rozwiązanie
Fragment A (jasna kreska pozioma w środku): jasne piksele wypadają dokładnie na wagi +2, ciemne na wagi −1, więc suma = 2 + 2 + 2 = 6. Po ReLU: 6. Wysoki wynik — filtr „zapalił się".
Fragment B (jasna kreska pionowa): jasne piksele to środkowa kolumna, czyli jeden piksel na wadze −1 (góra), jeden na +2 (środek), jeden na −1 (dół). Suma = −1 + 2 − 1 = 0. Po ReLU: 0. Filtr milczy.
Interpretacja: ten sam filtr, przy tej samej liczbie jasnych pikseli, daje wynik wysoki dla układu poziomego i zerowy dla pionowego. Filtr nie mierzy „ile tu jasności", tylko jak ta jasność jest ułożona — i właśnie dlatego jest detektorem wzorca, a nie licznikiem pikseli. Gdyby w obrazie kreska pozioma była ciemna na jasnym tle, wynik wyszedłby silnie ujemny, a ReLU obcięłoby go do zera; wykrycie takiej odwrotnej krawędzi jest zadaniem innego filtra — i to jeden z powodów, dla których jedna warstwa ma ich dziesiątki.
Zadanie 12.2.3. Wyjaśnij, jak to możliwe, że 320 parametrów obsługuje 26 · 26 = 676 położeń okienka, i co konkretnie byśmy stracili, gdyby każde położenie miało własne, niezależne wagi. Wskaż dwie różne straty.
Pokaż rozwiązanie
Możliwe jest to dzięki współdzieleniu wag: te same 9 liczb (plus obciążenie) jest używane w każdym z 676 położeń, bo pytanie zadawane w każdym miejscu jest to samo („czy tu jest kreska pozioma?"). Parametrów jest tyle, ile filtrów, a nie tyle, ile miejsc.
Gdyby każde położenie miało własne wagi, stracilibyśmy dwie rzeczy. Pierwsza: rozmiar. 676 położeń × 10 parametrów × 32 filtry = 216 320 parametrów w jednej warstwie zamiast 320 — i to na obrazku 28 × 28; na zdjęciu byłyby to miliony. Druga, ważniejsza: niezmienniczość na przesunięcie. Wagi w lewym górnym rogu uczyłyby się kreski osobno od wag na środku, każde z ułamka dostępnych przykładów. Wzorzec wyuczony w jednym miejscu nie działałby w innym — czyli wróciłaby dokładnie ta słabość sieci gęstej, od której zaczęliśmy (Jednostka 12.1).
🔍 Sprawdź, czy umiesz
- [ ] Opisać operację konwolucji krok po kroku i powiedzieć, co powstaje na wyjściu.
- [ ] Policzyć wymiar mapy cech i liczbę parametrów warstwy splotowej (także dla wejścia wielokanałowego).
- [ ] Wyjaśnić współdzielenie wag i wskazać dwie rzeczy, które z niego wynikają.
- [ ] Wyjaśnić, dlaczego jedna warstwa ma wiele filtrów.
- [ ] Powiedzieć, kto ustala wartości wag w filtrze — i dlaczego „detektor krawędzi" jest opisem po fakcie.