Co Właśnie Robi Kerel Konwolucyjny
Pod krywymlotną powierzchnią każdej cyfrowej fotografii znajduje się siatka liczb. Obraz o skali szarości to pojedyncza macierz, gdzie każda komórka przechowuje wartość jasności między 0 (ciemno) a 255 (jasno); obraz kolorowy to trzy takie same macierze, które są stosowane do kanałów czerwonego, zielonego i niebieskiego. Konwolucja jest operacją umożliwiającą systematyczną transformację tej siatki poprzez przesuwanie małej macierzy — kerela lub filtru — po każdej pozycji w obrazie i łączenie wartości pod nią do pojedynczej liczby wyjściowej.
Typowe keryla są znacznie mniejsze niż obraz, często tylko 3×3 lub 5×5 komórek. Na każdej pozycji mnożysz każdą wartość kerela przez piksel, który go pokrywa, a następnie sumujesz wyniki — to samo co iloczyn skalarny dwóch przekształconych wektorów. Ta suma staje się jednym pikselem w nowym obrazie nazywanym mapą cech. Przesuń kerel o krok do prawej, powtórz obliczenie i otrzymasz nastepny piksel wyjściowy. Wykonując to całe obraz, transformujesz go według wzoru zapisanego w kerelu.
To, co sprawia, że jest tak potężne, to to, że kilka liczb ułożonych w odpowiednim wzorcu może wykryć istotną strukturę. Kerel negatywny na lewo i pozytywny na prawo reaguje silnie tam, gdzie jasność skoczy z ciemnego do jasnego — inaczej mówiąc, odnajduje pionowe krawędzie. Kerel o jednorodnych wartościach dodatnich średnicą obszar otaczający, rozmywając obraz. Operacja matematyczna nigdy się nie zmienia; zmieniają się tylko liczby zawarte w kerelu, a to wystarcza do wygenerowania bardzo różnych efektów.
Czytanie jądra ręcznie: detektor krawędzi i rozmywania
Zaglądajmy do klasycznego, tradycyjnie używanego jądra zorientowanego na krawędzie pionowe:
[-1 0 1] [-1 0 1] [-1 0 1] Każda linia odejmuje piksel po lewej stronie pozycji od piksela po prawej. W płaskiej obszarze, gdzie piksele są niemal identyczne, suma jest bliska zera, więc wyjście pozostaje ciemnym. Jeśli zaś obraz skacze z ciemnego obszaru do jasnego — na przykład od 0 do 255 — suma spowoduje wyrastanie, tworząc jasny piksel w wyjściu. Wynik jest mapą, która sięga dokładnie tam, gdzie występują pionowe krawędzie, a pozostaje ciemna wszędzie indziej.
Jednym z najczęściej używanych jąder detektora krawędzi jest operator Sobela, który ulepsza ten pomysł, przydzielając większy wagę centrowej linii lub kolumny:
Sobel X: Sobel Y: [-1 0 1] [-1 -2 -1] [-2 0 2] [ 0 0 0] [-1 0 1] [ 1 2 1] Przeliczenie Sobela X i Sobela Y oddzielnie, a następnie połączenie wyników za pomocą wartości mocy = sqrt(Gx² + Gy²), daje siłę krawędzi, która jest czuła na gradienty w dowolnym kierunku, nie tylko pionowym ani poziomym.
Jądra rozmywające działają na odwrót: zamiast zwiększania różnic, średnie je wygładzają. Jądro 3×3 typu box rozmywania jest prosto siedmioma komórkami każdego zawierającymi 1/9, więc piksel wyjściowy staje się średnią jego sąsiedztwa. Jądro rozmywającego Gaussa przydzielają największą wagę centrowi i maleją wzdłuż krawędzi według krzywej gęsiackiej, co prowadzi do bardziej mlecznego i naturalnego wygładzenia z mniejszymi szpiczastymi artefaktami niż prosty box średnik. Jądro ostrośći odwrotnie działa w stosunku do rozmywania: podnosi piksel centrowy względem sąsiadów, na przykład [[-1,-1,-1],[-1,9,-1],[-1,-1,-1]], co zwiększa lokalną kontrastowość i sprawia, że krawędzie wydają się ostrojsze.
[-1 0 1] [-1 0 1] [-1 0 1]
Krok, wypełnienie i rozmiar wyjściowy
Trzy parametry kontrolują dokładnie, jak kernel przesuwa się po obrazie i jaki będzie rozmiar wynikowego mapowania cech.
Krok to wielkość kroku, który kernel podąża między obliczeniami. Krok 1 przesuwa kernel o jeden piksel na raz, tworząc wyjście prawie tak duże jak wejście. Krok 2 pominął co drugi pozycję, zmniejszając rozdzielczość wyjścia w każdym wymiarze — to proste i popularne rozwiązanie do zwiększenia skalowania obrazu podczas nadal stosowania operacji filtracji.
Wypełnienie zajmuje się tym, co dzieje się przy brzegach. 5×5 obraz convolowany z 3×3 kernelem bez wypełnienia ("valid" wypełnienie) może być tylko centralnie umieszczony na 3×3 pozycjach, więc wyjście zmniejsza się do 3×3. Jeśli chcesz, aby wyjście pozostało taka sama jak wejście ("same" wypełnienie), dodajesz wypełniające rzędy i kolumny — zazwyczaj wypełnione zerami — przed przesuwaniem kernela, tak że każdy oryginalny piksel może pełnić rolę centrum kernela.
Te dwa parametry połączone są w jednej formule, która dokładnie przewiduje rozmiar wyjściowy:
rozmiar_wyjsciowy = floor((rozmiar_wejsciowy + 2 × wypełnienie − rozmiar_kernela) / krok) + 1 Ta formula ma znaczenie praktyczne, ponieważ determinuje, ile warstw convolucyjnych można stosować przed tym, jak obraz zmniejszy się do niczego, oraz ile wypełnienia potrzebujesz, aby zachować rozdzielczość przestrzenną przez głęboką sieć. Jest to również dokładnie taka relacja, która staje się intuicyjna tylko po tym, jak można przeciągać klawisze do zmiany rozmiaru kernela, kroku i wypełnienia oraz obserwować na żywo zmiany rozmiarów siatki wyjściowej — dlatego interaktywny visualizer convolucji, pokazujący jednocześnie okno przesuwające się i wynikowe mapowanie cech, jest jednym z najefektywniejszych sposobów na zapewnienie intuicji tego pojęcia.
output_size = floor((input_size + 2 × padding − kernel_size) / stride) + 1
Od ręcznie zaprojektowanych filtrów do nauczonych jądra
Wszystko opisane dotychczas korzysta z jąder, które zaprojektował człowiek — wartości w jądrowych Sobelu i Gaussian nie ulegają zmianie od lat i są obliczone matematycznie. Sieci neuronowe konwolucyjne (CNN) stosują tę samą metodę okna przesuwającego, ale traktują wartości jądra jako parametry do nauczenia się zamiast stałych stałych. Warstwa konwolucyjna zaczyna od jąder inicjalizowanych małymi losowymi liczbami, a descent gradientowy dostosowuje te liczby warstwa po warstwie, tak aby mapy cech wynikające z nich stały się przydatne dla zadania na którym sieć jest treningu — klasifikowanie cyfr, wykrywanie twarzy, segmentacja tarczy.
Wczesne warstwy w CNN nauczonej tendują do ponownego odkrycia filtrów, które przypominają ręcznie zaprojektowane: detektor krawędzi, kropki przeciwległych barw, gracje orientowane. To ciekawa walidacja intuicji klasycznej dotyczącej projektowania filtrów — sieć dochodzi do podobnych rozwiązań, ponieważ są one rzeczywiście przydatne do wyodrębniania struktury z obrazów naturalnych. Dżazujące warstwy głębsze łączą te mapy cech niskiego poziomu w detektory coraz bardziej abstrakcyjnych wzorców: tekstury, części obiektów i ostatecznie całe kategorie obiektów.
Warstwa konwolucyjna generalizuje pojedynczy idea jądra stosując wiele jąder w paralelu do tego samego wejścia, każde z nich tworzą własną mapę cech, wszystkie ze sobą skumulowane do 3-wymiarowego wyjściowego objętości. Jeśli warstwa stosuje 16 filtrów o rozmiarze 3×3 do obrazu RGB o 3 kanałach, tensor wag ma kształt (3, 3, 3, 16) — trzy kanały wejściowe na filtr, szesnaście niezależnych filtrów. Liczba parametrów do nauczenia się w tej pojedynczej warstwie wynosi 3×3×3×16 = 432 wagi, plus 16 wyrazów biegunowych, co jest znacznie mniej parametrami niż potrzebowałby warstwa pełnopołączona do przetworzenia tego samego obrazu, ponieważ jądro powtarza się (z tymi samymi wagami) na każdym położeniu przestrzennym. Ta współdzielenie wag jest dokładnie dlaczego CNN skaliują się do dużych obrazów bez eksplozji liczby parametrów.
Obszar receptywny: Jak stosowanie konwolucji pozwala widzieć dalej
Jedna jednostka 3×3 tylko „widzi” 3×3 pasek wejścia — obszarem receptywnym jest 3×3 piksele. Ale gdy stosujemy drugą warstwę konwolucyjną 3×3 na górę pierwszej, neurony w tej drugiej warstwie widzą 3×3 pasek wyjścia pierwszej warstwy, a każdy z tych pikseli był obliczany z 3×3 paska oryginalnej obrazu. Efektywny obszar receptywny na oryginalnym obrazie rośnie do 5×5. Dodanie trzeciej warstwy powoduje, że wzrosł on do 7×7, zgodnie z wzorem, że każda dodatkowa warstwa konwolucyjna 3×3 (z przesunięciem 1) rosnie o dwie piksele w każdym wymiarze.
Ta złożona efektywność jest powodem, dla którego głębokie sieci mogą rozpoznawać strukturę na dużą skalę — całe twarze, samochody, budynki — mimo że każda jednostka jest mała. To również wyjaśnia kluczowy zrównoważony wybór projektu: dwie skonwolucjonowane warstwy 3×3 osiągają taki sam efektywny obszar receptywny 5×5 jak pojedyncza warstwa konwolucyjna 5×5, ale z mniejszą liczbą parametrów w sumie (2×9=18 przeciwko 25 dla pary kanału wejściowego-i wyjściowego) oraz dodatkowym elementem nieliniowym między nimi, co jest częścią powodu, dla którego architektury współczesne preferują wiele małych jednostek nad kilkoma dużymi.
Poołowanie: Zmniejszanie Mapy Charakterystyk Bez Stracenia Sygnału
Konwolucja jest zwykle połączona z drugim operacją przyspieszającą, nazywaną poołowieniem. Poołowanie zmniejsza wymiary mapy charakterystycznej bez dodawania parametrów trenowalnych. Max poołowanie przesuwa mały okno (często 2×2) po mapie charakterystycznej i zachowuje tylko największą wartość w każdym oknie, odrzucając pozostałe. To zmniejsza szerokość i wysokość mapy charakterystycznej o pół, podczas gdy zachowuje najbardziej aktywne elementy — efektywnie pyta: „Czy ten wzór był gdzieś w tym małym obszarze?”, a nie „Gdzie dokładnie był?”.
Strata precyzyjnego położenia jest świadomie zaplanowana: daje to sieci stopień niezależności od przesunięcia, więc cecha wykryta ligej w centrum obrazu nadal powoduje tę samą reakcję, jakby była dokładnie w centrum. Poołowanie średnie, które bierze średnią zamiast maksimum, jest mniej często używane dla warstw pośrednich, ale pozostaje powszechny na końcu sieci (globalne poołowanie średnie), gdzie zmniejsza każdą całą mapę charakterystyczną do jednej liczby przed warstwą klasyfikacyjną końcową.
Często zadawane pytania
Jak różni się konwolucja od korelacji krzyżowej?
Z matematycznego punktu widzenia, prawdziwa konwolucja obraca jączynkę zarówno poziomo, jak i pionowo przed przeniesieniem jej przez obraz, podczas gdy korelacja krzyżowa nie obraca. W praktyce, prawie każda ramka do uczenia maszynowego i biblioteka przetwarzania obrazów implementuje techniczną korelację krzyżową, ale nazywa to 'konwolucją' – ponieważ wartości jączynki są albo ręcznie zaprojektowane, albo nauczane, obrót nie ma znaczenia dla wyniku.
Dlaczego CNN używa małych jączynek 3x3 zamiast większych?
Stosowanie kilku małych jączynek osiąga taki sam polifizjum jak jedna duża jączynka, jednocześnie używając mniej parametrów i dodając więcej kroków aktywacji nieliniowych między nimi, co zazwyczaj poprawia siłę reprezentacyjną sieci bez znaczącego wzrostu kosztu obliczeniowego.
Czy większa jączynka zawsze łapie więcej użytecznych informacji?
Niekoniecznie. Wielka jączynka widzi szersze obszary w jednym kroku, ale ma również więcej parametrów do nauczenia, jest bardziej narażona na nadadapcję na ograniczone dane i mniej przyjmuje szczegółowe szczegóły. Wiele współczesnych architektur preferuje głębokość (wielu warstw z małymi jączyknami) nad szerokością (kilka warstw z dużymi jączyknami).
Co zrobione jest z krawędziowymi pikselami podczas konwolucji?
Bez paddingu, jączynka nie może osiągnąć centrum na najbardziej zewnętrznym wierszach i kolumnach, więc te piksele albo są odrzucone (padding validny, tworząc mniejszy wyjście) lub obraz jest artystycznie rozszerzony, często uzupełniony zerami, aby jączynka nadal mogła być zastosowana na każdym oryginalnym pozycji piksele (padding ten, tworząc wyjście takie same jak wejście).
Jak mogę wizualizować działanie jączynki konwolucyjnej?
Najprostszym sposobem jest animacja okna przesuwającego się: pokazuj pozycję bieżącej jączynki na siatce wejściowej, obliczenie mnożenia i sumowania dla tej pozycji oraz odpowiadający mu piksel włączony w mapie cech wyjściowej, a następnie przesuń się przez pozycje jedno po drugim lub odtwórz animację, aby zobaczyć powstanie mapy cech.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz How Convolution Kernels Transform Images i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.
▶ Otwórz symulację How Convolution Kernels Transform Images