---
tags: Společný základ
---
# SZ 5. Neuronové sítě
*Neuronové sítě: Vícevrstvé sítě a jejich výrazové schopnosti. Učení neuronových sítí: Gradientní sestup, zpětná propagace, praktické otázky učení (příprava dat, inicializace vah, volba a adaptace hyperparametrů). Regularizace. Konvoluční sítě. Rekurentní sítě (LSTM). (PV021)*
## 99% hotove
- https://drive.google.com/file/d/16SD3T2UfEsnw7ykQPgiaQZ81WVfltn7H/view?usp=sharing
## Výrazové schopnosti MLP
**Boolean functions**
- 2-layer MLP s unit-step activactions vie vyjadriť všetky boolean funkcie tvaru $F: {0,1}^n \rightarrow {0,1}$
- 1. vrstva: pre vstupný vektor $\vec{v} = (v_1, ..., v_n)$ máme neurón $N_{\vec{v}}$ ktorý vracia 1 iff input je presne $\vec{v}$
- 2. vrstva: spojíme výstupy všetkých takýchto neurónov splňujúcich $F(\vec{v}) = 1$ pomocou neurónu implementujúcemu OR.
**Cybenko theorem**
- Given sigmoid activation in hidden layers and linear activation in output layer:
For each continuous function $f: [0, 1]^n \rightarrow [0, 1]$ and $\epsilon > 0:$
$\exists$ funkcia $F: [0, 1]^n \rightarrow [0, 1]$ computed by 2-layer MLP where:
$\mid f(\vec{v}) - F(\vec{v}) \mid \lt \epsilon$ for each $\vec{v} \in [0, 1]^n$
- i.e. 2-layer MLP = univerzálny aproximátor
## Učení neuronových sítí
[ZDE](https://is.muni.cz/auth/el/fi/podzim2017/PV021/um/new_lecture_slides/NEW_Lecture_Slides.pdf)
### Inicializace vah
Aby sa sieť efektívne učila, musíme udržiavať konzistentný variance outputov (forward) a gradientov (backprop).
Glorot & Bengio (Xavier) a He inicializačné metódy sa snažia riešiť problém vanishing a exploding gradient správnym iniciálnym nastavením váh a tým zefektívniť učenie.
- (Xavier) Glorot & Bengio - vhodnejšie pre Sigmoid, Tanh funkcie
- He - vhodnejšie pre ReLU, Leaky ReLU
- https://medium.com/@sanjay_dutta/understanding-glorot-and-he-initialization-a-guide-for-college-students-00f3dfae0393



## Regularizace
https://towardsdatascience.com/regularization-in-deep-learning-l1-l2-and-dropout-377e75acc036
- **veľkosť modelu** - veľké modely viac náchylné overfitnut, treba nájsť vhodnú veľkosť pre daný dataset
- **early stopping** - zastav tréning ak nedošlo k zlepšeniu na validačnej sade za posledných k krokov/epoch
- **ensembles** - kombinácia viacerých separátne natrénovaných modelov + voting (klasifikácia) / averaging (regresia), chyby sa "vykrátia" a zmenší sa generalization error
- **dropout** - v každom kroku gradient descent sa náhodne (podľa určitej probability) zvolí časť neurónov, ktoré sa použijú pre forward a backward pass. Podobné, ale nie rovnaké, ako bagging.
- **L2 regularizácia** / **Weight decay** - penalizuje veľké váhy úpravou error function (tlačí nedôležité váhy k 0)
- $\text{Loss}_{\text{new}}(\vec{w}) = \text{Loss}_{\text{orig}}(\vec{w}) + \lambda \vec{w} \cdot \vec{w}$
## Konvoluční sítě (CNN)

- Redukuje overfitting a počet parametrů pomocí sdílení vah a poolingu.
- Skládá se z **konvolučních vrstev (convolutional layers)** a **pooling vrstev**.
### Konvoluční vrstvy (Convolutional layers)
- Vysvětlení na příkladu:
- Vstupní vrstva má $28 \times 28$ neuronů (pixelů)
- Každý neuron ze skryté vrstvy není spojen s každým neuronem předešlé vrstvy, ale pouze s menší oblastí neuronů (*local receptive field*) např. o velikosti $5 \times 5$.

- *Local receptive field* budeme posouvat po celé vstupní vrstvě (obrázku). Každému *local receptive field* tak náleží jeden neuron v konvoluční vrstvě.

- Použitím *local receptive field* o velikosti $5 \times 5$ na vstupní vrstvě o velikosti $28 \times 28$ jsme dostali vrstvu o velikosti $24 \times 24$. Protože jsme *local receptive field* mohli posunout pouze $23 \times$ doprava a dolů.
- Délce posunu *local receptive field* se říká *stride length* a může se lišit.
- Váhy každého z nově vzniklých $24 \times 24$ neuronů jsou **sdílené** (důležitá změna!).
- To znamená, že každý z těchto neuronů detekuje právě jednu *feature*, ovšem každý na jiném místě.
- Tyto sdílené váhy a bias označujeme jako *kernel* nebo *filter*.
- Aplikováním *filteru* na vstupu získáme tzv. *feature maps*. V reálné aplikaci jich potřebujeme víc. Konvoluční vrstva je tak složena z více *feature maps*.

- počítanie output size pre Conv2D layer:
- input: $W \times H \times C$ (Width , Height, Channels)
- parameters:
- $F$ - počet filtrov (channel dimenzia outputu)
- $K \times K$ - kernel size (môžu sa líšiť, v praxi často súhlasné), e.g. VGG16 má 3x3
- $S$ - stride, default 1
- $P$ - padding, často floor(K / 2)
- output:
- $W_{\text{out}} = \frac{W - K + 2P}{S} + 1$
- $H_{\text{out}} = \frac{H - K + 2P}{S} + 1$
- $C_{\text{out}} = F$
## LSTM
dopodrobna vysvětleno:
https://colah.github.io/posts/2015-08-Understanding-LSTMs/
super video:
https://youtu.be/WCUNPb-5EYI