Konvoluční sítě: jak síť poznává obrázky
Proč obyčejná síť nepozná posunutou číslici, konvoluční vrstva se sdílenými vahami, pooling a receptivní pole, naučené filtry a mapy příznaků, augmentace dat a cesta od LeNetu k ImageNetu — na síti napsané od nuly.
Série Základy AI Díl 64 z 83
- Mapa umělé inteligence: co je co a jak to do sebe zapadá
- Stručná historie umělé inteligence: od Turinga po jazykové modely
- Data, model, trénink, inference: základní pojmy na jednom příkladu
- Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relace: stavebnice, ze které se skládají definice v AI
- Funkce a zobrazení: proč je každý model v AI funkce
- Logika a důkazy: pravidla, podle kterých se v AI uvažuje
- Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
- Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
- Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
- Gradientní sestup: jak se model učí
- Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
- Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
- Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
- Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
- Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
- Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
- Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
- Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
- Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
- Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
- Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
- Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
- Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
- Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
- Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
- Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
- Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
- Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
- Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
- Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
- Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
- Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
- Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
- Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
- Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
- Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
- Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
- Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
- Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
- Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
- Přeučení a regularizace: proč model, který zná data nazpaměť, selže
- Vyhodnocení modelu: křížová validace, F1 a křivka ROC
- Shlukování a snížení dimenze: k-means, PCA a t-SNE
- Klasifikace a regrese: dvě úlohy učení s učitelem
- Lineární regrese: nejmenší čtverce geometricky i maticově
- Polynomiální a nelineární regrese: jak přímku ohnout
- Logistická regrese: sigmoida, šance a křížová entropie
- Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
- Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
- Ztrátové funkce: co přesně model minimalizuje
- Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
- Ansámbly: náhodný les a gradient boosting
- SVM a jádrový trik: nejširší hranice a jak ji ohnout
- Signál a vzorkování: proč platí Nyquistův teorém
- Fourierova transformace: rozklad signálu na frekvence
- Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
- Zvuk a řeč: spektrogram, melová škála a MFCC
- Obraz jako signál: pixely, barvy, konvoluce a hrany
- Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
- Neuronová síť od nuly: zpětné šíření chyby krok za krokem
- Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
- Konvoluční sítě: jak síť poznává obrázky
- Rekurentní sítě: paměť pro posloupnosti a mizející gradient
- LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
- Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
- Embeddingy a word2vec: jak se slovo stane vektorem
- Mechanismus pozornosti: jak se model naučí, kam se dívat
- Transformery a velké jazykové modely: architektura krok za krokem
- Tokenizace: jak se text rozseká na kousky pro model
- Předtrénování a škálování: proč větší model a víc dat funguje
- Doladění a RLHF: jak se z doplňovače textu stane asistent
- Prompty, kontext a RAG: jak modelu dát správné informace
- Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
- Generativní adversariální sítě (GAN): padělatel proti detektivovi
- Difúzní modely: jak se z čistého šumu stane obrázek
- Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
- Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
- Policy gradient a PPO: učení přímo strategie
- Jak funguje AI agent: jazykový model ve smyčce s nástroji
- Programování s AI agenty: zadání, testy a kontrola
- Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat
Celá osnova série 83 z 83 témat hotovo
- Proč plně propojená síť nepřenese naučené na jiné místo obrázku.
- Co dělá konvoluční vrstva a pooling a co se síť v první vrstvě naučí.
- Proč se konvoluce a augmentace dat doplňují.
Co se hodí znát předem: Obraz jako signál: pixely, barvy, konvoluce a hrany, Neuronová síť od nuly: zpětné šíření chyby krok za krokem
V roce 2012 přihlásil tým Geoffreyho Hintona do soutěže v rozpoznávání fotografií ImageNet konvoluční neuronovou síť AlexNet. Spletla se v 15,3 % případů; druhý nejlepší tým, s ručně navrženými příznaky, v 26,2 %. Za pár let používal konvoluční sítě každý — v telefonech, autech, nemocnicích. Jejich myšlenka je přitom stará a prostá: obrázek se nemá zpracovávat jako dlouhý seznam pixelů, ale jako obrázek, ve kterém na poloze nezáleží. V tomhle dílu postavíme malou konvoluční síť od nuly a porovnáme ji s obyčejnou sítí na úloze, na které je rozdíl vidět nejlíp: číslice, které se posunou.
Navazuje na díly Obraz jako signál a Aktivace, inicializace a normalizace.
1. Proč nestačí obyčejná síť
Data: číslice 0–9 jako obrázky 8 × 8 pixelů na plátně 12 × 12. Při tréninku je číslice posunutá nejvýš o pixel od středu, 500 obrázků. Testujeme dvakrát: na nových číslicích se stejně malým posunem a na číslicích posunutých o 2 pixely — takové síť nikdy neviděla.
Plně propojená síť (144 vstupů, 32 skrytých neuronů s ReLU, 10 výstupů se softmaxem, 4 970 parametrů) se naučí trénovací data bez chyby a na nových číslicích se stejným posunem má 99,9 %. Na číslicích posunutých o 2 pixely ale jen 16,3 % — skoro jako náhodné hádání (10 %). Pro ni je pixel 37 prostě jiný vstup než pixel 39; že je na nich tatáž čárka, posunutá o kousek, neví. Co se naučila o jednom místě obrázku, nepřenese na jiné.
Definice — softmax a křížová entropie pro více tříd
Nechť K ≥ 2 je počet tříd a z = (z1, …, zK) ∈ ℝK jsou výstupy poslední vrstvy. Softmax je funkce softmax : ℝK → (0, 1)K, z ↦ p = (p1, …, pK), kde
pk = ezk/∑m=1K ezm, k = 1, …, K.
Platí pk > 0 pro všechna k a p1 + … + pK = 1, takže p je rozdělení pravděpodobnosti na třídách.
Nechť c ∈ {1, …, K} je správná třída příkladu. Křížová entropie příkladu je číslo
E = −ln pc ≥ 0.
Jako funkce z má složení softmaxu a křížové entropie jednoduchý gradient
∂E/∂zk = pk − [k = c], k = 1, …, K,
kde [k = c] je 1, je-li k = c, a 0 jinak — odtud začíná zpětné šíření v obou našich sítích.
pk = ezk/∑m=1K ezm
- pk
- pravděpodobnost, kterou síť dává třídě k
- ezk
- exponenciála výstupu — vždy kladná a zachová pořadí: větší výstup dá větší číslo
- ∑m=1K ezm
- součet exponenciál všech tříd — dělením jím se pravděpodobnosti sečtou na 1
Příklad — softmax pro tři třídy
Výstupy z = (2, 1, 0): e2 = 7,389, e1 = 2,718, e0 = 1, součet 11,107, tedy
p = (7,389/11,107; 2,718/11,107; 1/11,107) = (0,665; 0,245; 0,090)
(barvy podle vzorce výše). Je-li správná třída první, ztráta je −ln 0,665 = 0,408 a gradient (0,665 − 1; 0,245; 0,090) = (−0,335; 0,245; 0,090): správný výstup se má zvednout, ostatní snížit, každý tím víc, čím víc se mýlí.
Příklad — 4 970 parametrů plně propojené sítě
Plně propojená vrstva z n vstupů na m neuronů má n · m vah a m prahů. Skrytá vrstva 144 · 32 + 32 = 4 640, výstupní 32 · 10 + 10 = 330, celkem 4 970. Každá z 4 608 vah první vrstvy patří k jednomu konkrétnímu pixelu — a to je ten problém.
2. Konvoluční vrstva
Definice — konvoluční vrstva
Nechť C ≥ 1 je počet vstupních kanálů, F ≥ 1 počet filtrů, k ≥ 1 velikost filtru a n ≥ k velikost vstupu. Vstup je X ∈ ℝC×n×n s prvky X[c, i, j], c = 1, …, C, i, j = 0, …, n − 1 (u šedého obrázku C = 1). Pro f = 1, …, F je Kf ∈ ℝC×k×k filtr (jádro) s prvky Kf[c, u, v], u, v = 0, …, k − 1, a bf ∈ ℝ jeho práh. Označme m = n − k + 1. Konvoluční vrstva (bez doplnění okrajů, s krokem 1) je zobrazení ℝC×n×n → ℝF×m×m, X ↦ Y, kde pro f = 1, …, F a i, j = 0, …, m − 1
Yf[i, j] = bf + ∑c=1C ∑u=0k−1 ∑v=0k−1 Kf[c, u, v] · X[c, i + u, j + v].
Matice Yf ∈ ℝm×m je mapa příznaků filtru f; výstup vrstvy je F map nad sebou. V naší síti se na každý prvek Y ještě použije ReLU. Filtr se tedy posouvá po vstupu a v každé poloze spočte vážený součet okénka k × k přes všechny kanály a přičte práh; jeho váhy Kf nezávisí na poloze (i, j) — jsou ve všech polohách stejné (sdílené).
Filtr je malá šablona — třeba „svislá čárka“ — kterou síť přikládá na každé místo obrázku a zapisuje, jak moc tam sedí. Je to stejná konvoluce jako u Sobelova detektoru hran, jen váhy šablony si síť naučí sama. A protože se stejná šablona použije všude, co se síť naučí v levém horním rohu, umí automaticky i v pravém dolním.
Úspora je obrovská. Plně propojená vrstva z barevného obrázku 224 × 224 na 64 neuronů má 9 633 792 vah; konvoluční vrstva s 64 filtry 3 × 3 jen 1 728 — a navíc umí najít svůj vzor kdekoli.
Vzorec konvoluční vrstvy
Hodnota mapy příznaků filtru f v poloze (i, j) před aktivací ReLU (vzorec z definice výše):
Yf[i, j] = bf + ∑c ∑u,v Kf[c, u, v] · X[c, i + u, j + v]
- Yf[i, j]
- jak dobře vzor filtru f sedí na místo (i, j) — jedna hodnota mapy příznaků
- bf
- práh filtru — posouvá hranici, od které ReLU odezvu pustí; slabá náhodná shoda se tak dá potlačit
- ∑c ∑u,v
- součet přes všechny vstupní kanály c a polohy u, v = 0 … k − 1 uvnitř okénka — filtr vidí najednou jen malý čtvereček, ale celou jeho hloubku (u druhé vrstvy všech 8 map první)
- Kf[c, u, v]
- váhy filtru — nezávisí na i, j; právě tohle sdílení dělá z vrstvy hledání téhož vzoru všude a šetří parametry
- X[c, i + u, j + v]
- okénko vstupu s levým horním rohem v (i, j) — posunem i, j se filtr přikládá na další místa
Definice — rozměr výstupu
Nechť n, k, s ∈ ℕ jsou velikost vstupu n × n, velikost okénka k × k a krok s ≥ 1 a p ∈ ℕ0 je počet nul, kterými se vstup doplní na každé straně, přičemž k ≤ n + 2p. Okénko se klade levým horním rohem do poloh t · s (v každém směru zvlášť), t = 0, 1, 2, …, dokud se celé vejde do doplněného vstupu, tj. pokud t · s + k ≤ n + 2p. Rozměr výstupu na stranu je počet takových poloh,
m = |{t ∈ ℕ0 : ts + k ≤ n + 2p}| = ⌊n + 2p − k/s⌋ + 1,
kde ⌊x⌋ je dolní celá část (největší celé číslo nejvýš x). Naše síť okraje nedoplňuje (p = 0): konvoluce 3 × 3 s krokem 1 dá z obrázku 12 × 12 mapy 10 × 10 (12 − 3 + 1 = 10), max-pooling 2 × 2 s krokem 2 z nich 10 − 2/2 + 1 = 5 a druhá konvoluce 5 − 3 + 1 = 3 — rozměry ze schématu níže.
parametrů = F · (k · k · C + 1)
- F
- počet filtrů — každý hledá jiný vzor a má vlastní váhy; počet parametrů roste jen s ním, ne s velikostí obrázku
- k · k · C
- váhy jednoho filtru — okénko k × k přes všech C vstupních kanálů
- 1
- práh filtru — jeden na filtr, ne na polohu
Příklad — konvoluce ručně
Obrázek 4 × 4 se svislou čárkou, filtr „svislá čára“ a práh b = −1:
X = 0110001000100111 K = −12−1−12−1−12−1
Výstup má 4 − 3 + 1 = 2 řádky i sloupce. V poloze (0, 1) leží pod filtrem okénko se sloupci 1 až 3; po řádcích dává
((−1) · 1 + 2 · 1 + (−1) · 0) + ((−1) · 0 + 2 · 1 + (−1) · 0) + ((−1) · 0 + 2 · 1 + (−1) · 0) = 1 + 2 + 2 = 5,
s prahem 5 + (−1) = 4. V poloze (0, 0) vyjde (1 − 1 − 1) + (−1) = −2 a ReLU z toho udělá 0. Barvy podle vzorce konvoluční vrstvy výše: váhy filtru, pixely okénka, práh a hodnota mapy. Celá mapa po ReLU:
Y = 0403
Filtr „zabral“ v pravém sloupci, kde čárka opravdu je; vlevo, kde je čárka na kraji okénka, dává záporný příspěvek.
# dopředný průchod konvoluční vrstvy (bez doplnění okrajů, krok 1)
vstup X: C × n × n, filtry K: F × C × k × k, prahy b: F
m = n − k + 1
for f in 1 … F:
for i in 0 … m−1, j in 0 … m−1:
s = b[f]
for c in 1 … C, u in 0 … k−1, v in 0 … k−1:
s = s + K[f][c][u][v] · X[c][i+u][j+v]
Y[f][i][j] = max(0, s) # ReLU
return Y # F map m × m
3. Pooling a hierarchie příznaků
Definice — max-pooling a receptivní pole
Nechť n ≥ 2 a A ∈ ℝn×n je mapa příznaků s prvky A[i, j], i, j = 0, …, n − 1. Označme m = ⌊n/2⌋.
- Max-pooling 2 × 2 s krokem 2 je zobrazení ℝn×n → ℝm×m, A ↦ P, kde pro i, j = 0, …, m − 1 P[i, j] = max {A[2i + u, 2j + v] : u, v ∈ {0, 1}}. Rozdělí tedy mapu na čtverečky 2 × 2 a z každého ponechá jen největší hodnotu; mapa se zmenší na polovinu v každém směru.
- Globální max-pooling je funkce ℝn×n → ℝ, A ↦ max {A[i, j] : i, j = 0, …, n − 1}; z celé mapy ponechá jediné číslo.
Má-li vrstva F map, použije se pooling na každou zvlášť.
Nechť je dána síť z konvolučních a poolingových vrstev ℓ = 1, 2, … se vstupním obrázkem X ∈ ℝn×n; neuronem rozumíme jeden prvek některé mapy a jeho okénko je množina prvků předchozí vrstvy (u vrstvy 1 pixelů X), ze kterých se jeho hodnota počítá. Receptivní pole R(y) ⊆ {0, …, n − 1}2 neuronu y je definováno po vrstvách:
- je-li y ve vrstvě 1, je R(y) množina poloh (i, j) pixelů v jeho okénku;
- je-li y ve vrstvě ℓ ≥ 2, je R(y) = ⋃ {R(y′) : y′ je v okénku y}.
Hodnota y je tedy funkcí jen pixelů z R(y) a změna pixelu mimo R(y) ji nijak nezmění. V sítích, jako je naše, je R(y) čtverec r × r pixelů; jeho stranu r počítá vzorec níže.
Pooling říká: „nezajímá mě přesně kde, jen jestli tu někde v okolí ta čárka je“. Tím přidá odolnost vůči malým posunům a zároveň zmenší obrázek, takže další vrstva vidí větší kus původního obrázku. První vrstva hledá čárky a hrany, druhá z nich skládá oblouky a rohy, hlubší vrstvy celé tvary. Naše síť má dvě konvoluční vrstvy; neuron druhé vrstvy už „vidí“ výřez 8 × 8 — celou číslici.
Max-pooling zapsaný vzorcem: P[i, j] = max { A[2i + u, 2j + v] : u, v ∈ {0, 1} }. Velikost receptivního pole se dá spočítat vrstvu po vrstvě; stačí si pamatovat, jak daleko od sebe ve vstupním obrázku leží sousední neurony vrstvy (rozestup Δ). Vrstvy číslujeme ℓ = 1, 2, … od vstupu, vrstva ℓ má okénko kℓ × kℓ a krok sℓ; na vstupu je r0 = 1 a Δ0 = 1. Pro ℓ ≥ 1:
rℓ = rℓ−1 + (kℓ − 1) · Δℓ−1, Δℓ = Δℓ−1 · sℓ
- rℓ
- receptivní pole neuronu vrstvy ℓ (strana čtverce v pixelech) — kolik obrázku může jeho hodnotu ovlivnit
- rℓ−1
- pole jednoho neuronu předchozí vrstvy — okénko se skládá z jejích neuronů, takže dostane aspoň tolik
- kℓ − 1
- o kolik sousedů okénko velikosti kℓ sahá dál než jeden neuron
- Δℓ−1, Δℓ
- rozestup sousedních neuronů měřený v pixelech vstupu — každý soused navíc přidá právě tolik pixelů; na vstupu je 1
- sℓ
- krok vrstvy — pooling s krokem 2 rozestup zdvojí, a proto každá další vrstva po poolingu roste dvakrát rychleji
Příklad — receptivní pole naší sítě
- vstup: r = 1, Δ = 1;
- konvoluce 3 × 3: r = 1 + 2 · 1 = 3, Δ = 1 · 1 = 1;
- max-pooling 2 × 2, krok 2: r = 3 + 1 · 1 = 4, Δ = 1 · 2 = 2;
- konvoluce 3 × 3: r = 4 + 2 · 2 = 8, Δ = 2 · 1 = 2 — výřez 8 × 8, velikost číslice;
- globální max přes mapu 3 × 3: r = 8 + 2 · 2 = 12 — celé plátno.
Barvy podle vzorce výše.
4. Co se síť naučila
Síť učíme stejně jako v dílu Neuronová síť od nuly: zpětné šíření chyby a gradientní sestup, 25 průchodů daty. Jediný rozdíl je, že gradient filtru se sčítá přes všechny polohy, kde byl filtr použit:
∂E/∂Kf[c, u, v] = ∑i,j δf[i, j] · X[c, i + u, j + v]
- ∂E/∂Kf[c, u, v]
- gradient jedné váhy filtru — o kolik ji posune gradientní sestup
- ∑i,j
- součet přes všechny polohy mapy — tatáž váha byla použita všude, a tak se o její změně „hlasuje“ ze všech míst; sem se promítne sdílení vah
- δf[i, j]
- chybový signál mapy v poloze (i, j), ∂E/∂Yf[i, j] — jak moc by chyba klesla, kdyby tu filtr odpověděl jinak; po ReLU a poolingu je ve většině poloh nula
- X[c, i + u, j + v]
- pixel, který tahle váha v poloze (i, j) násobila — stejně jako u obyčejného neuronu je gradient váhy „signál krát vstup“
Věta — gradient max-poolingu
Nechť q ≥ 1 a P : ℝq → ℝ, P(a) = max(a1, …, aq). Nechť a ∈ ℝq má jediné maximum v prvku am, tj. am > at pro všechna t ≠ m. Pak je P v bodě a diferencovatelná a
∂P/∂am(a) = 1, ∂P/∂at(a) = 0 pro t ≠ m.
Důkaz. Pro q = 1 je P(a) = a1. Pro q ≥ 2 položme ε = mint ≠ m (am − at) > 0. Pro každé h ∈ ℝq s |ht| < ε/2 pro všechna t je am + hm > at + ht pro t ≠ m, takže P(a + h) = am + hm. V okolí bodu a je tedy P lineární funkce, která závisí jen na m-té složce, a odtud plynou uvedené derivace. ∎
Slovy: malá změna kteréhokoli prvku kromě maxima výsledek nezmění, změna maxima se přenese beze změny. Pooling proto při zpětném šíření pošle celý signál jen do polohy, odkud maximum přišlo; ostatní tři ze čtverečku 2 × 2 dostanou nulu. Náš kód si tu polohu při dopředném průchodu zapamatuje.
# jeden krok učení naší konvoluční sítě na obrázku x se třídou c (η = 0,02)
dopředu: a1 = ReLU(konvoluce(x, K1) + b1) # 8 × 10 × 10
p1 = maxpool2×2(a1), zapamatuj polohy maxim # 8 × 5 × 5
a2 = ReLU(konvoluce(p1, K2) + b2) # 16 × 3 × 3
g = max přes každou mapu a2, zapamatuj polohy # 16
p = softmax(W · g + b3) # 10
dozadu: dz = p − (1 v místě c, jinde 0)
dg = Wᵀ · dz # ještě se starým W
W, b3 −= η · gradienty z dz
δ2 = dg jen v poloze maxima, ReLU propustí jen kladné
dp1 = δ2 rozprostřené zpět přes váhy K2
K2, b2 −= η · ∑ přes polohy δ2 · okénko p1
δ1 = dp1 jen v poloze maxima čtverečku 2 × 2, ReLU jako výše
K1, b1 −= η · ∑ přes polohy δ1 · okénko x
Filtry jsou jen 3 × 3 pixely a nejsou tak úhledné jako ručně navržený Sobel — síť je odvodila z pouhých 500 obrázků. Přesto je u řady z nich vidět světlá a tmavá strana, tedy detektor přechodu v určitém směru, a jiné připomínají šikmé čárky. Mapy příznaků ukazují, kde v obrázku který filtr „zabral“: na trojce jeden reaguje hlavně na vodorovné tahy, jiné na její pravý svislý okraj, další na celou kresbu.
5. Posun: konvoluční síť proti plně propojené
| Síť | parametrů | test, malý posun | test, posun o 2 px |
|---|---|---|---|
| plně propojená 144-32-10 | 4 970 | 99,9 % | 16,3 % |
| konvoluční | 1 418 | 100 % | 58,0 % |
| plně propojená, augmentovaná data | 4 970 | 89,8 % | 82,9 % |
| konvoluční, augmentovaná data | 1 418 | 100 % | 99,9 % |
Konvoluční síť má třikrát méně parametrů a na číslicích posunutých víc, než kdy viděla, poznala 58,0 % — místo 16,3 % u plně propojené. Dokonalá ale není: filtry druhé vrstvy se v okrajových polohách plátna při tréninku skoro neprocvičily. Konvoluce dává síti schopnost přenést naučené na jiné místo, ne záruku.
Definice — ekvivariance a invariance vůči posunu
Obrázky a mapy zde chápeme jako funkce na celé mřížce ℤ2, které mimo plátno mají hodnotu 0: obrázek s C kanály je funkce X : {1, …, C} × ℤ2 → ℝ. Pro vektor a = (a1, a2) ∈ ℤ2 je posun o a zobrazení X ↦ TaX,
(TaX)[c, i, j] = X[c, i − a1, j − a2]
(obsah, který byl v poloze (i, j), se přesune do (i + a1, j + a2)). Nechť g je zobrazení, které obrázku přiřadí výstup.
- Je-li výstupem opět obrázek (mapa), je g vůči posunu ekvivariantní, právě když ∀a ∈ ℤ2 ∀X : g(TaX) = Tag(X) — posun vstupu posune výstup o totéž.
- g je vůči posunu invariantní, právě když ∀a ∈ ℤ2 ∀X : g(TaX) = g(X) — posun výstup nezmění.
Věta — konvoluce je ekvivariantní, globální maximum invariantní
Na konečném plátně se posun nedá provést beze ztrát (něco vypadne přes okraj), věta proto mluví o polohách uvnitř. Nechť X ∈ ℝC×n×n je vstup, a ∈ ℤ2 a TaX ∈ ℝC×n×n obrázek posunutý o a na témž plátně (pixely, které by ležely mimo plátno, vypadnou; prázdná místa jsou 0). Nechť Y[X] je jedna mapa konvoluční vrstvy z definice výše (s filtrem K a prahem b, před ReLU i po něm) a M = {0, …, m − 1}2 množina jejích poloh. Pak
- pro každé (i, j) ∈ M, pro které je i (i − a1, j − a2) ∈ M, platí Y[TaX][i, j] = Y[X][i − a1, j − a2];
- označme G(X) = max(i, j) ∈ M Y[X][i, j] globální maximum mapy. Nabývá-li mapa Y[X] maxima v poloze (i′, j′), pro kterou je (i′ + a1, j′ + a2) ∈ M, a mapa Y[TaX] maxima v poloze (i, j), pro kterou je (i − a1, j − a2) ∈ M (maximum se posunem nedostalo přes okraj), pak G(TaX) = G(X).
Důkaz. (1) Pro u, v = 0, …, k − 1 leží (i − a1 + u, j − a2 + v) i (i + u, j + v) na plátně, a proto (TaX)[c, i + u, j + v] = X[c, i − a1 + u, j − a2 + v]; dosazením do vzorce konvoluční vrstvy dostaneme se stejnými vahami K přesně součet pro polohu (i − a1, j − a2). Jde to jen proto, že K na poloze nezávisí. ReLU působí na každé číslo zvlášť, takže rovnost nezkazí. (2) Podle (1) je Y[TaX][i′ + a1, j′ + a2] = Y[X][i′, j′] = G(X), tedy G(TaX) ≥ G(X), a G(TaX) = Y[TaX][i, j] = Y[X][i − a1, j − a2] ≤ G(X). ∎
Max-pooling 2 × 2 s krokem 2 je ekvivariantní jen vůči posunům o sudý počet pixelů (posun o 2 v obrázku je posun o 1 v menší mapě); posun o 1 pixel rozdělí hodnoty do čtverečků jinak. I proto naše síť přesně invariantní není.
Příklad — týž filtr na posunutém obrázku
Obrázek z příkladu v oddílu o konvoluční vrstvě posunutý o pixel doleva a jeho mapa s týmž filtrem a prahem:
T(0, −1)X = 1100010001001110 Y = 4030
Mapa 0403 se posunula o sloupec doleva spolu s obrázkem — ekvivariance. Její maximum je v obou případech 4 — invariance: vrstva, která se ptá jen „je tu někde svislá čárka?“, dá stejnou odpověď.
Definice — augmentace dat
Nechť 𝒳 je množina vstupů (obrázků), D = ((x1, y1), …, (xN, yN)) trénovací data s xk ∈ 𝒳 a třídami yk a 𝒯 množina transformací t : 𝒳 → 𝒳 (posuny, otočení, zrcadlení, změny jasu …), o kterých předpokládáme, že správnou třídu nemění: pro každé t ∈ 𝒯 má t(x) touž třídu jako x. Augmentace dat učí síť místo na D na datech
D′ = ((t1(x1), y1), …, (tN(xN), yN)), t1, …, tN ∈ 𝒯 vylosované náhodně,
případně na sjednocení D a takových upravených kopií. Síť tak uvidí tytéž příklady v různých podobách, u kterých se správná odpověď nemění. V našem pokusu je 𝒯 množina posunů o −2 až 2 pixely v každém směru; 500 trénovacích číslic jsme vygenerovali znovu, každou s náhodně vylosovaným posunem z 𝒯.
Když chceme, aby síť poznala číslici kdekoli, ukažme jí ji kdekoli. Se stejným počtem 500 obrázků, ale posunutých až o 2 pixely, má konvoluční síť na velkých posunech 99,9 %. Plně propojená se zlepší taky, na 82,9 % — jenže musí každou polohu naučit zvlášť, a tak se zhorší i na malých posunech (89,8 %). Konvoluce a augmentace se doplňují: architektura dá síti správný předpoklad, data ho doladí.
6. Od PSČ k ImageNetu
- Neokognitron (Kunihiko Fukušima, 1980) navrhl střídání vrstev, které hledají vzory, a vrstev, které je zobecňují — inspirován zrakovou kůrou koček.
- LeNet (Yann LeCun, 1989 až 1998) přidal učení zpětným šířením a četl ručně psaná PSČ na amerických obálkách a částky na šecích.
- AlexNet (2012) — osm vrstev, ReLU, dropout, augmentace a výpočet na grafických kartách — vyhrál ImageNet s velkým náskokem.
- ResNet (2015) díky reziduálním spojením naučil sítě se 152 vrstvami.
- Transformery pro obraz (ViT, 2020) rozdělí obrázek na čtverečky a zpracují je jako slova; na velkých datech konvolučním sítím konkurují, na menších datech mají konvoluce stále výhodu svého vestavěného předpokladu.
7. Shrnutí
- Plně propojená síť bere každý pixel zvlášť a naučené nepřenese na jiné místo: na posunutých číslicích 16,3 %.
- Konvoluční vrstva posouvá malé filtry po celém obrázku se sdílenými vahami — 1 728 vah místo 9,6 milionu.
- Pooling zmenšuje mapy a zvětšuje receptivní pole; hlubší vrstvy skládají jednoduché příznaky do složitějších.
- Naučené filtry první vrstvy jsou detektory hran; konvoluční síť s 1 418 parametry dala na posunutých číslicích 58,0 %.
- S augmentací dat dosáhla 99,9 %, plně propojená jen 82,9 %.
Chcete si to osahat? Nechte AI agenta stáhnout dataset MNIST a natrénovat na něm malou konvoluční síť v PyTorchi — a pak jí ukázat číslice posunuté o pět pixelů. Pomůže, když přidáte augmentaci?
Máte na to jiný názor? Napište na support@coden-app.com.