markdown
Neuron-a-perceptron.md
markdown
# Umělý neuron a perceptron V roce 1969 vyšla kniha, která na sedmnáct let zastavila výzkum neuronových sítí. Minsky a Papert v ní ukázali jedinou věc: **jeden neuron nedokáže realizovat funkci XOR.** Nebyl to útok, byl to důkaz. XOR není lineárně separabilní - nedá se oddělit jednou přímkou - a jeden neuron nic jiného než přímku nakreslit neumí. Financování se stáhlo, obor se odmlčel a čekalo se, až někdo vymyslí, jak naučit síť s víc vrstvami. Tahle stránka je o tom, co jeden neuron je, co umí a kde přesně naráží. Předpokládá to jen vážený součet a graf funkce. Jak se ten limit prolomí, je na [MLP a backpropagation](MLP-a-backpropagation), a co všechno z toho vyrostlo, je v [topologiích sítí](Topologie-a-uceni-siti). ## Biologická inspirace Umělé neuronové sítě vycházejí ze **zjednodušeného** modelu nervové tkáně. To slovo zjednodušeného je důležité - podobnost je inspirace, ne model. Čísla, kterými se to obvykle uvádí: - lidský mozek obsahuje přibližně **10^11 neuronů**,- ty jsou propojeny zhruba **10^14 synapsemi**,- každý neuron má stovky až tisíce vstupů (dendritů). Biologický neuron se skládá ze čtyř částí: - **dendrity** - vstupní výběžky přijímající signály,- **tělo (soma)** - vyhodnocuje součet příchozích signálů,- **axon** - vystupující vlákno přenášející impulz k dalším neuronům,- **synapse** - kontaktní místa s proměnnou „propustností", tedy vahou. Pokud součet vážených vstupů překročí prahovou hodnotu, neuron **vystřelí** - vyšle impulz po axonu. **To je celý mechanismus, který se modeluje.** Váhy jsou synapse, součet je soma, práh je vystřelení. Všechno ostatní v biologii - chemie neurotransmiterů, časování impulzů, plasticita - se zahodilo. ## Matematický model neuronu **Umělý neuron (McCulloch a Pitts, 1943)** má `n` vstupů `x1, ..., xn`, každý s odpovídající vahou `w1, ..., wn`. Výstup `y` se počítá jako: ```y = f( Σ wi·xi − Θ ) pro i = 1..n``` kde `Θ` je práh a `f` je aktivační funkce. Práh se dá zapsat úsporněji: zaveď váhu `w0 = −Θ` spojenou se **stálým vstupem `x0 = 1`**. Práh se tím stane obyčejnou váhou a vzorec se zjednoduší: ```ai = g( Σ Wj,i · aj ) = g(ini) pro j = 0..n``` **Tenhle trik se dělá vždycky** a je důvod, proč se v kódu neuronových sítí o prahu skoro nemluví - schová se do vah jako *bias* a učí se stejně jako ony. Schéma neuronu: ```x1 --w1--\x2 --w2---\ [ Σ , f ] --> y ... / práh Θxn --wn--/``` ## Aktivační funkce | Funkce | Předpis | Kdy ||---|---|---|| Prahová (Heavisideova, skoková) | `f(x) = 1` pro `x ≥ 0`, jinak `0` | perceptron, logické funkce || Signum | `f(x) = +1` pro `x ≥ 0`, jinak `−1` | perceptron s bipolárním výstupem || Sigmoida (logistická) | `f(x) = 1 / (1 + e^(−x))` | klasické MLP, výstup jako pravděpodobnost || Hyperbolická tangenta | `f(x) = (e^x − e^(−x)) / (e^x + e^(−x))` | skryté vrstvy, výstup centrovaný kolem nuly || **ReLU** | `f(x) = max(0, x)` | **dnes nejpoužívanější v hlubokých sítích** | Sigmoida má vlastnost, kvůli které se používala desítky let: ```f'(x) = f(x) · (1 − f(x))``` **Derivace se dá spočítat z hodnoty funkce.** Nemusíš nic derivovat znovu - máš-li výstup neuronu, máš i jeho derivaci. Pro [backpropagation](MLP-a-backpropagation) je to zásadní úspora. **Proč sigmoida a tanh?** Jsou **diferencovatelné**, což je nutná podmínka pro algoritmus zpětného šíření chyby. Skoková funkce diferencovatelná není a nedá se s ní gradient počítat vůbec. **ReLU není diferencovatelná v nule**, ale její sub-gradient se v praxi používá bez problémů - v nule se prostě zvolí nula nebo jedna a nikdy to nic nerozbilo. Vyhrála proto, že u hlubokých sítí netrpí mizejícím gradientem: sigmoida má derivaci nejvýš `0,25`, takže po deseti vrstvách je gradient násobený `0,25^10 ≈ 10^−6` a zmizí. ReLU má derivaci `1` všude v kladné části. Víc o tom u [rekurentních sítí](Rekurentni-site-a-LSTM#problém-dlouhodobých-závislostí), kde je ten problém nejvýraznější. ## Logické funkce jedním neuronem Vhodnou volbou vah se dají realizovat základní logické funkce. Aktivace je prahová. | Funkce | `w0` (práh) | `w1` | `w2` ||---|---|---|---|| AND (`x1 ∧ x2`) | 1,5 | 1 | 1 || OR (`x1 ∨ x2`) | 0,5 | 1 | 1 || NOT (`¬x1`) | −0,5 | −1 | - | Spočítej si AND. Vstup `(1, 1)` dá `1 + 1 = 2 ≥ 1,5`, tedy výstup 1. Vstup `(1, 0)` dá `1 < 1,5`, tedy 0. Sedí. U OR je práh jen `0,5`, takže stačí jeden jedničkový vstup. **Rozdíl mezi AND a OR je výhradně v prahu** - váhy jsou stejné. To je hezky vidět, jak málo stačí ke změně chování. ## XOR: limit, který zastavil obor Funkci XOR **jeden neuron realizovat nedokáže**, protože není lineárně separabilní. Nakresli si to na papír. Čtyři body: `(0,0) → 0`, `(0,1) → 1`, `(1,0) → 1`, `(1,1) → 0`. Jedničky leží na jedné úhlopříčce čtverce, nuly na druhé. **Žádná přímka je neoddělí.** A jeden neuron nic jiného než přímku nakreslit neumí. Rovnice `Σ wi·xi = Θ` je rovnicí nadroviny, a co je na jedné straně, dostane jedničku, co na druhé, nulu. **Tenhle limit objevili Minsky a Papert v roce 1969 a dočasně tím zastavili výzkum neuronových sítí.** Řešení - vícevrstvá síť - bylo tehdy známé, ale nikdo neuměl takovou síť naučit. Trvalo to do roku 1986, než se objevil [backpropagation](MLP-a-backpropagation). Poučení, které z toho stojí za to si odnést: **korektní důkaz o limitu jednoduchého modelu se dá číst jako důkaz o limitu celého přístupu, a to je omyl.** Kniha byla správná, závěr, který si z ní obor vzal, ne. ## Perceptron **Perceptron (Rosenblatt, 1958)** je nejjednodušší síť s jednou vrstvou trénovatelných vah. Pro binární klasifikaci platí: ```y = sgn( Σ wi·xi − Θ )``` **Perceptron definuje nadrovinu rozdělující vstupní prostor na dvě poloroviny.** Je to tedy lineární klasifikátor a spadá přesně do rámce [diskriminačních funkcí](Klasifikace-a-rozpoznavani#diskriminační-funkce). Pravidlo učení: ```Wj ← Wj + α · Err · g'(in) · xj, Err = t − y``` kde `t` je očekávaný a `y` aktuální výstup. Pro perceptron se skokovou aktivací se derivace `g'` nahrazuje jednotkou, čímž dostaneš klasické **Rosenblattovo pravidlo**: ```Wj ← Wj + α(t − y)·xj``` Rozeber si, co to dělá. Když je výstup správný, `t − y = 0` a **nic se nemění**. Když je výstup příliš nízký, `t − y > 0` a váhy se posunou ve směru vstupu, takže příště bude výstup vyšší. Když je příliš vysoký, posunou se opačně. **Perceptronová věta o konvergenci říká, že pro lineárně separabilní data tenhle postup skončí v konečném počtu kroků.** Pro data, která separabilní nejsou, neskončí nikdy a bude oscilovat - a to je přesně to, co se stane na XOR. ## Hebbovo pravidlo Nejjednodušší pravidlo učení **bez učitele** (Hebb, 1949). Posiluje spojení mezi neurony, které jsou aktivní současně: ```wij(t + 1) = wij(t) + α · yi · yj``` kde `α` je rychlost učení a `yi`, `yj` aktivity propojených neuronů. Populárně se to shrnuje jako **„neurons that fire together, wire together"**. Všimni si, že v tom vzorci **není žádné `t`, tedy žádný požadovaný výstup**. Proto je to učení bez učitele - pravidlo neví, co je správně, jen sleduje, co se děje současně. Slabina je vidět hned: váhy jen rostou a nic je nedrží. Bez normalizace nebo útlumu se rozletí do nekonečna. Praktické varianty (Ojovo pravidlo) proto přidávají člen, který váhy udržuje omezené. ## Co se na tom nejčastěji rozbije | Příznak | Kde je problém ||---|---|| Perceptron nikdy nezkonverguje | data nejsou lineárně separabilní - potřebuješ [víc vrstev](MLP-a-backpropagation) || Váhy se rozletí do nekonečna | příliš velká rychlost učení `α`, nebo Hebbovo pravidlo bez útlumu || Síť dává pořád tentýž výstup | nasycená sigmoida - vstupy nejsou [normalizované](Metriky-a-vyhodnoceni#základní-typy-dat) || Učení se zastaví, ale chyba je velká | práh se neučí - zapomenutý `x0 = 1` a váha `w0` || Neuron s ReLU je trvale mrtvý | dostal velký záporný gradient, výstup i derivace jsou navždy nula || Gradient po pár vrstvách zmizí | sigmoida v hluboké síti - přejdi na ReLU | ## Co si odnést **Neuron je vážený součet s prahem a nelineární funkcí.** Nic víc. **Práh se schová do vah jako `w0` se stálým vstupem `x0 = 1`.** **Jeden neuron kreslí nadrovinu**, takže umí AND, OR a NOT, ale ne XOR. **XOR není lineárně separabilní** a tenhle jediný fakt zastavil obor na sedmnáct let. **Sigmoida má derivaci `f(1−f)`**, což je důvod její dlouhé kariéry. ReLU vyhrála kvůli mizejícímu gradientu. **Perceptronové pravidlo konverguje jen na separabilních datech.** Jinak osciluje navěky. **Hebbovo pravidlo je učení bez učitele** - v jeho vzorci není požadovaný výstup. ## Kam dál - **[MLP a backpropagation](MLP-a-backpropagation)** - jak se limit XOR prolomil- **[Topologie a učení sítí](Topologie-a-uceni-siti)** - přehled, jaké druhy sítí existují a jak se učí- **[Linearní regrese](Linearni-regrese)** - neuron bez aktivační funkce je přesně tohle- **[Klasifikace a rozpoznávání](Klasifikace-a-rozpoznavani)** - kam perceptron zapadá mezi klasifikátory