# 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
