---
# System prepended metadata

title: SZ 5. Neuronové sítě
tags: [Společný základ]

---

---
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
 
![](https://i.imgur.com/mMRyNnr.png =500x)
![](https://i.imgur.com/GWPTtF5.png =500x)
![](https://i.imgur.com/UllAAdr.png =600x)

## 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)

![](https://i.imgur.com/LoUq4fD.png)




- 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$.

    ![](https://i.imgur.com/BIwxcqW.png)


  - *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ě.

    ![](https://i.imgur.com/0FQORvw.png)


  - 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*.

      ![](https://i.imgur.com/dFtf2SW.png)


- 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