# Autoenkoder ## (autoasocjator)
Architektura sieci neuronowej wykorzystywana do uczenia bez nadzoru, wykorzystywana w takich zagadnieniach jak: - redukcja wymiarowości - odszumianie danych - wykrywanie anomalii - segmentacja - kompresja - modelowanie generatywne - wzbogacanie danych rzeczywistych (*data augmentation*) - systemy rekomendacyjne

----
## Budowa Autoenkoder to dwuczęściowa sieć neuronowa, której części stanowią: - *koder* - kompresuje dane wysokowymiarowe do niskowymiarowej reprezentacji - *dekoder* - odtwarza oryginalne dane na podstawie tej niskowymiarowej reprezentacji

----
## Uczenie - uczenie polega na poszukiwaniu parametrów sieci w celu zminimalizowania straty (różnicy) pomiędzy danymi wejściowymi, a wyjściem. - ukryta warstwa będąca wyjściem kodera i wejściem dekodera stanowi ukrytą przestrzeń, do której skompresowane zostały dane wejściowe.

----
## Ukryta reprezentacja - punkty w ukrytej przestrzeni stanowią skompresowaną reprezentację oryginalnych danych - przestrzeń ukryta jest rozmaitością przestrzeni wielowymiarowej

--- ## Redukcja wymiarowości Autoenkodery pozwalają odwzorować dane do przestrzeni o niższym wymiarze przy zachowaniu głównych cech danych.  ---- ## Detekcja anomalii ### Unsupervised anomaly detection (UAD)
- sieć zostaje wytrenowana na danych bez anomalii - dane posiadające anomalie generują dużą wartość funkcji straty - anomalie są cechami, których sieć nie zna - uczenie bez nadzoru (dane bez etykiet)
 [Źródło](https://www.researchgate.net/publication/340499853_Autoencoders_for_Unsupervised_Anomaly_Segmentation_in_Brain_MR_Images_A_Comparative_Study)
---- ## Wzbogacanie danych, odszumianie ### Unsupervised data augmentation (UDA)
- AE jako metoda wzbogacania i uzupełniania danych - usuwanie szumu - kolorowanie zdjęć - uczenie bez nadzoru
 [Źródło](https://towardsdatascience.com/convolutional-autoencoders-for-image-noise-reduction-32fce9fc1763)  [Źródło](https://www.researchgate.net/publication/340499853_Autoencoders_for_Unsupervised_Anomaly_Segmentation_in_Brain_MR_Images_A_Comparative_Study)
---- ## Segmentacja
- proces podziału danych (np. obrazu) na jednorodne regiony należące do wybranej klasy - generowanie maski - lokalizacja "pixel perfect" - raczej zadanie dla autoenkoderów nielinearnych (U-Net)
 Źródło własne  [Źródło](https://www.researchgate.net/publication/346399693_Beyond_Measurement_Extracting_Vegetation_Height_from_High_Resolution_Imagery_with_Deep_Learning)
--- ## Autoenkodery konwolucyjne
- autoenkodery konwolucyjne zawierają filtry splotowe - *downsampling* (zmniejszenie rozmiaru danych, koder) jest realizowany przez sploty z krokiem (*stride*) większym niż 1 lub warstwy typu *MaxPool*/*AveragePool* - *upsampling* (dekoder) - splot transponowany (*transposed convolution*) lub interpolacja (np. *nearest neighbor* lub *bilinear*)
 [Źródło](https://www.researchgate.net/publication/340499853_Autoencoders_for_Unsupervised_Anomaly_Segmentation_in_Brain_MR_Images_A_Comparative_Study)
---- ## Splot transponowany
- zmiana kierunku projekcji: przejście z reprezentacji o mniejszym wymiarze do reprezentacji o większym wymiarze - splot transponowany jest aproksymacją przekształcenia odwrotnego do splotu (lecz NIE jest do operacja rozplotu / dekonwolucji) - splot danych rozrzedzonych zerami
 Przykład działania splotu transponowanego Źródło: [github.com/vdumoulin/conv_arithmetic](https://github.com/vdumoulin/conv_arithmetic)
----
### Porównanie splotu ze splotem transponowanym  Splot ze skokiem 2. [Źródło](https://arxiv.org/pdf/1609.07009.pdf)
 Splot z filtrem transponowanym ze skokiem 2.
---- ### Splot ze skokiem ułamkowym  Splot ze skokiem $1/2$. --- # U-Net
- model zaproponowany w 2015 roku - segmentacja danych z obrazowania medycznego - sieć w pełni splotowa - model oparty na architekturze autoenkodera
 [Źródło](https://scholar.google.de/citations?user=7jrO1NwAAAAJ&hl=en)
---- ## Struktura U-Net
- ścieżka redukująca / kompresująca (koder) i rekonstruująca / dekompresująca (dekoder) - ścieżka kompresująca zawiera warstwy splotowe ($3 \times 3$) i $MaxPool$ ($2 \times 2$) - ścieżka dekompresująca zawiera sploty transponowane (z ułamkowym skokiem) i konkatenację przyciętych map cech ze ścieżki kompresującej

---- ## Segmentacja "kafelkowa" ### *Overlap-tile strategy*
- segmentacja przekrywających się okienek - możliwe przetwarzanie obrazów o dowolnym rozmiarze - segmentacja obszaru w żółtej ramce na podstawie obrazu w niebieskiej ramce - brakujące dane są ekstrapolowane przez lustrzane odbicie

---- ## Śledzenie komórek ### *ISBI cell tracking challenge*  - *a*, *c*: obraz wejściowy - *b*, *d*: żółty kontur - rzeczywiste granice; kolorowe obszary - wynik z modelu --- ## Modelowanie generatywne
- modele generatywne znajdują rozkład prawdopodobieństwa oryginalnych danych w ukrytej przestrzeni - po wytrenowaniu VAE wykorzystuje się wyłącznie część dekodującą - próbkowanie z przestrzeni ukrytej pozwala wygenerować dane posiadające cechy danych weściowych, lecz nienależące do zbioru uczącego. - VAE opisuje więc, jak w sensie probabilistycznym są generowane dane
 Źródło: [www.tensorflow.org/tutorials/generative/cvae](https://www.tensorflow.org/tutorials/generative/cvae)
---- ## Autoenkodery wariacyjne (*VAE*)
- w zwyczajnym autoenkoderze obraz jest mapowany bezpośrednio na punkt w przestrzeni ukryte - w autoenkoderze wariacyjnym obraz jest mapowany na rozkład normalny wokół punktu w przestrzeni ukrytej - VAE zakłada, że pomiędzy wymiarami w przestrzeni ukrytej nie ma korelacji - ponieważ próbkujemy z z pewnego rozkładu, dekoder musi zapewnić, że obrazy bliskich punktów w przestrzeni ukrytej są podobne

---- ## Warstwa próbkująca
### AE $x$ \ $\downarrow$ \ kodowanie \ $\downarrow$ \ $z$ \ $\downarrow$ \ dekodowanie \ $\downarrow$ \ $x'$
### VAE $x$ \ $\downarrow$ \ kodowanie \ $\downarrow$ \ $\mu$, $\sigma$ \ $\downarrow$ \ próbkowanie \ $z = N(\mu,\sigma)$\ $\downarrow$ \ dekodowanie \ $\downarrow$ \ $x'$
---- ## Sztuczka reparametryzacyjna ### *reparametrization trick* - by umożliwić wsteczną propagację przez warstwę próbkującą, stosuje się "trik reparametryzacyjny" - zamiast losować $z$ z rozkładu $N(\mu, \sigma)$, losujemy $\xi = N(0,1)$ - $z = \mu + \sigma \xi$ ---- ## Architektura autoenkodera wariacyjnego  Źródło rysunku: [lilianweng.github.io/lil-log/2018/08/12/from-autoencoder-to-beta-vae](https://lilianweng.github.io/lil-log/2018/08/12/from-autoencoder-to-beta-vae) ---- ## Regularyzacja - regularyzację stosujemy, by zapewnić, że zmienne $z$ w przestrzeni ukrytej mają rozkład normalny $N(0,1)$ - miarą odległości pomiędzy dwoma rozkładami jest entropia względna (Kullback–Leibler divergence) $$ D_{KL}(q, p) = \sum\limits_i q(i) \ln \frac{q(i)}{p(i)} $$ - dla rozkładu normalnego $N(\mu, \sigma)$, entropia względna wynosi: $$ D_{KL}(N(\mu, \sigma) || N(0,1)) = \frac{1}{2} \left( \sigma^2 + \mu^2 - 1 - \log\sigma^2 \right) $$ - całkowitą stratę VAE definiuje się jako sumę straty rekonstrukcji i straty regularyzacji: $$ L = L_{reconstruction} + \gamma*L_{regularization} $$ ---- ## Arytmetyka w przestrzeni ukrytej


[Źródło](https://houxianxu.github.io/assets/project/dfcvae) ---
### Latent diffusion - VAE przekształca obraz z przestrzeni pikseli do przestrzeni ukrytej i z powrotem - U-Net usuwa szum w przestrzeni ukrytej (np. modele Stable Diffusion 1.5, SDXL) [High-Resolution Image Synthesis with Latent Diffusion Models](https://arxiv.org/abs/2112.10752)

---- ## Physics informed ML ### Sparse identification of nonlinear dynamics (SINDy)
 [Data-driven discovery of coordinates and governing equations](https://www.pnas.org/doi/10.1073/pnas.1906995116)

--- # Przykłady Źródło przykładów: [dokumentacja TensorFlow](https://www.tensorflow.org/tutorials) - [podstawowy autoenkoder z jedną warstwą ukrytą](https://github.com/tomgrad/SN-kod/blob/main/autoencoder_ts/basic.ipynb) - [odszumianie obrazu z wykorzystaniem autoenkodera konwolucyjnego](https://github.com/tomgrad/SN-kod/blob/main/autoencoder_ts/denoise.ipynb) - [wykrywanie anomalii](https://github.com/tomgrad/SN-kod/blob/main/autoencoder_ts/anomalies.ipynb) - [autoenkoder splotowy wariacyjny](https://www.tensorflow.org/tutorials/generative/cvae) ---- # Źródła - C. C. Aggarwal, *Neural Networks and Deep Learning*, Springer 2018 - D. Foster, *Generative Deep Learning*, O'Reilly 2019 - [W. Shi et al., *Is the deconvolution layer the same as a convolutional layer?* (2016)](https://arxiv.org/pdf/1609.07009.pdf) - [O. Ronneberger et al., *U-Net: Convolutional Networks for Biomedical Image Segmentation* (2015)](https://link.springer.com/chapter/10.1007/978-3-319-24574-4_28) - [Intuitively Understanding Variational Autoencoders](https://towardsdatascience.com/intuitively-understanding-variational-autoencoders-1bfe67eb5daf)