From 6e38c95e6e297ba97d9a289e1ce1997a3fd0ff6d Mon Sep 17 00:00:00 2001 From: EmaPajic Date: Sun, 18 Oct 2020 00:05:04 +0200 Subject: [PATCH 01/48] added initial readme --- docs/sr/README-SR.md | 108 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 docs/sr/README-SR.md diff --git a/docs/sr/README-SR.md b/docs/sr/README-SR.md new file mode 100644 index 000000000..5db88838a --- /dev/null +++ b/docs/sr/README-SR.md @@ -0,0 +1,108 @@ + +# Aprendizaje Profundo (con PyTorch) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Atcold/pytorch-Deep-Learning/master) + + +Este repositorio de *notebooks* tiene un [sitio web complementario](https://atcold.github.io/pytorch-Deep-Learning/es/), donde todo el material del curso puede ser encontrado en formato textual y de video. + + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md) +  [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md) + + +# Comenzando + + +Para poder seguir los ejercicios, necesitarás un ordenador con Miniconda (una versión minimalista de Anaconda) y varios paquetes de Python instalados. +Las instrucciones siguientes funcionarán para los usuarios de Mac o Ubuntu Linux. Los usuarios de Windows necesitarán instalar y trabajar en una terminal [Git BASH](https://gitforwindows.org/). + + +## Descarga e instala Miniconda + + +Ve al [sitio web de Anaconda](https://conda.io/miniconda.html). +Descarga e instala *la última* versión de Miniconda para *Python* 3.7 para tu sistema operativo. + + +```bash +wget +sh +``` + + +## Echa un vistazo al repositorio de git con los ejercicios + + +Una vez que Miniconda esté listo, revisa el repositorio del curso y continúa con la configuración del entorno: + +```bash +git clone https://github.com/Atcold/pytorch-Deep-Learning +``` + + +## Crear un entorno aislado de Miniconda + + +Cambia el directorio (`cd`) a la carpeta del curso, y luego escribe: + +```bash +# cd pytorch-Deep-Learning +conda env create -f environment.yml +source activate pDL +``` + + +## Inicia Jupyter Notebook o JupyterLab + + +Comienza desde la terminal como de costumbre: + +```bash +jupyter lab +``` + + +O, para la interfaz clásica: + +```bash +jupyter notebook +``` + + +## Visualización de notebooks + + +Los *Cuadernos Jupyter* (Notebooks) se utilizan a lo largo de estas lecciones para la exploración y visualización interactiva de datos. + + +Utilizamos estilos oscuros para *GitHub* y *Jupyter Notebook*. +Deberías intentar hacer lo mismo, o se verán feos. +JupyterLab tiene incorporado un tema oscuro seleccionable, por lo que solo necesitarás instalar algunas cosas extras si deseas usar la interfaz clásica de las notebooks. +Para ver el contenido adecuadamente en la interfaz clásica, instala lo siguiente: + + + - [Tema oscuro para *Jupyter Notebook*](https://userstyles.org/styles/153443/jupyter-notebook-dark); + - [Tema oscuro para *GitHub*](https://userstyles.org/styles/37035/github-dark) y comenta el bloque de código `invert #fff to # 181818`. From 20ac952960186f1acd01795ec34c5b3d69b4a4b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 18 Oct 2020 00:51:04 +0200 Subject: [PATCH 02/48] added translation of readme --- docs/sr/README-SR.md | 121 +++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 79 deletions(-) diff --git a/docs/sr/README-SR.md b/docs/sr/README-SR.md index 5db88838a..bdf65be1b 100644 --- a/docs/sr/README-SR.md +++ b/docs/sr/README-SR.md @@ -1,61 +1,40 @@ - -# Aprendizaje Profundo (con PyTorch) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Atcold/pytorch-Deep-Learning/master) - - -Este repositorio de *notebooks* tiene un [sitio web complementario](https://atcold.github.io/pytorch-Deep-Learning/es/), donde todo el material del curso puede ser encontrado en formato textual y de video. - - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md) -  [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md) - - -# Comenzando - - -Para poder seguir los ejercicios, necesitarás un ordenador con Miniconda (una versión minimalista de Anaconda) y varios paquetes de Python instalados. -Las instrucciones siguientes funcionarán para los usuarios de Mac o Ubuntu Linux. Los usuarios de Windows necesitarán instalar y trabajar en una terminal [Git BASH](https://gitforwindows.org/). - - -## Descarga e instala Miniconda - - -Ve al [sitio web de Anaconda](https://conda.io/miniconda.html). -Descarga e instala *la última* versión de Miniconda para *Python* 3.7 para tu sistema operativo. - - +# Duboko učenje (u PyTorch-u) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Atcold/pytorch-Deep-Learning/master) + +Ovaj repozitorijum ima [prateći sajt](https://atcold.github.io/pytorch-Deep-Learning/), gde se svi materijali kursa mogu naći u video i tekstualnom formatu. + + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇸🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md) + + +# Podešavanja + +Da bi bilo moguće pratiti vežbe, potreban je laptop sa instaliranom Miniconda-om (minimalnom verzijom Anaconda-e) i nekoliko paketa jezika Python. +Naredne instrukcije rade za Mac i Ubuntu Linux, a za Windows je potrebno da se instalira i radi u [Git BASH](https://gitforwindows.org/) terminalu. + + +## Instalacija + +Potrebno je otići na [sajt Anaconda](https://conda.io/miniconda.html). +Skinuti i instalirat *najnoviju* Miniconda verziju za *Python* 3.7 za vaš operativni sistem. + ```bash -wget +wget sh ``` - -## Echa un vistazo al repositorio de git con los ejercicios - -Una vez que Miniconda esté listo, revisa el repositorio del curso y continúa con la configuración del entorno: +## Preuzimanje git repozitorijuma sa vežbama + +Kada je Miniconda spremna, potrebno je preuzeti repozitorijum kursa i nastaviti sa podešavanjem okruženja: ```bash git clone https://github.com/Atcold/pytorch-Deep-Learning ``` - -## Crear un entorno aislado de Miniconda - -Cambia el directorio (`cd`) a la carpeta del curso, y luego escribe: +## Kreirati izolovano Miniconda okruženje + +Promeniti direktorijum (`cd`) na folder kursa, pa ukucati: ```bash # cd pytorch-Deep-Learning @@ -63,46 +42,30 @@ conda env create -f environment.yml source activate pDL ``` - -## Inicia Jupyter Notebook o JupyterLab - -Comienza desde la terminal como de costumbre: +## Startovati Jupyter Notebook ili JupyterLab + +Startovati iz terminala kao uobičajeno: ```bash jupyter lab ``` - -O, para la interfaz clásica: +Ili, za klasični interfejs: ```bash jupyter notebook ``` - -## Visualización de notebooks - - -Los *Cuadernos Jupyter* (Notebooks) se utilizan a lo largo de estas lecciones para la exploración y visualización interactiva de datos. - - -Utilizamos estilos oscuros para *GitHub* y *Jupyter Notebook*. -Deberías intentar hacer lo mismo, o se verán feos. -JupyterLab tiene incorporado un tema oscuro seleccionable, por lo que solo necesitarás instalar algunas cosas extras si deseas usar la interfaz clásica de las notebooks. -Para ver el contenido adecuadamente en la interfaz clásica, instala lo siguiente: - - - - [Tema oscuro para *Jupyter Notebook*](https://userstyles.org/styles/153443/jupyter-notebook-dark); - - [Tema oscuro para *GitHub*](https://userstyles.org/styles/37035/github-dark) y comenta el bloque de código `invert #fff to # 181818`. + +## Vizuelizacija Notebook-a + +*Jupyter Notebooks* se koriste kroz lekcije za interaktivnu eksploraciju i vizualizaciju. + +Koristimo tamni stil i za *GitHub* i *Jupyter Notebook*. +Trebalo bi podesiti isto jer inače neće izgledati lepo. +JupyterLab ima ugrađenu tamnu temu koju je moguće odabrati, pa je potrebno instalirati nešto samo ukoliko želite da koristite klasičan interfejs notebook-a. +Da bi se sadržaj video kako treba u klasičnom interfejsu potrebno je instalirati sledeće: + + - [*Jupyter Notebook* dark theme](https://userstyles.org/styles/153443/jupyter-notebook-dark); + - [*GitHub* dark theme](https://userstyles.org/styles/37035/github-dark) i zakomentarisati `invert #fff to #181818` blok koda. From 6cab86d570d0c19ab00646a7674ad896d2ecc824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 18 Oct 2020 13:38:01 +0200 Subject: [PATCH 03/48] added switch to Serbian language --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9bdaa9c33..327b1cc7a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This notebook repository now has a [companion website](https://atcold.github.io/pytorch-Deep-Learning/), where all the course material can be found in video and textual format. -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md) +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇸🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md) # Getting started From 04bc7f5437ce2f4b1f50dccdbca60db8c0ead2e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 18 Oct 2020 14:44:51 +0200 Subject: [PATCH 04/48] added translation of index.md --- docs/sr/index.md | 343 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 343 insertions(+) create mode 100644 docs/sr/index.md diff --git a/docs/sr/index.md b/docs/sr/index.md new file mode 100644 index 000000000..eecce422e --- /dev/null +++ b/docs/sr/index.md @@ -0,0 +1,343 @@ +--- +layout: default +title: DEEP LEARNING +author: Alfredo Canziani +lang-ref: home +--- + +**DS-GA 1008 · PROLEĆE 2020 · [NYU CENTAR ZA DATA SCIENCE](http://cds.nyu.edu/)** + +| PREDAVAČI | Yann LeCun & Alfredo Canziani | +| LEKCIJE | Ponedeljak 16:55 – 18:35, [GCASL C95](http://library.nyu.edu/services/campus-media/classrooms/gcasl-c95/) | +| VEŽBE | Utorak 19:10 – 20:00, [GCASL C95](http://library.nyu.edu/services/campus-media/classrooms/gcasl-c95/) | +| [PIAZZA](https://piazza.com/nyu/spring2020/dsga1008/home) | Pristupni kod: `DLSP20` | +| MATERIJALI | [Google Drive](https://bitly.com/DLSP20), [Notebooks](https://github.com/Atcold/pytorch-Deep-Learning) | + + +## Opis + +Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju atributa. Fokusira se na nadgledano i nenadgledano učenje, embedding metode, učenje metrika, konvolucione i rekurentne neuronske mreže, sa primenama u kompjuterskoj viziji, razumevanju prirodnog jezika i prepoznavanju govora. Potrebno predznanje: [DS-GA 1001 Intro to Data Science](https://cds.nyu.edu/academics/ms-curriculum/) ili kurs mašinskog učenja na nivou master ili doktorskih studija. + +## Lekcije + +**Oznake**: 🖥 slajdovi, 📓 Jupyter notebook, 🎥 YouTube video. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NedeljaFormatNaslovSadržaji
LekcijeIstorija i motivacija + 🖥️ + 🎥 +
Evolucija i duboko učenje
PraktikumNeuronske mreže (NN) + 📓 + 📓 + 🎥 +
LekcijeStohastički gradijentni spust (SGD) i propagacija unazad + 🖥️ + 🎥 +
Propagacija unazad u praksi
PraktikumObučavanje neuronskih mreža + 🖥 + 📓 + 📓 + 🎥 +
LekcijeTransformacija parametara + 🖥️ + 🎥 +
Konvolucione neuronske mreže (CNN)
PraktikumSvojstva prirodnih signala + 🖥 + 📓 + 🎥 +
Praktikum1D konvolucija + 📓 + 🎥 +
LekcijeOptimizacija I + 🖥️ + 🎥 +
Optimizacija II
PraktikumKonvolucione neuronske mreže (CNN), autograd + 📓 + 📓 + 🎥 +
LekcijeCNN primene + 🖥️ + 🖥️ + 🎥 +
Rekurentne neuronske mreže (RNN) i attention mehanizam
PraktikumObučavanje RNN + 📓 + 📓 + 🖥️ + 🎥 +
LekcijeModeli zasnovani na energiji (EBM) + 🖥️ + 🎥 +
Samonadgledano učenje (SSL), EBM
PraktikumAutoenkoderi + 🖥️ + 📓 + 🎥 +
LekcijeKontrastivne metode + 🖥️ + 🎥 +
Regularizovani latent
PraktikumObučavanje varijacionih autoenkodera (VAE) + 🖥️ + 📓 + 🎥 +
LekcijeProređenost + 🖥️ + 🎥 +
Model reči, GAN
PraktikumTreniranje GAN-ova + 🖥️ + 📓 + 🎥 +
LekcijeKompjuterska vizija (CV) SSL I + 🖥️ + 🎥 +
Kompjuterska vizija (CV) SSL II
PraktikumPrediktivno upravljanje + 🖥️ + 📓 + 🎥 +
LekcijeAktivacije + 🖥️ + 🖥️ + 🖥️ + 🎥 +
Funkcije gubitka
PraktikumPPUU + 🖥️ + 📓 + 🎥 +
LekcijeDuboko učenje za obradu prirodnih jezika (NLP) I + 🖥️ + 🎥 +
Duboko učenje za obradu prirodnih jezika (NLP) II
PraktikumAttention mehanizam i transformer + 🖥️ + 📓 + 🎥 +
LekcijeGraf-konvolucione mreže (GCN) I + 🖥️ + 🎥 +
Graf-konvolucione mreže (GCN) II
PraktikumGraf-konvolucione mreže (GCN) III + 🖥️ + 📓 + 🎥 +
LekcijeStruktuirane predikcije + 🖥️ + 🎥 +
Grafovske metode
PraktikumRegularizacija i Bajesovske neuronske mreže + 🖥️ + 📓 + 🖥️ + 📓 + 🎥 +
+ + +## Ljudi + +| Uloga| Slika | Kontakt | O nama | +|:-----|:-----:|:--------|:------| +|Predavač ||Yann LeCun
yann@cs.nyu.edu|Silver profesor računarskih nauka na NYU
i dobitnih Turing nagrade| +|Predavač ||Alfredo Canziani
canziani@nyu.edu|Asst. Prof. računarskih nauka na NYU| +|Asistent ||Mark Goldstein
goldstein@nyu.edu|PhD student računarskih nauka na NYU| +|Webmaster ||Zeming Lin
zl2799@nyu.edu|PhD student računarskih nauka na NYU| + + + + + +## Disclaimer + +Svi ostali tekstovi na ovom sajtu su beleške sa predavanja studenata New York Univerziteta tokom lekcija koje su držali Yann Le Cun, Alfredo Canziani, Ishan Misra, Mike Lewis and Xavier Bresson. +Dakle, tekstove na engleskom je pisalo oko 130 ljudi pa to utiče na homogenost teksta (nešto je u prošlom vremenu, nešto u sadašnjem; skraćenice nisu uvek iste; neke rečenice su kratke, a neke su u 5-6 redova, itd.). +Moguće je da postoje neke greške: greške u kucanju, slovne greške, itd. Ako primetite neku, pozivamo vas da postavite PR na [GitHub direktorijumu sajta](https://github.com/Atcold/pytorch-Deep-Learning/pulls) specifirajući sa `[EN]` da je u vezi tekstova na engleskom. + +Želimo vam duboko čitanje! From 22d25b5c6c4617edd8cf4b68abd8cb4c9b449750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 19 Oct 2020 08:39:02 +0200 Subject: [PATCH 05/48] updated sr to srb --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 327b1cc7a..00e2cb17b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This notebook repository now has a [companion website](https://atcold.github.io/pytorch-Deep-Learning/), where all the course material can be found in video and textual format. -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇸🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md) +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇸🇷🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SRB.md) # Getting started From 329bfe4ac056bc20465ad37b12938823e0a62790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 19 Oct 2020 08:43:26 +0200 Subject: [PATCH 06/48] updated srb to rs --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 00e2cb17b..3eff0068c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This notebook repository now has a [companion website](https://atcold.github.io/pytorch-Deep-Learning/), where all the course material can be found in video and textual format. -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇸🇷🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SRB.md) +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-RS.md) # Getting started From 7f733f517187a028dcbd4a0f613467534b28ff5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 19 Oct 2020 08:44:35 +0200 Subject: [PATCH 07/48] Update and rename README-SR.md to README-RS.md --- docs/sr/{README-SR.md => README-RS.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/sr/{README-SR.md => README-RS.md} (97%) diff --git a/docs/sr/README-SR.md b/docs/sr/README-RS.md similarity index 97% rename from docs/sr/README-SR.md rename to docs/sr/README-RS.md index bdf65be1b..a5a1c6b2f 100644 --- a/docs/sr/README-SR.md +++ b/docs/sr/README-RS.md @@ -3,7 +3,7 @@ Ovaj repozitorijum ima [prateći sajt](https://atcold.github.io/pytorch-Deep-Learning/), gde se svi materijali kursa mogu naći u video i tekstualnom formatu. -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇸🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md) +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-RS.md) # Podešavanja From 045809ab935216703cba2945fdada723b0fce889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 19 Oct 2020 08:46:56 +0200 Subject: [PATCH 08/48] Rename docs/sr/README-RS.md to docs/rs/README-RS.md --- docs/{sr => rs}/README-RS.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{sr => rs}/README-RS.md (100%) diff --git a/docs/sr/README-RS.md b/docs/rs/README-RS.md similarity index 100% rename from docs/sr/README-RS.md rename to docs/rs/README-RS.md From a53fc52eb1e9a1bdf9fcc1d46a8ac4743a389ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 19 Oct 2020 08:48:15 +0200 Subject: [PATCH 09/48] Rename docs/sr/index.md to docs/rs/index.md --- docs/{sr => rs}/index.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{sr => rs}/index.md (100%) diff --git a/docs/sr/index.md b/docs/rs/index.md similarity index 100% rename from docs/sr/index.md rename to docs/rs/index.md From 2a4e4fac9c5da6d173c2ccdb4ec89de90020de4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 19 Oct 2020 08:50:09 +0200 Subject: [PATCH 10/48] updated representation learning translation --- docs/rs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rs/index.md b/docs/rs/index.md index eecce422e..245ed9069 100644 --- a/docs/rs/index.md +++ b/docs/rs/index.md @@ -16,7 +16,7 @@ lang-ref: home ## Opis -Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju atributa. Fokusira se na nadgledano i nenadgledano učenje, embedding metode, učenje metrika, konvolucione i rekurentne neuronske mreže, sa primenama u kompjuterskoj viziji, razumevanju prirodnog jezika i prepoznavanju govora. Potrebno predznanje: [DS-GA 1001 Intro to Data Science](https://cds.nyu.edu/academics/ms-curriculum/) ili kurs mašinskog učenja na nivou master ili doktorskih studija. +Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacije. Fokusira se na nadgledano i nenadgledano učenje, embedding metode, učenje metrika, konvolucione i rekurentne neuronske mreže, sa primenama u kompjuterskoj viziji, razumevanju prirodnog jezika i prepoznavanju govora. Potrebno predznanje: [DS-GA 1001 Intro to Data Science](https://cds.nyu.edu/academics/ms-curriculum/) ili kurs mašinskog učenja na nivou master ili doktorskih studija. ## Lekcije From d7564885cb53c5fc705a098b58cf0955f402a5f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 22 Oct 2020 23:44:29 +0200 Subject: [PATCH 11/48] resolved comments on pr --- docs/rs/README-RS.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/rs/README-RS.md b/docs/rs/README-RS.md index a5a1c6b2f..8ac934408 100644 --- a/docs/rs/README-RS.md +++ b/docs/rs/README-RS.md @@ -1,6 +1,6 @@ # Duboko učenje (u PyTorch-u) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Atcold/pytorch-Deep-Learning/master) -Ovaj repozitorijum ima [prateći sajt](https://atcold.github.io/pytorch-Deep-Learning/), gde se svi materijali kursa mogu naći u video i tekstualnom formatu. +Ovaj repozitorijum ima [prateći sajt](https://atcold.github.io/pytorch-Deep-Learning/) gde se svi materijali kursa mogu naći u video i tekstualnom formatu. [🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-RS.md) @@ -12,7 +12,7 @@ Da bi bilo moguće pratiti vežbe, potreban je laptop sa instaliranom Miniconda- Naredne instrukcije rade za Mac i Ubuntu Linux, a za Windows je potrebno da se instalira i radi u [Git BASH](https://gitforwindows.org/) terminalu. -## Instalacija +## Podešavanje radnog okruženja Potrebno je otići na [sajt Anaconda](https://conda.io/miniconda.html). Skinuti i instalirat *najnoviju* Miniconda verziju za *Python* 3.7 za vaš operativni sistem. @@ -45,7 +45,7 @@ source activate pDL ## Startovati Jupyter Notebook ili JupyterLab -Startovati iz terminala kao uobičajeno: +Startovati iz terminala: ```bash jupyter lab @@ -60,11 +60,11 @@ jupyter notebook ## Vizuelizacija Notebook-a -*Jupyter Notebooks* se koriste kroz lekcije za interaktivnu eksploraciju i vizualizaciju. +*Jupyter Notebooks* se koriste kroz lekcije za interaktivnu analizu podataka i vizualizaciju. Koristimo tamni stil i za *GitHub* i *Jupyter Notebook*. Trebalo bi podesiti isto jer inače neće izgledati lepo. -JupyterLab ima ugrađenu tamnu temu koju je moguće odabrati, pa je potrebno instalirati nešto samo ukoliko želite da koristite klasičan interfejs notebook-a. +JupyterLab ima ugrađenu tamnu temu koju je moguće odabrati, pa je potrebno izvršiti dodatne instalacije samo ukoliko želite da koristite klasičan interfejs notebook-a. Da bi se sadržaj video kako treba u klasičnom interfejsu potrebno je instalirati sledeće: - [*Jupyter Notebook* dark theme](https://userstyles.org/styles/153443/jupyter-notebook-dark); From c35f3aa25da2abb62e3164487e381e467ba29d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 26 Nov 2020 13:08:45 +0100 Subject: [PATCH 12/48] Update and rename docs/rs/README-RS.md to docs/sr/README-SR.md --- docs/{rs/README-RS.md => sr/README-SR.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/{rs/README-RS.md => sr/README-SR.md} (99%) diff --git a/docs/rs/README-RS.md b/docs/sr/README-SR.md similarity index 99% rename from docs/rs/README-RS.md rename to docs/sr/README-SR.md index 8ac934408..868fdfff4 100644 --- a/docs/rs/README-RS.md +++ b/docs/sr/README-SR.md @@ -3,7 +3,7 @@ Ovaj repozitorijum ima [prateći sajt](https://atcold.github.io/pytorch-Deep-Learning/) gde se svi materijali kursa mogu naći u video i tekstualnom formatu. -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-RS.md) +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md) # Podešavanja From a6b32cdc688e0dc0cbf26b76c9b2375f63aac9c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 26 Nov 2020 13:10:03 +0100 Subject: [PATCH 13/48] Rename docs/rs/index.md to docs/sr/index.md --- docs/{rs => sr}/index.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{rs => sr}/index.md (100%) diff --git a/docs/rs/index.md b/docs/sr/index.md similarity index 100% rename from docs/rs/index.md rename to docs/sr/index.md From 902789b31f9fea4413daf0e340d282a053433e19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 26 Nov 2020 13:10:38 +0100 Subject: [PATCH 14/48] change rs to sr --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3eff0068c..310e2477e 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This notebook repository now has a [companion website](https://atcold.github.io/pytorch-Deep-Learning/), where all the course material can be found in video and textual format. -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-RS.md) +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md) # Getting started From 29cf578fba0f6f02d8aaead76d9fc84c70512fe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 26 Nov 2020 13:14:13 +0100 Subject: [PATCH 15/48] added serbian --- docs/_config.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index 568394b85..441b19ee4 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -605,4 +605,10 @@ ru: - path: ru/week01/01.md sections: - path: ru/week01/01-1.md - - path: ru/week01/01-2.md \ No newline at end of file + - path: ru/week01/01-2.md + +#################################### Serbian ##################################### +sr: + title: 'Duboko učenje' + prologues: + - path: sr/about.md From ecc17ec3e13f37420588c2b1bd38e1bd4540c1ad Mon Sep 17 00:00:00 2001 From: EmaPajic Date: Sat, 12 Dec 2020 00:30:20 +0100 Subject: [PATCH 16/48] synced --- README.md | 4 +- docs/_config.yml | 58 +++ docs/ar/README-AR.md | 4 +- docs/bn/README-BN.md | 61 +++ docs/bn/index.md | 328 +++++++++++++++ docs/bn/week01/01.md | 27 ++ docs/en/week12/12-3.md | 4 +- docs/en/week14/14-1.md | 4 +- docs/es/README-ES.md | 4 +- docs/es/index.md | 2 +- docs/fa/README-FA.md | 4 +- docs/fr/README-FR.md | 4 +- docs/index.md | 1 - docs/it/README-IT.md | 4 +- docs/it/index.md | 2 +- docs/ja/README-JA.md | 4 +- docs/ja/index.md | 70 ++++ docs/ja/week01/01-1.md | 48 +-- docs/ja/week01/01-2.md | 151 +++++++ docs/ja/week01/01-3.md | 201 ++++++++++ docs/ja/week01/01.md | 6 +- docs/ja/week02/02-1.md | 508 +++++++++++++++++++++++ docs/ja/week02/02-2.md | 290 ++++++++++++++ docs/ja/week02/02-3.md | 490 +++++++++++++++++++++++ docs/ja/week02/02.md | 36 ++ docs/ja/week03/03-2.md | 376 +++++++++++++++++ docs/ja/week03/03-3.md | 245 ++++++++++++ docs/ja/week05/05-3.md | 8 +- docs/ja/week06/06-1.md | 220 ++++++++++ docs/ja/week06/06-2.md | 400 +++++++++++++++++++ docs/ja/week06/06-3.md | 567 ++++++++++++++++++++++++++ docs/ja/week06/06.md | 27 ++ docs/ja/week07/07-1.md | 8 + docs/ja/week08/08-1.md | 209 ++++++++++ docs/ja/week08/08-2.md | 234 +++++++++++ docs/ja/week08/08-3.md | 362 +++++++++++++++++ docs/ja/week08/08.md | 35 ++ docs/ja/week09/09-1.md | 156 ++++++++ docs/ja/week09/09-3.md | 317 +++++++++++++++ docs/ja/week09/09.md | 25 ++ docs/ja/week10/10-1.md | 473 ++++++++++++++++++++++ docs/ja/week10/10-2.md | 562 ++++++++++++++++++++++++++ docs/ja/week10/10-3.md | 273 +++++++++++++ docs/ja/week10/10.md | 30 ++ docs/ja/week11/11-1.md | 755 +++++++++++++++++++++++++++++++++++ docs/ja/week11/11-2.md | 422 ++++++++++++++++++++ docs/ja/week11/11-3.md | 494 +++++++++++++++++++++++ docs/ja/week11/11.md | 25 ++ docs/ja/week12/12-1.md | 367 +++++++++++++++++ docs/ja/week12/12-2.md | 582 +++++++++++++++++++++++++++ docs/ja/week12/12-3.md | 571 ++++++++++++++++++++++++++ docs/ja/week12/12.md | 33 ++ docs/ja/week13/13-1.md | 604 ++++++++++++++++++++++++++++ docs/ja/week13/13-2.md | 518 ++++++++++++++++++++++++ docs/ja/week13/13-3.md | 412 +++++++++++++++++++ docs/ja/week13/13.md | 28 ++ docs/ja/week14/14-1.md | 331 +++++++++++++++ docs/ja/week14/14-2.md | 397 ++++++++++++++++++ docs/ja/week14/14-3.md | 470 ++++++++++++++++++++++ docs/ja/week14/14.md | 33 ++ docs/ko/README-KO.md | 4 +- docs/pt/README-PT.md | 107 +++++ docs/ru/README-RU.md | 4 +- docs/ru/index.md | 17 + docs/ru/week12/12-1.md | 431 ++++++++++++++++++++ docs/ru/week12/12-2.md | 638 +++++++++++++++++++++++++++++ docs/ru/week12/12-3.md | 886 +++++++++++++++++++++++++++++++++++++++++ docs/ru/week12/12.md | 30 ++ docs/sr/README-SR.md | 10 +- docs/sr/index.md | 37 +- docs/tr/README-TR.md | 4 +- docs/vi/README-VI.md | 4 +- docs/vi/index.md | 2 +- docs/vi/week01/01-1.md | 48 +-- docs/vi/week01/01-2.md | 16 +- docs/vi/week01/01-3.md | 6 +- docs/vi/week01/01.md | 4 +- docs/vi/week02/02.md | 22 + docs/zh/README-ZH.md | 4 +- 79 files changed, 15037 insertions(+), 121 deletions(-) create mode 100644 docs/bn/README-BN.md create mode 100644 docs/bn/index.md create mode 100644 docs/bn/week01/01.md create mode 100644 docs/ja/week01/01-2.md create mode 100644 docs/ja/week01/01-3.md create mode 100644 docs/ja/week02/02-1.md create mode 100644 docs/ja/week02/02-2.md create mode 100644 docs/ja/week02/02-3.md create mode 100644 docs/ja/week02/02.md create mode 100644 docs/ja/week03/03-2.md create mode 100644 docs/ja/week03/03-3.md create mode 100644 docs/ja/week06/06-1.md create mode 100644 docs/ja/week06/06-2.md create mode 100644 docs/ja/week06/06-3.md create mode 100644 docs/ja/week06/06.md create mode 100644 docs/ja/week08/08-1.md create mode 100644 docs/ja/week08/08-2.md create mode 100644 docs/ja/week08/08-3.md create mode 100644 docs/ja/week08/08.md create mode 100644 docs/ja/week09/09-1.md create mode 100644 docs/ja/week09/09-3.md create mode 100644 docs/ja/week09/09.md create mode 100644 docs/ja/week10/10-1.md create mode 100644 docs/ja/week10/10-2.md create mode 100644 docs/ja/week10/10-3.md create mode 100644 docs/ja/week10/10.md create mode 100644 docs/ja/week11/11-1.md create mode 100644 docs/ja/week11/11-2.md create mode 100644 docs/ja/week11/11-3.md create mode 100644 docs/ja/week11/11.md create mode 100644 docs/ja/week12/12-1.md create mode 100644 docs/ja/week12/12-2.md create mode 100644 docs/ja/week12/12-3.md create mode 100644 docs/ja/week12/12.md create mode 100644 docs/ja/week13/13-1.md create mode 100644 docs/ja/week13/13-2.md create mode 100644 docs/ja/week13/13-3.md create mode 100644 docs/ja/week13/13.md create mode 100644 docs/ja/week14/14-1.md create mode 100644 docs/ja/week14/14-2.md create mode 100644 docs/ja/week14/14-3.md create mode 100644 docs/ja/week14/14.md create mode 100644 docs/pt/README-PT.md create mode 100644 docs/ru/week12/12-1.md create mode 100644 docs/ru/week12/12-2.md create mode 100644 docs/ru/week12/12-3.md create mode 100644 docs/ru/week12/12.md create mode 100644 docs/vi/week02/02.md diff --git a/README.md b/README.md index 69456104f..7a114edab 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ This notebook repository now has a [companion website](https://atcold.github.io/pytorch-Deep-Learning/), where all the course material can be found in video and textual format. - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md) # Getting started diff --git a/docs/_config.yml b/docs/_config.yml index e73c6bf14..afc5bd769 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -467,9 +467,18 @@ ja: - path: ja/week01/01.md sections: - path: ja/week01/01-1.md + - path: ja/week01/01-2.md + - path: ja/week01/01-3.md + - path: ja/week02/02.md + sections: + - path: ja/week02/02-1.md + - path: ja/week02/02-2.md + - path: ja/week02/02-3.md - path: ja/week03/03.md sections: - path: ja/week03/03-1.md + - path: ja/week03/03-2.md + - path: ja/week03/03-3.md - path: ja/week04/04.md sections: - path: ja/week04/04-1.md @@ -478,12 +487,51 @@ ja: - path: ja/week05/05-1.md - path: ja/week05/05-2.md - path: ja/week05/05-3.md + - path: ja/week06/06.md + sections: + - path: ja/week06/06-1.md + - path: ja/week06/06-2.md + - path: ja/week06/06-3.md - path: ja/week07/07.md sections: - path: ja/week07/07-1.md - path: ja/week07/07-2.md - path: ja/week07/07-3.md + - path: ja/week08/08.md + sections: + - path: ja/week08/08-1.md + - path: ja/week08/08-2.md + - path: ja/week08/08-3.md + - path: ja/week09/09.md + sections: + - path: ja/week09/09-1.md - path: ja/week09/09-2.md + - path: ja/week09/09-3.md + - path: ja/week10/10.md + sections: + - path: ja/week10/10-1.md + - path: ja/week10/10-2.md + - path: ja/week10/10-3.md + - path: ja/week11/11.md + sections: + - path: ja/week11/11-1.md + - path: ja/week11/11-2.md + - path: ja/week11/11-3.md + - path: ja/week12/12.md + sections: + - path: ja/week12/12-1.md + - path: ja/week12/12-2.md + - path: ja/week12/12-3.md + - path: ja/week13/13.md + sections: + - path: ja/week13/13-1.md + - path: ja/week13/13-2.md + - path: ja/week13/13-3.md + - path: ja/week14/14.md + sections: + - path: ja/week14/14-1.md + - path: ja/week14/14-2.md + - path: ja/week14/14-3.md #################################### Arabic #################################### ar: @@ -640,6 +688,11 @@ ru: - path: ru/week01/01-1.md - path: ru/week01/01-2.md - path: ru/week01/01-3.md + - path: ru/week12/12.md + sections: + - path: ru/week12/12-1.md + - path: ru/week12/12-2.md + - path: ru/week12/12-3.md ################################## Vietnamese ################################## vi: @@ -650,7 +703,12 @@ vi: - path: vi/week01/01-1.md - path: vi/week01/01-2.md - path: vi/week01/01-3.md + - path: vi/week02/02.md ################################### Serbian #################################### sr: title: 'Duboko Učenje' + +################################### Bengali #################################### +bn: + title: 'ডীপ লার্নিং' diff --git a/docs/ar/README-AR.md b/docs/ar/README-AR.md index 74d3cb1c6..26fa60362 100644 --- a/docs/ar/README-AR.md +++ b/docs/ar/README-AR.md @@ -9,8 +9,8 @@ يحتوي دفتر الملاحظات هذا الآن على [موقع ويب مصاحب](https://atcold.github.io/pytorch-Deep-Learning/ar/)، حيث يمكن العثور على جميع مواد الدورة في شكل فيديو ونص. - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md)   [🇧🇩](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/bn/README-BN.md) diff --git a/docs/bn/README-BN.md b/docs/bn/README-BN.md new file mode 100644 index 000000000..8e38535f8 --- /dev/null +++ b/docs/bn/README-BN.md @@ -0,0 +1,61 @@ +# ডীপ লার্নিং (PyTorch সহ) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Atcold/pytorch-Deep-Learning/master) + +এই নোটবুকটির রিপোজিটরি (সংগ্রহস্থল) সহ একটি [সহযোগী ওয়েবসাইট](https://atcold.github.io/pytorch-Deep-Learning/) আছে, যেইখানে এই কোর্সটির সমস্ত শিক্ষাসামগ্রী গুলি ভিডিও ও লেখা তে উপলব্ধ আছে। + + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇧​​​​​🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-BN.md) + +# আরম্ভ করা + +এই কোর্সটির বিষয়বস্তুগুলিকে অনুসরণ করার জন্য আপনার Miniconda (Anaconda-র একটি সর্বনিম্ন সংস্করণ) এবং বেশ কয়েকটি বিভিন্ন Python প্যাকেজ সহ একটি ল্যাপটপের প্রয়োজন হবে। নিম্নলিখিত নির্দেশ গুলি Mac ও Ubuntu Linux এর ব্যবহারকর্তারা সরাসরি পালন করতে পারেন। Windows ব্যবহারকর্তাদের [Git BASH](https://gitforwindows.org/) টার্মিনাল ইনস্টল করে, এই টার্মিনালটি তে কাজ করতে হবে। + +## Miniconda ডাউনলোড করে ইনস্টল করুন + +[Anaconda ওয়েবসাইটে](https://conda.io/miniconda.html) গিয়ে আপনার অপারেটিং সিস্টেমে *Python* 3.7-এর জন্য Miniconda-র *সর্বশেষ* সংস্করণটি ডাউনলোড ও ইনস্টল করুন। + +```bash +wget +sh +``` + +## বিষয়বস্তু সহ Git রিপোজিটরিটি কে অনুসরণ করুন + +Miniconda তৈরী হয়ে যাওয়ার পর, কোর্সের রিপোজিটরিটি কে অনুসরণ করে এনভায়রনমেন্ট সেট-আপ করুন। : + +```bash +git clone https://github.com/Atcold/pytorch-Deep-Learning +``` +## একটি পৃথক Miniconda এনভায়রনমেন্ট তৈরী করুন + +ডাইরেক্টরি পরিবর্তন করে (`cd`) কোর্স ফোল্ডারে আসুন। এর পর নিম্নলিখিত কমান্ডটি কে লিখুন: + +```bash +# cd pytorch-Deep-Learning +conda env create -f environment.yml +source activate pDL +``` + +## Jupyter Notebook অথবা JupyterLab কে চালু করুন + +টার্মিনাল থেকে চালু করার জন্য এটি লিখুন: + +```bash +jupyter lab +``` + +অথবা, ক্লাসিক ইন্টারফেসের জন্য এটি লিখুন: + +```bash +jupyter notebook +``` + +## Notebook দৃশ্যায়ন + +মিথষ্ক্রিয় ডাটা এক্সপ্লোরেশন ও দৃশ্যায়ন করার জন্য এই কোর্সটির প্রত্যেকটি লেকচারে *Jupyter Notebooks*-এর ব্যবহার করা হয়েছে। + +আমরা *GitHub* এবং *Jupyter Notebooks*, দুটির জন্যই ডার্ক স্টাইলের ব্যবহার করি। আপনার ও এটি করা উচিত, অন্যথা এইগুলিকে দেখতে কুৎসিত লাগতে পারে। JupyterLab-এ একটি অন্তর্নির্মিত নির্বাচনযোগ্য ডার্ক থীম রয়েছে। তাই আপনি যদি ক্লাসিক notebook ইন্টারফেসটি কে ব্যবহার করতে চান, তবেই কিছূ ইনস্টল করবেন। + +ক্লাসিক ইন্টারফেসে যথাযথভাবে সামগ্রীটি দেখতে নিম্নলিখিত গুলিকে ইনস্টল করুন: + + - [*Jupyter Notebook* ডার্ক থীম](https://userstyles.org/styles/153443/jupyter-notebook-dark); + - [*GitHub* ডার্ক থীম](https://userstyles.org/styles/37035/github-dark) `invert #fff to #181818` কোড ব্লকটি কে কমেন্ট করুন। \ No newline at end of file diff --git a/docs/bn/index.md b/docs/bn/index.md new file mode 100644 index 000000000..4e847349b --- /dev/null +++ b/docs/bn/index.md @@ -0,0 +1,328 @@ +--- +layout: default +title: ডীপ লার্নিং +author: Alfredo Canziani +lang-ref: home +lang: bn +translation-date: 17 October 2020 +translator: Taniya Seth +--- + +**DS-GA 1008 · বসন্ত ২০২০ · [ডাটা সাইন্স-এর (তথ্য বিজ্ঞানের) জন্য এন-হোয়াই-ইউ কেন্দ্র](http://cds.nyu.edu/)** + +| প্রশিক্ষক | Yann LeCun ও Alfredo Canziani | +| লেকচার | প্রতি সোমবার ১৬:৫৫-১৮:৩৫, [GCASL C95](http://library.nyu.edu/services/campus-media/classrooms/gcasl-c95/) | +| প্র্যাক্টিক্যাল | প্রতি মঙ্গলবার ১৯:১০-২০:০০, [GCASL C95](http://library.nyu.edu/services/campus-media/classrooms/gcasl-c95/) | +| ফোরাম | [r/NYU_DeepLearning](https://www.reddit.com/r/NYU_DeepLearning/) | +| শিক্ষাসামগ্রী | [Google Drive](https://bitly.com/DLSP20), [Notebooks](https://github.com/Atcold/pytorch-Deep-Learning) | + +## বর্ণনা + +এই কোর্সটি ডীপ লার্নিং এবং রিপ্রেজেন্টেশন লার্নিং-এর সর্বশেষতম কৌশলগুলিকে শেখায়। কোর্সটি নিম্নলিখিত কৌশলগুলিকে প্রাধান্য দেয়- সুপারভাইজ্ড ও আনসুপারভাইজ্ড ডীপ লার্নিং, এমবেডিং মেথডস, মেট্রিক লার্নিং, কনভলিউশনাল ও রেকার্রেন্ট নেটওয়ার্কস, এইগুলির কম্পিউটার ভিশন, ন্যাচারাল ল্যাংগুয়েজ আন্ডারস্টেন্ডিং এবং স্পীচ রিকগ্নিশন-এর এপ্লিকেশন সহ। কোর্সটির পূর্বশর্ত হলো-[DS-GA 1001 ডাটা সাইন্স-এর (তথ্য বিজ্ঞানের) ভূমিকা](https://cds.nyu.edu/academics/ms-curriculum/) অথবা একটি গ্রাজুয়েট লেভেলের মেশিন লার্নিং কোর্স। + +## লেকচার + +**লেজেন্ড**: 🖥 স্লাইড, 📓 জুপিটার নোটবুক, 🎥 ইউটিউব ভিডিও। + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
সপ্তাহবিন্যাসশিরোনামশিক্ষাসামগ্রী
লেকচারইতিহাস এবং অনুপ্রেরণা + 🖥️ + 🎥 +
বিবর্তন এবং ডীপ লার্নিং
ব্যবহারিক পাঠ্যক্রমনিউরাল নেটওয়ার্ক্স + 📓 + 📓 + 🎥 +
লেকচারস্টোকাস্টিক গ্রেডিয়েন্ট ডিসেন্ট ও ব্যাক-প্রোপাগেশন + 🖥️ + 🎥 +
অনুশীলনে ব্যাক-প্রোপাগেশন
ব্যবহারিক পাঠ্যক্রমনিউরাল নেটওয়ার্ক্স-এর ট্রেনিং + 🖥 + 📓 + 📓 + 🎥 +
লেকচারপ্যারামিটার-এর রূপান্তর + 🖥️ + 🎥 +
CNN
ব্যবহারিক পাঠ্যক্রমন্যাচারাল সিগনালগুলির বৈশিষ্ট্য + 🖥 + 📓 + 🎥 +
ব্যবহারিক পাঠ্যক্রম1D কনভলিউশন + 📓 + 🎥 +
লেকচার +অপ্টিমাইজেশন-প্রথম + 🖥️ + 🎥 +
+অপ্টিমাইজেশন-দ্বিতীয়
ব্যবহারিক পাঠ্যক্রমCNN, অটোগ্র্যাড + 📓 + 📓 + 🎥 +
লেকচারCNN-এর এপ্লিকেশন + 🖥️ + 🖥️ + 🎥 +
RNNs ও আটেনশন
ব্যবহারিক পাঠ্যক্রমRNNs গুলিকে ট্রেন করা + 📓 + 📓 + 🖥️ + 🎥 +
লেকচারএনার্জি-বেসড মডেল + 🖥️ + 🎥 +
সেল্ফ সুপারভাইজ্ড লার্নিং, এনার্জি-বেসড মডেল
ব্যবহারিক পাঠ্যক্রমঅটো-এনকোডার + 🖥️ + 📓 + 🎥 +
লেকচারকন্ট্রাস্টিভ মেথড + 🖥️ + 🎥 +
রেগুলারাইজ্ড ল্যাটেন্ট
ব্যবহারিক পাঠ্যক্রমভেরিয়েশনাল অটো-এনকোডার গুলিকে ট্রেন করা + 🖥️ + 📓 + 🎥 +
লেকচারস্প্যার্সিটি + 🖥️ + 🎥 +
ওয়ার্ল্ড মডেল, জেনারেটিভ এডভারসিরিয়াল নেটওয়ার্ক
ব্যবহারিক পাঠ্যক্রমজেনারেটিভ এডভারসিরিয়াল নেটওয়ার্ক গুলিকে ট্রেন করা + 🖥️ + 📓 + 🎥 +
লেকচারকম্পিউটার ভিশন সেল্ফ সুপারভাইজ্ড লার্নিং-প্রথম + 🖥️ + 🎥 +
কম্পিউটার ভিশন সেল্ফ সুপারভাইজ্ড লার্নিং-দ্বিতীয়
ব্যবহারিক পাঠ্যক্রমপ্রেডিক্টিভ কন্ট্রোল + 🖥️ + 📓 + 🎥 +
লেকচারএকটিভেশন + 🖥️ + 🖥️ + 🖥️ + 🎥 +
লস
ব্যবহারিক পাঠ্যক্রমঅনিশ্চয়তার অধীনে প্রেডিকশন ও পলিসি লার্নিং + 🖥️ + 📓 + 🎥 +
লেকচারন্যাচারাল ল্যাংগুয়েজ প্রোসেসিং-এর জন্য দীপ লার্নিং-প্রথম + 🖥️ + 🎥 +
ন্যাচারাল ল্যাংগুয়েজ প্রোসেসিং-এর জন্য দীপ লার্নিং-দ্বিতীয়
ব্যবহারিক পাঠ্যক্রমআটেনশন ও ট্রান্সফরমার + 🖥️ + 📓 + 🎥 +
লেকচারগ্রাফ কনভলিউশনাল নেটওয়ার্ক-প্রথম + 🖥️ + 🎥 +
গ্রাফ কনভলিউশনাল নেটওয়ার্ক-দ্বিতীয়
ব্যবহারিক পাঠ্যক্রমগ্রাফ কনভলিউশনাল নেটওয়ার্ক-তৃতীয় + 🖥️ + 📓 + 🎥 +
লেকচারস্ট্রাকচার্ড প্রেডিকশন + 🖥️ + 🎥 +
গ্রাফিকাল মেথড
ব্যবহারিক পাঠ্যক্রমরেগুলারাইজেশন ও বয়েসিয়ান + 🖥️ + 📓 + 🖥️ + 📓 + 🎥 +
+ + +## কোর্সটির সাথে যুক্ত মানুষ + +| ভূমিকা | ছবি | যোগাযোগ | এই মানুষদের সম্পর্কে তথ্য | +|:-----|:-----:|:--------|:------| +|প্রশিক্ষক||Yann LeCun
yann@cs.nyu.edu|নিউ ইয়র্ক ইউনিভার্সিটি-তে কম্পিউটার সায়েন্সের সিলভের প্রফেসর
ও Turing পুরস্কার বিজয়ী| +|প্রশিক্ষক||Alfredo Canziani
canziani@nyu.edu|নিউ ইয়র্ক ইউনিভার্সিটি-তে কম্পিউটার সায়েন্সের অ্যাসিস্ট্যান্ট প্রফেসর| +|সহকারী||Mark Goldstein
goldstein@nyu.edu|নিউ ইয়র্ক ইউনিভার্সিটি-তে কম্পিউটার সায়েন্সের পি-এচ-ডি স্টুডেন্ট| +|ওয়েবমাস্টার||Zeming Lin
zl2799@nyu.edu|নিউ ইয়র্ক ইউনিভার্সিটি-তে কম্পিউটার সায়েন্সের পি-এচ-ডি স্টুডেন্ট| diff --git a/docs/bn/week01/01.md b/docs/bn/week01/01.md new file mode 100644 index 000000000..5887040b0 --- /dev/null +++ b/docs/bn/week01/01.md @@ -0,0 +1,27 @@ +--- +lang: bn +lang-ref: ch.01 +title: সপ্তাহ ১ +translation-date: 28 October 2020 +translator: Taniya Seth +--- + + +## লেকচার ভাগ এ + + +আমরা ডীপ লার্নিং-এর প্রেরণা সম্পর্কে আলোচনা করি। আমরা ডীপ লার্নিং-এর ইতিহাস এবং অনুপ্রেরণা কে দিয়ে আরম্ভ করি। এর পর আমরা প্যাটার্ন রিকগনিশন-এর ইতিহাস সম্পর্কে আলোচনা করি এবং গ্রেডিয়েন্ট ডিসেন্ট ও ব্যাকপ্রোপাগেশন দিয়ে তার গণনার সঙ্গে পরিচয়ে করি। শেষে, আমরা ভিজুয়াল কর্টেক্স-এর হিয়ারার্কিকল রিপ্রেজেন্টেশন সম্পর্কে আলোচনা করি। + + +## লেকচার ভাগ বী + + +প্রথমত আমরা CNN-এর বিবর্তন নিয়ে আলোচনা করি, ফুকুশিমা থেকে LeCun, এবং LeCun থেকে AlexNet। এর পর আমরা CNN-এর কয়েকটি এপ্লিকেশন যেমন চিত্র বিভাজন, স্বয়ংক্রিয় যানবাহন, এবং মেডিকেল চিত্র বিশ্লেষণ এইগুলির বিষয়ে আলোচনা করি। আমরা ডীপ নেটওয়ার্কগুলির শ্রেণিবিন্যাসিক প্রকৃতি এবং তাদের বৈশিষ্ট্যগুলির বিষয়ে আলোচনা করি যা সেগুলিকে সুবিধাজনক করে তোলে। আমরা ফীচার/রিপ্রেজেন্টেশন লার্নিং এবং জেনারেশন সম্পর্কিত আলোচনা দিয়ে শেষ করি। + + +## ব্যবহারিক পাঠ্যক্রম + + +স্পেসে দৃশ্যমান ডাটা পয়েন্টগুলিতে রূপান্তর প্রয়োগের অনুপ্রেরণা নিয়ে আমরা আলোচনা করি। আমরা লিনিয়ার আলজেব্রা এবং লিনিয়ার ও নন -লিনিয়ার রূপান্তরের প্রয়োগ সম্পর্কে কথা বলি। আমরা রূপান্তরগুলির কার্যকারিতা এবং প্রভাবগুলি বোঝার জন্য ভিজ্যুয়ালাইজেশনের ব্যবহার নিয়ে আলোচনা করি। আমরা একটি Jupyter Notebook-এ উদাহরণ গুলির অন্বেষণ করি, এবং নিউরাল নেটওয়ার্কগুলি দ্বারা প্রতিনিধিত্ব করা ফাংশনগুলির আলোচনার সাথে শেষ করি। diff --git a/docs/en/week12/12-3.md b/docs/en/week12/12-3.md index cdeab6fd6..6b7149760 100644 --- a/docs/en/week12/12-3.md +++ b/docs/en/week12/12-3.md @@ -284,7 +284,7 @@ Throughout the training of a transformer, many hidden representations are genera We will now see the blocks of transformers discussed above in a far more understandable format, code! -The first module we will look at the multi-headed attention block. Depenending on query, key, and values entered into this block, it can either be used for self or cross attention. +The first module we will look at the multi-headed attention block. Depending on query, key, and values entered into this block, it can either be used for self or cross attention. ```python @@ -392,7 +392,7 @@ Recall that self attention by itself does not have any recurrence or convolution $$ \begin{aligned} -E(p, 2) &= \sin(p / 10000^{2i / d}) \\ +E(p, 2i) &= \sin(p / 10000^{2i / d}) \\ E(p, 2i+1) &= \cos(p / 10000^{2i / d}) \end{aligned} $$ diff --git a/docs/en/week14/14-1.md b/docs/en/week14/14-1.md index ec05e24f4..421e164f3 100644 --- a/docs/en/week14/14-1.md +++ b/docs/en/week14/14-1.md @@ -79,7 +79,7 @@ Let’s assume that $Z_1$, $Z_2$, and $Y_1$ are discrete binary variables, and $ However, we notice that for a given $X$, $E_a$ only has two possible input configurations: $Z_1 = 0$ and $Z_1 = 1$. Similarly, $E_b$ and $E_c$ only have 4 possible input configurations, and $E_d$ has 6. Hence, there is no need for more than $2 + 4 + 4 + 6 = 16$ single factor evaluations. -Hence, we can pre compute the 16 factor values, and put them on the arcs in a trellis as shown in Figure 19 (bottom). +Hence, we can pre compute the 16 factor values, and put them on the arcs in a trellis as shown in Figure 5 (bottom). The nodes in each column represent the possible values of a single variable. Each edge is weighted by the output energy of the factor for the corresponding values of its input variables. With this representation, a single path from the start node to the end node represents one possible configuration of all the variables. The sum of the weights along a path is equal to the total energy for the corresponding configuration. Therefore, the inference problem can be reduced to searching for the **shortest path** in this graph. This can be performed using a dynamic programming method such as the Viterbi algorithm, or the A\* algorithm. The cost is proportional to the number of edges (16), which is exponentially smaller than the number of paths in general. @@ -98,7 +98,7 @@ However, it only applies to factor graphs that are bipartite trees (with no loop Figure 6. -The factor graph shown in Figure 20 is a log domain factor graph for linear structured models ("simple energy-based factor graphs" we are talking about) +The factor graph shown in Figure 6 is a log domain factor graph for linear structured models ("simple energy-based factor graphs" we are talking about) Each factor is a linear function of the trainable parameters. It depends on the input $X$ and on a pair of individual labels $(Y_m, Y_n)$. In general, each factor could depend on more than two individual labels, but we will limit the discussion to pairwise factors to simplify the notation: diff --git a/docs/es/README-ES.md b/docs/es/README-ES.md index 39809ff41..c29d61b19 100644 --- a/docs/es/README-ES.md +++ b/docs/es/README-ES.md @@ -6,8 +6,8 @@ --> Este repositorio de *notebooks* tiene un [sitio web complementario](https://atcold.github.io/pytorch-Deep-Learning/es/), donde todo el material del curso puede ser encontrado en formato textual y de video. - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md)   [🇧🇩](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/bn/README-BN.md) diff --git a/docs/es/index.md b/docs/es/index.md index 114f81961..9fe58975e 100644 --- a/docs/es/index.md +++ b/docs/es/index.md @@ -1,6 +1,6 @@ --- layout: default -title: DEEP LEARNING +title: APRENDIZAJE PROFUNDO author: Alfredo Canziani lang-ref: home lang: es diff --git a/docs/fa/README-FA.md b/docs/fa/README-FA.md index ac89eab6b..aa563a2d3 100644 --- a/docs/fa/README-FA.md +++ b/docs/fa/README-FA.md @@ -4,8 +4,8 @@ این مخزن یک [وبسایت](https://atcold.github.io/pytorch-Deep-Learning/fa/) به همراه خود دارد که تمام محتویات دوره در قالب متن و ویدیو در دسترس است. - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md)   [🇧🇩](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/bn/README-BN.md) # شروع diff --git a/docs/fr/README-FR.md b/docs/fr/README-FR.md index aeb072802..1578edfe5 100644 --- a/docs/fr/README-FR.md +++ b/docs/fr/README-FR.md @@ -13,8 +13,8 @@ This notebook repository now has a [companion website](https://atcold.github.io/ Ce répertoire a maintenant un [site web associé](https://atcold.github.io/pytorch-Deep-Learning/fr/), où tout le matériel de cours peut être trouvé au format vidéo et textuel. - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md)   [🇧🇩](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/bn/README-BN.md) - Lecture Structured Prediction diff --git a/docs/it/README-IT.md b/docs/it/README-IT.md index 18596c4e4..57594d708 100644 --- a/docs/it/README-IT.md +++ b/docs/it/README-IT.md @@ -4,8 +4,8 @@ Questo repositorio di *notebook* ha un [sito che lo accompagna](https://atcold.github.io/pytorch-Deep-Learning/it/), dove tutto il materiale del corso puo essere trovato in formati video e testuali. - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md)   [🇧🇩](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/bn/README-BN.md) # Iniziare diff --git a/docs/it/index.md b/docs/it/index.md index bd26f4162..fcb22eaaf 100644 --- a/docs/it/index.md +++ b/docs/it/index.md @@ -1,6 +1,6 @@ --- layout: default -title: Apprendimento Profondo +title: APPRENDIMENTO PROFONDO author: Alfredo Canziani lang-ref: home lang: it diff --git a/docs/ja/README-JA.md b/docs/ja/README-JA.md index 96ec36f25..92acb8cea 100644 --- a/docs/ja/README-JA.md +++ b/docs/ja/README-JA.md @@ -3,8 +3,8 @@ この講義で用いられる資料は全て、ビデオあるいはテキスト形式で[付随しているウェブサイト](https://atcold.github.io/pytorch-Deep-Learning/ja)に全て含まれています。 - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md)   [🇧🇩](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/bn/README-BN.md) # 始め方 diff --git a/docs/ja/index.md b/docs/ja/index.md index 3368b11d4..e96f0417c 100644 --- a/docs/ja/index.md +++ b/docs/ja/index.md @@ -274,6 +274,65 @@ translator: Go Inoue 🎥 + + + + 講義 + グラフ畳み込みネットワーク I + + 🖥️ + 🎥 + + + グラフ畳み込みネットワーク II + + 演習 + グラフ畳み込みネットワーク III + + 🖥️ + 📓 + 🎥 + + + + + + 講義 + 構造化予測 + + 🖥️ + 🎥 + + + グラフ手法 + + 演習 + 正則化とベイズ + + 🖥️ + 📓 + 🖥️ + 📓 + 🎥 + + + + + + 演習 + 潜在変数EBMの推論 + + 🖥️ + 🎥 + + + + 潜在変数EBMの学習 + + 🖥️ + 🎥 + + @@ -286,9 +345,20 @@ translator: Go Inoue |講師||Alfredo Canziani
canziani@nyu.edu|ニューヨーク大学コンピュータ・サイエンス学科助教| |アシスタント||Mark Goldstein
goldstein@nyu.edu|ニューヨーク大学コンピュータ・サイエンス学科博士課程| |サイト管理者||Zeming Lin
zl2799@nyu.edu|ニューヨーク大学コンピュータ・サイエンス学科博士課程| + + + + + +## 注意事項 + +このサイトにあるテキストの元はニューヨーク大学の学生のレクチャー・ノートのです。日本語の翻訳は複数のボランティアによって翻訳されたものであるため、言葉遣い・訳語・スタイルが統一されてないことがあります。 + +また、誤訳、翻訳漏れ、入力ミスもあるかもしれません。それに気づく場合、[GitHub](https://github.com/Atcold/pytorch-Deep-Learning/pulls)にプルリクエストを提出し、タイトルに`[JA]`(和訳に関わるもの)を記載していただけると嬉しいです。 diff --git a/docs/ja/week01/01-1.md b/docs/ja/week01/01-1.md index edc37e234..2dd8e1056 100644 --- a/docs/ja/week01/01-1.md +++ b/docs/ja/week01/01-1.md @@ -38,46 +38,46 @@ Self-supervised learning and beyond -ディープラーニングは概念レベルでは脳の一部をきっかけとして誕生したが脳の詳細全てに関係する訳ではない。同じようなこととして飛行機は鳥から着想を得たが飛行機と鳥が空を飛ぶ原理は根本的に違うということが挙げられる。 +ディープラーニングは概念レベルでは脳の一部をきっかけとして誕生しましたが脳の詳細全てに関係する訳ではありません。同じようなこととして飛行機は鳥から着想を得ましたが飛行機と鳥が空を飛ぶ原理は根本的に違うということが挙げられます。 -ディープラーニングの歴史は現在では人工頭脳学と呼ばれるかつて存在した分野にまで遡る。1940年代にMcCullochとPittsが扱い始め、ニューロンはオンとオフの状態がある閾値をもつ要素であるという考えに至った。ニューロンを繋ぎ合わせることでブール回路を作れば論理的推論を行うことができるのではないかと考えられた。基本的にはニューロンの二値性のため脳は論理的推論を行う機械であると言える。ニューロンは入力情報の重み付き和を計算しニューロンそれ自身が持つ閾値と比較する。もし計算された和が閾値より高ければニューロンはオン状態になり、閾値以下ではオフ状態になるが、これがニューラルネットワークがなぜうまく機能するのかを説明できる簡略化された見方である。 +ディープラーニングの歴史は現在では人工頭脳学と呼ばれるかつて存在した分野にまで遡ります。1940年代にMcCullochとPittsが扱い始め、ニューロンはオンとオフの状態がある閾値をもつ要素であるという考えに至りました。ニューロンを繋ぎ合わせることでブール回路を作れば論理的推論を行うことができるのではないかと考えられました。基本的にはニューロンの二値性のため脳は論理的推論を行う機械であると言えます。ニューロンは入力情報の重み付き和を計算しニューロンそれ自身が持つ閾値と比較します。もし計算された和が閾値より高ければニューロンはオン状態になり、閾値以下ではオフ状態になりますが、これがニューラルネットワークがなぜうまく機能するのかを説明できる簡略化された見方です。 -1947年、Donald Hebbは脳内にあるニューロンが他のニューロン間の結びつきの強さを変えることで学習ができるという考えに至った。この考え方はハイパーラーニングと呼ばれ、もし二つのニューロンが同時に活性化すれば結びつきが強くなり、そうでなければ結びつきを弱めるということを意味する。 +1947年、Donald Hebbは脳内にあるニューロンが他のニューロン間の結びつきの強さを変えることで学習ができるという考えに至りました。この考え方はハイパーラーニングと呼ばれ、もし二つのニューロンが同時に活性化すれば結びつきが強くなり、そうでなければ結びつきを弱めるということを意味します。 -1948年終盤にには、センサーとアクチュエータを用いたシステムでフィードバックループと自己抑制を備えたシステムを構築することができるという考え方が人工頭脳学としてNorbert Wienerによって提唱された。自動車のフィードバックの仕組みは全てここから来ている。 +1948年終盤には、センサーとアクチュエータを用いたシステムでフィードバックループと自己抑制を備えたシステムを構築することができるという考え方が人工頭脳学としてNorbert Wienerによって提唱されました。自動車のフィードバックの仕組みは全てここから来ています。 -1857年にはFrank Rosenblattがとても単純なニューラルネットワークの重みを変化させるという学習アルゴリズムであるパーセプトロンというものを提唱した。 +1857年にはFrank Rosenblattがとても単純なニューラルネットワークの重みを変化させるという学習アルゴリズムであるパーセプトロンというものを提唱しました。 -総合的に見ると、ニューロンの仕組みを真似することで知能機械を生み出そうというコンセプトは1940年代に生まれ、1950年代に注目を集めたものの1960年代後半には完全に廃れたものとなった。1960年代にこうなってしまった理由としては: -- 誤差逆伝播法をうまく行うためには連続である活性化関数を使う必要があったが、研究者はニューロンが完全に二値を取るものとして扱っていた。その当時、連続的なニューロンを用いるという考え方には至らず、二値のみを取るニューロンは微分不可であり勾配を計算して学習を行えるとは考えなかった。 -- 連続なニューロンを使う場合、重み付き和による作用を求めるにはニューロンの活性化値と重みの積を取る必要があると考えられていたが、1980年以前は二つの数値(特に浮動小数点の値)同士の積をコンピューター上で求めるのは非常に低速であったこともあり連続の活性化関数はあまり現実的ではなかった。 +総合的に見ると、ニューロンの仕組みを真似することで知能機械を生み出そうというコンセプトは1940年代に生まれ、1950年代に注目を集めたものの1960年代後半には完全に廃れたものとなりました。1960年代にこうなってしまった理由としては: +- 誤差逆伝播法をうまく行うためには連続である活性化関数を使う必要がありましたが、研究者はニューロンが完全に二値を取るものとして扱っていました。その当時、連続的なニューロンを用いるという考え方には至らず、二値のみを取るニューロンは微分不可であり勾配を計算して学習を行えるとは考えませんでした。 +- 連続なニューロンを使う場合、重み付き和による作用を求めるにはニューロンの活性化値と重みの積を取る必要があると考えられていましたが、1980年以前は二つの数値(特に浮動小数点の値)同士の積をコンピューター上で求めるのは非常に低速であったこともあり連続の活性化関数はあまり現実的ではありませんでした。 -1985年に誤差逆伝搬法の誕生とともにディープラーニングが再び注目され始めたものの、1995年には過去のものとなり機械学習の分野ではニューラルネットの考え方には誰も見向きもしなくなった。2010年代初頭には音声認識の分野でニューラルネットが利用され始めて良い結果を残し、その後商用目的で広く使われた。2013年にはニューラルネットがコンピュータビジョンの分野で幅広く使われ始め、2016年には自然言語処理の分野でも幅広く使われ始めた。ロボティクス、制御、その他の分野でも同様の変化が起こるであろう。 +1985年に誤差逆伝播法の誕生とともにディープラーニングが再び注目され始めたものの、1995年には過去のものとなり機械学習の分野ではニューラルネットの考え方には誰も見向きもしなくなりました。2010年代初頭には音声認識の分野でニューラルネットが利用され始めて良い結果を残し、その後商用目的で広く使われました。2013年にはニューラルネットがコンピュータビジョンの分野で幅広く使われ始め、2016年には自然言語処理の分野でも幅広く使われ始めました。ロボティクス、制御、その他の分野でも同様の変化が起こるでしょう。 ### 教師あり学習 -$90\%$のディープラーニングの利用例が教師あり学習を用いている。教師あり学習とは、入力と対応する出力の組み合わせをたくさん使って入力情報から正しい出力を出すようにコンピューター上のシステムに学習させることである。もし出力が正解なら何もせず、もし不正解なら正しい出力を出せるようにシステムのパラメーターを変更する。ここで重要なのはどの方向にどれだけパラメーターを変化させるかを求めることであり、勾配計算と誤差逆伝搬法を使うこととなる。 +$90\%$のディープラーニングの利用例が教師あり学習を用いています。教師あり学習とは、入力と対応する出力の組み合わせをたくさん使って入力情報から正しい出力を出すようにコンピューター上のシステムに学習させることです。もし出力が正解なら何もせず、もし不正解なら正しい出力を出せるようにシステムのパラメーターを変更します。ここで重要なのはどの方向にどれだけパラメーターを変化させるかを求めることであり、勾配計算と誤差逆伝播法を使うこととなります。 -教師あり学習はパーセプトロンとアダラインから派生している。アダラインはパーセプトロンと同じであるが重み付きの入力を使う。入力がある閾値より大きければオン状態になり、そうでなければオフ状態になる。パーセプトロンは二層のニューラルネットであり、一層目は固定されているが二層目は訓練可能である。ほとんどの場合、一層目はランダムに決められ連想層と呼ばれる。 +教師あり学習はパーセプトロンとアダラインから派生しています。アダラインはパーセプトロンと同じですが重み付きの入力を使います。入力がある閾値より大きければオン状態になり、そうでなければオフ状態になります。パーセプトロンは二層のニューラルネットであり、一層目は固定されていますが二層目は訓練可能です。ほとんどの場合、一層目はランダムに決められ連想層と呼ばれます。 @@ -85,34 +85,35 @@ $90\%$のディープラーニングの利用例が教師あり学習を用い -前述の内容はディープラーニングが普及する前にパターン認識の分野で取り入れられていた基本的なコンセプトである。特徴量抽出器と学習可能分類器を使うことがパターン認識においては一般的であった。例えば顔認識を行いたい時に目を検出することなど、入力されたデータの関連性のある有用な特徴を抽出する。そして得られた特徴量ベクトルを用いて学習可能な分類器で重み付き和を計算し閾値と比較する。パーセプトロンや一層だけのニューラルネットワークが用いるべき学習可能な分類器の候補となる。ただこの場合、人の手によって特徴量抽出を行う必要があり問題となる。つまりパターン認識とコンピュータビジョンにおいては、ある問題に対して使えそうな特徴抽出器の検討に注意が行きがちで、学習可能な分類器の設計はあまり重要視されない。 +前述の内容はディープラーニングが普及する前にパターン認識の分野で取り入れられていた基本的なコンセプトです。特徴量抽出器と学習可能分類器を使うことがパターン認識においては一般的でした。例えば顔認識を行いたい時に目を検出することなど、入力されたデータの関連性のある有用な特徴を抽出します。そして得られた特徴量ベクトルを用いて学習可能な分類器で重み付き和を計算し閾値と比較します。パーセプトロンや一層だけのニューラルネットワークが用いるべき学習可能な分類器の候補となります。ただこの場合、人の手によって特徴量抽出を行う必要があり問題となります。つまりパターン認識とコンピュータビジョンにおいては、ある問題に対して使えそうな特徴抽出器の検討に注意が行きがちで、学習可能な分類器の設計はあまり重要視されないということです。 -ディープラーニングが出現し成熟した頃には、その二段階プロセスが数々の部品が繋ぎ合わさったものへと変貌していた。それらの部品それぞれが調整可能なパラメータと非線形性を持っており、重なり合って複数の階層を構成する。これが「ディープラーニング」と呼ばれる所以である。ここで線形ではなく非線形性を与えるのはもし2つの層が両方とも線形性を持つならそれらは一つの線形の層で表すことができるためである。 +ディープラーニングが出現し成熟した頃には、その二段階プロセスが数々の部品が繋ぎ合わさったものへと変貌していました。それらの部品それぞれが調整可能なパラメータと非線形性を持っており、重なり合って複数の階層を構成します。これが「ディープラーニング」と呼ばれる所以です。ここで線形ではなく非線形性を与えるのはもし2つの層が両方とも線形性を持つならそれらは一つの線形の層で表すことができるためです。 -訓練可能なパラメータと非線形性を持つ複数層を持つアーキテクチャで最も単純なものとしては、画像や音がベクトル表現として入力され、訓練可能な重みとの積となり、そしてその積の要素一つずつに対してReLUのような非線形関数を適用する。このプロセスを繰り返すことにより基本的なニューラルネットワークとなる。これがニューラルネットワークと呼ばれているのは、このアーキテクチャが入力の要素の重み付き和を、行列の列に対応させながら計算するからである。 +訓練可能なパラメータと非線形性を持つ複数層を持つアーキテクチャで最も単純なものとしては、画像や音がベクトル表現として入力され、訓練可能な重みとの積となり、そしてその積の要素一つずつに対してReLUのような非線形関数を適用するものです。このプロセスを繰り返すことにより基本的なニューラルネットワークとなります。これがニューラルネットワークと呼ばれているのは、このアーキテクチャが入力の要素の重み付き和を、行列の列に対応させながら計算するからです。 -教師あり学習の話に戻ると、実際の出力内容と出力されるべき内容とで距離・ペナルティ・発散を計算して比較し、損失となる目的関数の最適化を行う。そして、このコスト関数を訓練データ全体で平均とし最小化したい。言い換えれば、この平均値が最小となるようなパラメーターの値を求めたい。 +教師あり学習の話に戻ると、実際の出力内容と出力されるべき内容とで距離・ペナルティ・ダイバージェンスを計算して比較し、損失となる目的関数の最適化を行います。そして、このコスト関数を訓練データ全体で平均し最小化したいと考えます。言い換えれば、この平均値が最小となるようなパラメーターの値を求めたいということです。 -そのパラメータを求めるためには勾配計算を行う。例えば、霧の出た夜中に平滑な山で道に迷ってしまい、谷にある村に向かおうとしている。その場で周囲を見てどの方向に進むのが下り勾配が最も急になるかを見つけその方向に一歩進む。その方向は(負の)勾配(グラーディエント)となる。もし谷が下に凸であることを仮定すればこの方法で谷底に辿りつくことができ、一つの方法として考えられる。 +そのパラメータを求めるためには勾配計算を行います。例えば、霧の出た夜中に平滑な山で道に迷ってしまい、谷にある村に向かおうとしているとしましょう。その場で周囲を見てどの方向に進むのが下り勾配が最も急になるかを見つけその方向に一歩進みます。その方向は(負の)勾配(グラーディエント)となります。もし谷が下に凸であることを仮定すればこの方法で谷底に辿りつくことができ、一つの方法として考えられます。 -更に効率的な方法としては確率的勾配降下法(Stochastic Gradient Descent - SGD)が挙げられる。訓練データ全体での損失の平均値の最小化を行いたいのであるから、サンプルの一部を選んで誤差を計算し勾配降下法を用い、またサンプル別の部分を用いて新しい誤差を計算し勾配を取得する。このとき基本的には新しい勾配はその前のもととは異なる値を取る。SGDを用いる主な理由としては、訓練データが非常に大きいときにでも素早く収束に至りやすいが経験的に知られていることと、様々なデータセットに対して同様の結果が得られるかを表す汎化性能が良くなりやすいことの二つがある。 +更に効率的な方法としては確率的勾配降下法(Stochastic Gradient Descent - SGD)が挙げられます。訓練データ全体での損失の平均値の最小化を行いたいのですから、サンプルの一部を選んで誤差を計算し勾配降下法を用い、またサンプル別の部分を用いて新しい誤差を計算し勾配を取得します。このとき基本的には新しい勾配はその前のもととは異なる値を取ります。SGDを用いる主な理由としては、訓練データが非常に大きいときにでも素早く収束に至りやすいことが経験的に知られていることと、様々なデータセットに対して同様の結果が得られるかを表す汎化性能が良くなりやすいことの二つがあります。 ### [誤差逆伝播法による勾配の計算方法](https://www.youtube.com/watch?v=0bMe_vCZo30&t=2336s) -誤差逆伝播法による勾配の計算は連鎖則の実用的な応用であり、入力に関しての勾配を求める誤差逆伝播の式は以下のようになる: +誤差逆伝播法による勾配の計算は連鎖則の実用的な応用であり、入力に関しての勾配を求める誤差逆伝播の式は以下のようになります: + $$ \begin{aligned} \frac{\partial C}{\partial \boldsymbol{x}_{i - 1}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial \boldsymbol{x}_i}{\partial \boldsymbol{x}_{i - 1}} \\ @@ -122,7 +123,8 @@ $$ -重みに関しての勾配を求める誤差逆伝播の式は以下のようになる: +重みに関しての勾配を求める誤差逆伝播の式は以下のようになります: + $$ \begin{aligned} \frac{\partial C}{\partial \boldsymbol{w}_{i}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial \boldsymbol{x}_i}{\partial \boldsymbol{w}_{i}} \\ @@ -132,11 +134,11 @@ $$ -ここで注意したいのは入力がスカラー値ではなくベクトル値であり、より一般には多次元の入力値となる。バックプロパゲーションにより、正しい出力と実際の出力の差分についてネットワーク上にあるいかなる値に関する微分を計算することができ、この差分が目的関数ともなる。誤差逆伝播法がネットワーク上の複数の層に用いることができるため重要である。 +ここで注意したいのは入力がスカラー値ではなくベクトル値であり、より一般には多次元の入力値となることです。誤差逆伝播法により、正しい出力と実際の出力の差分についてネットワーク上にあるいかなる値に関する微分も計算することができ、この差分が目的関数ともなります。誤差逆伝播法はネットワーク上の複数の層に用いることができるため重要です。 -入力をどのように変換するかも大切である。例えば、256$$\times$$256の画像では200,000個の値を持つ行列が必要となるだろう。このような行列はニューラルネットの層が扱うには大きすぎて実用的ではない。そのため行列の構造について仮説を組み立てることが重要になってくる。 +入力をどのように変換するかも大切です。例えば、256$$\times$$256の画像では200,000個の値を持つ行列が必要となるでしょう。このような行列はニューラルネットの層が扱うには大きすぎて実用的ではありません。そのため行列の構造について仮説を組み立てることが重要になってきます。 @@ -144,8 +146,8 @@ $$ -福島による実験によって脳がどのようにして眼からの情報を解釈するかへの理解が得られた。端的に言えば、網膜の前にあるニューロンにより入力情報が圧縮されて(これはコントラスト正規化として知られる)更に信号が眼から脳へと伝わることが分かった。その後伝わった視覚情報が階層的に処理され、特定のカテゴリーに対応するあるニューロンが活性化することで情報の分類が成される。このようにして視覚野は階層的にパターン認識をしている。 +福島による実験によって脳がどのようにして眼からの情報を解釈するかへの理解が得られました。端的に言えば、網膜の前にあるニューロンにより入力情報が圧縮されて(これはコントラスト正規化として知られています)更に信号が眼から脳へと伝わることが分かりました。その後伝わった視覚情報が階層的に処理され、特定のカテゴリーに対応するあるニューロンが活性化することで情報の分類が成されます。このようにして視覚野は階層的にパターン認識をしています。 -視覚野の特定の部位、特に一次視覚野 (V1)に電極を差し込むことで行う実験により、視野の極々一部に出現した模様に対して特定のニューロンが反応を示し、さらにその近くにある違う模様に対しては最初のニューロンの近くのニューロンが反応することが分かった。さらに、視野の同じ部分に反応するニューロンは様々な種類の縁に対して規則的に反応する(例えば辺が垂直か水平か)ことも分かった。また、視覚プロセスが本質的にはフィードフォーワードの過程であるという考え方があるということを知っておくのも重要である。こうして循環的な接続無しで高速に認識を行うことができるのである。 +視覚野の特定の部位、特に一次視覚野 (V1)に電極を差し込むことで行う実験により、視野の極々一部に出現した模様に対して特定のニューロンが反応を示し、さらにその近くにある違う模様に対しては最初のニューロンの近くのニューロンが反応することが分かりました。さらに、視野の同じ部分に反応するニューロンは様々な種類のエッジに対して規則的に反応する(例えば辺が垂直か水平か)ことも分かりました。また、視覚プロセスが本質的にはフィードフォーワードの過程であるという考え方があるということを知っておくのも重要です。こうして循環的な接続無しで高速に認識を行うことができるのです。 diff --git a/docs/ja/week01/01-2.md b/docs/ja/week01/01-2.md new file mode 100644 index 000000000..69f29a319 --- /dev/null +++ b/docs/ja/week01/01-2.md @@ -0,0 +1,151 @@ +--- +lang-ref: ch.01-2 +lang: ja +lecturer: Yann LeCun +title: CNNの進化と使用、そして、なぜ深層学習なのか? +authors: Marina Zavalina, Peeyush Jain, Adrian Pearl, Davida Kollmar +date: 27 Jan 2020 +translation-date: 2 Dec 2020 +translator: Shiro Takagi +--- + + + +## [CNNの進化](https://www.youtube.com/watch?v=0bMe_vCZo30&t=2965s) + + + +動物の脳では、ニューロンは、特定の方向にあるエッジに反応します。同じ方向に反応するニューロンのグループは、視覚野全体に複製されています。 + +福島(1982)は、2つの概念に基づいて、脳と同じように働くニューラルネット(NN)を構築しました。第一に、ニューロンは視覚野全体に複製されているということです。第二に、単純型細胞(方位選択ユニット)からの情報をプールする複雑型細胞が存在するということです。その結果、像のシフトは単純型細胞の活性化に変化を与えますが、複雑型細胞の統合的な活性化には影響を与えません(畳み込みプーリング)。 + +LeCun(1990)は手書きの数字を認識するCNNの訓練に誤差逆伝播法を使いました。1992年のデモでは、任意のスタイルの数字を認識しています。エンドツーエンドで学習されたモデルを使って文字・パターン認識を行うことは、当時としては新しいことでした。それまでは、教師ありモデルの前に特徴量抽出器を置いていました。 +これらの新しいCNNシステムは、画像中の複数の文字を同時に認識することができました。そのためには、CNN用の小さな入力ウィンドウを使って、画像全体をスワイプしました。それが活性化すれば、特定の文字が存在することを意味します。 + +その後、このアイデアは、顔や人物の検出やセマンティックセグメンテーション(ピクセル単位の分類)にも応用されました。例としては、Hadsell (2009)やFarabet (2012)などがあります。これはやがて産業界でも普及し、車線追跡などの自動運転の応用場面でも使われるようになりました。 + +CNNを訓練するための特殊なタイプのハードウェアは1980年代に話題になりましたが、その後は関心が下がり、今では再び人気が出てきています。 + +ディープラーニング(当時はこの用語は使われていませんでしたが)革命は2010年から2013年に始まりました。研究者たちは、大規模なCNNをより速く訓練するのに役立つアルゴリズムを発明することに焦点を当てていました。Krizhevsky(2012)は、それまで使われていたCNNよりもはるかに大規模なAlexNetを考え出し、GPUを使ってImageNet(130万サンプル)上で訓練しました。数週間学習を回した後、AlexNetは競合する当時最高のシステムの性能を大差で上回りました。具体的には、トップ5の誤差率は25.8%に対して16.4%でした。 + +AlexNetの成功を見て,コンピュータビジョン(CV)コミュニティはCNNが機能することを確信しました。2011年から2012年までのCNNに言及した論文はすべてリジェクトされていましたが、2016年以降はほとんどのCV論文でCNNが使われています。 + +この数年の間に、使用される層の数は増加しています。LeNetは7層、AlexNetは12層、VGGは19層、ResNetは50層となっています。しかし、出力の計算に必要な演算数、モデルのサイズ、精度の間にはトレードオフがあります。そこで、ネットワークを圧縮して計算を高速化する方法が、現在の人気のトピックとなっています。 + + + + + + +## [深層学習と特徴抽出](https://www.youtube.com/watch?v=0bMe_vCZo30&t=3955s) + +多層ネットワークが成功しているのは、自然のデータの構成的な構造を利用しているからです。構成的な階層では、ある階層のオブジェクトの組み合わせが次の階層のオブジェクトを形成します。この階層を多層として模倣し、ネットワークに適切な特徴の組み合わせを学習させると、いわゆるディープラーニングアーキテクチャが得られます。このように、ディープラーニングネットワークは階層的な性質を持っています。 + +ディープラーニングアーキテクチャは、物体の周囲の正確なマスクの識別と生成から、物体の空間的特性の識別まで、コンピュータビジョンのタスクにおいて驚異的な進歩をもたらしました。マスクRCNNとRetinaNetアーキテクチャが、主にこのような進歩をもたらしました。 +マスクRCNNは、個々のオブジェクトのセグメンテーション、すなわち、画像内の各オブジェクトのマスクを作成する際に使用されています。入力と出力は両方とも画像です。このアーキテクチャは、インスタンスセグメンテーション、すなわち、画像内の同じタイプの異なるオブジェクトを識別するためにも使用できます。Facebook AI Research(FAIR)のソフトウェアシステムであるDetectronは、これらの最先端の物体検出アルゴリズムをすべて実装しており、オープンソースになっています。 + +CNNの実用的な応用例としては、自動運転や医療画像の分析などがあります。 + +ディープラーニングの背後にある科学と数学はかなり理解されていますが、まだまだ研究が必要な興味深い問題がいくつかあります。これらの疑問には以下のようなものがあります。2つの層でどんな関数も近似できるのに、なぜ複数の層を持つアーキテクチャの方が性能が良いのか?なぜCNNは音声、画像、テキストなどの自然なデータに対してうまく機能するのか?非凸関数をどうやってこれほどうまく最適化できるのか?オーバーパラメトライズドなアーキテクチャはなぜ機能するのか?などです。 + +特徴抽出は、拡張された特徴が線形分離可能である可能性が高くなるように表現次元を拡張することからなります。 + +初期の機械学習では、人工知能モデルを構築するために、高品質で手作業で作られたタスク固有の特徴に頼っていました。しかし、ディープラーニングの出現により、モデルは自動的に一般的な特徴を抽出することができるようになりました。特徴抽出アルゴリズムで使用されている一般的なアプローチを以下に紹介します。 + +- スペースタイリング +- ランダム射影 +- 多項式分類器 (特徴量の交差積) +- 放射基底関数 +- カーネルマシン + +データの構成性のため、学習された特徴は抽象度が高くなるにつれて表現の階層を持ちます。例えば、以下のようなものがあります。 + +- 画像 - 最も細かいレベルでは、画像はピクセルとして考えることができます。ピクセルの組み合わせはエッジを構成し、それらが組み合わされることでtexton(複数のエッジ形状)が形成されます。textonはモチーフを形成し、モチーフは画像の一部を形成します。これらの部分を組み合わせることで、最終的な画像を得ることができます。 +- テキスト - 同様に、テキストデータにも固有の階層があります。文字は単語を形成し、単語を組み合わせることで単語群を形成し、次に節を形成し、節を組み合わせることで文を形成します。文は、最終的にどのようなストーリーが伝えられているのかを教えてくれます。 +- 音声 - 音声では、サンプルがバンドを構成し、それが音を構成し、それが単音を構成し、次に音素を構成し、次に単語全体を構成し、次に文を構成し、このように表現に明確な階層性があることを示しています。 + + + +## [表現の学習](https://www.youtube.com/watch?v=0bMe_vCZo30&t=4767s) + +ディープラーニングを否定する人たちがいます: どんな関数でも2つの層で近似できるなら、なぜそれ以上の層を持つ必要があるのでしょうか? + +例えば SVMは「データ全体に渡って」分離する超平面を見つけます。これは、予測が訓練サンプルの比較に基づいていることを意味しています。SVMは本質的に非常に単純な2層のニューラルネットであり、第1層が「テンプレート」を定義し、第2層が線形分類器です。2層に関する誤謬の問題点は、中間層の複雑さとサイズが$N$について指数関数的であることです(難しいタスクをうまくこなすためには、たくさんのテンプレートが必要だということです)。しかし、層の数を $\log(N)$ に拡張すると、層は $N$について線形になります。時間と空間の間にはトレードオフがあるのです。 + +アナロジーとして、2層以上のゲートでブール関数を計算する回路を設計することが考えられます -- **どんなブール関数も**この方法で計算できます! しかし、最初の層(ゲート数)の複雑さとリソースは、複雑な関数にはすぐに実行不可能になります。 + +では「ディープ」とは何でしょう? + +- SVMは2つの層しかないので、ディープではありません。 +- 分類木は、すべてのレイヤーが同じ(生の)特徴を分析するので、深くはありません。 +- ディープネットワークにはいくつかの層があり、それらを使用して**複雑さを増す特徴の階層を構築します**。 + +モデルはどのようにして表現(良い特徴)を学習できるのでしょうか? + +多様体仮説:自然なデータは低次元の多様体の中に存在するというものです。可能な画像の集合は本質的に無限ですが、「自然な」画像の集合はごく一部です。例えば、人物の画像の場合、可能な画像の集合は、人物が動かせる顔の筋肉の数(自由度)〜50のオーダーです。理想的な(非現実的な)特徴抽出器は、すべての変動要因(筋肉、照明、*など*)を表現します。 + +講義の最後からQ&A。 + +- 顔の例では、他の次元削減技術(PCA*など*)でこれらの特徴を抽出できますか? + - 答え: 多様体表面が超平面である場合にのみ機能しますが、そうではありません。 \ No newline at end of file diff --git a/docs/ja/week01/01-3.md b/docs/ja/week01/01-3.md new file mode 100644 index 000000000..42b099e8b --- /dev/null +++ b/docs/ja/week01/01-3.md @@ -0,0 +1,201 @@ +--- +lang-ref: ch.01-3 +lang: ja +title: 問題のモチベーション、線形代数、そして可視化 +lecturer: Alfredo Canziani +authors: Derek Yen, Tony Xu, Ben Stadnick, Prasanthi Gurumurthy +date: 28 Jan 2020 +translation-date: 2 Dec 2020 +translator: Shiro Takagi +--- + + + +## リソース + + +Alfredo Canziani [Twitter @alfcnz](https://twitter.com/alfcnz)をフォローしてください。線形代数や特異値分解(SVD)に関する詳細なビデオや教科書は、Alfredoのツイッターで検索することができます。例えば`linear algebra (from:alfcnz)`と検索してみてください。 + + + + +## [変換とモチベーション](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=233s) + +動機を与える例として、画像の分類を考えてみましょう。1メガピクセルのカメラで写真を撮ったとします。この画像は、縦に約1,000ピクセル、横に約1,000ピクセルの画素を持ち、各画素は赤、緑、青(RGB)の3つの色の次元を持っています。それぞれの画像は、300万次元空間の1点と考えることができます。このような巨大な次元により、犬と猫のように分類したいと思うような興味深い画像は、本質的に空間の同じ領域に存在することになります。 + +これらの画像を効果的に分離するために、点を移動させるためのデータの変換方法を考えます。2次元空間では、線形変換は行列積と同じであることを思い出してください。例えば、以下のような線形変換があります。 + +- 回転(行列が正規直交の場合) +- 拡大縮小(対角行列の場合) +- 鏡映(行列式が負の場合) +- せん断 + +0 が常に 0 に写像されるとは限らないので、平行移動だけでは線形ではないことに注意してください。画像の例に戻ると、点が0の周りにクラスタリングされるように変換し、その領域に「ズームイン」するように対角行列でスケーリングすることで、データ点を変換することができます。最後に、異なる点をそれぞれのクラスに分ける線を空間全体に見つけることで、分類を行うことができます。言い換えれば、線形変換と非線形変換を使って、点を線形分離可能な空間にマッピングするという考え方です。この考え方は、次の節でより具体的に説明します。 + + + + +## [データの可視化 - ネットワークを使って色で点を区切る](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=798s) + +この可視化では、5つの枝を持つ螺旋があり、それぞれの枝は異なる色に対応しています。点は2次元平面上にあり、タプルとして表現することができます。色は三次元を表現しており、これは各点ごとに異なるクラスであると考えることができます。そして、ネットワークを使用して、各点を色で区切ります。 + +|
|
| +| (a) 入力点、ネットワークに通す前 | (b) 出力点、ネットワークに通した後 | + +
図1: 5色の螺旋
+ネットワークは、それぞれの点を異なる部分空間に分離するために、空間構造を引き伸ばします。収束すると、ネットワークは、最終的な多様体の異なる部分空間に各色を分離します。言い換えれば、この新しい空間の色のそれぞれは、1対すべての回帰において線形分離可能になります。図中のベクトルは、5×2の行列で表すことができます。この行列は、各点に乗算することで、5つの色のそれぞれのスコアを返すことができます。ここでは、出力次元は5で、色ごとに1つずつ、入力次元は2で、それぞれ点xとyの座標に1つずつです。要約すると、このネットワークは基本的に空間構造を受け取り、いくつかの行列と非線形性によってパラメトライズされた空間の変換を行います。 + + +### ネットワークアーキテクチャ + + +
+
+図2: ネットワークアーキテクチャ +
+ + +最初の行列は、2次元の入力を100次元の隠れ層にマッピングします。次に、非線形層、`ReLU`(Rectified Linear Unit)ですが、これは単に*正の部分* を返す関数$(\cdot)^+$です。そして、画像をグラフィカルに表示するために、100次元の隠れ層の入力を2次元の出力にマッピングする埋め込み層を加えます。最後に、埋め込み層は、各色のスコアを表すネットワークの最終的な5次元の層に射影します。 + + + + + +## [ランダム射影 - Jupyter Notebook](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=1693s) + +Jupyter Notebook は [ここ](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/02-space_stretching.ipynb)から見つかります。このノートブックを動かすためには、[`README.md`](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)で説明されているような`pDL`環境をインストールしていなければなりません。 + + +### PyTorch `device` + + +PyTorch はコンピュータの CPU と GPU の両方で動作します。CPUはシーケンシャルなタスクに、GPUはパラレルなタスクに適しています。目的のデバイスで実行する前に、まず、テンソルとモデルがデバイスのメモリに転送されていることを確認する必要があります。これは以下の2行のコードで行うことができます。 + +```python +device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") +X = torch.randn(n_points, 2).to(device) +``` + + +最初の行では、`device`という変数を作成し、GPUが利用可能であればGPUに代入します。次の行では、`.to(device)`を呼び出すことでテンソルが作成され、デバイスのメモリに送られます。 + + + +### Jupyter Notebookのヒント + +ノートブックのセル内の関数のドキュメントを見るには、`Shift + Tab`を押してください。 + + + + + +### 線形変換の可視化 + +線形変換は行列として表現できることを思い出してください。特異値分解を用いて、行列を、それぞれ異なる線形変換を表す3つの成分行列に分解することができます。 + +$$ +W = U\begin{bmatrix}s_1 & 0 \\ 0 & s_2 \end{bmatrix} V^\top +$$ + + + +式(1)において、行列 $U$ と $V^\top$ は互いに直交する行列で、それぞれ回転変換と鏡映変換を表しています。真ん中の行列は対角行列で, スケーリング変換を表しています。 + +いくつかのランダムな行列の線形変換を図3に示します。特異値が結果の変換に与える影響に注目してください。 + +使用した行列は Numpy で生成したものですが、PyTorch の `nn.Linear` クラスで `bias = False` を指定して線形変換を行うこともできます。 + +| ![]({{site.baseurl}}/images/week01/01-3/initial_scatter_lab1.png) | ![]({{site.baseurl}}/images/week01/01-3/matrix_multiplication_lab1.png) | ![]({{site.baseurl}}/images/week01/01-3/matrix_multiplication_lab1_2.png) | +| (a) Original points | (b) $s_1$ = 1.540, $s_2$ = 0.304 | (c) $s_1$ = 0.464, $s_2$ = 0.017 | + + +
図3: ランダム行列からの線形変換
+ + + +### 非線形変換 + + +次に、下の変換を可視化します。 + +$$ +f(x) = \tanh\bigg(\begin{bmatrix} s & 0 \\ 0 & s \end{bmatrix} \bigg) +$$ + + +図4の$\tanh(\cdot)$の図を思い出してください。 + + +
+
+図4: tanh非線形性 +
+ +この非線形性は、 $-1$ と $+1$ の間の点を束縛し、正方形を作ります。(2)式の $s$ の値が大きくなるにつれて、より多くの点が正方形の端に押し出されます。これを図5に示します。より多くの点を周辺に押し付けることで、点をより大きく広げることができ、これによって分類を試みることができます。 + + +| | | +| (a) $s=1$の非線形性 | (b) $s=5$の非線形性 | + +
図5: 非線形変換
+ + + + +### ランダムニューラルネット + +最後に、単純な、訓練されていないニューラルネットワークによって実行される変換を可視化します。このネットワークは、アフィン変換を行う線形層、tanh非線形、そして最後に別の線形層から構成されています。図6の変換を見てみると、先ほどの線形変換や非線形変換とは異なることがわかります。今後、ニューラルネットワークによるこれらの変換を、最終的な目的である分類に役立てるにはどうすればよいかを見ていきます。 + +
+
+図6: 学習されていないニューラルネットによる変換 +
\ No newline at end of file diff --git a/docs/ja/week01/01.md b/docs/ja/week01/01.md index 1568dcf28..7cdc1f528 100644 --- a/docs/ja/week01/01.md +++ b/docs/ja/week01/01.md @@ -11,7 +11,7 @@ translator: Shohei Ogawa -この章ではディープラーニングを学ぶモチベーションについて扱う。ディープラーニングの歴史とそのきっかけに始まり、パターン認識の歴史について説明して、さらに勾配降下法とその計算方法である誤差逆伝播法を導入する。最後に視覚野の階層的表現について述べる。 +この章ではディープラーニングを学ぶモチベーションについて扱います。ディープラーニングの歴史とそのきっかけに始まり、パターン認識の歴史について説明して、さらに勾配降下法とその計算方法である誤差逆伝播法を導入します。最後に視覚野の階層的表現について述べます。 @@ -19,7 +19,7 @@ translator: Shohei Ogawa -まず初めに福島やLeCun仕事からAlexNetまでのCNNの進展について扱い、画像のセグメンテーション、自動運転、医療画像の分析でのCNNの利用例を議論する。そのあと、ディープネットワークの階層構造とその利点となる性質について説明する。最後に特徴量や表現の生成と学習について述べこの章のまとめとする。 +まず初めに福島やLeCunの仕事からAlexNetまでのCNNの進展について扱い、画像のセグメンテーション、自動運転、医療画像の分析でのCNNの利用例を議論します。そのあと、ディープネットワークの階層構造とその利点となる性質について説明します。最後に特徴量や表現の生成と学習について述べて、この章のまとめとします。 @@ -27,4 +27,4 @@ translator: Shohei Ogawa -まずどうして空間上に可視化されたデータ点を変換すると良いのかについて議論し、線形代数と線形変換、非線形変換の仕方について扱う。さらに変換の作用と影響をよく理解するために可視化を行う。 Jupyter Notebookを使って例を一通り扱い、ニューラルネットワークによって表現される関数について述べてまとめとする。 +まずどうして空間上に可視化されたデータ点を変換すると良いのかについて議論し、線形代数と線形変換、非線形変換の仕方について扱います。さらに変換の作用と影響をよく理解するために可視化を行います。 Jupyter Notebookを使って例を一通り扱い、ニューラルネットワークによって表現される関数について述べてまとめとします。 diff --git a/docs/ja/week02/02-1.md b/docs/ja/week02/02-1.md new file mode 100644 index 000000000..632a63251 --- /dev/null +++ b/docs/ja/week02/02-1.md @@ -0,0 +1,508 @@ +--- +lang-ref: ch.02-1 +lang: ja +lecturer: Yann LeCun +title: 勾配法と誤差逆伝播アルゴリズムの紹介 +authors: Amartya Prasad, Dongning Fang, Yuxin Tang, Sahana Upadhya +date: 3 Feb 2020 +translation-date: 2 Dec 2020 +translator: Shiro Takagi +--- + + + +## [勾配法](https://www.youtube.com/watch?v=d9vdh3b787Y&t=29s) + + + +### パラメトリックモデル + +$$ +\bar{y} = G(x,w) +$$ + + + +パラメトリックモデルは、単に入力と訓練可能なパラメータに依存する関数です。この2つの間には基本的な違いはありませんが、入力がサンプルごとに異なるのに対し、訓練可能なパラメータは訓練サンプル間で共有されます。ほとんどの深層学習フレームワークでは、パラメータは暗黙的なものであり、関数が呼び出されたときには渡されません。少なくともオブジェクト指向モデルでは、パラメータはいわば「関数の中に保存されている」のです。 + +パラメトリックモデル(関数)は、入力を受け取り、パラメータベクトルを持ち、出力を生成します。教師あり学習では、この出力はコスト関数($C(y,\bar{y}$))に入り、真の出力(${y}$)とモデルの出力($\bar{y}$)を比較します。このモデルの計算グラフを図1に示します。 + + +
Figure1
| +|
図1: パラメトリックモデルを表現した計算グラフ
| + + + +パラメータ付けられた関数の例 + +- 線形モデル - 入力ベクトルの成分の加重和 + + $$ + \bar{y} = \sum_i w_i x_i, C(y,\bar{y}) = \Vert y - \bar{y}\Vert^2 + $$ + + +- 最近傍 - 入力 $\vect{x}$ と重み行列 $\matr{W}$ があります。出力は、$\vect{x}$に最も近い$\matr{W}$の行に対応する$k$の値です。 + + $$ + \bar{y} = \underset{k}{\arg\min} \Vert x - w_{k,.} \Vert^2 + $$ + + + パラメトリックモデルにはより複雑な関数も含まれます。 + + + +#### 計算グラフのブロック図による表記 + + + +- 変数 (テンソル、スカラー、 連続、 離散) + - x は、観測された、システムへの入力です。 + - y は、決定論的な関数によって計算された変数です。 + + + +- 決定論的な関数 + + deterministic_function + + - 複数の入力を受けて、複数の出力を返すことができます。 + - 暗黙的なパラメータ変数 (${w}$)を持っています。 + - 丸みを帯びた部分は計算しやすい方向を示しています。上の図では、${x}$から${\bar{y}}$を計算する方が、逆よりも計算しやすいことがわかります。 + + + + + +- スカラー値関数 + + scalar-valued + + - コスト関数を表現するために使われます。 + - 暗黙的なスカラーの出力を持っています。 + - 複数の入力を受けて、単一の出力を返します (通常は入力の間の距離)。 + + + +#### 損失関数 + +損失関数は学習中に最小化される関数です。二つのタイプの損失があります。 + +1) サンプルごとの損失 - + +$$ + L(x,y,w) = C(y, G(x,w)) +$$ + +2) 平均損失 - + +​ 任意のサンプルの集合 $$S = \{(x[p],y[p]) \mid p=0,1...P-1 \}$$ に対して + +集合 S の平均損失は次のようになります $$L(S,w) = \frac{1}{P} \sum_{(x,y)} L(x,y,w)$$ + +|
Average_Loss
| +|
図2: 平均損失をもつモデルの計算グラフ
| + + +標準的な教師あり学習のパラダイムでは、損失(サンプルあたり)は単にコスト関数の出力です。機械学習は、主に関数の最適化(通常は最小化)に関するものです。また、GANのように2つの関数間のナッシュ均衡を見つけることも含まれます。これは必ずしも勾配降下法とは限りませんが、勾配ベースの手法を用いて行われます。 + + +### 勾配降下法 + + + +**勾配に基づく方法**は、関数の勾配を簡単に計算できると仮定して、関数の最小値を求める方法/アルゴリズムです。これは、関数が連続的で、ほぼすべての場所で微分可能であることを前提としています(すべての場所で微分可能である必要はありません)。 + +**勾配降下法の直感** - 霧が立ち込める山の中にいることを想像してみてください。あなたは村に下りたいと思っています。視界が限られているので、あなたは自分のすぐ近くを見回して、最も急な下り坂の方向を見つけ、その方向に一歩を踏み出します。 + + +**勾配降下法の様々な方法** + + +- 完全な (バッチ) 勾配降下法の更新則 + + $$ + w \leftarrow w - \eta \frac{\partial L(S,w)}{\partial w} + $$ + + +- SGD (確率的勾配降下法)については、更新則は次のようになります。 + + - $\text{0...P-1}$から$p$を選び、次のように更新します + + $$ + w \leftarrow w - \eta \frac{\partial L(x[p], y[p],w)}{\partial w} + $$ + + +ここで$${w}$$は最適化するパラメータを表しています。 + + +$\eta$はここでは定数ですが、もっと洗練されたアルゴリズムでは、行列などになることもあります。 + + + +これが半正定値行列であれば、まだ下山はできますが、必ずしも急な下り坂の方向に移動するとは限りません。実際には、最も急な下り坂の方向は、必ずしも我々が移動したい方向とは限りません。 + +関数が微分できない、つまり穴があったり階段のようだったり平坦だったりするような場合、勾配は何の情報も与えてくれません。この場合、0次法や勾配なし法と呼ばれる他の方法に頼らなければなりません。ディープラーニングでは、勾配に基づいた方法がすべてです。 + +しかし、RL(強化学習)では、勾配の明示的な形式を使わずに、**勾配の推定**を行います。例えば、ロボットが自転車に乗ることを学習することを考えます。この時、ロボットはたまに転んでしまうことがあります。目的関数は、自転車から落ちずにどれくらいの時間留まるかを測定します。残念ながら、目的関数には勾配がありません。ロボットはいろいろなことを試す必要があります。 + +RLのコスト関数はほとんどの場合微分できませんが、出力を計算するネットワークは勾配ベースです。これが教師あり学習と強化学習の大きな違いです。後者では、コスト関数Cは微分できません。実際、それは完全に未知です。ブラックボックスのように、入力が与えられると出力を返すだけです。これは非常に非効率的であり、RLの主な欠点の1つです。特に、パラメータベクトルが高次元である場合に問題になります(これは、探索するための巨大な解空間を意味し、どこに移動すべきかを見つけるのが困難になります)。 + +RLで非常に人気のある手法は、actor-critic法です。Critic法は基本的に、既知の訓練可能な第2のモジュールで構成されています。微分可能なCモジュールを訓練して、コスト関数/報酬関数を近似することができます。報酬は負のコストであり、罰のようなものです。これは、コスト関数を微分可能にしたり、少なくとも微分可能な関数で近似したりして、誤差逆伝播法を用いることができるようにする方法です。 + + + +## [従来のニューラルネットにおけるSGDと誤差逆伝播の利点](https://www.youtube.com/watch?v=d9vdh3b787Y&t=1036s) + + + +### 確率的勾配降下法 (SGD)の利点 + + +実際には、パラメータについての目的関数の勾配を計算するために、確率的な勾配を使用します。確率的な勾配は、すべてのサンプルの平均である完全な勾配を計算する代わりに、1つのサンプルを取り、損失$L$およびその損失のパラメータに関する勾配を計算します。そして、負の勾配の方向に1ステップ更新するだけです。 + +$$ +w \leftarrow w - \eta \frac{\partial L(x[p], y[p],w)}{\partial w} +$$ + + + +式の中では、与えられたサンプル($x[p]$,$y[p]$)毎の損失関数のパラメータに関する勾配にステップサイズをかけたものを、$w$から引くことで、$w$に近づけています。 + +これを1つのサンプルで行うと、図3に示すような非常にノイズの多い軌跡が得られます。損失が直接下降していくのではなく、確率的に降下しています。すべてのサンプルが損失を異なる方向に引き寄せます。それは、平均値の最小値に引っ張られているだけです。効率が悪いように見えますが、少なくとも機械学習の文脈では、サンプルに冗長性がある場合には、バッチ勾配降下法よりもはるかに高速です。 + +
Figure2
| +|
図3: サンプルごとの更新の確率的勾配降下法の軌跡
| + + +実際には、単一のサンプルで確率的勾配降下法を行う代わりにバッチを使用します。私たちは、単一のサンプルではなく、サンプルのバッチにわたって勾配の平均を計算し、その後、1ステップ更新します。これを行う理由は、単に、バッチを使用した方が並列化が容易なので、既存のハードウェア(GPUやマルチコアCPUなど)をより効率的に利用できるからです。並列化するにはバッチが一番簡単です。 + + +### 従来のニューラルネットワーク + + +従来のニューラルネットでは、基本的に線形演算と要素ごとの非線形演算の層が散在しています。線形演算については、概念的には行列-ベクトルの乗算にすぎません。(入力)ベクトルに重みで形成された行列を乗算したものを取ります。第二のタイプの演算は、加重和ベクトルの全成分を取り、単純な非線形関数(例えば、$\texttt{ReLU}(\cdot)$, $\tanh(\cdot)$, ....)を通過させるものです。 + + +|
Figure3
| +|
図4: 従来のニューラルネットワーク
| + + + +図4は2層ネットワークの例ですが、重要なのはペア(つまり線形+非線形)です。変数を数えるので3層ネットワークと呼ぶ人もいます。もし中間層に非線形性がなければ、2つの線形関数の積が線形関数になるので、1層にしてもよいことに注意してください。 + +図5は、ネットワークの線形関数ブロックと非線形関数ブロックがどのように積み重なっているかを示しています。 + + +|
Figure4
| +|
図5: 線形ブロックと非線形ブロックの中身
| + + + +このグラフでは、$s[i]$はユニット${i}$の重み付き和で、次のように計算されます + +$$ +s[i]=\Sigma_{j \in UP(i)}w[i,j]\cdot z[j] +$$ + + + +ここで、$UP(i)$は$i$に入ってくるものを表し、$z[j]$は前のレイヤーからの$j$番目の出力です。 + +出力 $z[i]$ は次のように計算されます。 + +$$ +z[i]=f(s[i]) +$$ + + +ここで$f$は非線形関数です。 + + + +### 非線形関数を通した誤差逆伝播法 + + +誤差逆伝播を行う最初の方法は、非線形関数を通して誤差逆伝播を行うことです。ネットワークから特定の非線形関数 $h$ を取り出し、他のすべてをブラックボックスに入れておきます。 + + +|
Figure5
| +|
図6: 非線形関数を通した誤差逆伝播
| + + +勾配を計算するために連鎖律を用います + +$$ +g(h(s))' = g'(h(s))\cdot h'(s) +$$ + + +ここで、$h'(s)$は、$s$についての$z$の微分で、$\frac{\mathrm{d}z}{\mathrm{d}s}$で表されます。 +微分同士の関係を明確にするために、上の式を次のように書き換えます + +$$ +\frac{\mathrm{d}C}{\mathrm{d}s} = \frac{\mathrm{d}C}{\mathrm{d}z}\cdot \frac{\mathrm{d}z}{\mathrm{d}s} = \frac{\mathrm{d}C}{\mathrm{d}z}\cdot h'(s) +$$ + + + + + +したがって、もしネットワーク内にこれらの関数の連鎖があるならば、すべての${h}$ 関数の微分を乗算して誤差逆伝播し、入力層に戻ることができます。 + +摂動を加えるという観点から考えると、より直感的です。sを$\mathrm{d}s$で摂動すると、次のように$z$を摂動することになります + + +$$\mathrm{d}z = \mathrm{d}s \cdot h'(s)$$ + + +そしてこれは下のようにCを摂動することになります + +$$ +\mathrm{d}C = \mathrm{d}z\cdot\frac{\mathrm{d}C}{\mathrm{d}z} = \mathrm{d}s\cdot h’(s)\cdot\frac{\mathrm{d}C}{\mathrm{d}z} +$$ + + +もう一度、上に示したのと同じような式を得ることができました。 + + + +### 重み付き和を通した誤差逆伝播 + + +線形モジュールに対しては、重み付き和を用いて誤差逆伝播を行います。ここでは、${z}$変数から$s$変数たちに向かう3つの接続を除いて、ネットワーク全体をブラックボックスとみなしています。 + + +
Figure6
| +|
図7: 重み付き和を通った誤差逆伝播
| + + + +今回は摂動は重み付き和です。Zは様々な変数に影響します。$z$を$\mathrm{d}z$で摂動すると、$s[0]$, $s[1]$ そして $s[2]$を次のように摂動します + +$$ +\mathrm{d}s[0]=w[0]\cdot \mathrm{d}z +$$ + +$$ +\mathrm{d}s[1]=w[1]\cdot \mathrm{d}z +$$ + +$$ +\mathrm{d}s[2]=w[2]\cdot\mathrm{d}z +$$ + + + これはCを次のように摂動します + +$$ +\mathrm{d}C = \mathrm{d}s[0]\cdot \frac{\mathrm{d}C}{\mathrm{d}s[0]}+\mathrm{d}s[1]\cdot \frac{\mathrm{d}C}{\mathrm{d}s[1]}+\mathrm{d}s[2]\cdot\frac{\mathrm{d}C}{\mathrm{d}s[2]} +$$ + + +したがって、Cは3つの変化の合計によって変化することになります + +$$ +\frac{\mathrm{d}C}{\mathrm{d}z} = \frac{\mathrm{d}C}{\mathrm{d}s[0]}\cdot w[0]+\frac{\mathrm{d}C}{\mathrm{d}s[1]}\cdot w[1]+\frac{\mathrm{d}C}{\mathrm{d}s[2]}\cdot w[2] +$$ + + + +## [ニューラルネットワークと一般化された誤差逆伝播のPyTorch実装](https://www.youtube.com/watch?v=d9vdh3b787Y&t=2288s) + + + +### 従来のニューラルネットのブロック図による表記 + + +- 線形ブロック $s_{k+1}=w_kz_k$ +- 非線形ブロック $z_k=h(s_k)$ + +
Figure 7
+ + +それぞれ、$w_k$: 行列、 $z_k$: ベクトル、 $h$: スカラー関数${h}$を各成分に適用したもの、です。これは線形関数と非線形関数のペアを持つ3層のニューラルネットです。最近のニューラルネットの多くはこのような明確な線形と非線形の分離がなく、より複雑ですが。 + + + +### PyTorch実装 + +```python +import torch +from torch import nn +image = torch.randn(3, 10, 20) +d0 = image.nelement() + +class mynet(nn.Module): + def __init__(self, d0, d1, d2, d3): + super().__init__() + self.m0 = nn.Linear(d0, d1) + self.m1 = nn.Linear(d1, d2) + self.m2 = nn.Linear(d2, d3) + + def forward(self,x): + z0 = x.view(-1) # flatten input tensor + s1 = self.m0(z0) + z1 = torch.relu(s1) + s2 = self.m1(z1) + z2 = torch.relu(s2) + s3 = self.m2(z2) + return s3 +model = mynet(d0, 60, 40, 10) +out = model(image) +``` + + + +- PyTorchでは、オブジェクト指向クラスを使ってニューラルネットを実装することができます。まず、ニューラルネットのクラスを定義し、コンストラクタで定義済みの nn.Linear クラスを使って線形層を初期化します。線形層は、それぞれにパラメータベクトルが含まれているので、別々のオブジェクトにする必要があります。nn.Linearクラスはバイアスベクトルも暗黙的に追加します。そして、$\text{torch.relu}$関数を非線形活性化関数として、出力を計算するためのフォワード関数を定義します。relu関数はパラメータを持たないので、個別に初期化する必要はありません。 + +- PyTorchはフォワード関数に対してどのように勾配を計算して伝播させるのかを知っているので、実装する人が陽に勾配を計算する必要はありません。 + + + +### 関数モジュールを通した誤差逆伝播 + + +より一般化された誤差逆伝播の式を示します。 + + +
Figure9
| +|
図8: 関数モジュールを通した誤差逆伝播
| + + + +- ベクトル関数に対して連鎖律を適用して、 + + $$ + z_g : [d_g\times 1] + $$ + + $$ + z_f:[d_f\times 1] + $$ + + $$ + \frac{\partial c}{\partial{z_f}}=\frac{\partial c}{\partial{z_g}}\frac{\partial {z_g}}{\partial{z_f}} + $$ + + $$ + [1\times d_f]= [1\times d_g]\times[d_g\times d_f] + $$ + + + これは、連鎖律を使った $\frac{\partial c}{\partial{z_f}}$ の基本式です。スカラー関数のベクトルに対する勾配は、微分するベクトルと同じ大きさのベクトルであることに注意してください。表記に一貫性を持たせるために、列ベクトルではなく行ベクトルとしています。 + + +- ヤコビ行列 + + $$ + \left(\frac{\partial{z_g}}{\partial {z_f}}\right)_{ij}=\frac{(\partial {z_g})_i}{(\partial {z_f})_j} + $$ + + + + $z_g$についてのコスト関数の勾配が与えられたもとで、$z_f$に対するコスト関数の勾配を計算するために、 $\frac{\partial {z_g}}{\partial {z_f}}$ (ヤコビ行列の要素)が必要です。各要素 $ij$ は、入力ベクトルの $j$ 番目の成分に対する出力ベクトルの $i$ 番目の成分の偏微分に等しいです。 + + モジュールが連なっている場合、すべてのモジュールのヤコビ行列を乗算し続けると、すべての内部変数の勾配が得られます。 + + + +### マルチステージグラフを通した誤差逆伝播 + + +図9に示すように、ニューラルネットワークの多くのモジュールのスタックを考えてみましょう。 + + +|
Figure10
| +|
図9: マルチステージグラフを通じた誤差逆伝播
| + +誤差逆伝播のアルゴリズムには、状態(ネットワークの各モジュール)に関するものと、重み(特定のモジュールのすべてのパラメータ)に関するものの2つの勾配のセットが必要です。つまり、各モジュールに関連付けられた2つのヤコビ行列が必要になります。誤差逆伝播には再び連鎖律を使うことができます。 + + +- ベクトル関数に連鎖律を使う + + $$ + \frac{\partial c}{\partial {z_k}}=\frac{\partial c}{\partial {z_{k+1}}}\frac{\partial {z_{k+1}}}{\partial {z_k}}=\frac{\partial c}{\partial {z_{k+1}}}\frac{\partial f_k(z_k,w_k)}{\partial {z_k}} + $$ + + $$ + \frac{\partial c}{\partial {w_k}}=\frac{\partial c}{\partial {z_{k+1}}}\frac{\partial {z_{k+1}}}{\partial {w_k}}=\frac{\partial c}{\partial {z_{k+1}}}\frac{\partial f_k(z_k,w_k)}{\partial {w_k}} + $$ + + +- モジュールに関する二つのヤコビ行列 + - $z[k]$に関するもの + - $w[k]$に関するもの + + diff --git a/docs/ja/week02/02-2.md b/docs/ja/week02/02-2.md new file mode 100644 index 000000000..a39676ed5 --- /dev/null +++ b/docs/ja/week02/02-2.md @@ -0,0 +1,290 @@ +--- +lang-ref: ch.02-2 +lang: ja +lecturer: Yann LeCun +title: NNモジュールに対する勾配の計算と、誤差逆伝播法のコツ +authors: Micaela Flores, Sheetal Laad, Brina Seidel, Aishwarya Rajan +date: 3 Feb 2020 +translation-date: 2 Dec 2020 +translator: Shiro Takagi +--- + + + +## [誤差逆伝播の具体的な例と基本的なニューラルネットモジュールの導入](https://www.youtube.com/watch?v=d9vdh3b787Y&t=2989s) + + + + +### 例 + +次に、グラフを用いて誤差逆伝播の具体例を考えます。任意の関数 $G(w)$ をコスト関数 $C$ に入力すると、グラフとして表現できます。ヤコビ行列を乗算する操作によって、このグラフを勾配の逆伝播を計算するグラフに変換することができます(PyTorch と TensorFlow は、ユーザーのために自動的にこれを行うことに注意してください。つまり、順伝播のグラフを自動的に「反転」させて、勾配を逆伝播する微分グラフを作成します)。 + +
Gradient diagram
+ + +この例では、右の緑のグラフが勾配グラフを表しています。一番上のノードからグラフをたどると、次のようになります。 + +$$ +\frac{\partial C(y,\bar{y})}{\partial w}=1 \cdot \frac{\partial C(y,\bar{y})}{\partial\bar{y}}\cdot\frac{\partial G(x,w)}{\partial w} +$$ + + + +次元に関していうと、$\frac{\partial C(y,\bar{y})}{\partial w}$ はサイズが $1\times N$ の行ベクトルです。ただし$N$ は $w$の要素の数です。また、$\frac{\partial C(y,\bar{y})}{\partial \bar{y}}$ はサイズが $1\times M$の行ベクトルです。ただし $M$ は出力の次元です。$\frac{\partial \bar{y}}{\partial w}=\frac{\partial G(x,w)}{\partial w}$ はサイズが $M\times N$の行列です。 ただし、$M$ は $G$ の出力の数で、$N$ は$w$の次元です。 + +グラフのアーキテクチャが固定ではなく、データに依存している場合、複雑な問題が発生する可能性があることに注意してください。例えば、入力ベクトルの長さに応じてニューラルネットモジュールを選択することができます。これは可能ですが、ループの数がそれなりに多くなると、このバリエーションを管理するのが難しくなります。 + + + +### 基本的なニューラルネットのモジュール + +おなじみの Linear や ReLU モジュール以外にも、さまざまなタイプの組みこみモジュールが存在します。これらのモジュールは、それぞれの機能を実行するために独自に最適化されているので便利です (他の基本的なモジュールの組み合わせで構築されるのとは対照的です)。 + +- 線形演算: $Y=W\cdot X$ + +$$ +\begin{aligned} +\frac{dC}{dX} &= W^\top \cdot \frac{dC}{dY} \\ +\frac{dC}{dW} &= \frac{dC}{dY} \cdot X^\top +\end{aligned} +$$ + +- ReLU: $y=(x)^+$ + + $$ + \frac{dC}{dX} = + \begin{cases} + 0 & x<0\\ + \frac{dC}{dY} & \text{それ以外} + \end{cases} + $$ + + + +- 複製: $Y_1=X$, $Y_2=X$ + + - 両方の出力が入力と等しくなる 「Y - splitter」に似ています。 + + - 逆伝播を行うと、勾配の和が得られます。 + + - 同様にn本の枝に分けることができます + + $$ + \frac{dC}{dX}=\frac{dC}{dY_1}+\frac{dC}{dY_2} + $$ + + + +- 足し算: $y=x_1+x_2$ + + - 2つの変数が合計されている状態で、一方が摂動されると、出力は同じ量摂動されます、つまり + + $$ + \frac{dC}{dX_1}=\frac{dC}{dY}\cdot1 \quad \text{and}\quad \frac{dC}{dX_2}=\frac{dC}{dY}\cdot1 + $$ + + +- 最大: $Y=\max(X_1,X_2)$ + + + - この関数は、次のように表すこともできます + + $$ + Y=\max(X_1,X_2)=\begin{cases} + X_1 & X_1 > X_2 \\ + X_2 & \text{それ以外} + \end{cases} + \Rightarrow + \frac{dY}{dX_1}=\begin{cases} + 1 & X_1 > X_2 \\ + 0 & \text{それ以外} + \end{cases} + $$ + + + - したがって、連鎖律から、 + +$$ +\frac{dC}{dX_1}=\begin{cases} + \frac{dC}{dY}\cdot1 & X_1 > X_2 \\ + 0 & \text{それ以外} + \end{cases} +$$ + + +## [LogSoftMax vs SoftMax](https://www.youtube.com/watch?v=d9vdh3b787Y&t=3953s) + + +*SoftMax*はPyTorchのモジュールでもあり、数値のグループを0から1の間の正の数値のグループに変換する便利な方法です。これらの数値は確率分布として解釈することができます。その結果、分類問題でよく使われます。下の式の $y_i$ は、すべてのカテゴリの確率のベクトルです。 + +$$ +y_i = \frac{\exp(x_i)}{\sum_j \exp(x_j)} +$$ + + +しかし、softmaxを使用すると、ネットワークは勾配消失の影響を受けやすくなります。勾配消失は、下流の重みがニューラルネットワークによって変更されるのを防ぎ、ニューラルネットワークがそれ以上の訓練を完全に止めてしまう可能性があるため、問題となります。1つの値に対するソフトマックス関数であるロジスティックシグモイド関数は、sが大きいときは$h(s)$が1、小さいときは$h(s)$が0であることを示しています。 シグモイド関数は$h(s)=0$と$h(s)=1$では平坦なので、勾配は0となり、勾配消失が発生します。 + +
Sigmoid function to illustrate vanishing gradient
+ +$$ +h(s) = \frac{1}{1 + \exp(-s)} +$$ + + +数学者は、softmaxで作られた勾配が消える問題を解決するために、logsoftmaxのアイデアを思いつきました。*LogSoftMax*はPyTorchのもう一つの基本モジュールです。下の式でわかるように、*LogSoftMax*はsoftmaxとlogを組み合わせたものです。 + +$$ +\log(y_i )= \log\left(\frac{\exp(x_i)}{\Sigma_j \exp(x_j)}\right) = x_i - \log(\Sigma_j \exp(x_j)) +$$ + + +下の式は、同じ式を見る別の方法を示しています。下の図は、この関数の「$\log(1 + \exp(s))$」の部分です。sが小さいときは0、大きいときはsになります。結果として出力が飽和せず、勾配消失問題が回避されます。 + +$$ +\log\left(\frac{\exp(s)}{\exp(s) + 1}\right)= s - \log(1 + \exp(s)) +$$ + +
Plot of logarithmic part of the functions
+ + + +## [誤差逆伝播法の実応用上のコツ](https://www.youtube.com/watch?v=d9vdh3b787Y&t=4891s) + + + + + +### 非線形活性化関数としてReLUを使用 + +ReLUは層数の多いネットワークに最適で、 シグモイド関数や$\tanh(\cdot)$関数のような代替案が人気を失っています。ReLUが最もよく機能する理由は、その単一のキンクがスケールに関して同変だからでしょう。 + + +### 分類問題の目的関数としてクロスエントロピー損失を使用 + +先ほどの講義で説明した Log softmax は、クロスエントロピー損失の特殊なケースです。PyTorchでは、必ずクロスエントロピー損失関数を入力として*log* softmaxを指定してください(通常のsoftmaxではなく)。 + + +### 学習中のミニバッチで確率的勾配降下法を使用 + +前述したように、ミニバッチを使うと、データに冗長性があるので、より効率的な学習が可能になります。全ての観測一つ一つについて1ステップで勾配を推定するために予測をしたり誤差を計算したりする必要はありません。 + + +### 確率的勾配降下法を使う場合、学習例の順序をシャッフル + +順番は重要です。もしモデルが各学習ステップで単一のクラスのデータしか見ていない場合、なぜそのクラスを予測すべきなのかを学習せずに、そのクラスを予測するように学習してしまいます。例えば、MNISTのデータセットから数字を分類しようとしていて、データがシャッフルされていない場合、最後の層のバイアス・パラメータは、単純に常に0を予測し、その後、常に1を予測するように適応し、次に2を予測するように適応します。理想的には、すべてのミニバッチにすべてのクラスのサンプルがあるべきです。 + +しかし、パス(エポック)ごとにサンプルの順番を変える必要があるかどうかについては、現在も議論が続いています。 + + + + +### 平均値がゼロで分散が1になるように入力を正規化 + +学習の前に、各入力特徴量の平均値が0、標準偏差が1になるように正規化しておくと便利です。RGB画像データを使用する場合、各チャンネルの平均と標準偏差を個別に取り、チャンネルごとに正規化するのが一般的です。例えば、データセットに含まれる全ての青の値の平均 $m_b$ と標準偏差 $\sigma_b$ を取り、個々の画像の青の値を次のように正規化します。 + +$$ +b_{[i,j]}^{'} = \frac{b_{[i,j]} - m_b}{\max(\sigma_b, \epsilon)} +$$ + + +ここで $\epsilon$ は、ゼロによる除算を避けるために使う任意の小さな数です。緑と赤のチャンネルについても同じことを繰り返します。これは、異なる照明で撮影した画像から意味のある信号を得るために必要なことです。 + + + +### 学習率を下げるためにスケジュールを使用 + +学習率は、訓練が進むにつれて低下させるべきです。実際には、ほとんどの高度なモデルは、学習率が一定の単純な SGD の代わりに、学習率を適応させる Adam のようなアルゴリズムを使用して学習します。 + + +### 重みの減衰には、L1 および/または L2 正則化を使用 + +重みが大きい場合のペナルティをコスト関数に追加することができます。例えば、L2正則化を使って、損失$L$を定義し、重み$w$を以下のように更新します。 + +$$ +L(S, w) = C(S, w) + \alpha \Vert w \Vert^2\\ +\frac{\partial R}{\partial w_i} = 2w_i\\ +w_i = w_i - \eta\frac{\partial L}{\partial w_i} = w_i - \eta \left( \frac{\partial C}{\partial w_i} + 2 \alpha w_i \right) +$$ + + +なぜこれを重み減衰と呼ぶのかを理解するために、上の式を書き換えます。すると、更新中に $w_i$ に 1 よりも小さい定数を乗算することになっていることがわかります。 + +$$ +w_i = (1 - 2 \eta \alpha) w_i - \eta\frac{\partial C}{\partial w_i} +$$ + + + +L1正則化(Lasso)は、$\Vert w \Vert^2$の代わりに、$\sum_i \vert w_i\vert$を使用することを除いて、似ています。 + +本質的に、正則化は、システムに、可能な限り最短の重みベクトルで コスト関数を最小化するように伝えようとします。L1正則化では、役に立たない重みは0に縮小されます。 + + +### 重みの初期化 + +重みはランダムに初期化する必要がありますが、出力が入力とほぼ同じ分散になるように、大きすぎても小さすぎてもいけません。PyTorchには、さまざまな重みの初期化方法が組み込まれています。深層モデルでうまく機能する方法の1つは、重みの分散が入力数の平方根に反比例するKaimingの初期化です。 + + + + +### ドロップアウトを使う + +ドロップアウトは正則化の別の形式です。これはニューラルネットのもう一つの層と考えることができます。すなわち、入力を取り、入力のうち $n/2$ をランダムにゼロに設定し、その結果を出力として返すような層です。これにより、システムは少数の入力ユニットに過度に依存するのではなく、すべての入力ユニットから情報を取得することを強制され、その結果、層内のすべてのユニットに情報を分散させることができます。この方法は、Hinton et al (2012)によって最初に提案されました。 + +より多くのトリックについては、LeCun et al 1998を参照してください。 + +最後に、誤差逆伝播法はスタックモデルだけでなく、モジュールに部分的な順序がある限り、有向非巡回グラフ(DAG)でも動作することに注意してください。 \ No newline at end of file diff --git a/docs/ja/week02/02-3.md b/docs/ja/week02/02-3.md new file mode 100644 index 000000000..2b349edc7 --- /dev/null +++ b/docs/ja/week02/02-3.md @@ -0,0 +1,490 @@ +--- +lang-ref: ch.02-3 +lang: ja +title: 人工ニューラルネットワーク(ANN) +lecturer: Alfredo Canziani +authors: +date: 4 Feb 2020 +typora-root-url: 02-3 +translation-date: 2 Dec 2020 +translator: Shiro Takagi +--- + + +## [分類のための教師あり学習](https://www.youtube.com/watch?v=WAn6lip5oWk&t=150s) + + + +* 下の **図1(a)** を考えてみましょう。このグラフの点は、螺旋の枝の上にあり、$\R^2$の中にいます。それぞれの色はクラスのラベルを表しています。一意なクラスの数は $K = 3$ です。これは、数学的には、**式1(a)** で表されます。 + +* **図1(b)** は、ガウスノイズ項を加えた、同様の螺旋を示しています。これは数学的には **式1(b)** で表されます。 + + どちらの場合も、これらの点は線形分離不可能です。 + + + +
+ + + +
+
+
+ 図1(a) 「ノイズがない」2次元螺旋 +
+
+
+
+ 図1(b) 「ノイズがある」2次元螺旋 +
+
+
+ + +$$ +X_{k}(t)=t\left(\begin{array}{c}{\sin \left[\frac{2 \pi}{K}(2 t+k-1)\right]} \\ {\cos \left[\frac{2 \pi}{K}(2 t+k-1)\right]}\end{array}\right) \\ +0 \leq t \leq 1, \quad k=1, ..., K +$$ + + +
式1(a)
+ +$$ + X_{k}(t)=t\left(\begin{array}{c}{\sin \left[\frac{2 \pi}{K}(2 t+k-1 +\mathcal{N}\left(0, \sigma^{2}\right))\right]} \\ {\cos \left[\frac{2 \pi}{K}(2 t+k-1 +\mathcal{N}\left(0, \sigma^{2}\right))\right]}\end{array}\right)\\0 \leq t \leq 1, \quad k=1, ..., K +$$ + + +
式1(b)
+ + + +**分類**を行うとはどういうことでしょうか? **ロジスティック回帰**の場合を考えてみましょう。分類のためのロジスティック回帰がこのデータに適用された場合、データをそのクラスに分離しようとして、**線形平面**(決定境界)の集合を作成します。この解決策の問題点は、各領域に複数のクラスに属する点があることです。螺旋の枝は線形決定境界を横切っています。これは、**優れた解決策ではありません!** + +**どうやってこれを解決するのでしょうか?** 入力空間を線形分離可能になるように変換します。これを行うためにニューラルネットワークを訓練する過程で、ニューラルネットワークが学習する決定境界は訓練データの分布に適応しようとします。 + +**注**:この講義では、ニューラルネットワークは常に**入力に近い層から順に下から上に**表現されます。最初の層が一番下にあり、最後の層が一番上にあります。これは、概念的には、入力データはニューラルネットワークが試みようとしているタスクのための低次の特徴だからです。データがネットワークを通って**上向き**に移動すると、後続の各層はより高次の特徴を抽出します。 + + + +## 訓練データ + +先週、新しく初期化されたニューラルネットワークが入力を任意の方法で変換することを見ました。しかし、この変換は、目下のタスクを実行するのに **(最初は)** 役に立ちません。データを使用して、どのようにしてこの変換を強制的に、目下のタスクに関連する何らかの意味を持たせることができるかを探ります。以下は、ネットワークの訓練の入力として使用されるデータです。 + +* $\vect{X}$は入力データを表現しています。これは$m$ (訓練データ点の数) x $n$ (各入力点の次元)の行列です。図**1(a)**、**1(b)** のデータの場合、$n = 2$です。 + + +
+
+図2 訓練データ +
+ + + +* ベクトル $\vect{c}$ と行列 $\boldsymbol{Y}$ は、それぞれの $m$ データ点のクラスラベルを表しています。上の例では、$3$ 個のクラスがあります。 + + * $c_i \in \lbrace 1, 2, \cdots, K \rbrace$, そして $\vect{c} \in \R^m$です。 ただし、訓練データとして $\vect{c}$ を使用しない場合もあります。また、クラスラベルを異なる数値ラベル$c_i \in \lbrace 1, 2, \cdots, K \rbrace$にしてしまうと、クラス内での順序を推測してしまい、データの分布とは異なるものになってしまう可能性があります。 + * この問題を回避するために、**one-hot符号化**を使用します。各ラベル$c_i$に対して、$K$次元のゼロベクトル$\vect{y}^{(i)}$を作成し、$c_i$番目の要素を$1$とします(下図の**図3**参照)。 + + +
+
+図3 one-hot符号化 +
+ + + * よって、$\boldsymbol Y \in \R^{m \times K}$です。この行列は、$$K$$の一つの点に完全に集中しているある確率質量を持っていると考えることもできます。 + + +## 全結合層 + + +ここでは、全結合(FC)ネットワークとは何か、その仕組みを見ていきましょう。 + + +
+
+図4 全結合ニューラルネットワーク +
+ + + +**図4** のネットワークを考えてみましょう。入力データである$\boldsymbol x$には、$\boldsymbol W_h$で定義されたアフィン変換が行われ、その後、非線形変換が行われます。この非線形変換の結果を $\boldsymbol h$ と呼びます。これは**隠れ層の出力**、つまりネットワークの外から見ることのできない出力を表しています。これに対して、別のアフィン変換($\boldsymbol W_y$)に続いて、別の非線形変換が行われます。これが最終的な出力である$\boldsymbol{\hat{y}}$ を生成します。このネットワークは、以下の **式2** で数学的に表すことができます。ここで、$f$と$g$はともに非線形活性化関数です。 + +$$ +\begin{aligned} +&\boldsymbol h=f\left(\boldsymbol{W}_{h} \boldsymbol x+ \boldsymbol b_{h}\right)\\ +&\boldsymbol{\hat{y}}=g\left(\boldsymbol{W}_{y} \boldsymbol h+ \boldsymbol b_{y}\right) +\end{aligned} +$$ + + +
式2 FCネットワークの背後にある数学
+ + + +上記のような基本的なニューラルネットワークは、単に連続したペアの集合であり、各ペアではアフィン変換に続いて非線形演算(スカッシング)が行われます。よく使われる非線形関数には、ReLU、シグモイド、tanh、ソフトマックスなどがあります。 + +上図のネットワークは3層のネットワークです。 + + 1. 入力ニューロン + 2. 隠れニューロン + 3. 出力ニューロン + +したがって、$3$層のニューラルネットワークは、$2$つのアフィン変換を持っています。これは、$n$層のネットワークに一般化することができます。 + +では、もっと複雑なケースに移りましょう。 + +3つの隠れ層があり、各層が全結合である場合を考えてみましょう。図は、**図5**にあります。 + + +
+
+図5 三層の隠れ層を持つニューラルネット +
+ + +第二層のニューロン $j$ を考えてみましょう。そのactivationは + +$$ +a^{(2)}_j = f(\boldsymbol w^{(j)} \boldsymbol x + b_j) = f\Big( \big(\sum_{i=1}^n w_i^{(j)} x_i\big) +b_j ) \Big) +$$ + + +となります。ただし、$\vect{w}^{(j)}$は$\vect{W}^{(1)}$の$j$行目です。 + + + +この場合の入力層のactivationは、単なる恒等写像であることに注意してください。隠れ層は、ReLU、tanh、シグモイド、ソフト(arg)maxなどの活性化関数を持つことができます。 + +一般的に最後の層の活性化関数は、[この](https://piazza.com/class/k5spqaanqk51ks?cid=36) Piazzaの投稿で説明されているように、使用ケースに依存します。 + + + + +## ニューラルネットワーク (推論) + +**図6**にあるような3層(入力、隠れ、出力)のニューラルネットワークについてもう一度考えてみましょう。 + + + +
+
+図6 三層ニューラルネットワーク +
+ + +どんな関数を見ているのでしょうか? + +$$ +\boldsymbol {\hat{y}} = \boldsymbol{\hat{y}(x)}, \boldsymbol{\hat{y}}: \mathbb{R}^n \rightarrow \mathbb{R}^K, \boldsymbol{x} \mapsto \boldsymbol{\hat{y}} +$$ + + +ただし、隠れ層があることを可視化しておくと便利で、写像を次のように展開することができます。 + +$$ +\boldsymbol{\hat{y}}: \mathbb{R}^{n} \rightarrow \mathbb{R}^d \rightarrow \mathbb{R}^K, d \gg n, K +$$ + + + +上記の場合の設定例は、どのように見えるでしょうか?この場合、2次元の入力があり($n=2$)、1つの隠れ層の次元数は1000($d = 1000$)で、3つのクラスがあります($C=3$)。1つの隠れ層にそれほど多くのニューロンを入れたくないという実用的な理由があるので、その1つの隠れ層を10個ずつのニューロンで3つに分割するのは理にかなっているかもしれません ($1000 \rightarrow 10 \times 10 \times 10$)。 + + + +## [ニューラルネットワーク (訓練I)](https://www.youtube.com/watch?v=WAn6lip5oWk&t=822s) + + +では、典型的な訓練とはどのようなものなのでしょうか?これを損失の標準的な用語に定式化しておくと便利です。 + +まず、soft(arg)maxを再導入します。そして、この活性化関数は、多クラス予測のために負の対数尤度損失を使う場合、最後の層に用いられる一般的な活性化関数であることを明示しておきましょう。LeCun教授が講義で述べているように、これは、シグモイドや二乗損失を使用する場合よりも良い勾配を得ることができるからです。さらに、この活性化関数を使うことで、最後の層はすでに正規化された状態になります(最後の層のすべてのニューロンの和が1になります)が、これは明示的な正規化(ノルムで割る)よりも勾配法に適しています。 + +soft (arg)maxを使うと、最後の層のロジットは次のようになります。 + +$$ +\text{soft{(arg)}max}(\boldsymbol{l})[c] = \frac{ \exp(\boldsymbol{l}[c])} {\sum^K_{k=1} \exp(\boldsymbol{l}[k])} \in (0, 1) +$$ + + +指数関数は厳密に正であるという性質を持つため、集合は閉じていないことに注意してください。 + +予測値の集合が $\matr{\hat{Y}}$ であるとすると、損失は次のようになります。 + +$$ +\mathcal{L}(\boldsymbol{\hat{Y}}, \boldsymbol{c}) = \frac{1}{m} \sum_{i=1}^m \ell(\boldsymbol{\hat{y}_i}, c_i), \quad +\ell(\boldsymbol{\hat{y}}, c) = -\log(\boldsymbol{\hat{y}}[c]) +$$ + + + +ここで $c$ は整数のラベルを表し、one-hot符号化の表現ではありません。 + +そこで、あるサンプルが正しく分類されている場合とそうでない場合の 2 つの例をやってみましょう。 + +以下のようにしましょう。 + +$$ +\boldsymbol{x}, c = 1 \Rightarrow \boldsymbol{y} = +{\footnotesize\begin{pmatrix} +1 \\ +0 \\ +0 +\end{pmatrix}} +$$ + + + +インスタンスごとの損失はどうなるでしょうka +? + +ほぼ*完璧な予測*の場合には、($\sim$ は *おおよそ* の意味) + +$$ +\hat{\boldsymbol{y}}(\boldsymbol{x}) = +{\footnotesize\begin{pmatrix} \sim 1 \\ \sim 0 \\ \sim 0 \end{pmatrix}} + \Rightarrow \ell \left( +{\footnotesize\begin{pmatrix} \sim 1 \\ \sim 0 \\ \sim 0 \end{pmatrix}} +, 1\right) \rightarrow 0^{+} +$$ + + +*ほぼ絶対に間違っている*場合には、 + +$$ \hat{\boldsymbol{y}}(\boldsymbol{x}) = +{\footnotesize\begin{pmatrix} \sim 0 \\ \sim 1 \\ \sim 0 \end{pmatrix}} +\Rightarrow \ell \left( +{\footnotesize\begin{pmatrix} \sim 0 \\ \sim 1 \\ \sim 0 \end{pmatrix}} +, 1\right) \rightarrow +\infty $$ + + + +上の例では、$\sim 0 \rightarrow 0^{+}$ と $\sim 1 \rightarrow 1^{-}$ となっています。なぜでしょうか?ちょっと考えてみてください。 + +**注** `CrossEntropyLoss`を使うと、`LogSoftMax`と負の対数尤度`NLLLoss`が一緒になってしまうので、二度手間にならないようにしましょう。 + + + +## [ニューラルネットワーク(訓練II)](https://www.youtube.com/watch?v=WAn6lip5oWk&t=2188s) + + + +学習のためには、学習可能なパラメータ(重み行列とバイアス)を我々が$\mathbf{\Theta} = \lbrace\boldsymbol{W_h, b_h, W_y, b_y} \rbrace$と呼ぶものに集約します。これにより、目的関数や損失を次のように書くことができます。 + +$$ +J \left( \mathbf{\Theta} \right) = \mathcal{L} \left( \boldsymbol{\hat{Y}} \left( \mathbf{\Theta} \right), \boldsymbol c \right) \in \mathbb{R}^{+} +$$ + + +これにより、損失はネットワークの出力 $\boldsymbol {\hat{Y}} \left( \mathbf{\Theta} \right)$に依存することになるので、最適化問題にすることができます。 + +これがどのように動作するかの簡単な説明は、**図7**にあります。ここで、最小化する関数$J(\vartheta)$は、スカラーパラメータ$\vartheta$しか持ちません。 + + +
+
+図7 勾配降下法による損失関数の最適化 +
+ + + +ランダムな初期値$\vartheta_0$、そしてそれによって定まる損失$J(\vartheta_0)$を定めます。その点で評価された微分$J'(\vartheta_0) = \frac{\text{d} J(\vartheta)}{\text{d} \vartheta} (\vartheta_0)$を計算することができます。この場合、微分の傾きは正の値になります。ということで、急降下の方向に一歩踏み出す必要があります。この場合、それは $-\frac{\text{d} J(\vartheta)}{\text{d} \vartheta}(\vartheta_0)$です。 + +このプロセスを反復的に繰り返すことを 勾配降下法といいます。勾配法はニューラルネットワークを訓練するための主要な方法です。 + +必要な勾配を計算するためには、以下に示すような誤差逆伝播を用いなければなりません + +$$ \frac{\partial \, J(\mathbf{\Theta})}{\partial \, \boldsymbol{W_y}} = \frac{\partial \, J(\mathbf{\Theta})}{\partial \, \boldsymbol{\hat{y}}} \; \frac{\partial \, \boldsymbol{\hat{y}}}{\partial \, \boldsymbol{W_y}} \quad \quad \quad \frac{\partial \, J(\mathbf{\Theta})}{\partial \, \boldsymbol{W_h}} = \frac{\partial \, J(\mathbf{\Theta})}{\partial \, \boldsymbol{\hat{y}}} \; \frac{\partial \, \boldsymbol{\hat{y}}}{\partial \, \boldsymbol h} \;\frac{\partial \, \boldsymbol h}{\partial \, \boldsymbol{W_h}} $$ + + + +## 螺旋の分類 - Jupyter notebook + + + +Jupyter notebookは [ここ](https://github.com/Atcold/pytorch-Deep-Learning-Minicourse/blob/master/04-spiral_classification.ipynb) にあります。Notebookを実行するには、[README.md](https://github.com/Atcold/pytorch-Deep-Learning-Minicourse/blob/master/README.md) で指定された `dl-minicourse` 環境がインストールされていることを確認してください。 + +`torch.device()` の使い方については、[先週のノート](https://atcold.github.io/pytorch-Deep-Learning-Minicourse/en/week01/01-3/)に説明があります。 + +前回と同様に、$\mathbb{R}^2$の中の点を、赤、黄、青の3色のラベルで表現してみましょう。 + + +
+
+図8 螺旋分類データ +
+ + + +`nn.Sequential()`は、追加された順にモジュールをコンストラクタに渡すコンテナですが、`nn.linear()` は、**アフィン変換**$\boldsymbol y = \boldsymbol W \boldsymbol x + \boldsymbol b$を適用するので、名前が間違っています。詳しくは [PyTorch documentation](https://pytorch.org/docs/stable/nn.html) を参照してください。 + +アフィン変換とは、回転、反射、平行移動、スケーリング、剪断の5つであることを覚えておいてください。 + +**図9**にあるように、線形決定境界で螺旋データを分離しようとした場合、つまり`nn.linear()` モジュールのみを使用しそれらの間に非線形性を持たせな買った場合、最高の分類精度は50%です。 + + +
+
+図9 線形決定境界 +
+ + +線形モデルから、2つの `nn.linear()` モジュールとその間の `nn.ReLU()` モジュールを持つモデルに移行すると、精度は95%まで上がります。これは、**図10**に示すように、境界線が非線形になり、データの螺旋状の形によく適応するからです。 + +
+
+ 図10 非線形決定境界 +
+ + +線形回帰では正しく解けないけれど、同じニューラルネットワーク構造では簡単に解ける回帰問題の例を[このノートブック](https://github.com/Atcold/pytorch-Deep-Learning-Minicourse/blob/master/05-regression.ipynb)と**図11**に示します。そこには、10の異なるネットワークが示されています。そのうち5つは`nn.ReLU()`を用いていて、残りの5つは`nn.Tanh()`を用いています。前者は断片的な線形関数であるのに対し、後者は連続的で滑らかな回帰です。 + + + +
+
+図11: 10個のニューラルネットとその分散と標準偏差
+左: 5つの ReLU ネットワーク 右: 5つの tanh ネットワーク +
+ + +黄色と緑の線は、ネットワークの標準偏差と分散を示しています。これらを使用することは、「信頼区間」のようなものに便利です。なぜなら、関数は出力ごとに単一の予測を与えるからです。アンサンブル分散予測を使用すると、予測が行われている不確実性を推定することができます。この重要性は、**図12**で見ることができます。ここでは、決定関数を訓練区間の外に拡張していますが、これらは$+\infty, -\infty$に向かっている傾向があります。 + + +
+
+図12 ニューラルネットとその分散と標準偏差。訓練区間の外。
+左: 5つの ReLU ネットワーク 右: 5つの tanh ネットワーク +
+ + + +PyTorchを使ってニューラルネットワークを学習するには、5つの基本的なステップが必要です。 + +1. `output = model(input)` はモデルの順伝播で、入力を受けて出力を生成します。 +2. `J = loss(output, target label)` はモデルの出力を受け取り、真のターゲットまたはラベルに対する訓練誤差を計算します。 +3. `model.zero_grad()` は勾配計算をクリーンアップし、次のパスに蓄積されないようにします。 +4. `J.backward()` は逆伝播と勾配の蓄積を行います。`requires_grad=True`となっている各変数$\texttt{x}$について$\nabla_\texttt{x} J$を計算します。これらは各変数の勾配に蓄積されます:$\texttt{x.grad} \gets \texttt{x.grad} + \nabla_\texttt{x} J$。 +5. `optimiser.step()` は、勾配降下法のステップを進め、重みを更新します。 + +NNを学習する際には、この5つのステップが提示された順に、必要になる可能性が高いです。 \ No newline at end of file diff --git a/docs/ja/week02/02.md b/docs/ja/week02/02.md new file mode 100644 index 000000000..276541c5b --- /dev/null +++ b/docs/ja/week02/02.md @@ -0,0 +1,36 @@ +--- +lang-ref: ch.02 +lang: ja +title: 第2週 +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + + +## レクチャーパートA + +パラメトリックモデルとは何かを理解することから始め、損失関数とは何かを議論します。次に、伝統的なニューラルネットワークにおいて、勾配に基づく方法が誤差逆伝播アルゴリズムでどのように使用されているかを見ていきます。最後に、PyTorchでニューラルネットワークを実装する方法を学び、誤差逆伝播法のより一般的な形について議論して、このセクションを締めくくります。 + + +## レクチャーパートB + +誤差逆伝播法の具体例から始め、ヤコビ行列の次元について議論します。次に、様々な基本的なニューラルネットモジュールを見て、その勾配を計算し、softmaxとlogsoftmaxについて簡単に議論します。このパートのもう一つのトピックは、誤差逆伝播法のための実践的なコツです。 + + +## 演習 + +人工ニューラルネットワークを用いた教師あり学習について簡単に紹介します。これらのネットワークを訓練するために使用される問題の定式化とデータの慣例について説明します。また、マルチクラス分類のためのニューラルネットワークの訓練方法や、ネットワークが訓練された後に推論を行う方法についても議論します。 \ No newline at end of file diff --git a/docs/ja/week03/03-2.md b/docs/ja/week03/03-2.md new file mode 100644 index 000000000..b30d7cb75 --- /dev/null +++ b/docs/ja/week03/03-2.md @@ -0,0 +1,376 @@ +--- +lang-ref: ch.03-2 +lecturer: Yann LeCun +title: ConvNet Evolutions, Architectures, Implementation Details and Advantages. +authors: Chris Ick, Soham Tamba, Ziyu Lei, Hengyu Tang +date: 10 Feb 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + + +## [初期のCNNと、現代のCNNへの進化](https://www.youtube.com/watch?v=FW5gFiJb-ig&t=2949s) + + +### 畳み込みニューラルネットを用いた小さなデータセットの初期の畳み込み + +視覚皮質のモデリングに関する福島の研究に触発されて、単純型細胞/複雑型細胞の階層と教師あり学習と誤差逆伝播を組み合わせたものを用いて、88-89年にトロント大学のYann LeCun教授が最初のCNNを開発した。実験には320桁の「ムーサーが書いた」数字の小さなデータセットが使われた。以下のアーキテクチャの性能が比較された。 + +1. 単一のFC(全結合)層 +2. 2つのFC層 +3. 重み共有なしで局所的に接続された層 +4. 重みを共有し、局所接続を行う制約付きネットワーク +5. 重みを共有し、局所接続を行う制約付きネットワーク (より多くの特徴マップ) + +最も成功したネットワーク(重みを共有した制約付きネットワーク)は最も強い汎化性能を持ち、現代のCNNの基礎を形成しています。一方、単一のFC層は過学習する傾向があります。 + + +### ベル研究所での最初の "本物の" ConvNets + +ベル研究所に移った後、LeCunnの研究は、より大きなCNNを訓練するために、米国郵政公社の手書きの郵便番号を使用することにシフトしました。 + +* サイズ256 (16$\times$16)の入力層 +* サイズ12 5$\times$5のカーネル。ただし、ストライドが2 (2ピクセルで止まる)、すなわち次のレイヤーは解像度が低減。 +* セパレートプーリング**なし**。 + + +### プーリングを用いた畳み込みネットワークアーキテクチャ + +翌年、いくつかの変更が行われました:セパレートプーリングが導入されました。セパレートプーリングとは、入力値を平均化してバイアスを加え、非線形関数(tanh)に渡すことで行うものです。2$\times$2のプーリングは、ストライドを2にして実行され、解像度が半分になりました。 + + + +
+
+ 図1 ConvNetのアーキテクチャ +
+ + + +単一の畳み込み層の例としては、以下のようなものが考えられます。 +1. サイズ*32$\times$32*の入力を取ります。 +2. 畳み込み層は、5$\times$5のカーネルをストライド1で画像上を通過させ、その結果、サイズ*28$\times$28*の特徴マップが得られます。 +3. 特徴マップを非線形関数に渡します。 +4. プーリング層に渡して、2$\times$2のウィンドウでストライドが2で平均をとります:サイズは*14$times$14* +5. 1-4を4カーネル分繰り返します。 + +第1層の単純な畳み込み/プールの組み合わせは、通常、方向エッジの検出のような単純な特徴を検出します。最初の畳み込み/プール層の後は、目的は、前の層からの特徴の組み合わせを検出することです。これを行うために、ステップ2〜4は、前層の特徴マップ上で複数のカーネルを用いて繰り返され、新しい特徴マップに合計されます。 + +1. 新しい5$\times$5のカーネルを前の層の特徴マップの上にスライドさせ、結果を合計します。(注: 1989年のLeCun教授の実験では、計算のために全結合ではありません。最近の設定では、通常は全結合を強制しています。 +2. 畳み込みの出力を非線形関数に渡します。 +3. 1と2を16個分繰り返します。 +4. 結果を、ストライド2で2$\times$2のウィンドウを用いて平均操作をするプーリング層に渡します:各特徴マップについてサイズ*5$\times$5*です。 + +出力を生成するために、最後の層の畳み込みが行われます。これは全結合のように見えますが、実際には畳み込みです。 + +1. 最後の畳み込み層では、5$\times$5のカーネルを全ての特徴マップ上にスライドさせ、結果を合計したものが、 size *1$\times$1*となります。 +2. 非線形関数を通過させます。 +3. 1つのカテゴリの単一出力を生成します。 +4. 10個のカテゴリのそれぞれについて、これまでのすべてのステップを繰り返します(並行して) + +畳み込みが次のレイヤーの特徴量マップの形状をどのように変化させるかについては、Andrej Karpathy のウェブサイトの [このアニメーション](http://cs231n.github.io/convolutional-networks/) を参照してください。論文の全文は [ここ](https://papers.nips.cc/paper/293-handwritten-digit-recognition-with-a-back-propagation-network.pdf) にあります。 + + + +### 平行移動不変性 + + +
+
+ 図2 平行移動不変性 +
+ + +スライドのアニメーションで示されているように(ここでは別の例です)、入力画像を変換しても特徴マップは同じように変換されます。ただし、特徴マップの変化は、畳み込み・プーリング処理によってスケーリングされます。例えば、ストライド2で2$\times$2のプーリングを行うと、入力レイヤーの1ピクセルの平行移動が、次の特徴量マップでは0.5ピクセルの平行移動になります。このようにして、空間分解能は特徴量の増加に交換され、表現はより抽象的になり、平行移動や歪みの影響を受けにくくなります。 + + + + +### アーキテクチャの全体的な内訳 + +一般的なCNNアーキテクチャは、いくつかの基本的な層のタイプに分解することができます。 + +* **正規化** + * ホワイトニングの調整(オプション) + * 減算法(例:平均の除去、ハイパスフィルタリング) + * 局所的なコントラストの正規化、分散の正規化 + +* **フィルターバンク** + * 次元を増やす + * オーバーコンプリートな基底への射影 + * エッジ検出 + +* **非線形性** + * スパース化 + * 一般に Rectified Linear Unit (ReLU): $\text{ReLU}(x) = \max(x, 0)$. + +* **プーリング** + * 特徴マップ上での集計 + * Max Pooling: $\text{MAX}= \text{Max}_i(X_i)$ + + * LP-Norm Pooling: $$\text{L}p= \left(\sum_{i=1}^n \|X_i\|^p \right)^{\frac{1}{p}}$$ + + * Log-Prob Pooling: $\text{Prob}= \frac{1}{b} \left(\sum_{i=1}^n e^{b X_i} \right)$ + + + + + + +## [LeNet5と数字の識別](https://www.youtube.com/watch?v=FW5gFiJb-ig&t=3830s) + + +### PyTorch での LeNet5 の実装 + +LeNet5は以下の層から構成されています(1は最上層)。 + +1. Log-softmax +2. 次元が500$\times$10の全結合層 +3. ReLu +4. 次元が(4$\times$4$\times$50)$\times$500の全結合層 +5. 次元が2$\times$2でストライドが2のMax Pooling層 +6. ReLU +7. 出力チャンネル数が20で、カーネルサイズが5$\times$5で、 ストライドが1の畳み込み層 +8. 次元が2$\times$2でストライドが2のMax Pooling層 +9. ReLU +10. 出力チャンネル数が20で、カーネルサイズが5$\times$5で、 ストライドが1の畳み込み層 + +入力は32$\times$32のグレースケール画像(1入力チャンネル)です。 + +LeNet5は以下のコードでPyTorchで実装できます。 + +```python +class LeNet5(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5, 1) + self.conv2 = nn.Conv2d(20, 20, 5, 1) + self.fc1 = nn.Linear(4*4*50, 500) + self.fc2 = nn.Linear(500, 10) + + def forward(self, x): + x = F.relu(self.conv1(x)) + x = F.max_pool2d(x, 2, 2) + x = F.relu(self.conv2(x)) + x = F.max_pool2d(x, 2, 2) + x = x.view(-1, 4*4*50) + x = F.relu(self.fc1) + x = self.fc2(x) + return F.logsoftmax(x, dim=1) +``` + + + +`fc1` と `fc2` は全結合層ですが、 カーネルが入力全体をカバーする畳み込み層と考えることができます。全結合層は効率化のために使われます。 + +同じコードを `nn.Sequential` を用いて表現することもできますが、それは時代遅れです。 + + + +## CNNの利点 + +完全畳み込みネットワークでは、入力のサイズを指定する必要はありません。しかし、入力のサイズを変更すると、出力のサイズが変化します。 + +草書体の手書き認識システムを考えてみましょう。入力画像をセグメントに分割する必要はありません。カーネルは画像全体のすべての位置をカバーし、パターンがどこにあっても同じ出力を記録します。画像全体にCNNを適用することは、複数の場所に個別に適用するよりもはるかに安価です。事前のセグメンテーションが不要なので、画像をセグメンテーションする作業は画像を認識する作業と似ているので安心です。 + + +### 例:MNIST + +LeNet5は、サイズ32$\times$32のMNIST画像上で学習し、画像の中央にある個々の数字を分類します。データの拡張は、数字をずらしたり、数字の大きさを変えたり、横に数字を挿入したりして行いました。また、上記のいずれでもない11番目のカテゴリで学習しました。このカテゴリでラベル付けされた画像は、空白の画像を生成するか、中央ではなく横に数字を配置することで生成されました。 + + +
+
+ 図3 スライディングウィンドウConvNet +
+ + +上の画像は、32$\times$32で学習したLeNet5ネットワークを32$\times$64の入力画像に適用することで、複数の位置の数字を識別できることを示しています。 + + + +## [特徴量結合問題](https://www.youtube.com/watch?v=FW5gFiJb-ig&t=4827s) + + + + +### 特徴量結合問題とは? + +視覚神経科学者やコンピュータビジョンの人たちは、オブジェクトをオブジェクトとして定義する問題を抱えています。オブジェクトは特徴の集合体ですが、このオブジェクトを形成するために、すべての特徴を結合するにはどうすればよいのでしょうか? + + + + +### どうやって解決するのか? + +CNNを訓練するのに十分な非線形性とデータがあれば、そのための特別なメカニズムを持たずに、プーリングを持つ2層の畳み込みと、さらに2層の全結合層だけで、この特徴結合の問題を解決することができます。 + +
+
+ 図4 特徴量結合問題に取り組むConvNet +
+ + +上のアニメーションでは、CNNが一つのストロークを移動させることで異なる数字を識別する能力を示しており、特徴量結合の問題に対処する能力、つまり階層的で構成的な方法で特徴を識別する能力があることを示しています。 + + + +### 例: 動的な入力の長さ + +全体のストライドが4になるように、ストライド1の畳み込み層を2ちストライド2のプーリング層を2つ持つCNNを構築することができます。したがって、新しい出力を得たい場合は、入力ウィンドウを4だけずらす必要があります。言いたいことをより明確にするために、下の図(緑の単位)を見てください(図中の緑の単位)。まず、サイズ10の入力があり、サイズ3の畳み込みを行い、8個のウユニットを取得します。その後、サイズ2のプーリングを行い、4個のユニットを得ます。同様に、再び畳み込みとプーリングを繰り返し、最終的には1個の出力が得られます。 + + +
+
+ 図5 様々な入力サイズのバインディングについてのConvNetアーキテクチャ +
+ +. Moreover, this is a demonstration of the fact that if we increase the size of the input, we will increase the size of every layer, proving CNNs' capability in handling dynamic length inputs. --> +ここで、入力層に4個のユニット(上のピンク色のユニット)を追加すると、第1の畳み込み層の後にさらに4個、第1のプーリング層の後にさらに2個、第2の畳み込み層の後にさらに2個、そして1個の出力が得られることになります。したがって、新たな出力を生成するためのウィンドウサイズは4 (2 ストライド $\times$2)となります。さらに、これは、入力のサイズを大きくすれば、すべての層のサイズも大きくなることを示しており、CNNが動的な長さの入力を扱う能力を持っていることを証明しています。 + + + +## CNNは何に適しているのか? + +CNNは多次元配列の形をした自然にある信号の処理に適しており、3つの大きな特性を持っています。 +1. **局所性**: 1つ目は、値の間に強い局所的な相関があることです。自然画像の近くにある2つのピクセルを取ると、それらのピクセルは同じ色を持っている可能性が非常に高いです。2つのピクセルが遠くなるにつれて、それらの間の類似性は減少します。局所的な相関は、局所的な特徴を検出するのに役立ちます。これがまさにCNNがやっていることです。CNNに並べ替えたピクセルを与えると、入力画像の認識がうまくいかなくなりますが、全結合層は影響を受けません。局所的な相関は局所的なつながりを正当化します。 +2. **定常性**: 第二の特徴は、特徴が本質的であり、画像上のどこにでも現れる可能性があることであり、重み共有やプーリングを正当化します。さらに、統計信号は一様に分布しているため、入力画像上のすべての場所で特徴検出を繰り返す必要があります。 +3. **構成性**: 3つ目の特徴は、自然画像が構成的であるということで、特徴が階層的に画像を構成していることを意味します。これは、ニューロンを何層にも分けて使うことを正当化するものであり、ヒューベルとウィーゼルの単純型細胞と複雑型細胞の研究とも密接に対応しています。 + +さらに、ビデオ、画像、テキスト、音声認識などでCNNはうまく活用されています。 diff --git a/docs/ja/week03/03-3.md b/docs/ja/week03/03-3.md new file mode 100644 index 000000000..5b6f01241 --- /dev/null +++ b/docs/ja/week03/03-3.md @@ -0,0 +1,245 @@ +--- +lang-ref: ch.03-3 +title: Properties of natural signals +lecturer: Alfredo Canziani +authors: Ashwin Bhola, Nyutian Long, Linfeng Zhang, and Poornima Haridas +date: 11 Feb 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + + +## [自然界の信号の性質](https://www.youtube.com/watch?v=kwPWpVverkw&t=26s) + +すべての信号は、ベクトルとして考えることができます。例えば、音声信号は1次元の信号$\boldsymbol{x} = [x_1, x_2, \cdots, x_T]$です。ただし、各$x_t$は時刻$t$での波形の振幅を表しています。誰かが何を話しているのかを理解するために、蝸牛はまず気圧の振動を信号に変換し、脳は言語モデルを使ってこの信号を言語に変換します。音楽の場合、信号は立体音響で、音が複数の方向から聞こえているように錯覚させるために2つ以上のチャンネルを持っています。2つのチャンネルを持っていても、時間だけが信号の変化に沿って変化しているので、1次元の信号であることに変わりはありません。 + +画像は、情報が空間的に描かれているので、2次元信号です。各点はそれ自体がベクトルであることに注意してください。つまり、画像の中に $d$ チャンネルがある場合、画像の各空間的な点は $d$ 次元のベクトルであることを意味します。カラー画像はRGBの平面を持っているので、 $d = 3$ ということになります。任意の点 $x_{i,j}$ について、これはそれぞれ赤、緑、青の色の強度に対応します。 + +上記の論理で言語を表現することもできます。各単語は、私たちの語彙の中で発生する位置に1を持ち、それ以外の場所では0を持つone-hotベクトルに対応しています。これは、各単語が語彙の大きさのベクトルであることを意味します。 + +自然データの信号は、以下の特性に従います。 +1. 定常性: 特定のモチーフが信号全体に渡って繰り返されます。音声信号では、時間領域にわたって同じタイプのパターンが何度も何度も観察されます。画像では、同じような視覚的パターンが次元を超えて繰り返されることを意味します。 +2. 局所性: 近くの点は遠くの点よりも相関が高くなります。1次元信号の場合、ある点 $t_i$ でピークを観測した場合、 $t_i$ の周りの小さな窓の中の点は $t_i$ と同じような値を持つと予想されますが、 $t_i$ から離れた点 $t_j$ では、 $x_{t_i}$ は $x_{t_j}$ との関係が非常に薄いことを意味しています。より正式には、信号と反転した信号の畳み込みは、信号が反転した信号と完全に重なったときにピークを迎えます。2つの1次元信号間の畳み込み(相互相関)は、2つのベクトルがどれだけ似ているか、あるいは近いかの指標である、互いのドット積以外の何ものでもありません。このように、情報は信号の特定の部分に含まれています。画像の場合、これは、画像内の2つの点の間の相関が、点を遠ざけるにつれて減少することを意味します。$x_{0,0}$ の画素が青である場合、次の画素($x_{1,0},x_{0,1}$)も青である確率はかなり高いですが、画像の反対側の端($x_{-1,-1}$)に移動するにつれて、この画素の値は $x_{0,0}$ の画素の値とは独立になります。 +3. 構成性; 自然界に存在するすべてのものは、全体の部分のまた部分の・・・というように構成されています。例として、文字は文字列を形成して単語を形成し、それがさらに文を形成します。文は組み合わせて文書を形成することができます。構成性は世界を説明可能にします。 + +もしデータが定常性、局所性、構成性を示すならば、スパース性、重み共有、層の積み重ねを利用したネットワークでそれらを利用することができます。 + + + + +## [不変性と等価性を生み出すために自然の信号の性質を活用する](https://www.youtube.com/watch?v=kwPWpVverkw&t=1074s) + + +### 局所性 $Rightarrow$ スパース性 + +図1は、5層の全結合ネットワークを示しています。各矢印は、入力に乗算される重みを表しています。見ての通り、このネットワークは非常に計算量が多いです。 + +

+図1: 全結合ネットワーク
+ +私たちのデータが局所性を示す場合、各ニューロンは、前の層の少数の局所ニューロンに接続する必要があります。そのため、図2に示すように、いくつかの接続を削除することができます。図2(a)は全結合ネットワークです。データの局所性を利用して、図2(b)では遠く離れたニューロン間の接続を落としています。図2(b)の隠れ層のニューロン(緑)は入力全体をカバーしているわけではありませんが、全体のアーキテクチャはすべての入力ニューロンをカバーすることができます。受容野(RF)は、特定の層の各ニューロンが見ることができる、あるいは考慮に入れた、前の層のニューロンの数です。したがって、隠れ層の出力層のRFは3、入力層のRFは3ですが、出力層のRFは5となります。 + +| | | +|図2(a): スパース性を適用する前 | 図2(b): スパース性を適用した後| + + + + +### 定常性 \Rightarrow$ パラメータ共有 + +データが定常性を示す場合には、ネットワークアーキテクチャー全体で小さなパラメータのセットを複数回使用することができます。例えば、図3(a)のスパースネットワークでは、3つの共有パラメータ(黄色、オレンジ、赤)のセットを使用することができます。そうすると、パラメータの数は9個から3個に減ってしまいます。新しいアーキテクチャは、これらの特定の重みを訓練するためのデータがより多くあるので、より良く機能するかもしれません。 +スパース性とパラメータ共有を適用した後の重みは、畳み込みカーネルと呼ばれます。 + +| | | +|図3(a): パラメータ共有適用前 | 図3(b): パラメータ共有適用後| + + +以下は、スパース性とパラメータ共有を使用することの利点です。 +* パラメータ共有 + * より速い収束 + * より良い汎化 + * 入力サイズに拘束されない + * カーネルの独立性 $\Rightarrow$ 並列化 +* 接続のばらつき + * 計算量の削減 + +図4は、1次元データ上のカーネルの例を示しており、カーネルサイズは、2(カーネル数)×7(前の層の厚さ)×3(ユニークな接続の数/重さ)です。 + +カーネルサイズの選択は経験的なものです。3 * 3 の畳み込みが空間データの最小サイズであるように思われます。サイズ1の畳み込みは、より大きな入力画像に適用できる最終層を得るために使用することができます。偶数のカーネルサイズはデータの品質を低下させる可能性があるので、奇数のカーネルサイズ、通常は3や5を使用します。 + +| | | +|図4(a): 1次元データに対するカーネル | 図4(b): ゼロパディングのデータ| + + + + +### 詰め物 + +パディングは一般的に最終的な結果に悪影響を与えますが、プログラム的には便利です。通常はゼロパディングを使用します。`サイズ = (カーネルサイズ - 1)/2`のようにします + + + +### 標準的な空間的CNN + +標準的な空間的CNNには以下の特性があります。 + +* 複数の層 + * 畳み込み + * 非線形性(ReLUとリーク) + * プーリング + * バッチ正規化 +* residual connection + +バッチ正規化とresidual connectionは、ネットワークを良好に訓練するのに非常に役立ちます。 +residual connectionを介した追加の接続は、下から上へのパスと上から下への勾配のパスを保証します。 + +図5では、入力画像には2次元の空間情報がほとんど含まれていますが(各ピクセルの色である特徴情報は別として)、出力層は厚いです。途中で、空間情報と特徴情報の間にトレードオフが生じ、表現が濃くなります。したがって、階層が上がるにつれて、空間情報が失われ、表現が濃くなります。 + +

+図5: 階層を移動する情報表現
+ + +### [Pooling](https://www.youtube.com/watch?v=kwPWpVverkw&t=2376s) + +

+Figure 6: Illustration of Pooling
+ +A specific operator, $L_p$-norm, is applied to different regions (refer to Fig.6). Such an operator gives only one value per region(1 value for 4 pixels in our example). We then iterate over the whole data region-by-region, taking steps based on the stride. If we start with $m * n$ data with $c$ channels, we will end up with $\frac{m}{2} * \frac{n}{2}$ data still with $c$ channels (refer to Fig.7). +Pooling is not parametrized; nevertheless, we can choose different polling types like max pooling, average pooling and so on. The main purpose of pooling reduces the amount of data so that we can compute in a reasonable amount of time. + +

+Figure 7: Pooling results
+ +### [プーリング](https://www.youtube.com/watch?v=kwPWpVverkw&t=2376s) + +

+図6: プーリングの図
+ +$L_p$-ノルムという演算子を、異なる領域に適用します(図6参照)。このような演算子は、1つの領域につき1つの値しか与えられません(今回の例では、4つの画素に対して1つの値を与えます)。次に、データ全体を領域ごとに繰り返していき、ストライドに基づいてステップを動かします。サイズ$m * n$ で $c$ チャネルを持つデータものから始めると、 サイズ$\frac{m}{2} * \frac{n}{2}$ で$c$チャンネルを持つデータになります。図7を参照してください。 +プーリングはパラメトライズされていませんが、最大プーリングや平均プーリングなど、さまざまな種類のプーリングを選択することができます。プーリングの主な目的は、データ量を減らすことで、合理的な時間で計算できるようにすることです。 + +

+図7: プーリングの結果
+ + + + +## CNN - Jupyter Notebook + +Jupyter Notebookは [ここ](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/06-convnet.ipynb) にあります。ノートブックを実行するには、[`README.md`](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md) で指定された `pDL` 環境がインストールされていることを確認してください。 + +このノートでは、MNISTデータセットの分類タスクのために、多層パーセプトロン(FCネットワーク)と畳み込みニューラルネットワーク(CNN)を学習しています。なお、どちらのネットワークもパラメータ数は同じです。(図8) + +

+図8: 元のMNISTデータセットからのインスタンス
+ +訓練の前に、ネットワークの初期化がデータの分布と一致するようにデータを正規化します(非常に重要です!)。また、以下の5つの操作/ステップが訓練に存在することを確認してください。 + + 1. モデルにデータを供給する + 2. 損失の計算 + 3. 蓄積された勾配のキャッシュを `zero_grad()` でクリーニングする + 4. 勾配の計算 + 5. オプティマイザーのステップを実行する + +まず、正規化されたMNISTデータを用いて両者のネットワークを学習します。その結果、FCネットワークの精度は$87\%$、CNNの精度は$95\%$でした。同じパラメータ数であれば、CNNはより多くのフィルタを学習することができました。FCネットワークでは、遠くにあるものと近くにあるものとの間に依存関係を持たせようとするフィルタが訓練されます。それらは完全に無駄になります。その代わりに、畳み込みネットワークでは、これらのパラメータはすべて隣のピクセル間の関係に集中しています。 + +次に、MNISTデータセットの全ての画像の全ての画素に対して、ランダムな並べ替えを行います。これにより、図8を図9に変換し、この修正されたデータセット上で両方のネットワークを訓練します。 + +

+図9: Permuted MNIST Datasetからのインスタンス
+ +FCネットワークの性能はほとんど変わらない($85\%$)ですが、CNNの精度は$83\%$に低下しました。これは、ランダムな並べ替えの後、画像がCNNで利用可能な局所性、定常性、構図性の3つの性質を保持しなくなったためです。 diff --git a/docs/ja/week05/05-3.md b/docs/ja/week05/05-3.md index 0d5f37d2e..ac260e562 100644 --- a/docs/ja/week05/05-3.md +++ b/docs/ja/week05/05-3.md @@ -1,10 +1,12 @@ --- lang-ref: ch.05-3 -title: Understanding convolutions and automatic differentiation engine title: 畳み込みと自動微分エンジンを理解する lecturer: Alfredo Canziani authors: Leyi Zhu, Siqi Wang, Tao Wang, Anqi Zhang date: 25 Feb 2020 +lang: ja +translation-date: 04 Oct 2020 +translator: Jesmer Wong --- @@ -181,7 +183,7 @@ PyTorchで偏導関数を使用する場合、常に元のデータと同じ次 Now we have a $1\times3$ vector $x$, assign $y$ to the double $x$ and keep doubling $y$ until its norm is smaller than $1000$. Due to the randomness we have for $x$, we cannot directly know the number of iterations when the procedure terminates. --> ###基本的なものから展開すると -これで、$ 1 \ times3 $ベクトル$ x $して、$ y $をダブル$ x $に割り当て、ノルムが$ 1000 $より小さくなるまで$ y $を2倍にやり続けます。 +これで、$ 1 \ times3 $ベクトル$ x $して、$ y $をダブル$ x $に割り当て、ノルムが$ 1000 $より小さくなるまで$ y $を2倍にやり続けます。 $ x $にはランダム性があるため、反復回数計算はいつか終わるって簡単にわかりません。 ```python @@ -208,7 +210,7 @@ print(i) ``` -推測に関しては、以下に示すように、 `requires_grad = True`を使用して、勾配の蓄積を追跡することパラメータを付けます。 $ x $または$ w $の宣言で `requires_grad = True`を省略し、$ z $で` backward() `を呼び出すと、$ x $と$ w $の勾配がいっさい積算されてないため、ランタイムエラーが発生します。 +推測に関しては、以下に示すように、 `requires_grad = True`を使用して、勾配の蓄積を追跡することパラメータを付けます。 $ x $または$ w $の宣言で `requires_grad = True`を省略し、$ z $で` backward() `を呼び出すと、$ x $と$ w $の勾配がいっさい積算されてないため、ランタイムエラーが発生します。 ```python # Both x and w that allows gradient accumulation diff --git a/docs/ja/week06/06-1.md b/docs/ja/week06/06-1.md new file mode 100644 index 000000000..ff7bf630d --- /dev/null +++ b/docs/ja/week06/06-1.md @@ -0,0 +1,220 @@ +--- +lang-ref: ch.06-1 +lecturer: Yann LeCun +title: Applications of Convolutional Network +authors: Shiqing Li, Chenqin Yang, Yakun Wang, Jimin Tan +date: 2 Mar 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + +## [郵便番号の識別](https://www.youtube.com/watch?v=ycbMGyCPzvE&t=43s) + + +前回の講義では、畳み込みネットワークで数字を認識できることを示しましたが、モデルがどのようにして各数字を選択し、隣接する数字への摂動を回避するのかという疑問が残りました。次のステップでは、非重複物体を検出するために、一般的なNMS(Non-Maximum Suppression)のアプローチを用います。ここで、入力が非重複な数字の列であると仮定して、複数の畳み込みネットワークを訓練し、多数決または畳み込みネットワークによって生成された最も高いスコアに対応する数字を選ぶという戦略をとります。 + + + +### CNNによる認識 + + +ここでは、5つの非重複な郵便番号を識別するタスクを提示します。このシステムには、各数字をどのように分離するかについての指示は与えられていませんが、5つの数字を予測する必要があることを認識しています。このシステム(図1)は、4つの異なるサイズの畳み込みネットワークで構成されており、それぞれが1つの出力セットを生成します。出力は行列で表現されます。4つの出力行列は、最後の層の異なるカーネル幅を持つモデルからのものです。各出力には、0から9までの10のカテゴリを表す10行があります。白い四角が大きいほど、そのカテゴリのスコアが高いことを表しています。これら4つの出力ブロックでは、最後のカーネル層の幅は、それぞれ5、4、3、2です。カーネルのサイズは、入力上のモデルの表示ウィンドウの幅を決定するので、各モデルは異なるウィンドウサイズに基づいて数字を予測しています。次にモデルは多数決を取り、そのウィンドウで最も高いスコアに対応するカテゴリを選択します。有用な情報を抽出するためには、すべての文字の組み合わせが可能ではないことを念頭に置いておく必要があります。そのため、入力制限を利用した誤り訂正は、出力が真の郵便番号であることを保証するのに役立ちます。 + + + +
+
+図1: 郵便番号識別のための複数の分類器 +
+ +Now to impose the order of the characters. The trick is to utilize a shortest path algorithm. Since we are given ranges of possible characters and the total number of digits to predict, We can approach this problem by computing the minimum cost of producing digits and transitions between digit. The path has to be continuous from the lower left cell to the upper right cell on the graph, and the path is restricted to only contain movements from left to right and bottom to top. Note that if the same number is repeated next to each other, the algorithm should be able to distinguish there are repeated numbers instead of predicting a single digit. +今度は文字に順番をつけます。コツは最短経路アルゴリズムを利用することです。可能な文字の範囲と予測すべき数字の合計が与えられているので、数字の生成と数字間の遷移の最小コストを計算することで、この問題にアプローチすることができます。経路はグラフ上の左下のセルから右上のセルまで連続していなければならず、経路は左から右へ、下から上への移動のみを含むように制限されています。同じ数字が隣り合わせで繰り返される場合、アルゴリズムは一つの数字を予測するのではなく、繰り返される数字があることを区別できるようにしなければならないことに注意してください。 + + + +## [顔検出](https://www.youtube.com/watch?v=ycbMGyCPzvE&t=1241s) + + +畳み込みニューラルネットワークは物体検出タスクに適しており、顔検出も例外ではありません。顔検出を行うには、顔のある画像と顔のない画像のデータセットを収集し、その上で30 $\times$ 30ピクセルのようなウィンドウの大きさの畳み込みネットを訓練し、顔があるかどうかをネットワークに教えてもらいます。一度訓練されたモデルを新しい画像に適用し、30 $\times$ 30ピクセルのウィンドウ内に大体の顔があれば、畳み込みネットは対応する位置で出力を点灯させます。しかし、2つの問題があります。 + + + +- **偽陽性**: 画像のパッチが顔ではない方法はたくさんあります。学習段階では、モデルはそれらのすべてを見ることはできないかもしれません(すなわち、完全な代表集合)。そのため、モデルはテスト時に多くの偽陽性を生み出す可能性があります。 + +- **Different Face Size:** Not all faces are 30 $\times$ 30 pixels, so faces of differing sizes may not be detected. One way to handle this issue is to generate multi-scale versions of the same image. The original detector will detect faces around 30 $\times$ 30 pixels. If applying a scale on the image of factor $\sqrt 2$, the model will detect faces that were smaller in the original image since what was 30 $\times$ 30 is now 20 $\times$ 20 pixels roughly. To detect bigger faces, we can downsize the image. This process is inexpensive as half of the expense comes from processing the original non-scaled image. The sum of the expenses of all other networks combined is about the same as processing the original non-scaled image. The size of the network is the square of the size of the image on one side, so if you scale down the image by $\sqrt 2$, the network you need to run is smaller by a factor of 2. So the overall cost is $1+1/2+1/4+1/8+1/16…$, which is 2. Performing a multi-scale model only doubles the computational cost. +- **顔の大きさの違い**: すべての顔が30 $\times$ 30ピクセルではないので、大きさの違う顔は検出されないかもしれません。この問題を解決する方法の一つとして、同じ画像のマルチスケール版を生成する方法があります。オリジナルの検出器では、30 $\times$ 30ピクセル前後の顔を検出します。もし、$\sqrt 2$のスケールを適用すると、30$\times$ 30だったものが20$\times$ 20ピクセルになるので、元の画像では小さかった顔が検出されることになります。大きな顔を検出するには、画像のサイズを小さくすれば良いです。この処理にかかるコストの半分は、元の画像を縮小していない画像を処理することで得られるので、この処理は容易に行えます。他のすべてのネットワークのコストの合計は、元の非拡大画像を処理するのとほぼ同じです。ネットワークのサイズは、片側の画像のサイズの二乗なので、画像を$\sqrt 2$だけスケールダウンすると、実行する必要のあるネットワークは2倍小さくなります。 なので、全体のコストは$1+1/2+1/4+1/8+1/16...$で、これは2です。 マルチスケールモデルを実行すると、計算コストが2倍になります。 + + + +### マルチスケール顔検出システム + + +
+
+図2: 顔検出システム +
+ + +(図3)に示すマップは、顔検出器のスコアを示しています。この顔検出器は、20$\times$ 20ピクセルの大きさの顔を認識しています。細かいスケール(スケール3)では、高いスコアが多いですが、あまり確定的ではありません。スケーリング係数を上げると(スケール6)、白い領域が多くなってきます。これらの白い領域は検出された顔を表しています。次に、non-maximum suppressionを適用して、顔の最終的な位置を求めます。 + + +
+
+図3: 様々なスケーリングについての顔検出スコア +
+ + + + +### Non-maximum suppression + +それぞれのスコアが高い領域には、おそらくその下に顔があります。より多くの顔が最初の顔に非常に近い位置で検出された場合、それは1つだけが正しく、残りは間違っていると考えるべきであることを意味します。 Non-maximum suppressionでは,重複するバウンディングボックスの中で最もスコアの高いものを取り、それ以外のものを除去します。その結果、最適な位置に1つのバウンディングボックスができます。 + + + +### Negative mining + +最後のセクションでは、物体が顔に似て見える方法がたくさんあるため、テスト時にモデルがどのようにして大量の偽陽性になるかを説明しました。学習セットには、顔に似ているように見える顔以外のオブジェクトがすべて含まれているわけではありません。この問題は、ネnegative miningによって軽減することができます。Negative miningでは、モデルが顔として検出した非顔パッチのネガティブデータセットを作成します。このデータは、顔が含まれていないことが知られている入力に対してモデルを実行することで収集されます。次に、nネガティブデータセットを使って検出器を再訓練します。このプロセスを繰り返すことで、偽陽性に対するモデルのロバスト性を高めることができます。 + + + +## セマンティックセグメンテーション + +セマンティックセグメンテーションとは、入力画像の各ピクセルにカテゴリを割り当てる作業です。 + + + +### [長距離の適応的なロボットの視角のためのCNN](https://www.youtube.com/watch?v=ycbMGyCPzvE&t=1669s) + + +このプロジェクトでは、ロボットが道路と障害物を区別できるように、入力画像から領域をラベル付けすることを目的としています。図では、緑色の領域がロボットが走行可能な領域であり、赤色の領域が背の高い草などの障害物です。このタスクのためのネットワークを訓練するために、画像からパッチを取り出し、それが横断可能かどうか(緑か赤か)を手動でラベル付けしました。次に、パッチの色を予測してもらうことで、パッチ上の畳み込みネットワークを訓練します。システムが十分に訓練されると、画像全体に適用され、画像のすべての領域に緑または赤のラベルが付けられます。 + + +
+
+図4: 長距離の適応的なロボットの視角のためのCNN (DARPA LAGR program 2005-2008) +
+ + +予測には5つのカテゴリーがありました。1)super緑、2)緑、3)紫:障害物足線、4)赤の障害物5)super赤:間違いなく障害物。 + + + +**ステレオラベル**(図4、コラム2) + 画像はロボットに搭載された4つのカメラによって撮影され、2つのステレオビジョンペアにグループ化されています。ステレオペアのカメラ間の既知の距離を使用して、ステレオペアの両方のカメラに現れるピクセル間の相対距離を測定することによって、3D 空間における各ピクセルの位置を推定します。これは、私たちの脳が目に見える物体の距離を推定するのと同じプロセスです。推定された位置情報を用いて、平面を地面にフィットさせ、地面に近い場合は緑、地面より上にある場合は赤のラベルを付けます。 + +* **ConvNetの限界と動機** +ステレオビジョンは10mまでしか使えず、ロボットを運転するためには長距離の視野が必要となります。しかし、ConvNetは正しく訓練されていれば、はるかに遠くの物体を検出することができます。 + + +
+
+図5: 距離が正規化された画像のスケール不変なピラミッド +
+ + + +* **モデルの入力**:重要な前処理の一つとして、距離で正規化された画像のスケール不変なピラミッドを構築することが含まれます(図5)。これは、この講義の前に複数のスケールの顔を検出しようとしたときに行ったことと似ています。 + + + +**モデルの出力** (図4、コラム3) + +このモデルは、画像の**水平線**までのピクセルごとにラベルを出力します。これらは、マルチスケール畳み込みネットワークの分類器の出力です。 + + + + +* **モデルを適応的にする方法**: ロボットはステレオラベルに継続的にアクセスしているため、ネットワークは新しい環境に適応して再訓練を行うことができます。ネットワークの最後の層だけが再訓練されることに注意してください。前の層は事前に訓練され、固定されます。 + + + +**システムのパフォーマンス**。 + +障壁の向こう側のGPS座標にたどり着こうとすると、ロボットは遠くから障壁を「見て」、それを避けるルートを計画しました。これはCNNが50~100m先までの物体を検知しているおかげです。 + + + +**限界**。 + +2000年代に戻ると、計算リソースは制限されていました。ロボットは1秒間に1フレーム程度の処理が可能でしたが、これは、ロボットが反応するまでの1秒間は、自分の前を歩いてきた人を検出できないことを意味します。この制限を解決するのが、**Low-Cost Visual Odometry**モデルです。これは、ニューラルネットワークに基づいておらず、2.5m程度の視野を持ちながらも、素早く反応します。 + + + +### シーンの解析とラベリング + + +このタスクでは、モデルはピクセルごとにオブジェクトのカテゴリ(建物、車、空など)を出力します。アーキテクチャもマルチスケールです(図6)。 + +
+
+Figure 6: シーン解析のためのマルチスケールCNN +
+ + + + +CNNの出力を入力に逆射影することは,ラプラシアンピラミッドの底にある原画像上のサイズ$46 \times 46$の入力ウィンドウに相当することに注意してください。つまり、中心画素のカテゴリを決めるために、**$46 \times 46$ ピクセルのコンテキストを使っていることになります**。 + +しかし、大きなオブジェクトの場合、このコンテキストサイズだけではカテゴリを決定できないことがあります。 + +**マルチスケール法では、リスケーリングされた画像を入力として提供することで、より広い視野を得ることができます**。次のようなステップで行われます。 +1. 同じ画像を、2倍と4倍の係数で別々に縮小します。 +2. これら2つの余分なリスケーリングされた画像を**同じConvNet**(同じ重み、同じカーネル)に投入し、レベル2の特徴量を2セット取得します。 +3. **これらの特徴量をアップサンプル**して、元の画像のレベル2の特徴量と同じサイズになるようにします。 +4. (アップサンプルされた)特徴量の3つのセットを**重ねて**、分類器に送ります。 + + +これで、1/4サイズにリサイズされた画像から得られる最大の実効的なサイズは、$184 \times 184, (46 \times 4=184)$です。 + +**パフォーマンス**: 事後処理を行わず、フレーム単位で実行しているため、標準的なハードウェアでも非常に高速に動作します。学習データのサイズがやや小さい(2k~3k)ですが、結果はまだ記録に残るほどのものです。 diff --git a/docs/ja/week06/06-2.md b/docs/ja/week06/06-2.md new file mode 100644 index 000000000..fc1e99558 --- /dev/null +++ b/docs/ja/week06/06-2.md @@ -0,0 +1,400 @@ +--- +lang-ref: ch.06-2 +lecturer: Yann LeCun +title: RNNs, GRUs, LSTMs, Attention, Seq2Seq, and Memory Networks +authors: Jiayao Liu, Jialing Xu, Zhengyang Bian, Christina Dominguez +date: 2 March 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + +## [深層学習のアーキテクチャ](https://www.youtube.com/watch?v=ycbMGyCPzvE&t=2620s) + + + +ディープラーニングでは、異なる機能を実現するための異なるモジュールが存在します。ディープラーニングの専門知識は、特定のタスクを行うためのアーキテクチャを設計することを含みます。 初期のコンピュータに指示を与えるためのアルゴリズムでプログラムを書くのと同様に、ディープラーニングでは複雑な機能を機能モジュールのグラフ(動的な場合もある)に還元し、その機能は学習によって最終的に決定されます。 + +畳み込みネットワークで見たものと同様に、ネットワークアーキテクチャが重要です。 + + + + +## リカレントネットワーク + +畳み込みニューラルネットワークでは、モジュール間のグラフや相互接続にループを持つことはできません。出力を計算するときに入力が利用できるように、モジュール間には少なくとも部分的な順序が存在します。 + +図1に示すように、リカレントニューラルネットワークにはループがあります。 + + +
+
+図1 ループを持つリカレントニューラルネットワーク +
+ + + - $x(t)$ : 時間を通じた入力 + - $\text{Enc}(x(t))$: 入力の表現を生成するエンコーダー + - $h(t)$: 入力の表現 + - $w$: 学習可能パラメータ + - $z(t-1)$: 前の時間ステップの出力である、前の隠れ状態 + - $z(t)$: 現在の隠れ状態 + - $g$: 複雑なニューラルネットワークになりうる関数。入力の一つは $z(t-1)$ であり、これは前の時間ステップの出力。 + - $\text{Dec}(z(t))$: 出力を生成するデコーター + + + + +## リカレントネットワーク:ループを展開する + +ループを時間内に展開します。入力は系列$x_1, x_2, \cdots, x_T$です。 + + +
+ " +
+図2:ループが展開されたリカレントニューラルネット +
+ +In Figure 2, the input is $x_1, x_2, x_3$. + +At time t=0, the input $x(0)$ is passed to the encoder and it generates the representation $h(x(0)) = \text{Enc}(x(0))$ and then passes it to G to generate hidden state $z(0) = G(h_0, z', w)$. At $t = 0$, $z'$ in $G$ can be initialized as $0$ or randomly initialized. $z(0)$ is passed to decoder to generate an output and also to the next time step. + +As there are no loops in this network, and we can implement backpropagation. + +Figure 2 shows a regular network with one particular characteristic: every block shares the same weights. Three encoders, decoders and G functions have same weights respectively across different time steps. + +BPTT: Backprop through time. Unfortunately, BPTT doesn't work so well in the naive form of RNN. + +時刻t=0のとき、入力$x(0)$をエンコーダに渡し、表現$h(x(0)) = \text{Enc}(x(0))$を生成し、それをGに渡して隠れ状態$z(0) = G(h_0, z', w)$を生成します。$t = 0$のとき、$G$の$z'$は、$0$として初期化してもいいですし、ランダムに初期化してもいいです。z(0)$はデコーダに渡されて出力が生成され、次の時間ステップにも渡されます。 + +このネットワークにはループがないので、誤差逆伝播を実装することができます。 + +図2は、1つの特殊な特徴を持つ通常のネットワークを示しています:すべてのブロックが同じ重みを共有しています。3つのエンコーダ、デコーダ、G関数はそれぞれ異なる時間ステップで同じ重みを持っています。 + +BPTT(Backprop through tim): 残念ながら,RNNのナイーブな形式では,BPTTはあまりうまく機能しません. + + +RNNの問題点。 + +1. Vanishing gradients + - In a long sequence, the gradients get multiplied by the weight matrix (transpose) at every time step. If there are small values in the weight matrix, the norm of gradients get smaller and smaller exponentially. +2. Exploding gradients + - If we have a large weight matrix and the non-linearity in the recurrent layer is not saturating, the gradients will explode. The weights will diverge at the update step. We may have to use a tiny learning rate for the gradient descent to work. + +1. 勾配消失 + - 長いシーケンスでは、勾配は時間ステップごとに重み行列(の転置)に乗算されます。重み行列の値が小さい場合、勾配のノルムは指数関数的に小さくなります。 +2. 勾配爆発 + - 大きな重み行列があり、リカレント層の非線形性が飽和していない場合、勾配は爆発的に増大します。これによって更新ステップで重みが発散します。勾配降下法が機能するためには、小さな学習率を使用しなければならないかもしれません。 + + + +RNNを使う理由の一つに、過去の情報を記憶できるという利点があります。しかし、仕掛けのない単純なRNNでは、かなり前の情報を記憶するのに失敗する可能性があります。 + +勾配消失がある例。 + +入力はCプログラムの文字です。システムはそれが構文的に正しいプログラムであるかどうかを判断します。構文的に正しいプログラムは、有効な数の中括弧と括弧を持っていなければなりません。したがって、ネットワークは、チェックすべき開いている括弧と中括弧の数を覚えていて、それらをすべて閉じているかどうかを確認しなければなりません。ネットワークはそのような情報をカウンターのような隠れた状態で記憶しなければなりません。 しかし、勾配消失のため、長いプログラムではそのような情報を保存することに失敗します。 + + + + +## RNNのコツ + +- 勾配クリッピング。 (勾配爆発を避ける) + 勾配が大きくなりすぎた場合には勾配を潰します。 +- 初期化 (うまく開始すると、爆発や消失を避けることができます) + ある程度ノルムを維持するために、重み行列を初期化します。例えば、直交初期化では、重み行列をランダムな直交行列として初期化します。 + + +## 乗算モジュール + + +乗算モジュールでは、入力の加重和だけを計算するのではなく、入力の積を計算し、その積の加重和を計算します。 + + +$x \in {R}^{n\times1}$, $W \in {R}^{m \times n}$, $U \in {R}^{m \times n \times d}$ そして $z \in {R}^{d\times1}$とします。 ここで U はテンソルです。 + +$$ +w_{ij} = u_{ij}^\top z = +\begin{pmatrix} +u_{ij1} & u_{ij2} & \cdots &u_{ijd}\\ +\end{pmatrix} +\begin{pmatrix} +z_1\\ +z_2\\ +\vdots\\ +z_d\\ +\end{pmatrix} = \sum_ku_{ijk}z_k +$$ + +$$ +s = +\begin{pmatrix} +s_1\\ +s_2\\ +\vdots\\ +s_m\\ +\end{pmatrix} = Wx = \begin{pmatrix} +w_{11} & w_{12} & \cdots &w_{1n}\\ +w_{21} & w_{22} & \cdots &w_{2n}\\ +\vdots\\ +w_{m1} & w_{m2} & \cdots &w_{mn} +\end{pmatrix} +\begin{pmatrix} +x_1\\ +x_2\\ +\vdots\\ +x_n\\ +\end{pmatrix} +$$ + + +ただし$s_i = w_{i}^\top x = \sum_j w_{ij}x_j$です。 + + + +システムの出力は、入力と重みの古典的な加重和です。重み自体もまた、入力と重みの加重和です。 + +ハイパーネットワークアーキテクチャ:重みは別のネットワークによって計算されます。 + + +## Attention + + + +$x_1$ と $x_2$ はベクトル、 $w_1$ と $w_2$ は softmax 後のスカラーで、 $w_1 + w_2 = 1$、 $w_1$ と $w_2$ は 0 から 1 の間の値です。 + +$w_1x_1 + w_2x_2$ は、 $x_1$ と $x_2$ を係数 $w_1$ と $w_2$ で加重したものです。 + +$w_1$と$w_2$の相対的な大きさを変えることで、$w_1x_1 + w_2x_2$の出力を、$x_1$または$x_2$、または$x_1$と$x_2$のいくつかの線形の組み合わせに切り替えることができます。 + +入力は、複数の $x$ ベクトル($x_1$ と $x_2$ 以上)を持つことができます。attentionメカニズムは、ニューラルネットワークが特定の入力にattentionを向けさせ、他の入力を無視することを可能にします。 + +Attentionは、transformerアーキテクチャや他のタイプのattentionを使用する NLP システムでますます重要になってきています。 + +z はデータに依存しないので、重みはデータに依存しません。 + + +## [Gated Recurrent Units (GRU)](https://www.youtube.com/watch?v=ycbMGyCPzvE&t=3549s) + +As mentioned above, RNN suffers from vanishing/exploding gradients and can’t remember states for very long. GRU, [Cho, 2014](https://arxiv.org/abs/1406.1078), is an application of multiplicative modules that attempts to solve these problems. It's an example of recurrent net with memory (another is LSTM). The structure of A GRU unit is shown below: + +上述したように、RNNは消失/爆発勾配に苦しみ、あまり長く状態を記憶することができません。GRU, [Cho, 2014](https://arxiv.org/abs/1406.1078)は、これらの問題を解決しようとする乗算モジュールの応用です。これはメモリ付きリカレントネットの一例です(別のものとしてLSTMがあります)。GRUユニットの構造は以下の通りです。 + + +
+
+図3 Gated リカレントユニット +
+ +$$ +\begin{array}{l} +z_t = \sigma_g(W_zx_t + U_zh_{t-1} + b_z)\\ +r_t = \sigma_g(W_rx_t + U_rh_{t-1} + b_r)\\ +h_t = z_t\odot h_{t-1} + (1- z_t)\odot\phi_h(W_hx_t + U_h(r_t\odot h_{t-1}) + b_h) +\end{array} +$$ + + +ここで、$\odot$は要素毎の乗算(アダマール積)、$x_t$は入力ベクトル、$h_t$は出力ベクトル、$z_t$は更新ゲートベクトル、$r_t$はリセットゲートベクトル、$\phi_h$は双曲線tanh、$W$,$U$,$b$は学習可能なパラメータです。 + +To be specific, $z_t$ is a gating vector that determines how much of the past information should be passed along to the future. It applies a sigmoid function to the sum of two linear layers and a bias over the input $x_t$ and the previous state $h_{t-1}$. $z_t$ contains coefficients between 0 and 1 as a result of applying sigmoid. The final output state $h_t$ is a convex combination of $h_{t-1}$ and $\phi_h(W_hx_t + U_h(r_t\odot h_{t-1}) + b_h)$ via $z_t$. If the coefficient is 1, the current unit output is just a copy of the previous state and ignores the input (which is the default behaviour). If it is less than one, then it takes into account some new information from the input. + +The reset gate $r_t$ is used to decide how much of the past information to forget. In the new memory content $\phi_h(W_hx_t + U_h(r_t\odot h_{t-1}) + b_h)$, if the coefficient in $r_t$ is 0, then it stores none of the information from the past. If at the same time $z_t$ is 0, then the system is completely reset since $h_t$ would only look at the input. + +具体的には、$z_t$は、過去の情報を未来にどれだけ渡すべきかを決めるゲーティングベクトルです。これは、入力$x_t$と前の状態$h_{t-1}$に対する2つの線形層とバイアスの和にシグモイド関数を適用します。 z_t$には、シグモイドを適用した結果として0と1の間の係数が含まれています。最終的な出力状態$h_t$は、$h_{t-1}$と$z_t$を介した$\phi_h(W_hx_t + U_h(r_t\odot h_{t-1}) + b_h)$の凸の組み合わせである。係数が1の場合、現在の単位出力は前の状態のコピーに過ぎず、入力を無視します(これがデフォルトの動作です)。係数が1より小さい場合は、入力からの新しい情報を考慮に入れます。 + +リセットゲート $r_t$ は、過去の情報をどれだけ忘れるかを決めるために使用されます。新しい記憶内容 $\phi_h(W_hx_t + U_h(r_t\odot h_{t-1}) + b_h)$において、$r_t$の係数が0であれば、過去の情報は何も記憶しない。同時に$z_t$が0ならば、$h_t$は入力を見ているだけなので、システムは完全にリセットされる。 + +## LSTM (Long Short-Term Memory) + + +GRUは実はもっと前に出てきたLSTMの簡略化版です[Hochreiter, Schmidhuber, 1997](https://www.bioinf.jku.at/publications/older/2604.pdf)。LSTMは、過去の情報を保存するためのメモリセルを構築することで、RNNの長期記憶喪失の問題を解決することも目的としています。LSTMの構造を以下に示します。 + +
+
+Figure 4. LSTM +
+ +$$ +\begin{array}{l} +f_t = \sigma_g(W_fx_t + U_fh_{t-1} + b_f)\\ +i_t = \sigma_g(W_ix_t + U_ih_{t-1} + b_i)\\ +o_t = \sigma_o(W_ox_t + U_oh_{t-1} + b_o)\\ +c_t = f_t\odot c_{t-1} + i_t\odot \tanh(W_cx_t + U_ch_{t-1} + b_c)\\ +h_t = o_t \odot\tanh(c_t) +\end{array} +$$ + + + +ここで、$\odot$は、要素毎の乗算、$x_t\in\mathbb{R}^a$は、LSTMユニットへの入力ベクトル、$f_t\in\mathbb{R}^h$は、忘却ゲートの活性ベクトル、$i_t\in\mathbb{R}^h$は、入力/更新ゲートの活性ベクトルです。また、$o_t\in\mathbb{R}^h$は、出力ゲートの活性ベクトル、$h_t\in\mathbb{R}^h$ は、隠れ状態ベクトル(出力としても知られている)、$c_t\in\mathbb{R}^h$ は、セルの状態ベクトルです。 + + + +LSTMユニットは、セルの状態$c_t$を使用して、ユニットを介して情報を伝達します。ゲートと呼ばれる構造を通して、セルの状態から情報をどのように保存したり削除したりするかを調節しています。忘却ゲート $f_t$ は、現在の入力と前の隠れ状態を見て、前のセルの状態 $c_{t-1}$ からどれだけの情報を残すかを決め、0から1の間の数を $c_{t-1}$ の係数として生成します。 そして、$\tanh(W_cx_t + U_ch_{t-1} + b_c)$は、セルの状態を更新するための新しい候補を計算し、忘却ゲートと同様に、入力ゲート$i_t$は、どの程度の更新を適用するかを決定します。最後に、出力$h_t$は、セルの状態$c_t$に基づいていますが、$\tanh$を通過し出力ゲート$o_t$によってフィルタリングされます。 + +LSTMは、NLPでは広く使われていますが、その人気は低下しています。例えば、音声認識では時間的なCNN、NLPではtransformerを使う方向に進んでいます。 + +## Sequence to Sequence Model + + +[Sutskever NIPS 2014](https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf)によって提案されたアプローチは、古典的なアプローチに匹敵する性能を持った初めてのニューラル機械翻訳システムでした。これは、エンコーダとデコーダの両方が多層LSTMであるエンコーダ/デコーダアーキテクチャを使用しています。 + + +
+
+図5. Seq2Seq +
+ + + +図中の各セルはLSTMです。エンコーダ(左の部分)の場合、時間ステップ数は翻訳する文の長さに等しくなります。各ステップでは、前のLSTMの隠れ状態が次のLSTMにフィードされるLSTMのスタック(紙面では4層)があります。最後の時間ステップの最後の層では、文全体の意味を表すベクトルが出力され、それが別の多層LSTM(デコーダ)に送り込まれ、目的言語の単語が生成されます。デコーダでは、テキストは逐次的に生成されます。各ステップでは1つの単語が生成され、それが次の時間ステップへの入力として供給されます。 + +このアーキテクチャは、2つの点で満足できるものではありません。第一に、文全体の意味がエンコーダとデコーダの間の隠れた状態に押し込められなければなりません。第2に、LSTMは実際には約20語以上の情報を保持できません。これらの問題を解決する方法は、Bi-LSTMと呼ばれるもので、これは2つのLSTMを逆方向に実行するものです。 Bi-LSTMでは、意味は2つのベクトルで符号化され、1つは左から右にLSTMを実行して生成され、もう1つは右から左に実行されます。 これにより、あまり多くの情報を失うことなく、文の長さを2倍にすることができます。 + + + +## AttentionつきSeq2seq + +The success of the approach above was short-lived. Another paper by [Bahdanau, Cho, Bengio](https://arxiv.org/abs/1409.0473) suggested that instead of having a gigantic network that squeezes the meaning of the entire sentence into one vector, it would make more sense if at every time step we only focus the attention on the relevant locations in the original language with equivalent meaning, i.e. the attention mechanism. +上記のアプローチの成功は短命でした。[Bahdanau, Cho, Bengio](https://arxiv.org/abs/1409.0473)による別の論文では、文全体の意味を一つのベクトルに押し込むような巨大なネットワークを持つよりも、各時間ステップで、原語の中の同等の意味を持つ関連する場所だけに注意を集中させた方が、より意味があると提案しています(例えばattentionn機構を使うなどして)。 + + +
+
+図6 AttentionつきSeq2seq +
+ + +Attentionでは、各時間ステップで現在の単語を生成するために、まず、入力文中のどの単語の隠れ表現に注目するかを決定する必要があります。本質的には、ネットワークは、各エンコードされた入力がデコーダの現在の出力とどれだけ一致しているかをスコア化することを学習します。これらのスコアはソフトマックスで正規化され、係数は、異なる時間ステップでのエンコーダの隠れ状態の重み付けされた合計を計算するために使用されます。重みを調整することで、システムは焦点を当てる入力の領域を調整することができます。このメカニズムのすごいところは、係数を計算するために使用されるネットワークが誤差逆伝播によって学習できることです。手作業で構築する必要はありません! + +Attention機構は、ニューラル機械翻訳を完全に変貌させました。その後、Googleは論文[*Attention Is All You Need*](https://arxiv.org/abs/1706.03762)を発表し、ニューロンの各層やグループがattentionを実装しているtransformerを発表しました。 + + +## [Memory network](https://www.youtube.com/watch?v=ycbMGyCPzvE&t=4575s) + + + +Memory networkは、2014年に[Antoine Bordes](https://arxiv.org/abs/1410.3916)と2015年に[Sainbayar Sukhbaatar](https://arxiv.org/abs/1503.08895)によって開始されたFacebookでの研究に由来しています。 + +Memory networkのアイデアは、脳には2つの重要な部分があるということです。一つは長期記憶を司どる**大脳皮質**であり、もう一つは大脳皮質のほぼすべての場所にワイヤーを送っている**海馬**と呼ばれるニューロンの別の塊です。海馬は短期記憶に使われると考えられており、比較的短い期間の記憶をしています。海馬の容量が限られているため、睡眠時には長期記憶に固めるために海馬から大脳皮質に多くの情報が転送されているというのが定説です。 + +Memory networkには、ネットワークへの入力$x$(メモリのアドレスと考えてください)があり、この$x$とベクトル$k_1, k_2, k_3, \cdots$(キー)をドット積で比較します。それらをソフトマックスにかけると、要素の総和が1となる配列が得られます。 これらのベクトルにsoftmaxで得たスカラーを掛けて、これらのベクトルを合計すると (attention機構に似ていることに注意してください) 結果が得られます。 + + +
+
+図7 Memory Network +
+ + + +キーの1つ(例えば $k_i$)が $x$ と完全に一致する場合、このキーに関連する係数は1に非常に近いものになります。したがって、システムの出力は本質的に $v_i$ となります。 + +これが **アドレス指定可能な連想記憶** です。連想記憶とは、入力があるキーにマッチした場合、その値を取得することです。そして、これはそれの微分可能なバージョンにすぎず、誤差逆伝播したり、勾配降下法によってベクトルを変化させたりすることができます。 + +著者らが行ったことは、システムに一連の文章を与えることで、システムに文の内容を伝えることでした。文章は、事前に訓練されていないニューラルネットを通過することで、ベクトルにエンコードされ、記憶になります。システムに質問をすると、その質問をエンコードしてニューラルネットの入力として入れることで、ニューラルネットはメモリに対して$x$を生成し、メモリは値を返します。 + +この値は、ネットワークの前の状態と一緒に、メモリに再アクセスするために使用されます。そして、このネットワーク全体を訓練して、質問に対する答えを生成します。大規模な訓練の後、このモデルは実際に文の内容を記憶して質問に答えるように学習します。 + +$$ +\alpha_i = k_i^\top x \\ +c = \text{softmax}(\alpha) \\ +s = \sum_i c_i v_i +$$ + + +Memory networkでは、入力を受けてメモリのアドレスを生成し、その値をネットワークに返してもらいます。そしてそれに続いて、最終的には出力を出すニューラルネットがあります。読み書きするためのCPUと外部メモリがあるので、これはコンピュータと非常によく似ています。 + +
+ +
+ + +図8. memory networkとコンピュータの比較 (Photo by Khan Acadamy) +
+ + + +これを使って、実際に**微分可能なコンピュータ**を作れるのではないかと想像している人たちがいます。その一例がDeepMindの[Neural Turing Machine](https://arxiv.org/abs/1410.5401)で、Facebookの論文がarXivで公開された3日後に公開されました。 + +入力をキーと比較し、係数を生成し、バリューを生成するというもので、これが基本的にtransformerがやっていることです。 Transformerとは、基本的にはニューラルネットのことで、ニューロンのすべてのグループがこれらのネットワークの1つであるようなものです。 diff --git a/docs/ja/week06/06-3.md b/docs/ja/week06/06-3.md new file mode 100644 index 000000000..92dac0e38 --- /dev/null +++ b/docs/ja/week06/06-3.md @@ -0,0 +1,567 @@ +--- +lang-ref: ch.06-3 +title: Architecture of RNN and LSTM Model +lecturer: Alfredo Canziani +authors: Zhengyuan Ding, Biao Huang, Lin Jiang, Nhung Le +date: 3 Mar 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + +## [概要](https://www.youtube.com/watch?v=8cAffg2jaT0&t=21s) + + +RNNは、シーケンスデータを扱うために使用できるアーキテクチャの1つのタイプです。シーケンスとは何でしょうか?CNNのレッスンでは、信号はドメインによって1次元、2次元、3次元のいずれかになることを学びました。ドメインは、何から何にマッピングしているのか、によって定義されます。シーケンシャルデータを扱うのは、ドメインが時間軸なので、基本的には1Dデータを扱うことになります。とはいえ、2つの方向がある2Dデータを扱う場合もRNNを使うこともできます。 + + + +### 通常のNN vs. リカレントNN + +図1は3層のバニラニューラルネットワークの図です。"バニラ "とは、アメリカの言葉で無地を意味します(つまりバニラニューラルネットワークは、通常のニューラルネットワークのことを指します)。ピンクの点が入力ベクトルx、中央が緑の隠れ層、最後の青の層が出力です。右のデジタル回路の例は、現在の出力が現在の入力にしか依存しない組合せ論理のようなものです。 + + +
+
+図1: バニラアーキテクチャ +
+ + +バニラニューラルネットワークとは異なり、リカレントニューラルネットワークでは、図2に示すように、電流出力は現在の入力だけでなく、システムの状態にも依存します。これは、デジタル回路の順序論理のようなもので、出力は「フリップフロップ」(デジタル回路の基本的な記憶装置)にも依存します。したがって、ここでの主な違いは、バニラニューラルネットワークの出力が現在の入力にのみ依存するのに対し、RNNの出力はシステムの状態にも依存するということです。 + + + +
+
+図2: RNNのアーキテクチャ +
+ +
+
+図3: 基本的なNNのアーキテクチャ +
+ + +Yannの図は、あるテンソルと別のテンソル(あるベクトルから別のベクトル)との間のマッピングを表すために、ニューロン間にこれらの形状を追加します。例えば、図3では、入力ベクトルxは、この追加項目を介して隠れ表現hにマッピングされます。その後、別の変換を経て、隠れ層から最終的な出力に到達します。同様に、RNN図では、ニューロン間で同じ追加項目を持つことができます。 + + + +
+
+図4: Yannの RNNのアーキテクチャ +
+ + +### Four types of RNN Architectures and Examples +### 4種類のRNNのアーキテクチャとその例 + + +最初の例はベクトルからシーケンスへの変換です。入力は1つの点であり、緑色の点としてアノテーションされているのはシステムの内部状態の状態更新です。システムの状態が更新されると、各時間ステップで1つの特定の出力が発生します。 + + +
+
+図5: Vec to Seq +
+ + +このタイプのアーキテクチャの例としては、入力が1つの画像であり、出力が入力画像の英語の記述を表す単語のシーケンスとなるようなものが挙げられます。図6を用いて説明すると、ここでは、青い点それぞれが英単語の辞書のインデックスとなっています。例えば、出力が「This is a yellow school bus」という文であるとしましょう。まず、"This "という単語のインデックスを取得し、次に "is "という単語のインデックスを取得します。このネットワークの結果の一部を以下に示します。例えば、1列目の最後の画像に関する記述は、「A herd of elephants walking across a dry grass field."」となっており、非常に洗練されています。そして2番目の列では、最初の画像は "Two dogs play in the grass."と出力されていますが、実際には3匹の犬です。最後の列は、"A yellow school bus parked in a parking lot."のように、より間違った例です。一般的に、これらの結果は、このネットワークがかなり大幅に失敗することもあれば、うまくいくこともあることを示しています。これは、画像の表現である1つの入力ベクトルから、例えば英語の文章を構成する文字や単語である記号の列へと変化する場合です。このようなアーキテクチャを自己回帰型のネットワークと呼びます。自己回帰型のネットワークとは、前の出力を入力として与えられた下で、出力をするネットワークのことです。 + + +
+
+図6: vec2seqの例: 画像から文章へ +
+ + +2番目のタイプは、最終的なベクトルへを返すシーケンスです。このネットワークはシンボルのシーケンスを与え続け、最後にのみ最終的な出力を与えます。これの応用として、Pythonを解釈するためにネットワークを使用することができます。例えば、入力はPythonプログラムの以下の行です。 + + + +
+
+図 7: Seq to Vec +
+ +
+
+図 8: Pythonコードの入力列 +
+ + +そうすると、ネットワークはこのプログラムの正解を出力することができるようになります。もう一つ、このようなもっと複雑なプログラムがあります。 + +
+
+図9: より複雑な場合のPython Codesの入力列 +
+ + + +すると、出力は12184になるはずです。これら2つの例は、この種の操作を行うためにニューラルネットワークを訓練できることを示しています。記号のシーケンスを与えて、最終的な出力が特定の値になるように強制するだけです。 + +3つ目は、図10に示すように、シーケンスからベクトルへ変換し、そこからまたシーケンスへ変換を行うものです。このアーキテクチャは、かつて言語翻訳を実行するための標準的な方法でした。ここでは、ピンク色で示されている一連のシンボルから始まります。そして、すべてのものがこの最終的なhに凝縮されます。これは概念を表しているといえます。例えば、入力として文章を持っていて、それを一時的にベクトルに圧縮することができます。そして、どのような表現であれこの意味を獲得した後、ネットワークはそれを別の言語に展開します。例えば、英語の単語列の中の「Today I'm very happy」は、イタリア語や中国語に翻訳することができます。一般的に、ネットワークは入力として何らかのエンコーディングを取得し、それを圧縮表現に変換します。最後に、この圧縮された表現を与えられた下でデコーディングを行います。最近では、次の講義で紹介するTransformerのようなネットワークが、言語翻訳のタスクでこの方法を上回るパフォーマンスを発揮しています。このタイプのアーキテクチャは、約2年前(2018年)に最先端として使われていました。 + + + + +
+
+図10: Seq to Vec to Seq +
+ +潜在空間に対してPCAを行うと、このグラフのように意味でグループわけされた単語が得られます。 + +
+
+図11: PCAの後に意味でグループわけされた単語 +
+ +詳しく見てみると、同じ場所に1月と11月のようにすべての月があることがわかります。 +
+
+図12: 単語グループを拡大する +
+ +別の場所に焦点を当てると、「数日前」「数ヶ月後」などのフレーズが出てきます。 +
+
+図13: 他の場所の単語のグループ +
+ + + +これらの例から、異なる場所が特定の共通の意味を持っていることがわかります。 + +図14は、この種のネットワークを学習することで、どのように意味論的な特徴を拾っていくかを示しています。この例では、男性と女性を結ぶベクトルと、王様と王妃を結ぶベクトルがあることがわかります。この埋め込み空間では、男性と女性のようなケースに適用しても、同じ距離が得られます。もう一つの例は、「歩いている」が「歩いた」になり、「泳いでいる」が「泳いだ」になります。あなたは常にこの種の特定の線形変換を、ある単語から別の単語へ、または国から首都へ行うことができます。 + + +
+
+図4: 学習中に選ばれた意味的な特徴表現 +
+ + +最後となる4番目のケースは、シーケンスからシーケンスへの変換です。このネットワークでは、入力を受け取ると、出力を生成し始めます。このタイプのアーキテクチャの例としては、T9が挙げられます。他の例としては、キャプションへの音声変換があります。良い例としては、このRNN-writerがあります。"the rings of Saturn glittered while "と入力し始めると、次のような "two men looked at each other "を提案してくれます。このネットワークはいくつかのSF小説で訓練されたもので、何かを入力するだけで、本を書くのに役立つ提案をしてくれるようになっています。もう一つの例を図16に示します。一番上のプロンプトを入力すると、このネットワークは残りの部分を完成させようとします。 + + + + +
+
+図5: Seq to Seq +
+ +
+
+図16: Seq to Seq な文書入力自動補完モデル +
+ + +## [Back Propagation through time](https://www.youtube.com/watch?v=8cAffg2jaT0&t=855s) + + + +### モデルアーキテクチャー + + +RNNを学習するためには、backpropagation through time(BPTT)を用いる必要があります。RNNのモデルアーキテクチャを下図に示します。左の図はループ表現を用いたもので、右の図はループを時間の経過とともに1行に展開したものです。 + + +
+
+図17: Back Propagation through time +
+ + +隠れ表現は次のように表現されます + +$$ +\begin{aligned} +\begin{cases} +h[t]&= g(W_{h}\begin{bmatrix} +x[t] \\ +h[t-1] +\end{bmatrix} ++b_h) \\ +h[0]&\dot=\ \boldsymbol{0},\ W_h\dot=\left[ W_{hx} W_{hh}\right] \\ +\hat{y}[t]&= g(W_yh[t]+b_y) +\end{cases} +\end{aligned} +$$ + + +最初の式は、スタックされた入力の回転に非線形関数を適用したもので、隠れ層の前の設定が付加されています。式を簡単にするために、$W_h$は、$\left[ W_{hx}\ W_{hh}\right]$の2つの行列として書くことができるので、以下のように書くことができます。 + +$$ +W_{hx}\cdot x[t]+W_{hh}\cdot h[t-1] +$$ + + +これは入力のスタックされた表現に一致します。 + + +$y[t]$は最終的な回転操作のところで計算され、その後、連鎖律を使用して、誤差を前回の時間ステップに逆伝播することができます。 + + +### 言語モデリングをバッチ化する + + +記号のシーケンスを扱う場合、テキストを異なるサイズにバッチ化して処理することができます。例えば、次の図のようなシーケンスを扱う場合、時間領域が垂直方向に保存されているところでは、最初の部分をバッチ化することができます。この場合、バッチサイズは4に設定されます。 + + +
+
+図18: バッチ化 +
+ + +BPTT期間$T$を3とすると、RNNの最初の入力$x[1:T]$と出力$y[1:T]$は次のように決定されます。 + +$$ +\begin{aligned} +x[1:T] &= \begin{bmatrix} +a & g & m & s \\ +b & h & n & t \\ +c & i & o & u \\ +\end{bmatrix} \\ +y[1:T] &= \begin{bmatrix} +b & h & n & t \\ +c & i & o & u \\ +d & j & p & v +\end{bmatrix} +\end{aligned} +$$ + + +最初のバッチでRNNを行う場合、まず、$x[1] = [a\ g\ m\ s]$をRNNに与え、$y[1] = [b\ h\ n\ t]$となるように強制的に出力します。隠れ表現$h[1]$を次の時間ステップに送り、RNNが$x[2]$から$y[2]$を予測するのを助けます。$x[T]$と$y[T]$の最終集合に$h[T-1]$を送り込んだ後、$h[T]と$h[0]$の両方の勾配を伝搬する処理をカットして、勾配が無限に伝搬しないようにします(.detach() in Pytorch)。全体の処理を下図に示します。 + + +
+
+図19: バッチ化 +
+ + + +## 勾配消失と勾配爆発 + + +### 問題 + + +
+
+図20: 勾配消失 +
+ + + +上の図は典型的なRNNのアーキテクチャです。RNNで前のステップの回転を行うために、上のモデルでは横向きの矢印と見なすことができる行列を使っています。行列は出力の大きさを変えることができるので、選択する行列式が1よりも大きいと、時間の経過とともに勾配が膨らみ、勾配爆発を起こしてしまいます。相対的に言えば、我々が選択する固有値が0を挟んで小さい場合、伝播過程は勾配を収縮させ、勾配消失につながります。 + +典型的なRNNでは、勾配はすべての可能な矢印を通って伝搬され、勾配が消失または爆発する大きなチャンスを提供します。例えば、時刻1の勾配は大きく、明るい色で示されています。それが1回転すると、勾配は大きく縮小し、時刻3では殺されてしまいます。 + + +### 解 + +An ideal to prevent gradients from exploding or vanishing is to skip connections. To fulfill this, multiply networks can be used. +勾配爆発や消失を防ぐための理想的な方法は、接続をスキップすることです。これを実現するために、乗算ネットワークを使用することができます。 + + +
+
+図21: スキップ接続 +
+ + + +上記の場合、元のネットワークを4つのネットワークに分割します。最初のネットワークを例に考えてみましょう。このネットワークは、時刻1に入力から値を取り込んで、その出力を隠れ層の最初の中間状態に送ります。この状態には、他に3つのネットワークがあり、ここでは、$-$が伝搬を阻止し、$\circ$が勾配を通過させます。このような手法をgatedリカレントネットワークと呼びます。 + +LSTMはgatedリカレントネットワークの一つですが、以下の節で詳しく紹介します。 + + +## [Long Short-Term Memory](https://www.youtube.com/watch?v=8cAffg2jaT0&t=1838s) + + + +### モデルアーキテクチャ + + +以下はLSTMを表す式です。入力ゲートは黄色のボックスで強調されていますが、これはアフィン変換になります。この入力変換は $c[t]$ を乗算したもので、これが候補ゲートとなります。 + + +
+
+図22: LSTMのアーキテクチャ +
+ + + +忘却ゲートは、セルメモリの前の値$c[t-1]$に乗算されます。セルの合計値 $c[t]$ は、忘却ゲート + 入力ゲートです。最終的な隠れ表現は、出力ゲート$o[t]$とセルのtanhである$c[t]$との間の要素毎の掛け算です。最後に、候補ゲート $\tilde{c}[t]$ は、単純にリカレントネットです。つまり、出力を変調するための $o[t]$、忘れないようにするための $f[t]$、入力ゲートを変調するための $i[t]$があります。これらのメモリとゲートの間の相互作用は、すべて乗算的な相互作用です。i[t]$、$f[t]$、$o[t]$は、すべて0から1に向かうシグモイドです。したがって、ゼロに乗算すると、閉じたゲートになります。1を掛けると開いたゲートになります。 + +出力をオフにするにはどうすれば良いでしょうか?紫色の内部表現 $th$ を持ち、出力ゲートにゼロを入れたとします。そうすると、出力は何か掛けるゼロになります。出力ゲートに1を入れると、紫色の内部表現と同じ値が得られます。 + + + +
+
+図23: LSTMのアーキテクチャ - 出力オン +
+ +
+
+図24: LSTMのアーキテクチャ - 出力オフ +
+ + +同様に、メモリを制御することもできます。例えば、$f[t]$と$i[t]$をゼロにすることで、メモリをリセットすることができます。乗算と和の後、メモリの中にゼロが入ります。そうでなければ、内部表現 $th$ をゼロにしたまま、$f[t]$ の中に 1 を入れておくことで、メモリを保持することができます。したがって、和は $c[t-1]$ を得て、それを送り出し続けます。最後に、入力ゲートで1を取得し、乗算が紫色になり、忘却ゲートで0を設定して、実際に忘れてしまうように書くことができます。 + + + + +
+
+図25: メモリセルの可視化 +
+ +
+
+図26: LSTMのアーキテクチャ - メモリのリセット +
+ +
+
+図27: LSTMのアーキテクチャ - メモリの保持 +
+ +
+
+図28: LSTMのアーキテクチャ - メモリの書き込み +
+ + + + +## Notebookの例 + + +### シーケンスの分類 + + +目的は,シーケンスを分類することです。要素とターゲットは、局所的に表現されます(0 以外のビットが 1 つだけの入力ベクトル)。シーケンスは、は`B`で始まり,`E`(「トリガーシンボル」)で終わります。それ以外の場合は、$t_1$と$t_2$の1の要素を除いた、集合 `{a, b, c, d}` の中からランダムに選ばれたシンボルで構成されます。`DifficultyLevel.HARD` の場合、配列の長さは100〜110の間でランダムに選ばれ、$t_1$ は10〜20の間でランダムに選ばれ、$t_2$ は50〜60の間でランダムに選ばれます。配列には、`Q`, `R`, `S`, `U` の4つのクラスがあり、これは`X`, `Y` の時間的順序に依存します。次のようなルールです。:`X, X -> Q`; `X, Y -> R`; `Y, X -> S`; `Y, Y -> U` + +1). データセット探索 + +データ生成器からの戻り値の型は、長さ2のタプルです。 タプルの最初の項目は、$(32, 9, 8)$の形をしたシーケンスのバッチです。これがネットワークに投入されるデータです。各行には8つの異なるシンボル(`X`, `Y`, `a`, `b`, `c`, `d`, `B`, `E`)があります。各行は1つのホットベクトルです。行のシーケンスはシンボルのシーケンスを表します。最初の全ての要素がゼロの行はパディングです。シーケンスの長さがバッチの最大長よりも短い場合にパディングを使用します。 タプルの2番目の項目は、4つのクラス(`Q`, `R`, `S`, `U`)があるので、シェイプが$(32, 4)$の対応するクラスラベルのバッチです。最初のシーケンスは `BbXcXcbE` です。すると、そのデコードされたクラスラベルは $[1, 0, 0, 0]$ であり、`Q`に対応します。 + + + +
+
+図29: 入力ベクトルの例 +
+ + + + + 2). モデルの定義と訓練 + +単純なリカレントネットワーク、LSTMを作成し、10エポック訓練してみましょう。訓練のループでは、常に5つのステップを行います。 + + * モデルの順伝播を実行する + * 損失を計算する + * 勾配のキャッシュをゼロにする + * 誤差逆伝播によってパラメータに関しての損失の偏微分を計算する + * 勾配の反対方向にステップを踏む + + +
+
+図30: 単純なRNN vs LSTM - 10エポック +
+ + +10エポック後に、簡単なタスクでは、RNNは50%の精度を得るのに対し、LSTMは100%の精度を得ることができます。しかし、LSTMはRNNの4倍の重みを持っており、2つの隠れ層を持っているので、公平な比較ではありません。100エポック後のRNNの精度も100%となりますが、LSTMよりも学習に時間がかかります。 + + +
+
+図31: 単純なRNN vs LSTM - 100エポック +
+ + +タスクの難易度を上げる(長いシーケンスを使う)と、LSTMが学習し続けている間にRNNが失敗することがわかります。 + + + +
+
+図32: 隠れ状態の値の可視化 +
+ + +上の可視化は、LSTMにおける隠れ状態の時間変化を描いたものです。入力が$-2.5$以下であれば$-1$に、$2.5$以上であれば$1$にマップされるように、tanhを通して入力を送ります。つまり、この場合、特定の隠れ層が `X` (図の5行目) にピックされて、もう1つの `X` を得るまで赤くなっていることがわかります。つまり、セルの5番目の隠れユニットは、`X`を観察すると活性化し、他の`X`を見た後は静かになるということです。これにより、シーケンスのクラスを識別することができます。 + + + +### 信号のエコー + + + +信号のnステップのエコー処理は、同期化された多対多のタスクの一例です。例えば、第1入力シーケンスは `"1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 ..."` であり、第1ターゲットシーケンスは ``"0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 ..."` です。この場合、出力は3ステップ後になります。つまり、情報を保持するためには短時間のワーキングメモリが必要となります。一方、言語モデルでは、まだ言われていないことを言っています。 + + +シーケンス全体をネットワークに送り、最終的なターゲットを何かに強制する前に、長いシーケンスを小さなチャンクにカットする必要があります。新しいチャンクを送りながら、隠れ状態を追跡し、次の新しいチャンクを追加するときに内部状態への入力として送る必要があります。LSTMでは、十分な容量があれば長時間メモリを保持することができます。RNNでは、一定の長さに達すると過去のことを忘れ始めます。 diff --git a/docs/ja/week06/06.md b/docs/ja/week06/06.md new file mode 100644 index 000000000..942e62155 --- /dev/null +++ b/docs/ja/week06/06.md @@ -0,0 +1,27 @@ +--- +lang-ref: ch.06 +title: Week 6 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + +## レクチャーパートA + + +畳み込みニューラルネットワークの3つの応用について議論しました。まず、数字認識から始まり、5桁の郵便番号認識への応用についてお話しました。物体検出では、顔検出の設定でマルチスケールアーキテクチャをどのように利用するかを話しました。最後に、ロボット視覚システムと都市環境における物体セグメンテーションの具体例を用いて、セマンティックセグメンテーションタスクに畳み込みニューラルネットがどのように利用されているかを見ました。 + + + +## レクチャーパートB + + +リカレントニューラルネットワークとその問題点、およびこれらの問題点を緩和するための一般的な技術を検討します。 次に、Attention、GRU(Gated Recurrent Unit)、LSTM(Long Short-Term Memory)、Seq2Seqなど、RNNモデルの問題を解決するために開発された様々なモジュールをおさらいします。 + + + +## 演習 + + +通常のRNNモデルとLSTMモデルのアーキテクチャを議論し、両者の性能を比較しました。LSTMはRNNの長所を継承しつつ、RNNの弱点を改善し、情報を長時間メモリに格納する「メモリセル」を含むことで、RNNモデルの性能を大幅に向上させています。LSTMモデルはRNNモデルを大きく凌駕しています。 diff --git a/docs/ja/week07/07-1.md b/docs/ja/week07/07-1.md index 3df55938d..33b0d84c6 100644 --- a/docs/ja/week07/07-1.md +++ b/docs/ja/week07/07-1.md @@ -193,7 +193,11 @@ $$ 上の$F_\beta(x, y)$の定義では、$P(y \mid x)$は単にギブス・ボルツマン式の応用であり、$z$はこの中で暗黙のうちに周辺化されています。 物理学者はこれを「自由エネルギー」と呼んでおり、そのため私たちもこれを$F$と呼んでいます. つまり、$e$がエネルギーで、$f$が自由エネルギーということになります。 +<<<<<<< HEAD +***Question: Can you elaborate on the advantage that energy-based models give? In probability-based models, you can also have latent variables, which can be marginalized over.*** +======= +>>>>>>> master ***質問:エネルギーベースのモデルが与える利点についてもう少し詳しく教えてくださいませんか? 確率ベースのモデルでも潜在変数を持つこともできますし、それについて周辺化することもできると思います。*** @@ -205,7 +209,11 @@ $$ +<<<<<<< HEAD +これは、*x*と*y*の間の依存関係を捉えるためのエネルギー関数です。 いわば山脈のようなものです。 谷は黒い点(これらはデータポイントです)があるところで、周囲には山があります。 さて、これを使って確率モデルを学習する場合、点が実際に無限に薄い多様体上にあると想像してみてください。 つまり黒い点のデータ分布は、実際にはただの線であり、その中の3つの点がある状況です。 実際には線には幅はありません。 ですから、もしあなたがこの上で確率モデルを訓練した場合、密度モデルは、この多様体上にいるときに多様体上にいることを教えてくれるはずです。 この多様体上では、密度は無限大で、その外側に$varepsilon$離れただけで密度はゼロになるはずです。 それがこの分布の正しいモデルでしょう。 密度が無限大であるだけでなく、[xとy]の上での積分が1でなければなりません。 これをコンピュータ上で実装するのは非常に難しいです。 それだけでなく、基本的に不可能です。例えば、ある種のニューラルネットを使ってこの関数を計算したいとしましょう -- そのニューラルネットは無限の重みを持たなければならず、全領域にわたるシステムの出力の積分が1になるように調整されなければなりません。 これは基本的に不可能です。 この特定のデータの例のための正確で正しい確率モデルは不可能です。 これが最尤法が求めるものであり、これを計算できるコンピュータは世界中に存在しません。 ですから、実際には、面白くもなんともありません。 この例についての完全な密度モデルを持っていたと想像してみてください。それはその(x, y)空間内の薄い板であり、推論することはできません。もし私がxの値を与えて、「yの最良の値は何ですか?」と聞いても、それはわからないでしょう。なぜなら,ゼロ確率の集合以外のyの値はすべてゼロの確率を持っていて、とりうる可能な値はわずかしかないからです。例えば、これらのxの値について、 +======= これは、*x*と*y*の間の依存関係を捉えるためのエネルギー関数です。 いわば山脈のようなものです。 谷は黒い点(これらはデータポイントです)があるところで、周囲には山があります。 さて、これを使って確率モデルを学習する場合、点が実際に無限に薄い多様体上にあると想像してみてください。 つまり黒い点のデータ分布は、実際にはただの線であり、その中の3つの点がある状況です。 実際には線には幅はありません。 ですから、もしあなたがこの上で確率モデルを訓練した場合、密度モデルは、この多様体上にいるときに多様体上にいることを教えてくれるはずです。 この多様体上では、密度は無限大で、その外側に$\varepsilon$離れただけで密度はゼロになるはずです。 それがこの分布の正しいモデルでしょう。 密度が無限大であるだけでなく、[xとy]の上での積分が1でなければなりません。 これをコンピュータ上で実装するのは非常に難しいです。 それだけでなく、基本的に不可能です。例えば、ある種のニューラルネットを使ってこの関数を計算したいとしましょう -- そのニューラルネットは無限の重みを持たなければならず、全領域にわたるシステムの出力の積分が1になるように調整されなければなりません。 これは基本的に不可能です。 この特定のデータの例のための正確で正しい確率モデルは不可能です。 これが最尤法が求めるものであり、これを計算できるコンピュータは世界中に存在しません。 ですから、実際には、面白くもなんともありません。 この例についての完全な密度モデルを持っていたと想像してみてください。それはその(x, y)空間内の薄い板であり、推論することはできません。もし私がxの値を与えて、「yの最良の値は何ですか?」と聞いても、それはわからないでしょう。なぜなら,ゼロ確率の集合以外のyの値はすべてゼロの確率を持っていて、とりうる可能な値はわずかしかないからです。例えば、これらのxの値について、 +>>>>>>> master

diff --git a/docs/ja/week08/08-1.md b/docs/ja/week08/08-1.md new file mode 100644 index 000000000..d8066f5a7 --- /dev/null +++ b/docs/ja/week08/08-1.md @@ -0,0 +1,209 @@ +--- +lang-ref: ch.08-1 +lecturer: Yann LeCun +title: Contrastive Methods in Energy-Based Models +authors: Vishwaesh Rajiv, Wenjun Qu, Xulai Jiang, Shuya Zhao +date: 23 Mar 2020 +lang: ja +translation-date: 28 Nov 2020 +translator: Jesmer Wong +--- + + + +## [要約](https://www.youtube.com/watch?v=ZaVP2SY23nc&t=5s) + + + +LeCun博士は、最初の約15分間で、エネルギーベースのモデル(EBM)のレビューを行いました。この明細、特に対照学習法の概念については、先週(第7週のメモ)を参照してください。 + + +前回の講義から学んだように、学習方法には主に2つのクラスがあります。 + + + +1.コントラスト方法はトレーニング・データポイントのエネルギー$ F(x_i、y_i)$を押し下げ、他のすべてのエネルギー$ F(x_i、y ’)$を押し上げること。 +2.アーキテクチャ手法は正則化を適用することによって低エネルギー領域を最小化/制限したエネルギー関数$ F $を構築すること。 + +To distinguish the characteristics of different training methods, Dr. Yann LeCun has further summarized 7 strategies of training from the two classes mention before. One of which is methods that are similar to Maximum Likelihood method, which push down the energy of data points and push up everywhere else. + +さまざまなトレーニング方法の特徴を区別するために、LeCun博士は、前述の2つのクラスから7つのトレーニング戦略をさらに分けるようにします。 + +その1つは、データポイントのエネルギーを押し下げ、他のすべてのところを押し上げる、つまり最尤法に似た方法です。 + + + +最尤法は、トレーニング・データポイントでエネルギーを確率的に押し下げ、$ y ’\ neq y_i $の他のすべての値を他のすべての場所に押し下げます。 +最尤法は、エネルギーの絶対値を「ケア」のではなく、エネルギー間の差を「ケア」するだけです。 +確率分布は常に合計で1になるように正規化されているため、任意の2つのデータポイント間の比率を比較する方が、単に絶対値を比較するよりも便利です。 + +## [Contrastive methods in self-supervised learning](https://www.youtube.com/watch?v=ZaVP2SY23nc&t=613s) +## [自己教師あり学習のコントラスト的な方法](https://www.youtube.com/watch?v=ZaVP2SY23nc&t=613s) + + +コントラストな方法では、観測されたトレーニング・データポイント($ x_i $、$ y_i $)のエネルギーを押し下げ、トレーニングデータ多様体以外のポイントのエネルギーを押し上げます。 + + +自己教師あり学習では、入力の一部を使用して他の部分を予測します。このモデルが教わるタスクのモデルに合わせるコンピュータービジョンの優れた機能を生みだされることだろう。 + + +研究者によりますと、コントラストな埋め込み方法を自己教師あり学習モデルに適用すると、教師ありモデルに匹敵する優れたパフォーマンスが得られることを実証的に発見しました。これらの方法のとその結果を以下で説明します。 + + +###コントラスト的な埋め込み + + +$ x $が画像で、$ y $がそのコンテンツの変換(回転、倍率、トリミングなど*)しても$ x $を保持できるであるようなペア($ x $、$ y $)について考えてみましょう。これは**ポジティブペア**と呼びます。 + +
+
+ +Fig. 1: ポジティブペア +
+ + + +概念的には、コントラスト的な埋め込み方法は畳み込みネットワークを使用し、このネットワークを介して$ x $と$ y $を入力して、$ h $と$ h '$の2つの特徴ベクトルを取得します。 $ x $と$ y $の内容は同じであるため(*つまり*ポジティブペア)、それらの特徴ベクトルをできるだけ類似させたいと考えています。 +その結果、類似性メトリック(コサイン類似性など)と損失関数を選択し、$ h $と$ h '$の間の類似性を最大化するようにます。これで、トレーニングデータ多様体上の画像のエネルギーが押し下げられます。 + +
+
+Fig. 2: Negative Pair +
+ + + +ただし、この多様体以外の点のエネルギーも押し上げる必要があります。そのため、**ネガティブサンプル($ x _ {\ text {neg}} $、$ y _ {\ text {neg}} $)、異なったコンテンツ(異なるクラスラベルなど)の画像も生成します。これらを上記のネットワークに入力し、特徴ベクトル$ h $と$ h '$を取得して、それらの間の類似性を最小限に抑えようとします。 + + + +この方法では、類似したペアのエネルギーを押し下げながら、異なるペアのエネルギーを押し上げることができます。 + + + +最近の結果(ImageNet)は、この方法が、教師あり方法で学習した機能に匹敵する、オブジェクト認識に適した機能を生成できることを示しています。 + + +### Self-Supervised Results (MoCo, PIRL, SimCLR) +###自己監視結果(MoCo、PIRL、SimCLR) + +
+
+Fig. 3: PIRL and MoCo on ImageNet +
+ + +上の図に示されているように、MoCoとPIRLはSOTAの結果を達成します(特に、パラメーターの数が少なくスケールが小さいモデルで使う場合)。 PIRLは、学習タスクありベースラインの上位1の線形精度(〜75%)に近づき始めています。 + + +PIRLは、その目的関数であるNCE(ノイズ・コントラスティブ・推定量)を次のように理解していきましょう。 + + +$$ +h(v_I,v_{I^t})=\frac{\exp\big[\frac{1}{\tau}s(v_I,v_{I^t})\big]}{\exp\big[\frac{1}{\tau}s(v_I,v_{I^t})\big]+\sum_{I'\in D_{N}}\exp\big[\frac{1}{\tau}s(v_{I^t},v_{I'})\big]} +$$ + +$$ +L_{\text{NCE}}(I,I^t)=-\log\Big[h\Big(f(v_I),g(v_{I^t})\Big)\Big]-\sum_{I'\in D_N}\log\Big[1-h\Big(g(v_{I^t}),f(v_{I'})\Big)\Big] +$$ + + +ここでは、コサイン類似性で2つの特徴マップ/ベクトル間の類似性メトリックを定義します。 + + + + +PIRLの違いは、畳み込み特徴を抽出することで直接出力を使用しないことです。代わりに、異なる_heads_ $ f $と$ g $を定義します。これらは、基本畳み込み特徴抽出器の上にある独立層としてと考えるでしょう。 + + + + +すべてをまとめると、PIRLのNCE目的関数は次のように示します。ミニバッチでは、1つのポジティブ(類似した)ペアと多くのネガティブ(異なる)ペアがあります。次に、ミニバッチ内のなかに変換された画像の特徴ベクトル($ I ^ t $)と残りの特徴ベクトル(1つは正、残りは負)の間の類似性を計算します。次に、ポジティブペアのソフトマックスのような関数のスコアを計算します。ソフトマックススコアを最大化することは、残りのスコアを最小化することと同じであり、これはエネルギーベースのモデルに必要なことです。したがって、最終な損失関数を使用すると、類似したペアでエネルギーを押し下げ、異なるペアでエネルギーを押し上げるモデルを構築できます。 + + + +LeCun博士は、これを機能させるには、多数のネガティブサンプルが必要であると述べています。 SGDでは、ミニバッチからのこれらのネガティブサンプルを一貫して維持することが難しい場合があります。したがって、PIRLはキャッシュされたメモリバンクも使用します。 + + + +**質問**: なぜL2-ノルムよりコサイン類似度を使用するのですか? +回答:L2ノルムでは、ベクトル間の部分差の2乗の合計にすぎないため、 +2つのベクトルを「短く」(中心に近い)にすることで類似させることや、2つのベクトルを非常に「長く」(中心から遠ざける)することで非類似にすることは非常に簡単です。 +したがって、コサイン類似度を使用すると、システム上、ベクトルを短くしたり長くしたりすることで、「カーニング」をせずに適切な解を見つけることができます。 + + +### SimCLR + +
+
+Fig. 4: SimCLR Results on ImageNet +
+ + + +SimCLRは、上記方法よりも優れた結果が達成できます。これが、ImageNetの教師あり学習方法のパフォーマンスに達し、ImageNetの線形精度はトップ1になります。この手法では、高度なデータ拡張方法を使用して類似したペアを生成し、TPUで長時間(非常に大きなバッチサイズで)トレーニングを行います。 + +SimCLRは、ある程度、コントラスト的な方法の限界を示していることはLeCun博士がそれを信じています。高次元空間には、データ多様体よりも実際に高いことを確認するためにエネルギーを押し上げる必要がある多くの領域があります。また、表現の次元を増やせば増やすほど、マニフォールド上にない場所でエネルギーが高くなるようにするため、多くのネガティブ負のサンプルが必要になります。 + + +## [Denoising autoencoder](https://www.youtube.com/watch?v=ZaVP2SY23nc&t=1384s) +## [オートエンコーダのノイズ除去] + + + +先週の講義により、オートエンコーダのノイズ除去について説明しました。このモデルは、破損した入力を元の入力に再構築することにより、データの表現を学習する傾向があります。特に、破損したデータがデータ多様体から離れるにつれて二次で成長したエネルギー関数を生成するようにそのシステムをトレーニングします。 + + +
+
+Fig. 5: Architecture of denoising autoencoder +
+ + + + +###問題 + +ただし、オートエンコーダのノイズ除去にはいくつかの問題があります。 1つの問題は、高次元の連続空間では、データの一部を破損する無数の方法があることです。したがって、さまざまな場所を押し上げるだけでエネルギー関数を形成できるという保証はありません。 +モデルのもう1つの問題は、潜在変数がない画像を処理するときにパフォーマンスが低下することです。画像を再構成する方法はたくさんあるので、システムはさまざまな予測を生成し、特に優れた特徴を学習しません。さらに、マニフォールドの中央にある破損したポイントは、両側に再構築できます。これにより、エネルギー関数にフラットスポットが作成され、全体的なパフォーマンスに影響します。 + + + + +##他のコントラスト的な方法 + +コントラスト的な発散、比率マッチング、ノイズのコントラスティブな推定、最小確率フローなど、他のコントラスト的な方法があります。こちらにコントラスト的な発散の基本的な考え方について簡単に説明します。 + + + +###コントラスト的な発散 + +対照的発散(CD)は、入力サンプルをスマートに破損することによって表現を学習する別のモデルです。連続空間では、最初にトレーニングサンプル$ y $を選択し、そのエネルギーを下げます。そのサンプルでは、​​ある種の勾配ベースのプロセスを使用して、ノイズとともにエネルギーを押し下げます。入力空間が離散的である場合、代わりにトレーニングサンプルをランダムに摂動させてエネルギーを変更できます。 +得るエネルギーが低ければ維持して、そうではないと、ある程度の確率で破棄します。これをやり続けると、最終的に$ y $のエネルギーが低下できます。次に、$ y $と対照的なサンプル$ \ bar y $を損失関数と比較することにより、エネルギー関数のパラメーターを更新できます。 + + + +###持続的なコントラストな発散 + +コントラスト的な発散(CD)からの改良したものは、持続的なコントラスト的な発散です。システムは一連の「粒子」を使用し、それらの位置を記憶します。これらの粒子は、通常のCDで行ったのと同じように、エネルギー的に下に移動します。最終的に、この粒子らはエネルギー面で低エネルギーの場所を見つけ、それらを押し上げさせます。ただし、次元が増加するにつれて、システムは適切にスケーリングされません。 \ No newline at end of file diff --git a/docs/ja/week08/08-2.md b/docs/ja/week08/08-2.md new file mode 100644 index 000000000..ea9b6edb9 --- /dev/null +++ b/docs/ja/week08/08-2.md @@ -0,0 +1,234 @@ +--- +lang-ref: ch.08-2 +lecturer: Yann LeCun +title: Regularized Latent Variable Energy Based Models +authors: Henry Steinitz, Rutvi Malaviya, Aathira Manoj +date: 23 Mar 2020 +lang: ja +translation-date: 28 Nov 2020 +translator: Jesmer Wong +--- + + +## [Regularized latent variable EBMs](https://www.youtube.com/watch?v=ZaVP2SY23nc&t=2233s) +## [正則化された潜在変数EBM] + + +詳細については、前の講義のメモを参照してください。 + + + +だが、潜在変数$ z $が最終予測$ \ overline {y} $を生成する際に表現力が大きすぎる場合、任意の真の出力$ y $は、適切に選択された$ z $を使用して入力$ x $から完全に再構築されます。 +これは、推論中にエネルギーが$ y $と$ z $の両方で最適化されるため、エネルギー関数はどこでも0になります。 +そこで解決策は、潜在変数$ z $の情報容量を制限することです。ある1つの方法は、潜在変数を正則化することです。 + + +$$E(x,y,z) = C(y, \text{Dec}(\text{Pred}(x), z)) + \lambda R(z)$$ + + + +この方法では、$ z $の空間のボリュームが小さな値で制限され、その値によって、エネルギーの低い$ y $の空間が制御されます。 +$ \ lambda $の値は、このトレードオフを制御します。 $ R $の有用な例は、$ L_1 $ノルムです。これは、ほとんどにどこでも微分可能な有効次元の近似計算と見なすことができます。 $ L_2 $ノルムを制限しながら$ z $にノイズを追加すると、情報コンテンツ(VAE)も制限される可能性があります。 + + + +###スパースコーディング + +スパースコーディングは、区分的線形関数でデータを近似化しようとする無条件の正則化潜在変数EBMの例です。 + +$$E(z, y) = \Vert y - Wz\Vert^2 + \lambda \Vert z\Vert_{L^1}$$ + + + +$ n $次元のベクトル$ z $は、ゼロ以外の成分ベクトルの最大数$ m << n $を持つ傾向があります。よって、各$ Wz $は、$ W $の$ m $列のスパンの要素になります。 +各最適化ステップの後、マトリクス$ W $と潜在変数$ z $は、$ W $の列の$ L_2 $ノルムの合計によって正規化されます。これにより、$ W $と$ z $が無限大とゼロに発散しないことが保証されます。 + +### FISTA + +
+
+Fig. 2: FISTA computation graph +
+ + + +FISTA(高速ISTA)は、2つの項$ \ Vert y-Wz \ Vert ^ 2 $と$ \ lambda \ Vert z \ Vert_ {L ^ 1} $。を交互に最適化することにより、$ z $に関してスパースコーディングエネルギー関数$ E(y、z)$を最適化するアルゴリズムです。 $ Z(0)$を初期化し、次のルールに従って$ Z $を繰り返し更新します。 + +$$z(t + 1) = \text{Shrinkage}_\frac{\lambda}{L}(z(t) - \frac{1}{L}W_d^\top(W_dZ(t) - y))$$ + + + +この式$ Z(t)-\ frac {1} {L} W_d ^ \ top(W_dZ(t)-Y)$は、$ \ Vert y-Wz \ Vert ^ 2 $項の勾配ステップです。次に、$ \ text {Shrinkage} $関数は、値を0へずらします。これにより、$ \ lambda \ Vert z \ Vert_ {L_1} $項が最適化されます。 + +### LISTA + + + +FISTAは、高次元データの大規模なセット(*例* 画像)に適用するにはコストでかかりすぎます。それをより効率的にする1つの方法は、代わりに最適なやりかたは潜在変数$ z $を予測するようにネットワークをトレーニングすることです。 + +
+
+Fig. 3: EBM with latent variable encoder +
+ +潜在変数エンコーダーを備えたEBM + + + +このアーキテクチャのエネルギーには、追加の項とした予測潜在変数$ \ overline z $と最適潜在変数$ z $の差を測定することが含まれます。 + +$$ C(y, \text{Dec}(z,h)) + D(z, \text{Enc}(y, h)) + \lambda R(z)$$ + + +さらに下記のように定義します + +$$W_e = \frac{1}{L}W_d$$ + +$$S = I - \frac{1}{L}W_d^\top W_d$$ + + +そして + +$$z(t+1) = \text{Shrinkage}_{\frac{\lambda}{L}}[W_e^\top y - Sz(t)]$$ + + + +この更新ルールはリカレントネットワークで解釈できます。よりに効率的なやりかたというと、潜在変数$ z $を繰り返し決定するパラメーター$ W_e $ということで代わりに学習できることです。ネットワークは一定数のタイムステップ$ K $で実行され、$ W_e $の勾配は一般な通時的誤差逆伝播法を使用して計算されます。トレーニングされたネットワークは、FISTAアルゴリズムよりも少ない繰り返し積算で適切な$ z $を生成します。 + +
+
+Fig. 4: LISTA as a recurrent net unfolded through time. +
+ + + + +###スパースコーディングの例 + +256次元の潜在ベクトルを持つスパースコーディングシステムでMNISTの手書き数字データセットに適用されると、システムは、この256ストロークのセットを線形結合でトレーニングセット全体をほぼ再現できるように学習します。スパース正則化により、少数のストロークから再現できるように保証されます。 + +
+
+Fig. 5: Sparse coding on MNIST. Each image is a learned column of $W$. +
+MNISTでのスパースコーディング。各画像は$ W $の学習済み列です。 + + + +スパースコーディングシステムが一般な画像をパッチでトレーニングされる場合、学習される特徴は、方向付けエッジであるガボールフィルターです。これらの機能は、動物の視覚系の初期の部分で学習された機能に似ています。 + + +### [Convolutional sparse coding](https://www.youtube.com/watch?v=ZaVP2SY23nc&t=4066s) +### [畳み込みスパースコーディング] + + + +仮に画像とその画像の特徴マップ($ z_1、z_2、\ cdots、z_n $)があるとします。次に、各機能マップをカーネル$ K_i $で畳み込み($ * $)をし、再構成されたものは次のように計算できます。 + + +$$Y=\sum_{i}K_i*Z_i$$ + + + +これは、再構築が$ Y = \ sum_ {i} W_iZ_i $に対して実行された元々のスパースコーディングとはちがいます。通常のスパースコーディングでは、列の重み合計があり、重みは$ Z_i $との係数です。畳み込みスパースコーディングでは、それは同じく線形演算ですが、辞書マトリクスに入ったのもの特徴マップになり、各特徴マップを各カーネルで畳み込みで結果を合計することになります。 + +#### Convolutional sparse auto-encoder on natural images +#### 一般画像に応用した畳み込みスパースオートエンコーダ + +
+
+Fig.6 Filters and Basis Functions obtained. Linear convolutional decoder +
+得られたフィルターと基底関数。線形畳み込みデコーダー + + + +エンコーダーとデコーダーのフィルターは非常によく似ています。エンコーダーは、単純な畳み込みと非線形性マップと対角線レイヤーでスケーリングとした形です。次に、コードの制約にスパース性があります。デコーダーのほうは単純に畳み込み線形デコーダーであり、二乗誤差をここに再構成されるのです。 + + + +もし、フィルターが1つしかない場合は、中心に囲まれるタイプというフィルターの形になります。 2つのフィルターを使用すると、変な形のフィルターをいくつか取得できます。 4つのフィルターを使用すると、方向付けエッジフィルター(水平および垂直)とフィルターごとに2つの極性が得られます。 8つのフィルターを使用すると、8つの異なる方向で方向付けエッジを取得できます。 16を使用すると、中心に沿ってより多くの方向性が得られます。フィルター数を増やしていくと、エッジ検出器に加えてより多様なフィルターが得られ、またさまざまな方向、中心としたグレーティング検出器なども得られます。 + + + +この現象は、わたしたちの視覚野で観察されているとよく似ているため、興味深いようです。これで、完全に教師なしの方法で本当に優れた機能を学習できることを示しています。 + + + +別の使用法として、これらの特徴を畳み込みネットワークに接続してから何かのトレーニングする場合、とくにイメージネットで最初からトレーニングするよりも必ずしも良い結果が得られないが、パフォーマンスの向上に役立つ場合がすぐできます。たとえば、サンプルの数が十分に多くない場合やラベル・カテゴリが少ない場合、純粋に教師ありの方法でトレーニングすると特徴が完全に解読できなくなります。 + +
+
+Fig. 7 Convolutional sparse encoding on colour image +
+ + + +上の図は、カラー画像の別の例です。デコードカーネル(右側)のサイズは9 x 9です。このカーネルは、画像ピクセル全体に畳み込みで適用されます。左側の画像は、エンコーダーからのスパースコードです。 $ Z $ベクトルは非常に疎らな空間であり、白または黒(灰色以外)のコンポーネントはほとんどありません。 + +### [Variational autoencoder](https://www.youtube.com/watch?v=ZaVP2SY23nc&t=4371s) +変分オートエンコーダ + + + +変分オートエンコーダは、スパース性を除いて、正則化潜在変数EBMと類似したアーキテクチャを備えています。その違いは、コードの情報内容は、ノイズを多くすることによって制限されるとのことです。 + +
+
+Fig. 8: Architecture of Variational Autoencoder +
+変分オートエンコーダのアーキテクチャ + + + +潜在変数$ z $は、$ z $に対してエネルギー関数を最小化することによって計算されません。代わりに、エネルギー関数の計算は、$ {\ overline z} $とリンクしたコスト関数である対数分布に従ってランダムに$ z $をサンプリングすると見なされます。この分布は、平均値$ {\ overline z} $としたガウス分布であり、これによりガウスノイズが$ {\ overline z} $に追加されることです。 + + + +ガウスノイズが追加されたコードベクトルは、図9(a)に示すようにファジーボールとして視覚化できます。 + +|

(a) Original set of fuzzy balls
|

(b) Movement of fuzzy balls due to energy minimization without regularization
| + +(b)の動き正則化なしのエネルギー最小化によるファジーボール + +
Fig. 9: Effect of energy minimization on fuzzy balls
+ファジーボールに対するエネルギー最小化の効果 + +The system tries to make the code vectors ${\overline z}$ as large as possible so that the effect of $z$(noise) is as small as possible. This results in the fuzzy balls floating away from the origin as shown in Fig. 9(b). Another reason why the system tries to make the code vectors large is to prevent overlapping fuzzy balls, which causes the decoder to confuse between different samples during reconstruction. + +システムは、コードベクトル$ {\ overline z} $をできるだけ大きくして、$ z $(ノイズ)の影響をできるだけ小さくしようとします。これにより、図9(b)に示すように、ファジーボールが原点から離れて浮き上がります。システムがコードベクトルを大きくしようとするもう1つの理由は、ファジーボールのオーバーラップを防ぐためです。これにより、再構成中にデコーダーが異なるサンプル間で混乱する原因になります。 + +But we want the fuzzy balls to cluster around a data manifold, if there is one. So, the code vectors are regularized to have a mean and variance close to zero. To do this, we link them to the origin by a spring as shown in Fig. 10. + +ただし、ファジーボールが存在する場合は、データ多様体の周りにクラスター化する必要があります。したがって、コードベクトルは、平均と分散がゼロに近くなるように正則化されます。これを行うには、図10に示すように、ばねによってそれらを原点にリンクします。 + +
+
+Fig. 10: Effects of regularization visualized with springs +
+バネの正則化の効果を視覚化でみる + + + +バネの強さによって、ファジーボールが原点にどれほど近づくことかが決まるようになります。バネが弱すぎると、ファジーボールが原点から飛び出し、代わりに強すぎると、原点にで崩壊し、エネルギー値が高くなります。これを防ぐために、システムでは、対応するサンプルが類似している場合のみ円球を重なり合わせることになっています。 + +It is also possible to adapt the size of the fuzzy balls. This is limited by a penalty function (KL Divergence) that tries to make the variance close to 1 so that the size of the ball is neither too big nor too small that it collapses. + +ファジーボールのサイズを調整することも可能です。これは、ペナルティ関数(KL Divergence)によって分散値を1に近づけように制限され、ボールのサイズがちょうどいいぐらい調節するようにしています。 diff --git a/docs/ja/week08/08-3.md b/docs/ja/week08/08-3.md new file mode 100644 index 000000000..15173c75f --- /dev/null +++ b/docs/ja/week08/08-3.md @@ -0,0 +1,362 @@ +--- +lang-ref: ch.08-3 +title: Generative Models - Variational Autoencoders +lecturer: Alfredo Canziani +authors: Richard Pang, Aja Klevs, Hsin-Rung Chou, Mrinal Jain +date: 24 March 2020 +lang: ja +translation-date: 28 Nov 2020 +translator: Jesmer Wong +--- + + +### [Recap: Auto-encoder (AE)](https://www.youtube.com/watch?v=7Rb4s9wNOmc&t=155s) + + + +大まかに要約すると、オートエンコーダー (AE) の非常にシンプルなかたちは次のとおりです。 + +-最初に、オートエンコーダーは入力を受け取り、類似性変換を介して隠れた状態にマップします$ \ boldsymbol {h} = f(\ boldsymbol {W} _h \ boldsymbol {x} + \ boldsymbol {b} _h)$、 ここで、$ f $は(要素ごとの)活性化関数です。 これは**エンコーダー** のステージです。 $ \ boldsymbol {h} $は **コード** とも呼ばれます。 +-次に、$ \ hat {\ boldsymbol {x}} = g(\ boldsymbol {W} _x \ boldsymbol {h} + \ boldsymbol {b} _x)$、ここで$ g $は活性化関数です。 これは**デコーダー**ステージです。 + +*詳細な説明については、[第7週]({{site.baseurl}} / en / week07 / 07-3 /)のメモを参照してください。* + + + + +### VAEの背後にある直感と従来のオートエンコーダーとの比較 + +次に、生成モデルの一種である変分オートエンコーダー(またはVAE)を紹介します。なぜ生成モデルさえ気にするのかというと、識別モデルはいくつかの観察を与えられて結果を予測することについて学習しますが、生成モデルはデータ生成プロセスをシミュレーションすることを目的としています。 よって、生成モデルが根本的な因果関係をよりよく理解できることであり、モデルを一般化とされるときより良い結果が達することです。 + +VAEの名前には「オートエンコーダー」(AE)が含まれていますが(オートエンコーダーと構造的またはアーキテクチャ的に類似しているため)、定式上は大きく異なります。以下の*図1 *を参照してください。 + +
+
+Fig. 1: VAE *vs.* Classic AE +
+ + + +**変分オートエンコーダー(VAE)とクラシックオートエンコーダー(AE)の違いは何ですか?** + +VAEの場合: +-最初に、エンコーダーステージ:入力$ \ boldsymbol {x} $をエンコーダーに渡します。 AEで隠れ表現$ \ boldsymbol {h} $(コード)を生成する代わりに、VAEのコードは2種類$ \ mathbb {E}(\ boldsymbol {z})$と$ \ mathbb {V}( \ boldsymbol {z})$があります。ここで、$ \ boldsymbol {z} $は、平均$ \ mathbb {E}(\ boldsymbol {z})$と分散$ \ mathbb {V}(\を持つガウス分布に従う潜在確率変数です。 boldsymbol {z})$。実際には、エンコードされた分布としてはガウス分布より他の分布も使用できます。 +-エンコーダーは$ \ mathcal {X} $から$ \ mathbb {R} ^ {2d} $との関数から$ \ boldsymbol {x} \ mapsto \ boldsymbol {h} $にマップします。(ここでは$ \ boldsymbol {h} $で、$ \ mathbb {E}(\ boldsymbol {z})$と$ \ mathbb {V}(\ boldsymbol {z})$)の連結を表します。 +-次に、エンコーダーによってパラメーター化された上記の分布から$ \ boldsymbol {z} $をサンプリングします。具体的には、$ \ mathbb {E}(\ boldsymbol {z})$と$ \ mathbb {V}(\ boldsymbol {z})$が**サンプラー**に渡され、潜在変数$ \ boldsymbol {z} $が生成されます。 +-次に、$ \ boldsymbol {z} $がデコーダーに渡され、$ \ hat {\ boldsymbol {x}} $が生成されます。 +-デコーダーは$ \ mathcal {Z} $から$ \ mathbb {R} ^ {n} $から$ \ boldsymbol {z} \ mapsto \ boldsymbol {\ hat {x}} $にマップします。 + +実際、クラシックのオートエンコーダの場合、$ \ boldsymbol {h} $はVAE定式化のベクトル$ \ E(\ boldsymbol {z})$とみなすことができます。要するに、VAEとAEの主な違いは、VAEには優れた潜在スペースあって生成プロセスでを可能になるということです。 + + + + +### VAEの目的(損失)関数 + +
+
+Fig. 2: 入力スペースから潜在スペースへのマッピング +
+ + +*上記の図2を参照してください。右上のものをまず(次のセクションで説明する再パラメータ化のトリック)は無視してください。* + +まず、エンコーダーとノイズを使用して、入力スペース(左)から潜在スペース(右)にエンコードします。次に、潜在スペース(右)から出力空間(左)にデコードします。潜在スペースから入力スペース(生成プロセス)に移行するには、(潜在コードの)分布を学習するか、何らかの構造を強制する必要があります。この場合、VAEは潜在スペースに何らかの構造で強制するようにします。 + + +いつものように、VAEをトレーニングするために、損失関数を最小化します。損失関数は、再構成項と正則化項で構成されます。 +-再構成項は最終層(図の左側)にあります。これは、図の$ l(\ boldsymbol {x}、\ hat {\ boldsymbol {x}})$に対応します。 +-正則化項は潜在層にあり、潜在スペース(図の右側)に特定のガウス構造を適用します。これを行うには、ペナルティ項$ l_ {KL}(\ boldsymbol {z}、\ mathcal {N}(\ boldsymbol {0}、\ boldsymbol {I} _d))$を使用します。これがないと、VAEはクラシックのオートエンコーダーのように機能し、過剰適合につながる可能性があり、必要な生成特性が得られません。 + + + + +###サンプリング$ \ boldsymbol {z} $に関する議論(**再パラメーター化のトリック**) + +VAEのエンコーダーによって返される分布からどうやってサンプリングしますか? 上記によると、$ \ boldsymbol {z} $は、ガウス分布からサンプリングします。 ただし、VAEモデルをトレーニングするために勾配降下法を実行する場合、サンプリング・モジュールを介してバック伝播を実行する方法がわからないため、これには問題にあります。 + +代わりに、**再パラメーター化のトリック**を使用して$ \ boldsymbol {z} $を「サンプリング」します。 $ \ boldsymbol {z} = \ mathbb {E}(\ boldsymbol {z})+ \ boldsymbol {\ epsilon} \ odot \ sqrt {\ mathbb {V}(\ boldsymbol {z})} $を使用します。ここで$ \ epsilon \ sim \ mathcal {N}(\ boldsymbol {0}、\ boldsymbol {I} _d)$。 この場合、トレーニングでのバック伝播が可能です。 具体的には、勾配は上記の式の(要素ごとの)乗算と加算を通過します。 + + + + +## [VAE損失関数の分析](https://www.youtube.com/watch?v=7Rb4s9wNOmc&t=997s) +###潜在変数の推定値と再構成損失の視覚化 + +上記のように、VAEの損失関数には、再構成項と正則化項の2つの部分が含まれます。 これは次のように書くことができます + +$$ +l(\boldsymbol{x}, \hat{\boldsymbol{x}}) = l_{reconstruction} + \beta l_{\text{KL}}(\boldsymbol{z},\mathcal{N}(\textbf{0}, \boldsymbol{I}_d)) +$$ + +損失関数の各項を視覚化するために、推定された各$ \ boldsymbol {z} $値を、円の中心が$ \ mathbb {E}(\)である$ 2d $空間の円と考えることができます。 boldsymbol {z})$とその周辺の領域は、$ \ mathbb {V}(\ boldsymbol {z})。$によってすべての$ \ boldsymbol {z} $の可能な値です。 + +
+
+Fig. 3: Visualizing vector $z$ as bubbles in the latent space +
+ + + +*上記の図3では、各バブルは$ \ boldsymbol {z} $の推定領域を表し、矢印は再構成項が各推定値を他の推定値から遠ざける方法を表します。これについては以下で詳しく説明します。* + +$ z $の任意の2つの推定値の間に重なり合わせがある場合(視覚的には、2つのバブルが重なり合わせる場合)、オーバーラップ内のポイントを両方の元の入力にマッピングもできるため、再構築のあいまいさが生じます。 したがって、再構築の損失は、ポイントを互いに遠ざけます。 + +ただし、再構築損失のみを使用すると、推定値は互いに離れたままになり、システムが発散する可能性があります。この理由でペナルティ条件の役目です。 + +**注:**バイナリ入力の場合、再構成損失は + +$$ +l(\boldsymbol{x}, \hat{\boldsymbol{x}}) = - \sum\limits_{i=1}^n [x_i \log{(\hat{x_i})} + (1 - x_i)\log{(1-\hat{x_i})}] +$$ + +and for real valued inputs the reconstruction loss is +実数値の入力の場合、再構成損失は + +$$ +l(\boldsymbol{x}, \hat{\boldsymbol{x}}) = \frac{1}{2} \Vert\boldsymbol{x} - \hat{\boldsymbol{x}} \Vert^2 +$$ + + + +###ペナルティ項 + +2番目の項は、平均$ \ mathbb {E}(\ boldsymbol {z})$、分散$ \のガウス分布に由来する$ \ boldsymbol {z} $間の相対エントロピー(2つの分布の間の距離) と mathbb {V}(\ boldsymbol {z})$および標準正規分布。 この第2項をVAE損失関数で拡張すると、次のようになります。 + +$$ +\ beta l _ {\ text {KL}}(\ boldsymbol {z}、\ mathcal {N}(\ textbf {0}、\ boldsymbol {I} _d))= \ frac {\ beta} {2} \ sum \ Limits_ {i = 1} ^ d(\ mathbb {V}(z_i)-\ log {[\ mathbb {V}(z_i)]}-1 + \ mathbb {E}(z_i)^ 2) +$$ + +合計の各式には4つの項があります。 以下に、*図4 *の最初の3つの項を書き出してグラフ化します。 + +$$ +v_i = \mathbb{V}(z_i) - \log{[\mathbb{V}(z_i)]} - 1 +$$ + +
+
+Fig. 4: Plot showing how relative entropy forces the bubbles to have variance = 1 +
+ + + +この計算からみると、$ z_i $の分散が1の場合、この式が最小化されることがわかります。したがって、ペナルティ損失により、推定潜在変数の分散値が約1に保たれます。視覚的には、上からの「バブル」の半径は約1になります。 + +最後の項$ \ mathbb {E}(z_i)^ 2 $は、$ z_i $間の距離を最小化するため、再構成項によって促進される発散を防ぎます。 + +
+
+Fig. 5: The "bubble-of-bubble" interpretation of VAE +
+ + + +*上の図5は、VAE損失で、各ポイントの推定分散を1前後に保ちながら、推定潜在変数を重なり合わさせずにできる限り近づけた方法を示しています。* + +**注:** VAE損失関数の$ \ beta $は、再構成項とペナルティの項を重みでバランスするハイパーパラメーターです。 + + + +## [Variational Autoencoder(VAE)の実装] +このノートブックでは、VAEを実装し、MNISTデータセットでトレーニングします。 +次に、正規分布から$ \ boldsymbol {z} $をサンプリングしてデコーダーにフィードし、結果を比較します。 最後に、2D投影で$ \ boldsymbol {z} $がどのように変化するかを見ていきます。 + +**注:**使用されているMNISTデータセットでは、ピクセル値は$ [0、1] $の範囲で正規化されています。 + + + +###エンコーダーとデコーダー + +1.「VAE」モジュールでエンコーダーとデコーダーを定義します。 +2.エンコーダーの最後の線形層について、出力をサイズ$ 2d $と定義します。前半の$ d $値は平均であり、後半の$ d $値は分散です。 前の再パラメーター化のトリックで説明したように、これらの平均値と分散値を使用して$ \ boldsymbol {z} \ in R ^ d $をサンプリングします。 +3.デコーダーの最後の線形レイヤーでは、入力データと同様に、範囲$ [0、1] $で出力できるように、シグモイド活性層を使用します。 + +```python +class VAE(nn.Module): + def __init__(self): + super().__init__() + + self.encoder = nn.Sequential( + nn.Linear(784, d ** 2), + nn.ReLU(), + nn.Linear(d ** 2, d * 2) + ) + + self.decoder = nn.Sequential( + nn.Linear(d, d ** 2), + nn.ReLU(), + nn.Linear(d ** 2, 784), + nn.Sigmoid(), + ) +``` + + + + +###再パラメータ化と `forward`関数 + +`再パラメータ化`の関数の場合、モデルがトレーニングするとき、対数分散(` logvar`)から標準偏差( `std`)を計算します。分散がネガティブではないことを保証されるため対数分散を使用します。 +その対数を取得すると、分散の全範囲が確保され、トレーニングがより安定します。 + +トレーニング中、 `再パラメータ化`関数は再パラメーター化のトリックを実行するため、トレーニングでバック伝播を実行できます。講義で説明したように、上記に書いてバブルの概念に接続するために、この関数が呼び出されるたびに、この `eps = std.data.new(std.size())。normal_()`で点を描画します。 100回実行すると正規分布であるため100個の点で結成された大きい球が得られ、この線 `eps.mul(std).add_(mu)`により、球は `mu`を中心とし、半径は`std`になります。 + +`forward`関数の場合、最初にエンコーダーから` mu`(前半)と `logvar`(後半)を計算し、次に` 再パラメータ化`関数を介して$ \ boldsymbol {z} $を計算します。最後に、デコーダーの出力を返します。 + +```python +def reparameterise(self, mu, logvar): + if self.training: + std = logvar.mul(0.5).exp_() + eps = std.data.new(std.size()).normal_() + return eps.mul(std).add_(mu) + else: + return mu + +def forward(self, x): + mu_logvar = self.encoder(x.view(-1, 784)).view(-1, 2, d) + mu = mu_logvar[:, 0, :] + logvar = mu_logvar[:, 1, :] + z = self.reparameterise(mu, logvar) + return self.decoder(z), mu, logvar +``` + + + + +### VAEの損失関数 + +ここでは、再構成損失(バイナリ・クロス・エントロピー)と相対エントロピー(KL発散ペナルティ)を定義します。 + +```python +def loss_function(x_hat, x, mu, logvar): + BCE = nn.functional.binary_cross_entropy( + x_hat, x.view(-1, 784), reduction='sum' + ) + KLD = 0.5 * torch.sum(logvar.exp() - logvar - 1 + mu.pow(2)) + + return BCE + KLD +``` + + + + +###新しいサンプルの生成 + +モデルをトレーニングした後、正規分布からランダムな$ z $をサンプリングし、それをデコーダーに供給しきます。 *図6 *で、一部の結果が良くないことが見えます、それは、デコーダーが潜在空間全体を「カバー」されていないためです。 +より多くのエポックでモデルをトレーニングすると、これを改善できます。 + +
+
+Fig. 6: Randomly moving in the latent space +
+ + + +ある数字が別の数字にどのように変化するかについて、オートエンコーダーを使用しないとはいけないことを見てみましょう。潜在スペースにもぐると、デコーダーの出力はまだ見なせることがわかります。 以下の*図7 *は、数字$ 3 $を$ 8 $に変換する方法を示しています。 + +
+
+Fig. 7: Morphing the digit 3 into 8 +
+ + + + +###平均の投射 + +最後に、トレーニング中/トレーニング後に潜在スペースがどのように変化するかを見てみましょう。 *図8 *の次のグラフは、エンコーダーの出力からの平均であり、2D空間に投影され、各色は数字を表します。 エポック0から、クラスはほとんど集中せずにばらついていることがわかります。 モデルがトレーニングされると、潜在スペースがより明確になり、クラス(数字)がクラスターを形成し始めます。 + +
+
+Fig. 8: 2D projection of the means $\E(\vect{z})$ in latent space +
diff --git a/docs/ja/week08/08.md b/docs/ja/week08/08.md new file mode 100644 index 000000000..8f83b0bba --- /dev/null +++ b/docs/ja/week08/08.md @@ -0,0 +1,35 @@ +--- +lang-ref: ch.08 +title: Week 8 +authors: Vishwaesh Rajiv, Wenjun Qu, Xulai Jiang, Shuya Zhao +date: 23 Mar 2020 +lang: ja +translation-date: 28 Nov 2020 +translator: Jesmer Wong +--- + + +##講義 第一部分 + + + +このセクションでは、いくつかの角度でエネルギー・ベース・モデル(EBM)にコントラスト的な方法を中心として紹介していきましょう。 +まずは、自己教師あり学習にコントラスト的な方法を適用するその利点について説明します。次に、ノイズ除去オートエンコーダのアーキテクチャと、画像再構成タスクにおけるそれらの弱点について説明します。また、コントラスト的な発散や持続的なコントラスト発散のような他のコントラスト的な方法についても説明しました。 + + + +##講義 第二部分 + + + +このセクションでは、正則化された潜在変数つきのEBMについて、とくに条件付きバージョンと無条件バージョンのモデル概念を詳しく説明します。次に、ISTA、FISTA、およびLISTAのアルゴリズムについて説明し、畳み込みスパースエンコーダーから学習したスパースコーディングとフィルターの例を見ていきます。最後に、変分付きオートエンコーダーとそれに関連する基本的な概念について説明していきます。 + + + +実習 + + + +このセクションでは、変分付きオートエンコーダー(VAE)とばれるある特定のタイプの生成モデルについて説明し、この機能と従来のオートエンコーダーに対する利点を比較してみました。VAEの目的関数を詳細に理解し、どうやって潜在スペースに構造させて適用する方法を理解しました。最後に、MNISTデータセットにVAEでトレーニングし、それを使用して新しいサンプルを生成しました。 + diff --git a/docs/ja/week09/09-1.md b/docs/ja/week09/09-1.md new file mode 100644 index 000000000..1374c39d5 --- /dev/null +++ b/docs/ja/week09/09-1.md @@ -0,0 +1,156 @@ +--- +lang-ref: ch.09-1 +lecturer: Yann LeCun +title: Discriminative Recurrent Sparse Auto-Encoder and Group Sparsity +authors: Kelly Sooch, Anthony Tse, Arushi Himatsingka, Eric Kosgey +date: 30 Mar 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + +## [識別リカレントスパースオートエンコーダー (DrSAE)](https://www.youtube.com/watch?v=Pgct8PKV7iw&t=35s) + + +DrSAEのアイデアは、スパース符号化(スパース自動符号化器)と識別的な訓練を組み合わせることです。 +
+ + +**図1:** 識別リカレントスパースオートエンコーダー + + +エンコーダである $W_e$ は、LISTA 法のエンコーダに似ています。変数Xは、$W_e$ を通して非線形変換を実行します。この結果に別の学習済み行列 S を掛け合わせて $W_e$ に加算します。その後、別の非線形性を通過させます。このプロセスは何度も繰り返すことができ、それぞれの繰り返しがレイヤーとして機能します。 + + + +このニューラルネットワークを3つの基準で訓練します。 +1. $L_1$: 特徴ベクトルZに$L_1$基準を適用してスパースにします。 +2. Xの再構成: これは、入力を出力に再現するデコーディング行列を用いて行われます。これは,図1の$W_d$で示されるように,二乗誤差を最小化することで行われます. +3. 第3項を追加します。$W_c$で示されるこの第3項は、カテゴリを予測しようとする単純な線形分類器です。 + + +システムは、これらの3つの基準のすべてを同時に最小化するように訓練されます。 + + +この利点は、システムに入力を再構成できる表現を見つけることを強制することで、基本的には入力に関する情報をできるだけ多く含む特徴を抽出するようにシステムを偏らせていることです。言い換えれば、特徴を豊かにするということです。 + + +### グループでのスパース制約 + + +ここでの考え方は、スパースな特徴量を生成するのではなく、畳み込みで抽出された通常の特徴量ではなく、基本的にはプールした後にスパースな特徴量を生成するというものです。 +
+ + +**図2:** Group Sparsityのあるオートエンコーダ + + +図2は、group sparsityを持つオートエンコーダーの例を示しています。ここでは、潜在変数Zが$L_1$に行くのではなく、基本的にはグループ上の$L_2$を通ります。つまり、Zのグループの各成分の $L_2$ ノルムを取り、それらのノルムの和を取ります。これが正則化として使用されるので、Zのグループをスパースにすることができます。これらのグループ(特徴表現のプール)は、互いに似た特徴をグループ化する傾向があります。 + + + +## [group sparsityのあるオートエンコーダー: 質問と説明](https://www.youtube.com/watch?v=Pgct8PKV7iw&t=918s) + + + +Q: 最初のスライドで使用されているような分類器と正則化器を用いた類似の戦略は、VAEに適用できますか? + +A: VAEにおけるノイズの追加とスパースネスの強制は、潜在変数/コードが持つ情報を減らす2つの方法です。恒等写像の学習を防ぎます。 + +Q: スライド「group sparsityを用いたオートエンコーダー」にある、$P_j$とは何ですか? + +A: pは特徴量のプールです。ベクトル z に対しては,z の値の部分集合になります. + +Q: *特徴のプールについての説明。* + +A: (Yann はgroup sparsityを持つオートエンコーダーの表現を描く) エンコーダは、プールされた特徴の $L_2$ ノルムを用いて正則化された潜在変数 z を生成します。このzは、デコーダによって画像再構成に利用されます。 + +Q: グループ正則化は,類似した特徴をグループ化するのに役立ちますか? + +A: 不明です。ここで行われた作業は、計算能力やデータが容易に入手できるようになる前に行われました。今はどうかわかりません。 + + +## [画像レベルの学習、局所フィルタはあるが重み共有はない](https://www.youtube.com/watch?v=Pgct8PKV7iw&t=1834s) + + +役に立つかどうかについての答えは明確ではありません。これに興味がある人は、画像復元に興味があるか、ある種の自己学習に興味があるかのどちらかです。これは、データセットが非常に小さい場合にうまくいくでしょう。畳み込み式のエンコーダとデコーダを持っていて、複雑なセル上でgraoup sparsityを使って学習した場合、事前学習が終わった後に、デコーダを取り除き、エンコーダだけを特徴抽出器として使用します。 + +
+ +**図3:** Group Sparsityのある畳み込みRELUネットの構造 + + + +上で見たように、画像から始め、基本的には 畳み込みRELUネットであるエンコーダと、この後にある種のスケーリング層があります。Group sparsityを用いて学習します。線形デコーダと1によるグループである基準を持ち、group sparsityによる正則化をします。これは、group sparsityに似たアーキテクチャを持つL2プーリングのようなものです。 + +このネットワークの別のインスタンスを学習することもできます。今回は、より多くの層を追加して、L2プーリングとスパース基準を持つデコーダを持ち、プーリングを出力において入力を再構成するように訓練します。これにより、事前に訓練された2層の畳み込みネットが作成されます。この手順はStacked オートエンコーダーとも呼ばれます。ここでの主な特徴は、group sparsityを持つ不変な特徴を生成するように訓練されることです。 + +Q : 可能なすべての部分木をグループとして使うべきですか? + +A : それはあなた次第です。必要以上に大きな木で訓練して、滅多に使わない枝を削除することもできます。 + +
+ +**図4:** 画像レベルの学習、局所フィルタはあるが重み共有はない + + + +これらはピンホイールパターンと呼ばれています。これは特徴量の整理の仕方の一種です。赤い点の周りを回ると、様々な向きが連続的に変化しています。私たちがそれらの赤い点の一つを取って、赤い点の周りを少し円を描くと、抽出器の向きが移動するにつれて連続的に変化することに気づくでしょう。脳でも同じような傾向が見られます。 + +Q : Group sparsityの項自体は小さな値を持つように訓練されますか? + +正則化器です。ですので項自体は訓練されておらず、固定されています。グループのL2ノルムが決まっているだけで、グループはあらかじめ決まっています。しかし、基準になるので、エンコーダとデコーダが何をするか、どのような種類の特徴を抽出するかがこれによって決まります。 + + +
+ +**図5:** 側方抑制による不変な特徴表現 + + +ここで、二乗再構成誤差を持つ線形デコーダを考えます。エネルギーには基準がります。行列Sは、手動で決定されるか、この項が最大になるように学習されます。Sの項が正で大きい場合、システムは $z_i$ と $z_j$ を同時にオンにしたくないことを意味します。したがって、これは一種の相互抑制(神経科学では自然抑制と呼ばれています)です。したがって、できるだけ大きなSの値を見つけようとします。 + + +
+**図6:** 側方抑制による不変な特徴表現 (木構造) + + + +Sを木で整理すると、線はS行列のゼロ項を表します。線がないときはいつでも、ゼロではない項があります。つまり、すべての特徴は、木の上にあるものや木の下にあるものを除いて、他のすべての特徴を阻害します。これは、group sparsityの逆のようなものです。 + +システムは多かれ少なかれ連続的に特徴を整理していることがわかります。木の枝に沿った特徴は、選択性のレベルが異なる同じ特徴を表しています。抑制がないので、周辺部に沿った特徴は多かれ少なかれ連続的に変化します。 + +各イテレーションで $x$ を与え、このエネルギー関数を最小化する $z$ を見つけることでこのシステムを訓練します。勾配降下法を1ステップ行って $W$ を更新し、 $S$ の項を大きくすることもできます。 diff --git a/docs/ja/week09/09-3.md b/docs/ja/week09/09-3.md new file mode 100644 index 000000000..871da6c98 --- /dev/null +++ b/docs/ja/week09/09-3.md @@ -0,0 +1,317 @@ +--- +lang-ref: ch.09-3 +title: Generative Adversarial Networks +lecturer: Alfredo Canziani +authors: William Huang, Kunal Gadkar, Gaomin Wu, Lin Ye +date: 31 Mar 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + +## [generative adversarial networks (GANs)の導入](https://www.youtube.com/watch?v=xYc11zyZ26M&t=57s) + + +
+
+図1: GANのアーキテクチャ +
+ + +GANは教師なし機械学習に使用されるニューラルネットワークの一種です。GANは2つの敵対的モジュールで構成されています。_generator_ ネットワークと _cost_ ネットワークです。これらのモジュールは、_cost_ ネットワークが偽の例をフィルタリングしようとするのに対し、_generator_ は現実的な例を作ることで、このフィルタを騙そうとするように、互いに競合します。この競争を通じて、モデルは現実的なデータを生成する生成器を学習する。将来予測や、特定のデータセットで訓練された後の画像生成などのタスクで使用することができます。 + + +
+
+図2: ランダム変数からのGANの写像 +
+ + + +GAN はエネルギーベースモデル(EBM)の一例です。このように、コストネットワークは、図2のピンクの $\vect{x}$ で示される真のデータ分布に近い入力に対して低コストになるように訓練されます。図2の青い $\vect{\hat{x}}$ のような他の分布からのデータは、高いコストを持つはずです。コストネットワークの性能を計算するために、一般的に平均二乗誤差(MSE)が使用されます。ここで注目すべきは、コスト関数が、指定された範囲内で正のスカラー値を出力することです(例えば$\text{cost} : \mathbb{R}^n \rightarrow \mathbb{R}^+ \cup \{0\}$)。これは、離散的な分類を出力に用いる古典的な判別器とは異なります。 + + + +一方、生成器($\text{generator} : \mathcal{Z} \rightarrow \mathbb{R}^n$)は、コストネットワークを騙すようために、ランダムな変数$\vect{z}$から、本物のようなデータ$\vect{\hat{x}}$を生成を改善していきます。生成器は、コストネットワークの出力を基準にして、$\vect{\hat{x}}$のエネルギーを最小にするように学習します。このエネルギーを$C(G(\vect{z}))$と呼びますが、ここで、$C(\cdot)$がコストネットワーク、$G(\cdot)$が生成ネットワークである。 + + +コストネットワークの訓練は、MSE損失を最小化することを基本とし、生成ネットワークの訓練は、$\vect{\hat{x}}$についての$C(\vect{\hat{x}})$の勾配を用いて、コストネットワークを最小化することで行います。 + + + +データ多様体の外側の点に対しては高いコストが、内側の点に対しては低いコストが割り当てられるように、コストネットワークの損失関数 $\mathcal{L}\_{C}$ は、ある正のマージン$m$に対して $C(x)+[m-C(G(\vect{z}))]^+$fとなる。$\mathcal{L}\_{C}$を最小化するためには、$C(\vect{x}) \rightarrow 0$であり$C(G(\vect{z})) \rightarrow m$であることが必要です。生成器の損失$\mathcal{L}\_{G}$は単純に $C(G(\vect{z}))$ であり、これは生成器が $C(G(\vect{z})) \rightarrow 0$ を確実にするように促します。 しかし、これは $0 \leftarrow C(G(\vect{z})) \rightarrow m$ のように不安定になります。 + + + +## [GANとVAEの違い](https://www.youtube.com/watch?v=xYc11zyZ26M&t=1844s) + + +
+
+図3: VAE (左) vs. GAN (右) - アーキテクチャのデザイン +
+ + +第8週の変分オートエンコーダー(VAE)と比較して、GANはジェネレーターの作成方法が少し異なります。VAEは、入力$\vect{x}$を潜在空間$\mathcal{Z}$に _encoder_ でマップし、$\mathcal{Z}$から _decoder_ でデータ空間にマップして、$\vect{\hat{x}}$を得るものでした。そして、再構成誤差を利用して、$\vect{x}$と$\vect{\hat{x}}$を似たようなものにしていました。一方、GANは、上述したように、生成ネットワークとコストネットワークが競合する敵対的な設定で訓練を行います。これらのネットワークは、勾配に基づいた手法を用いて誤差逆伝播を行いながら学習します。このアーキテクチャの違いを比較すると、図3のようになります。 + + +
+
+図4: VAE (左) vs GAN (右) - ランダムサンプル $\vect{z}$からの写像 +
+ + +GANはまた、VAEとは、どのように生成を行い、どのように$\vect{z}$を使用するかという点で異なります。GANは、まず、VAEの潜在空間と同様に、$\vect{z}$をサンプリングすることから始めます。次に、生成ネットワークを用いて、$\vect{z}$を$\vect{\hat{x}}$にマップします。この$\vect{\hat{x}}$は、それがどれだけ「本物」であるかを評価するために、判別器/コストネットワークを通して送られます。VAEやGANとの主な違いの一つは、**生成ネットワークの出力と実データとの間の直接的な関係(再構成誤差)を測定する必要がないことです。** その代わりに、我々は、discriminator/cost networkが実データ$\vectct{x}$と似たようなスコアを生成するように生成器を訓練することで、$\vect{\hat{x}}$が$\vect{x}$と似たようなものになるように強制します。 + + + +## GANの主な落とし穴 + + +GANは生成器の構築に威力を発揮しますが、いくつかの大きな落とし穴があります。 + + + + +### 1. 不安定な収束性 + +生成器が訓練によって改善されるにつれて、判別器の性能は悪くなります。生成器が完全であれば、本物のデータと偽物のデータの多様体は互いに重なり合い、判別器は多くの誤分類を生み出すことになります。 + +判別器のフィードバックは時間の経過とともに意味をなさなくなりますが、これは、GANの収束に問題をもたらします。GANが、判別器が完全にランダムなフィードバックを与えている時点を超えて学習を続けると、ジェネレーターは質の悪いフィードバックで学習を開始し、その品質が崩壊する可能性があります。[GANの学習の収束](https://developers.google.com/machine-learning/gan/training)を参照してください。 + +この生成器と識別器の間の敵対的な性質の結果として、平衡ではなく不安定な平衡点が生じます。 + + + +### 2. 勾配消失 + +GANにバイナリクロスエントロピー損失を使うことを考えてみましょう。 + +$$ +\mathcal{L} = \mathbb{E}_\boldsymbol{x}[\log(D(\boldsymbol{x}))] + \mathbb{E}_\boldsymbol{\hat{x}}[\log(1-D(\boldsymbol{\hat{x}}))] \text{.} +$$ + +識別器が自信を持つようになると、$D(\vect{x})$は$1$に近づき、$D(\vect{\hat{x}})$は$0$に近づきます。この自身は、コストネットワークの出力を、勾配が飽和するようなより平坦な領域に移動させます。これらの平坦な領域は、生成ネットワークの学習の妨げとなる、小さくて消失する勾配を提供します。したがって、GANを訓練する際には、自身が高まるにつれてコストが徐々に増加するようにしたいという要請が生まれます。 + + + + + +### 3. モード崩壊 + + も生成器が、サンプラーからのすべての$\vect{z}$を **単一の** 判別器を騙すことができる$\vect{\hat{x}}$に写像するならば、生成器はそのような$\vect{\hat{x}}$**だけ**を生成することになります。最終的に、判別器は、この偽の入力の検出に**特化した**学習をしてしまいます。その結果、生成器は、次の最も妥当な$\vect{\hat{x}}$を見つけ、そのサイクルを継続する。その結果、判別器は、偽の $\vect{\hat{x}}$'s を循環させている間に、局所的な最小値に捕らわれてしまいます。この問題の解決策として、異なる入力が与えられたときに、常に同じ値を出力することに何らかのペナルティを課すことが考えられます。 + + +## [Deep Convolutional Generative Adversarial Network (DCGAN) source code](https://www.youtube.com/watch?v=xYc11zyZ26M&t=2911s) + + +この例のソースコードはここで見られます [here](https://github.com/pytorch/examples/blob/master/dcgan/main.py). + + + +### 生成器 + +1. 生成器は、`nn.BatchNorm2d` と `nn.ReLU` で区切られた複数の `nn.ConvTranspose2d` モジュールを用いて入力をアップサンプリングします。 +2. 系列の最後に、ネットワークは `nn.Tanh()` を用いて出力を $(-1,1)$ の範囲にします。 +3. 入力ランダムベクトルのサイズは$nz$。出力はサイズ$nc \times 64 \times 64$です。ここで$nc$はチャンネル数を表しています。 + +```python +class Generator(nn.Module): + def __init__(self): + super().__init__() + self.main = nn.Sequential( + # input is Z, going into a convolution + nn.ConvTranspose2d( nz, ngf * 8, 4, 1, 0, bias=False), + nn.BatchNorm2d(ngf * 8), + nn.ReLU(True), + # state size. (ngf*8) x 4 x 4 + nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False), + nn.BatchNorm2d(ngf * 4), + nn.ReLU(True), + # state size. (ngf*4) x 8 x 8 + nn.ConvTranspose2d(ngf * 4, ngf * 2, 4, 2, 1, bias=False), + nn.BatchNorm2d(ngf * 2), + nn.ReLU(True), + # state size. (ngf*2) x 16 x 16 + nn.ConvTranspose2d(ngf * 2, ngf, 4, 2, 1, bias=False), + nn.BatchNorm2d(ngf), + nn.ReLU(True), + # state size. (ngf) x 32 x 32 + nn.ConvTranspose2d( ngf, nc, 4, 2, 1, bias=False), + nn.Tanh() + # state size. (nc) x 64 x 64 + ) + + def forward(self, input): + output = self.main(input) + return output +``` + + + + +### 識別器 + +1. 負の領域の勾配を殺さないように、`nn.LeakyReLU`を活性化関数として使用することが重要です。これらの勾配がなければ、生成器は更新を受け取れません。 +2. 系列の最後に、識別器は `nn.Sigmoid()` を用いて入力を分類します。 + +```python +class Discriminator(nn.Module): + def __init__(self): + super().__init__() + self.main = nn.Sequential( + # input is (nc) x 64 x 64 + nn.Conv2d(nc, ndf, 4, 2, 1, bias=False), + nn.LeakyReLU(0.2, inplace=True), + # state size. (ndf) x 32 x 32 + nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False), + nn.BatchNorm2d(ndf * 2), + nn.LeakyReLU(0.2, inplace=True), + # state size. (ndf*2) x 16 x 16 + nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False), + nn.BatchNorm2d(ndf * 4), + nn.LeakyReLU(0.2, inplace=True), + # state size. (ndf*4) x 8 x 8 + nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False), + nn.BatchNorm2d(ndf * 8), + nn.LeakyReLU(0.2, inplace=True), + # state size. (ndf*8) x 4 x 4 + nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False), + nn.Sigmoid() + ) + + def forward(self, input): + output = self.main(input) + return output.view(-1, 1).squeeze(1) +``` + + +これら2つのクラスは `netG` と `netD` として初期化されます。 + + + + +### GANの損失関数 + +ターゲットと出力の間のバイナリクロスエントロピーを使います。 + + +```python +criterion = nn.BCELoss() +``` + + + +### 設定 + + +サイズ `opt.batchSize` と長さ `nz` のランダムベクトルを用いて `fixed_noise` を設定します。また、実データ用のラベルと生成データ用のラベルをそれぞれ `real_label` と `fake_label` と呼びます。 + +```python +fixed_noise = torch.randn(opt.batchSize, nz, 1, 1, device=device) +real_label = 1 +fake_label = 0 +``` + + +そして、判別器と生成器のオプティマイザーを設定します。 + +```python +optimizerD = optim.Adam(netD.parameters(), lr=opt.lr, betas=(opt.beta1, 0.999)) +optimizerG = optim.Adam(netG.parameters(), lr=opt.lr, betas=(opt.beta1, 0.999)) +``` + + + +### 訓練 + + +学習の各エポックは2つのステップに分かれています。 + + + +**ステップ1**では、判別器ネットワークを更新します。これは2つの部分で行われます。まず、`dataloaders` から送られてくる実データを判別器に与え、出力と `real_label` の間の損失を計算し、誤差逆伝播を用いて勾配を蓄積する。次に、生成器で生成された識別器データを `fixed_noise` を用いてフィードし、`fake_label` との間の損失を計算し、勾配を蓄積します。最後に、蓄積された勾配を用いて識別ネットワークのパラメータを更新します。 + +識別器を訓練している間に勾配が生成器に伝搬しないようにするために、偽データを計算グラフから切り離すことに注意してください。 + +また、最初に一度だけ `zero_grad()` を呼び出すだけで勾配がクリアされるので、実データと偽データの両方からの勾配が更新に利用できることにも注意してください。2回の `.backward()` コールはこれらの勾配を蓄積します。最後に、パラメータを更新するために `optimizerD.step()` を1回呼び出すだけである。 + +```python +# train with real +netD.zero_grad() +real_cpu = data[0].to(device) +batch_size = real_cpu.size(0) +label = torch.full((batch_size,), real_label, device=device) + +output = netD(real_cpu) +errD_real = criterion(output, label) +errD_real.backward() +D_x = output.mean().item() + +# train with fake +noise = torch.randn(batch_size, nz, 1, 1, device=device) +fake = netG(noise) +label.fill_(fake_label) +output = netD(fake.detach()) +errD_fake = criterion(output, label) +errD_fake.backward() +D_G_z1 = output.mean().item() +errD = errD_real + errD_fake +optimizerD.step() +``` + + +**ステップ2**は生成ネットワークを更新することです。今回は、偽のデータを判別器に与えますが、`real_label`で損失を計算します! ここでの目的は、本物のような$\vect{\hat{x}}$'sを作るように生成器を訓練することです。 + +```python +netG.zero_grad() +label.fill_(real_label) # fake labels are real for generator cost +output = netD(fake) +errG = criterion(output, label) +errG.backward() +D_G_z2 = output.mean().item() +optimizerG.step() +``` diff --git a/docs/ja/week09/09.md b/docs/ja/week09/09.md new file mode 100644 index 000000000..f885ae651 --- /dev/null +++ b/docs/ja/week09/09.md @@ -0,0 +1,25 @@ +--- +lang-ref: ch.09 +title: Week 9 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + +## レクチャーパートA + + +識別的リカレントスパース自動符号化器とグループスパースについて議論しました。スパース符号化と識別的訓練をどのように組み合わせるかが主な考え方でした。LISTAに似たリカレントオートエンコーダとデコーダを用いてネットワークを構成する方法を説明しました。次に、グループスパースを用いて不変特徴を抽出する方法について議論しました。 + + +## レクチャーパートB + + +ここでは、自律制御のための世界モデルについて、ニューラルネットワークのアーキテクチャや学習スキーマを含めて説明しました。次に、世界モデルと強化学習(RL)の違いについて述べました。最後に、エネルギーベースモデルの観点からGAN(Generative Adversarial Networks)について対照学習を用いて検討しました。 + + +## 演習 + + +今週の実習では、GAN(Generative Adversarial Networks)とそれがどのようにして現実的な生成モデルを生成できるかを探りました。次に、2つのネットワークの主な違いを強調するために、第8週のGANとVAEを比較しました。次に、GANのモデルの限界について議論した。最後に、PyTorchの例であるDeep Convolutional Generative Adversarial Networks (DCGAN)のソースコードを見ました。 diff --git a/docs/ja/week10/10-1.md b/docs/ja/week10/10-1.md new file mode 100644 index 000000000..6ca44607f --- /dev/null +++ b/docs/ja/week10/10-1.md @@ -0,0 +1,473 @@ +--- +lang-ref: ch.10-1 +title: 自己教師あり学習 - Pretext Tasks +lecturer: Ishan Misra +authors: Aniket Bhatnagar, Dhruv Goyal, Cole Smith, Nikhil Supekar +date: 6 Apr 2020 +translation-date: 1 Aug 2020 +translator: Shiro Takagi +lang: ja +--- + + + +## [教師あり学習の成功例: 事前学習](https://www.youtube.com/watch?v=0KeR6i1_56g&t=75s) + + +過去10年間、様々なコンピュータビジョン問題の中でも大きな成功の秘訣の一つは、ImageNet分類の教師あり学習による視覚的表現の学習であり、また、これらの学習で得られた表現や学習されたモデルの重みを、ラベル付けされた大量のデータが利用できない他のコンピュータビジョンのタスクの初期化に利用することです。 + + +しかし、ImageNetのような大規模なデータセットのアノテーションには、膨大な時間と費用がかかります。例えば、1400万枚の画像を用いたImageNetのラベル付けには、およそ22年の歳月がかかっています。 + + +このため、研究コミュニティは、ソーシャルメディア画像のハッシュタグ、GPS位置情報、データサンプルからラベルを作る自己教師ありのアプローチなど、代替的なラベル付けの方法を探し始めました。 + + +しかし、ラベリングの代替手段を探す前に生じる重要な疑問があります。 + + +**結局どれだけのラベル付きデータが手に入るのでしょうか?** + + +- オブジェクトレベルのカテゴリとバウンディングボックスのアノテーションを持つすべての画像を検索すると、約100万枚の画像があります。 +- ここで、バウンディングボックス座標の制約を緩和すると、利用可能な画像の数は約1400万枚に跳ね上がります。 +- しかし、インターネット上にある全ての画像を対象にすると、データ量は5桁も増えてしまいます。 +- また、画像以外のデータもありますが、これを理解するためには他の感覚入力を必要とします。 + + +
+
+図1: Variation in available data quantum basis complexity of annotation +
+ + + +したがって、ImageNetのアノテーションだけで22年分の時間がかかったという事実から、インターネット上のすべての写真やそれ以上の写真に対しても同じようにラベリングをすることは不可能です。 + + +**珍しい概念の存在の問題** (*ロングテール問題(分布の裾が広がっているという問題)*) + + +一般的に、インターネット上の画像のラベルの分布を示すプロットは、ロングテール(分布の裾が広がっていること)のように見えます。つまり、ほとんどの画像が非常に少ないラベルに対応している一方で、対応する画像があまり存在しないラベルが多数存在しています。このように、分布の裾のほうのカテゴリーについてのラベル付きサンプルを取得するには、膨大な量のデータをラベル付けする必要があります。 + + + + +
+
+図2: ラベル付きの利用可能な画像の分布のばらつき +
+ + +**異なるドメインという問題** + + +このような、ImageNetで事前学習をして下流のタスク対してfine-tuningする方法は、下流タスクの画像が医用画像のように全く異なるドメインの画像である場合には,さらにうまくいかなくなってしまう。また、異なるドメインの事前学習のためのImageNetの量のデータセットを得ることは不可能である。 + + + + +## 自己教師あり学習とは? + + +**自己教師あり学習を定義する2つの方法** + + +- **教師あり学習に基づく定義**:例えば、ラベルが人間の入力なしに半自動的に手に入る状況でネットワークを教師あり学習すること。 +- **予測問題**:データの一部が隠れていて、残りが観測可能であるような状況。したがって、目的は、隠されたデータを予測するか、隠されたデータの特性を予測すること。 + + +自己教師あり学習は教師あり学習と教師なし学習とどのような点で異なるのか? + + +- 教師あり学習タスクには、あらかじめ定義された(一般的には人間が提供する)ラベルがあります。 +- 教師なし学習では、教師信号、ラベル、正しい出力は無く、データサンプルのみがあります。 +- 自己教師あり学習は、与えられたデータサンプルと共起するモダリティ、またはデータサンプル自体の共起する部分からラベルを導き出します。 + + + +### 自然言語処理における自己教師あり学習 + + +#### Word2Vec + + +- このタスク(Word2Vec)では、入力文が与えられると、pretext task を構築する目的でその文から意図的に省略された単語を予測しなければなりません。 +- したがって、ラベルの集合は語彙の中のすべての可能な単語になり、正しいラベルは文から省略された単語になります。 +- このようにして、単語レベルの表現を学習するために、通常の勾配に基づく方法を用いてネットワークを学習することができます。 + + + +### なぜ自己教師あり学習なのか? + +- Self-supervised learning enables learning representations of data by just observations of how different parts of the data interact. +- Thereby drops the requirement of huge amount of annotated data. +- Additionally, enables to leverage multiple modalities that might be associated with a single data sample. +- 自己教師あり学習では、データの異なる部分がどのように相互作用するかを観測するだけで、データの表現を学習することができます。 +- これにより、膨大な量のラベル付きデータが必要なくなります。 +- さらに、一つのデータサンプルに関連した複数のモダリティを活用することができます。 + + + +## コンピュータービジョンにおける自己教師あり学習 + + +一般的に、自己教師あり学習を採用したコンピュータビジョンの工程では、pretext taskと実際の(下流の)タスクの2つのタスクを実行します。 + + +- 実際の(下流の)タスクは、分類タスクや検出タスクのように、アノテーションされたデータサンプルが不十分なものであれば何でも構いません。 +- Pretext taskは、視覚的表現を学習するために解いた自己教師あり学習タスクであり、学習した表現やその過程で得られたモデルの重みを下流のタスクに利用することを目的としています。 + + + +#### Pretext task を開発する + +- コンピュータビジョン問題のためのpretext taskは、画像、動画、または動画と音声のいずれかを使用して開発することができます。 +- それぞれのpretext taskには、観測可能なデータと不可能なデータがあり、観測されていないデータそのものもしくはその性質のいずれかを予測することがタスクとなります。 + + + +#### [Pretext taskの例: 画像のパッチの相対的な位置を予測する](https://www.youtube.com/watch?v=0KeR6i1_56g&t=759s) + + +- 入力: アンカー画像パッチ(相対位置の起点となる画像パッチ)とクエリ画像パッチ(相対位置を知りたい画像パッチ)からなる2つの画像パッチ。 +- 2つの画像パッチが与えられると、ネットワークはアンカー画像パッチに対するクエリ画像パッチの相対的な位置を予測しなければいけません。 +- したがって、この問題は8-way分類問題としてモデル化することができます。 +- また、アンカーに対するクエリー画像の相対位置を与えることで、この問題のラベルを自動的に生成することができます。 + +注:~way分類問題とは,~値分類だと思って差し支えありません。few-shot学習の文脈とかでこのような使われ方を見かけます。クエリ画像などの用語も同様です。(by translator) + + +
+
+図3: 相対位置予測タスク +
+ + + + +#### 相対位置予測タスクで学習した視覚表現 + + +学習した視覚表現の有効性を評価するために、ネットワークから提供された画像パッチベースの特徴表現に対する最近傍を調べることができます。与えられた画像パッチの最近傍を計算するために、 + + +- データセット内のすべての画像について、CNN特徴量を計算します。これは検索のためのサンプルプールとして機能します。 +- 要求された画像パッチのCNN特徴量を計算します。 +- 利用可能な画像の特徴ベクトルのプールから、要求された画像の特徴ベクトルの最近傍を識別する。 + + +相対位置予測タスクは、物体の色などの要素に対する不変性を保ちながら、入力画像パッチと非常に類似した画像パッチを見つけ出します。このようにして、相対位置予測タスクは、視覚的に類似した外観を持つ画像パッチの表現が表現空間においてもより近くなるような視覚表現を学習することができます。 + + +
+
+図4: 相対位置: 最近傍 +
+ + + +#### 画像の回転の予測 + + +- 回転の予測は、単純で簡単な構成で最小限のサンプリングで済む最もよく使われるpretext taskの一つです。 +- 画像に0, 90, 180, 270度の回転を適用し、画像にどのような回転が適用されたかを予測しするためにこれらの回転した画像をネットワークに入力して、ネットワークは単に回転を予測するために4方向の分類を行います。 +- 回転を予測すること自体に意味はありません。私たちは、下流のタスクで使用するための特徴や表現を学習するための代わりとして、このpretext taskを使用しているだけです。 + + +
+
+図5: 画像の回転 +
+ + + +#### なぜ回転が役に立つのか、なぜうまくいくのか? + + +これは経験的にうまくいくことが証明されています。その背後にある直感は、回転を予測するためには、モデルが画像の大まかな境界や表現を理解する必要があるということです。例えば、水から空を分離したり、水から砂を分離したり、木が上向きに成長することを理解する必要があります。 + + + +#### 色付け + + +
+
+図6: 色付け +
+ + +このpretext taskでは、グレースケール画像の色を予測します。これはどのような画像に対しても定式化することができます。画像の色を除去して、その色を予測するためにこのグレースケール画像をネットワークに与えるだけです。このタスクは、例えば古いグレースケールのフィルムの色付けに使えるように、いくつかの点で有用です[//]。<> (このpretext taskを適用することができます)。このタスクの背後にある直感は、ネットワークが木が緑であること、空が青であることなどの意味のある情報を理解している必要があるということです。 + + +カラーマッピングは決定論的ではなく、いくつかの真の解が存在することに注意することが重要です。つまり、ある物体の色にいくつかの可能性がある場合、ネットワークはそれをすべての可能な解の平均値である灰色に着色します。最近では、多様な色付けのために変分オートエンコーダーと潜在変数を使用したものがあります。 + + +#### 空白を埋める + + + +画像の一部を隠して、残りの周囲の部分から隠された部分を予測します。これがうまくいくのは、車は道路を走っている、建物は窓とドアで構成されているなど、データの暗黙の構造をネットワークが学習するためです。 + + + +### 動画のPretext Task + + +動画は連続したフレームで構成されており、フレームの順番を予測したり、空白を埋めたり、オブジェクトを追跡したりするような、いくつかのpretext taskに活用することができます。 + + + + +#### シャッフルして学習する(Shuffle & Learn) + + +
+
+図7: 補完 +
+ + +いくつかの動画フレームが与えられたとして、その中の3つのフレームを抽出して、それらが正しい順序で抽出されていれば正のラベルを付け、そうでなくてシャッフルされていれば負のラベルを付けます。これは、フレームが正しい順番にあるかどうかを予測する二値分類問題になります。そこで、開始点と終了点が与えられている場合、中間点が有効な補間であるかどうかを確かめます。 + + +
+
+図8: シャッフルして学習(Shuffle & Learn)、の概念図 +
+ + +3つのフレームを独立に順伝播させ、生成された特徴量を連結して2値分類を行い、フレームがシャッフルされているかどうかを予測するtriplet Siameseネットワークを使用することができます。 + + +
+
+図9: 最近傍表現 +
+ + +ここでも、最近傍アルゴリズムを使用して、ネットワークが何を学習しているかを可視化することができます。上の図9では、まずクエリフレームを順伝播して特徴表現を取得し、その表現空間内の最近傍を見ています。比較してみると、ImageNet、Shuffle & Learn、ランダムで得られた近傍の間には大きな違いがあることがわかります。 + + +ImageNetは、最初の入力からジムの写真であることが分かるように、意味的な情報全体を取り出すことを得意としています。同様に、2番目のクエリでは、草などが生えている屋外の写真であることがわかります。一方、ランダムを観察すると、背景色を重視していることがわかります。 + + + +Shuffle & Learnを観察しても、色を重視しているのか、意味的な概念を重視しているのかはすぐにはわかりません。さらに調べてみると、様々な例を観察した結果、人のポーズを見ていることがわかりました。例えば、最初の画像では人物が逆さまになっており、2番目の画像ではシーンや背景色を無視して、足の位置がクエリフレームと同じような特定の位置にあることがわかります。これは、私たちののpretext taskがフレームの順番が正しいかどうかを予測していたためで、そのためには動画内で動いているもの、この場合は人物に焦点を当てる必要があったからです。 + + +この表現を、人間のキーポイント推定のタスクに対してfine-tuningすることで、定量的に検証しました。このタスクでは人間の画像が与えられたときに、鼻、左肩、右肩、左肘,右肘などのキーポイントを予測します。この手法はトラッキングや姿勢推定に有効です。 + + +
+
+図10: キーポイント推定の比較 +
+ + +図10から、ImageNetを用いた教師あり学習の結果と、FLICとMPIIのデータセットを用いたShuffle & Learnによる自己教師あり学習の結果を比較したところ,Shuffle & Learnがキーポイント推定に対して良い結果を示していることがわかります。 + + + +### 動画と音声に対するPretext Tasks + +動画と音声は、それぞれが一つの感覚入力に対応したマルチモーダルな情報です。ここで、与えられたビデオクリップがオーディオクリップに対応しているかどうかを予測することを考えます。 + + +
+
+図11: 動画と音声のサンプリング +
+ + +ドラムの音声が入った動画に対して、それに対応する音声が入った動画フレームをサンプリングして、それを正のセットと呼びます。次に、ドラムの音声とギターのビデオフレームをサンプリングして、それを負の集合としてタグ付けします。これで、動画と音声を対応づける問題を二値分類問題として解くためのネットワークを訓練することができるようになりました。 + + +
+
+図12: アーキテクチャ +
+ + +**アーキテクチャ:** 動画フレームを視覚タスクを解く部分ネットワークに入力し、音声を音声タスクを解くサブネットワークに入力し、128次元の特徴量と埋め込みを得ます。そしてそれらを融合させて互いに対応しているかどうかを予測する二値分類問題として解きます。 + + +これは、フレーム内の何が音を出しているのかを予測するのに使われます。直感的には、ギターの音であれば、ネットワークはギターがどのように見えるかを大まかに理解する必要があり、ドラムについても同じことが言えます。 + + + +## [「pretext」task が何を学習するかを理解する](https://www.youtube.com/watch?v=0KeR6i1_56g&t=2426s) + + +* Pretext taskは、**補完的**なものでなければなりません。 + + * 例えば、*相対位置予測タスク* と *色付けタスク* というpretext taskを例に挙げてみましょう。以下に示すように,両方のpretext taskを学習するモデルを学習することで,パフォーマンスを向上させることができます。 + + +
+
+図13: 相対位置予測タスクと色付けタスクをそれぞれ解かせた場合と一緒に解かせた場合の比較。ResNet101。(Misra) +
+ + + * SSの表現を学習するためには、ただ一つのpretext taskを解かせることが正解ではないかもしれません。 + + +* Pretext taskは何を予測しようとしているかの点で大きく異なります(難しさ) + + + **better representation** --> + + + * 相対位置予測タスクは単純な分類問題なので簡単です。 + * マスキングや補完ははるかに難しいです --> **より良い表現** + * **コントラスティブ法** はpretext taskよりもさらに多くの情報を生み出します。 + + +* **質問:** どのようにして複数の事前学習を行うのですか? + + + + * Pretextの出力は入力に依存します。最後の全結合層はバッチの種類に応じて**取り換える**ことができます。 + * 例えば、白黒画像のバッチデータがネットワークに入力され、モデルがカラー画像を生成するとします。次に、最終レイヤーを切り替え、相対位置を予測するためのパッチのバッチデータを与えます。 + + +* **Question:** Pretext taskでどの程度学習した方が良いですか? + + + * 経験則: 下流のタスクを改善するように非常に難しいpretext taskを使用します。 + * 実応用上は、pretext taskは再訓練されることはありません。開発では、全工程の一部として訓練されます。 + + + +## 自己教師あり学習をスケールさせる + + + +### ジグゾーパズル + + +* イメージを複数のタイルに分割し、これらのタイルをシャッフルします。モデルはその後、タイルを元の位置に戻すためにシャッフルを解除する作業を行う。(Noorozi & Favaro, 2016) + + + * 入力にどの順列が適用されたかを予測する。 + * これは、**画像の各タイルが独立して評価される**ようなタイルのバッチを作成することで行われます。次に、畳み込みネットワークからの出力が連結され、以下の図のようにタイルの並べ替えの予測が行われます。 + + +
+
+図14: ジグゾーpretext taskを解くためのSiameseネットワークアーキテクチャ。各タイルは独立に入力され、並び順を予測するために連結された埋め込みを使用します。(Misra) +
+ + * Considerations: + 1. Use a subset of permutations (i.e.: From 9!, use 100) + 2. The n-way ConvNet uses shared parameters + 3. The problem complexity is the size of the subset. The *amount of information you are predicting.* + * 考慮事項 + 1. 並び順の部分集合を使用してください(例:9から100を使用してください)。 + 2. n-way ConvNetはパラメータ共有をします。 + 3. 問題の複雑さは、部分集合の大きさです。これはすなわち*予測している情報の量です。* + + +* この方法は、ネットワークが入力の形状に関する概念を学習することができるため、教師ありの手法よりも下流のタスクで優れた性能を発揮することがあります。 + +* Shortcomings: Few Shot Learning: Limited number of training examples +* 欠点: few-shot学習:限られた訓練データ数 + + * **Self-supervised representations are not as sample efficient** + * **自己教師あり表現はサンプル効率が悪い** + + + +### 評価: Fine-tuning vs 線形分類器 + + This form of evaluation is a kind of **Transfer Learning**. + この形の評価は、ある種の**転移学習**である。 + + +* **Fine Tuning**: 下流のタスクに適用する場合は、ネットワーク全体を**初期状態**として使用し、そこからすべての重みを更新して新しいネットワークを訓練します。 + + +* **線形分類器**: ネットワークの残りの部分をそのままにして、Pretext task を解かせたネットワークの上に、 下流のタスクを実行するための小さな線形分類器を訓練します。 + + + + + +* Pretextの学習を **様々なタスク** で評価することは有用です。これは、ネットワークの異なる層が作成した表現を**固定特徴**として抽出し、これらの異なるタスクでの有用性を評価することで可能になります。 + * 測定法: Mean Average Precision (mAP)(平均適合率の平均) --考慮しているすべての異なるタスクで平均化された平均適合率。 + * これらのタスクのいくつかの例は以下の通りです: 物体検出(fine-tuningを使用)、表面法線推定(Surface Normal Estimation) (NYU-v2 データセットをみてください) +* 各層は何を学習しているのか? + * 一般に、深い層の表現を用いるほど下流のタスクでのmAPは高くなります。 + * しかし、**最終層**では、層が**専門化しすぎている**ため、mAPが急激に低下します。 + * これは一般的にmAPが層の深さに応じて常に増加する教師ありネットワークとは対照的です。 + * このことは、pretext taskが下流のタスクにうまく**調整されていない**ことを示しています。 diff --git a/docs/ja/week10/10-2.md b/docs/ja/week10/10-2.md new file mode 100644 index 000000000..ac9fe9444 --- /dev/null +++ b/docs/ja/week10/10-2.md @@ -0,0 +1,562 @@ +--- +lang-ref: ch.10-2 +title: 自己教師あり学習 - ClusterFit と PIRL +lecturer: Ishan Misra +authors: Zhonghui Hu, Yuqing Wang, Alfred Ajay Aureate Rajakumar, Param Shah +date: 6 Apr 2020 +translation-date: 13 Aug 2020 +translator: Shiro Takagi +lang: ja +--- + + + +### [「pretext」tasksに欠けているものは? 汎化への希望](https://www.youtube.com/watch?v=0KeR6i1_56g&t=3710s) + + +Pretext taskは一般的に、自己教師あり学習下で行われる事前学習のステップと、分類や検出などの転移先のタスクから構成されています。私たちは、事前学習のタスクと転移先のタスクが「揃っている」ことを*期待*しています。ですので、pretext taskを設計し、それを本当にうまく実装するために、多くの研究が行われています。 + + +しかし、なぜそれ自体では意味がないタスクを実行すると良い特徴が得られるのかは非常に非自明です。例えば、ジグゾーパズルのようなものを解きながら、なぜ「意味」を学ぶことを期待できるのか?また、画像からハッシュタグを予測することが、転移先のタスクの分類器の学習に役立つと期待されるのはなぜか?という疑問が残ります。どのようにして転移先のタスクに沿った良い事前学習のタスクを設計すればよいのでしょうか? + + +この問題を評価する一つの方法は、各層の表現を見ることです(図1参照)。もし、最後の層の表現が転移先のタスクとうまく一致していなければ、事前学習のタスクは正しいタスクではないのかもしれません。 + + +
+
+図1: 各層の特徴表現 +
+ + +図2は、VOC07データに対する分類を行う線形分類器について、ジグソータスクで事前学習を用いて各層でのmAPをプロットしたものです。最後の層がジグソー問題に非常に特化していることがわかります。 + + +
+
+図2: 各層に基づくジグソータスクの性能 +
+ + + +### 事前学習された特徴から何を得たいのか? + + +* 画像が互いにどのように関係しているのかを表現する + + + * ClusterFit: Improving Generalization of Visual Representations + + +* 「nuisance factor」(厄介な要素)(関心がないが結果に影響を及ぼしてしまうような要因のこと)に対する頑健性 -- 不変性 + + + 例: オブジェクトの正確な位置、光源の正確な位置、正確な色 + + + * PIRL: Self-supervised learning of Pre-text Invariant Representations + + +上記の特性を達成するための2つの方法は、**クラスタリング**と**コントラスティブ学習**です。これらの方法は、これまでに設計されたどのようなpretext taskよりもはるかに良い性能を発揮するようになってきました。 クラスタリングに属する方法の一つは **ClusterFit** であり、もう一つの不変性に属する方法は **PIRL** です。 + + + +## ClusterFit: Improving Generalization of Visual Representations + + +特徴空間のクラスタリングは、画像が互いにどのような関連性を持っているかを見る一つの方法です。 + + + +### 方法 + + +ClusterFitは2つのステップに従います。 1つはクラスターステップ、もう1つは予測ステップです。 + + +#### クラスター: 特徴量クラスタリング + + +事前学習されたネットワークを用いて、画像の集合から特徴量を抽出します。ネットワークはどのような種類の事前学習ネットワークであっても構いません。そして、これらの特徴量に対してK平均クラスタリングを実行し、各画像が属したクラスターがその画像のラベルとなります。 + + +
+
+図3: クラスターステップ +
+ + + +#### フィット: クラスターの割り当てを予測する + + +このステップでは、画像の疑似ラベルを予測するためのネットワークを一から訓練します。これらの疑似ラベルは、最初のステップでクラスタリングによって得られたものです。 + + +
+
+図4: 予測ステップ +
+ + +図5の最初の行に示すように、標準的な事前学習と転移先タスクでは、最初にネットワークを事前学習してから、下流のタスクで評価をします。ClusterFitは、データセット $D_{cf}$ に対して事前学習を行い、事前学習されたネットワーク $N_{pre}$ を得ます。事前学習したネットワーク $N_{pre}$ をデータセット $D_{cf}$ 上で実行してクラスタを生成します。そして、このデータに対して新しいネットワーク $N_{cf}$ をゼロから学習します。最後に、下流のすべてのタスクに $N_{cf}$ を使用します。 + +
+
+Fig. 5: 「標準的な」 事前学習 + 転移学習 vs「標準的な」 事前学習 + ClusterFit +
+ + + +### なぜClusterFitがうまくいくのか + + +なぜClusterFitが機能するかというと、クラスタリングのステップでは本質的な情報だけが捕捉されてアーティファクトは捨てられ、第二のネットワークがより一般的なものを学習するようになるからです。 + +To understand this point, a fairly simple experiment is performed. We add label noise to ImageNet-1K, and train a network based on this dataset. Then, we evaluate the feature representation from this network on a downstream task on ImageNet-9K. As it is shown in Fig. 6, we add different amounts of label noise to the ImageNet-1K, and evaluate the transfer performance of different methods on ImageNet-9K. +この点を理解するために、かなり簡単な実験を行います。 ImageNet-1Kにラベルノイズを追加し、このデータセットに基づいてネットワークを学習させます。そして,このネットワークの特徴表現を ImageNet-9Kを用いた下流のタスクで評価します。図 6 に示すように、ImageNet-1K にラベルノイズを付加し、ImageNet-9K での転移先での分類タスクの性能を評価しています。 + + +
+ +
図6: 対照実験 +
+ + +ピンクの線は事前学習されたネットワークの性能を示しており、ラベルノイズの量が増えると性能が低下します。青色の線はモデル蒸留を表しており、初期ネットワークを使用してラベルを生成します。蒸留は一般的に事前学習済みネットワークよりも優れた性能を発揮します。 緑の線、ClusterFitは、これらの方法のいずれよりも一貫して優れています。この結果は、私たちの仮説を検証しています。 + + +* 質問: なぜ蒸留法と比較するのですか。蒸留法とClusterFitの違いは何ですか? + +モデル蒸留では、事前に学習したネットワークを用いて、ネットワークが予測したラベルをよりソフトな方法で画像のラベルを生成します。例えば、すべてのクラスの分布を得て、この分布を使って2番目のネットワークを学習します。柔らかい分布は、最初に得たクラスを強化するのに役立ちます。ClusterFitでは、ラベル空間は気にしません。 + + + +### 性能 + + +この手法を自己教師あり学習に適用します。ここでは、Jigsawを適用して、ClusterFitで事前学習されたネットワーク $N_{pre}$ を得ます。図7から、他の自己教師あり学習法と比較して、異なるデータセットでの転移先での性能が驚くほどの向上を示していることがわかります。 + + +
+
図7: 異なるデータセットに対する転移先での性能 +
+ + +ClusterFitは、事前学習済みのネットワークであれば、どのようなものにも使えます。追加のデータ、ラベル、アーキテクチャの変更なしに得られる利益は、図8に見ることができます。このように、ある意味では、ClusterFitは自己教師ありのfine-tuningステップであり、表現の質を向上させると考えることができます。 + + +
+
図8: 追加のデータ、ラベル、アーキテクチャの変更なしに得られる利益 +
+ + +## [Self-supervised Learning of Pretext Invariant Representations (PIRL)](https://www.youtube.com/watch?v=0KeR6i1_56g&t=4748s) + + + +### コントラスティブ学習 + + +コントラスティブ学習は、基本的には、関連性のある点を組み合わせたり、まとめたりして、関連性のない点を押し除けるような特徴空間を学習しようとする一般的なフレームワークです。 + + +
+
図9: 関連した画像と関連していない画像のグループ +
+ + +この場合、青い箱が互いに関連している点、緑も互いに関連している点、紫も互いに関連している点だと考えてください。 + + +
+
図10: コントラスティブ学習と損失関数 +
+ + +これらのデータ点のそれぞれの特徴量は、Siameseネットワークと呼ばれる共有ネットワークを介して抽出され、これらのデータ点のそれぞれについての画像特徴量が得られます。次に、例えば青い点と緑の点の間の距離とは対照的に、青い点の間の距離を最小にするためにコントラスト損失関数を用います。あるいは、基本的には、青い点の間の距離は、青い点と緑の点との間の距離、あるいは青い点と紫の点との間の距離よりも小さくなければなりません。つまり、関連するサンプルからの埋め込み空間は、関連しないサンプルからの埋め込み空間よりもはるかに近くなければなりません。これがコントラスティブ学習の一般的な考え方で、ご存知の通りYannはこの方法を最初に提案した先生の一人です。コントラスティブ学習は今、自己教師あり学習で再度注目され初めていて、実際自己教師あり学習の最先端の手法の多くは、このコントラスティブ学習に基づいています。 + + +### どのように関連しているかいないかを決めるのか? + + +そして、何が関連していて何が関連していないかをどのように定義するかというのが主な問題です。教師あり学習の場合、犬の画像はすべて関連性のある画像であり、犬ではない画像は基本的に関連性のない画像です。しかし、この自己教師あり学習の場合、関連性と非関連性をどのように定義するかはあまり明確ではありません。もう一つ、pretext taskのようなものとの大きな違いは、コントラスティブ学習では本当に一度にたくさんのデータを推論するということです。 損失関数を見ると、それは常に複数の画像を含んでいます。1列目は基本的に青と緑の画像を含み、2列目は青と紫の画像を含みます。しかし、ジグソーや回転予測のようなタスクでは、常に1つの画像を独立して推論していることになります。これがコントラスティブ学習とのもう一つの違いで、コントラスティブ学習は一度に複数のデータ点について推論します。 + + +このように、コントラスティブ学習では、複数のデータ点について一度に推論を行うことができます。動画の中で近くにあるフレームは関連性があり、別のビデオからのフレームや時間的に離れたフレームは関連性がありません。これがこの分野の多くの自己教師あり学習法の基礎となっています。この方法はコントラスト予測符号化(CPC)と呼ばれるもので、信号は逐次的であるという性質に依存しています。これを利用して、基本的にはかなり多くの作業が行われています:音声領域、動画、テキスト、特定の画像などです。最近では、動画とオーディオにも取り組んでいます。基本的には、動画とそれに対応するオーディオは関連するサンプルであり、別の動画の動画とオーディオは基本的に無関係なサンプルです。 + + + +### オブジェクトの追跡 + + +
+
図11: オブジェクトの追跡 +
+ + +自己教師あり学習のような初期の研究のいくつかは、このコントラスティブ学習法を使っていて、関連する例を非常に興味深く定義しています。トラッカーに追跡されたオブジェクトを動画上で走らせると、移動するパッチが得られ、トラッカーに追跡されたパッチは元のパッチに関連すると言います。一方、別の動画からのパッチは関連性のあるパッチではありません。つまり、基本的にはこれらの関連するサンプルと関連しないサンプルが出てきます。図11(c)では、距離表記のようなものがあります。このネットワークが学習しようとしているのは、基本的には、同じ動画から来たパッチは関連していて、異なる動画から来たパッチは関連していないということです。何らかの方法で、オブジェクトの異なる姿勢を自動的に学習します。これは、異なる角度から見たサイクルや、犬の異なる姿勢をグループ分けしようとします。 + + + +### 一つの画像の近くのパッチと離れているパッチ + + +
+
図12: 一つの画像の近くのパッチと離れているパッチ +
+ + +一般的に、画像について言えば、近くの画像パッチと遠くの画像パッチを比較することが多く、CPC v1やCPC v2のほとんどの手法は、画像のこの特性を利用しています。つまり、近い画像パッチはポジティブ(正例)と呼ばれ、離れた画像パッチはネガティブ(負例)と呼ばれ、このポジティブとネガティブの定義を使ってコントラスト損失を最小化することが目的となります。 + + + +### ある画像のパッチと別の画像のパッチ + +
+
図13: ある画像のパッチと別の画像のパッチ +
+ + +これを行うより一般的な、または実行可能な方法は、ある画像から来るパッチを見て、別の画像から来るパッチとそれらを対比させることです。これは、インスタンス識別、MoCo、PIRL、SimCLRのような多くの一般的な方法の基礎を成しています。基本的には、画像に示されているような考え方です。もっと詳しく説明すると、これらの手法では、画像から完全にランダムなパッチを抽出します。これらのパッチは重なり合っていたり、実際にはお互いの中に含まれていたり、完全にバラバラになっていたりします。この場合、例えば、色をごちゃ混ぜにしたり色を除去したりすることが考えられます。そして、この2つのパッチを正例として定義して、別のパッチを別の画像から抽出します。これもランダムなパッチで、基本的にはこれが負例になります。これらの手法の多くは、多くのネガティブパッチを抽出し、基本的にはコントラスト学習を行います。つまり、互いに関係のある2つの正例がありますが、コントラスト学習を行うための負例はたくさんあるような状況です。 + + + +### Pretext Taskの基本原理 + + +
+
図14: 画像変換のPretext Taskと標準的な Pretext学習 +
+ + + +それでは、少しPIRLの説明に移ります。これは、pretext taskの主な違いを理解しようとするもので、コントラスティブ学習がpretext taskとどう違うのかを理解しようとするものです。繰り返しになりますが、pretext taskでは、常に一度に一つの画像について推論します。 つまり、ある画像が与えられたときに、その画像に対して事前の変換(この場合はジグソー変換)を行い、その変換された画像をConvNetに入力して、適用した変換の特性、適用した並び替え、適用した回転、削除した色などを予測しようとするという考え方です。つまり、(また繰り返しですが)pretext taskは常に1つの画像について推論しています。もう一つは、この場合に実行しているタスクは、変換の性質を捉えなければならない、つまり、適用される正確な並び順の変換や回転の種類を捉えなければならないということです。 + + +しかし、残念ながら、これが意味するのは、最後の層の表現は信号の非常に低次の性質を捉えているということです。回転などの性質を確かに捉えてはいます。しかし、私たちが欲しいのは、例えば猫を認識するために不変な表現であって、それは例えば猫が直立していても、猫が90度の方向に曲がっていても、猫を認識できるような表現です。一方で、特定のpretext taskを解いているときには、全く逆のことを課していることになります。私たちは、この絵が直立しているか、この絵が基本的に横に曲がっているかを認識できるようになるべきだと言っているのです。このような低レベルの表現を共変量にしたいと思う例外はたくさんありますが、その多くは実行しているタスクに関係していて、かなり多くの3Dのタスクで予測できて欲しいのです。例えば、どのようなカメラ変換をしているかを予測したい場合はあります(同じオブジェクトの2つの側面を見ている場合など)。しかし、多くの意味を解釈したいようなタスクに対してそのような特定の用途でもない限り、入力を使用するための変換に対しては不変であって欲しいと考えるのです。 + + +### 不変性がどれだけ重要なのか? + + +不変性は特徴量学習の + + +になっています。ここに挿入してるかなり人気のある手作りの特徴であるSIFTのようなものは、不変になります。そして教師ありネットワーク、例えば教師ありAlex netは、Data Augmentation(データ拡張)に対して不変になるように訓練されています。このネットワークには、入力に適用された変換が正確に何であったかを予測するように求めるのではなく、この画像の異なるクロップ(トリミングのようなもの)や異なる回転を木として分類するようにして欲しいと考えます。 + + + + +### PIRL + + +
+
図15: PIRL +
+ + +これが PIRL の発想の源です。PIRL は pretext invariant representation learning の略で、表現が不変であること、あるいは入力変換の情報をできるだけ少なくすることを目指すという考え方です。ある画像とそれになんらかの変換を施した画像があり、これらの画像を ConvNet で順伝播すると、表現が得られますが、基本的にはこれら2つの画像に対するそれぞれの表現が類似しているようにします。先ほどの表記法では、画像 $I$ とその変換後の画像 $I^t$ は関連するサンプルであり、他の画像は関連しないサンプルです。このようにして、このネットワークを定式化するとき、獲得された表現にはこの変換 $t$ についての情報がほとんど含まれていないことが望まれます。ここでコントラスティブ学習を使っていると仮定します。コントラスティブ学習では、基本的には元の画像 $I$ から保存された特徴量 $v_I$ と、変換後の画像から得られた特徴量 $v_{I^t}$ があり、これらの表現は両方とも同じになるようにします。そして、私たちが見た本の論文は、最先端な2つのpretext変換、つまりジグソーパズルと先ほど議論した回転法です。ある意味では、これはマルチタスク学習のようなものですが、ただ本当に両方の回転を予測しようとしているわけではありません。ジグソーの回転に対しては不変であろうとするのですね。 + + + + +### たくさんの負例を用いる + + +過去に試行錯誤を成功させてコントラスティブ学習をうまく機能させてきた鍵となっているのは、大量の負例を使うことです。これを紹介した良い論文の1つが、2018年に発表されたこのインスタンス識別に関する論文で、ここではメモリバンクの概念を紹介しています。最先端の研究方法のほとんどは、このメモリバンクというアイデアに依拠しています。メモリバンクは、計算量を増加させることなく、多数の負例を得るための素晴らしい方法です。何をするかというと、画像ごとの特徴ベクトルをメモリに保存しておき、その特徴ベクトルをコントラスティブ学習に使用するということをします。 + + + +### どのように機能するか + + +
+
図16: メモリバンクがどのように機能するか +
+ + +最初に、メモリバンクを使わずにPIRLのセットアップを行う方法について説明します。画像 $I$ と画像 $I^t$ があり、これらの画像を順伝播すると、元の画像 $I$ から特徴ベクトル $f(v_I)$ が得られ、変換されたパッチから特徴量 $g(v_{I^t})$ が得られます。ここで求めたいのは、特徴量 $f$ と $g$ が似ていることです。そして、他の無関係な画像の特徴量は、基本的には似ていないものにしたいと考えます。この場合、大量の負例画像が必要な場合は、これらの負例画像を同時に順伝播する必要があり、これを実現するには非常に大きなバッチサイズが必要になります。もちろん、限られた量のGPUメモリ上では、大きなバッチサイズは望ましくありません。そこで、メモリバンクと呼ばれるものを使用する方法があります。このメモリバンクが何をするかというと、データセット内の各画像の特徴ベクトルを保存しておくことで、コントラスティブ学習を行う際に特徴ベクトルを使用するのではなく、例えば、負例画像とは異なる画像やバッチ内の異なる画像から特徴ベクトルを取得することができるようにします。他の無関係な画像の特徴量をメモリから取得して、それを代用してコントラスティブ学習を行うことができます。単に目的関数を2つの部分に分けると、変換された画像から特徴ベクトルを持ってくるためのコントラスト項がありました $g(v_I)$。これはメモリにある表現 $m_I$に似ています。そして、同様に、特徴量 $f(v_I)$ をメモリ上の特徴表現に近づけようとする第二のコントラスティブなConvNetがあります。本質的には、 $g$ は $m_I$ に近づこうとしており、 $f$ は $m_I$ に近づこうとしています。推移律から、 $f$ と $g$ が互いに近くに引っ張られていることになります。そして、これを外側に分ける理由は、安定した訓練のためであり、これをしないと訓練ができなかったからです。基本的に訓練が実際に収束することはありません。$f$と$g$の間で直接コントラスティブ学習をするのではなく、これを2つの形に分けることで、訓練を安定化させ、実際にうまくいくようにしたのです。 + + + +### PIRL 事前学習 + + +これを評価する方法は、基本的には標準的な事前学習の評価の仕組みによります。転移学習では、ラベルのない画像に対して事前学習を行うことができます。標準的な方法は、ImageNetを用意してラベルを捨て、教師なしのように用いることです。 + + +### [評価](https://www.youtube.com/watch?v=0KeR6i1_56g&t=5889s) + + +そして、完全なfine-tuningや線形分類器の訓練を使って評価しています。2番目に行ったことは、PIRLを手を加えていないそのままの画像で訓練することで、PIRLのテストと画像分布に対する頑健性を検証したことです。YFCCのデータセットであるFlickrから100万枚の画像をランダムに取得しました。そして、基本的にはこれらの画像に対して事前学習を行い、そのあとで異なるデータセットに対して転移を行いました。 + + + + +#### 物体検出タスクでの評価 + + +PIRLは、まず物体検出タスク(視覚系の +タスクにおける標準的なタスク)で評価され、**VOC07+12**と**VOC07**の両方のデータセットについて、ImageNetで事前学習したネットワークの性能を上回ることができました。実際、PIRLは、より厳しい評価基準である$AP^{all}$でも優れた性能を示しています。これはとても良い兆しです。 + + +
+
図17: 異なるデータセットに対する物体検出タスクの性能 +
+ + + +#### 半教師あり学習での評価 + + +次にPIRLを半教師あり学習タスクで評価しました。ここでもPIRLはかなり良い結果が得られました。実際、ジグソーのpretext taskよりもPIRLの方が良い結果が得られました。最初の行と最後の行の違いは、ジグソーが共変量版であるのに対し、PIRLは不変量版であるという違いだけです。 + + +
+
図18: ImageNetにでの半教師あり学習 +
+ + + +#### 線形分類器での評価 + + +線形分類器で評価すると、PIRLはCPCv2が登場したときには、実際にはCPCv2と同等の性能を持っていました。また、多くのパラメータの設定や多くの異なるアーキテクチャでも問題なく動作しました。そしてもちろん、今ではSimCLRなどの方法でかなり良い性能を発揮することができます。実際、SimCLRの一番良い精度は69-70くらいですが、PIRLの場合は63くらいになります。 + + + +
+
図19: 線形分類器でのImageNetの分類 +
+ + + +#### YFCC画像での評価 + + +PIRLは、YFCCのデータセットの中の*加工していないそのままのFlickrの*画像を用いて評価しました。PIRLは、$100$倍少ないデータセットでも、ジグソータスクよりも優れた性能を発揮することができました。このことは、単にpretext taskを予測するだけでなく、pretext taskの表現に不変性を考慮することの有効性を示しています。 + + + +
+
図20: 綺麗に加工されていないYFCC画像 +
+ + + +### 意味的な特徴 + + +次に、意味的な特徴の検証に戻って、PIRL と ジグソー の `conv1` から `res5` までの異なる表現の層における最も高い精度を見てみます。興味深いことに、PIRLとジグソーでは、それぞれの層で精度が向上していますが、ジグソーでは5層目で精度が低下していることがわかります。一方、PIRLでは精度が向上しています(層を経るごとにより意味的な特徴になっています)。 + + +
+
図21: 層ごとのPIRLの表現の質 +
+ + + +### スケーラビリティ + + +並べ替え方の数を予測する必要がなく、それをただ入力として使うだけなので、PIRLは問題の複雑な部分を扱うのに非常に優れています。つまり、PIRLは、9つのパッチの362880のすべての可能な順列へと簡単にスケーリングすることができます。一方、ジグソーでは、並べ替え自体を予測しているので、出力空間のサイズによって制限されてしまいます。 + + +
+
図22: パッチの並べ替え数を変化させた影響 +
+ + +また、「*Misra & van der Maaten, 2019, PIRL*」という論文では、PIRLをジグソーや回転予測などの他のタスクに簡単に拡張できることが示されています。さらに、ジグソーと回転予測の組み合わせのように、それらのタスクの組み合わせにも拡張することができます。 + + +
+
図23: 異なるpretext taskの組み合わせと共にPIRLを使う +
+ + + +### 不変性 vs 性能 + + +不変性という点では、一般的に PIRL の不変性はクラスタリングの不変性よりも高いと断言できます。また、同様に、PIRL の方がクラスタリングよりも性能が良いです。その結果、pretext taskよりも高い性能をはっきすることになります。このことから、より不変性を持たせることで性能が向上する可能性があることが示唆されました。 + + + +### 欠点 + + +1. どのデータ変換が大事なのかがあまり明確ではありません。ジグソーはうまくいきますが、なぜ機能するのかはあまり明確ではありません。 +2. モデルサイズとデータサイズによる(性能の?)飽和。 +3. 3. どのような不変性が重要なのか?(特定の教師ありタスクに対してどのような不変性が働くかについては、今後の課題として一般的に考えることができます。) + + + +したがって、一般的には、より多くの情報を予測しようとする一方で、可能な限り不変であるようにするべきです。 + + +## 疑問として聞かれた重要な質問のうちのいくつか + + + +### コントラスティブ学習とバッチ正規化 + + +1. コントラスティブ学習を行うネットワークがバッチ正規化を使用している場合、ネットワークは正例と負例を分離するための極めて自明な方法しか学習しないのではないでしょうか? + + +**回答**: *PIRLでは、そのような現象はみられませんでした。ですので通常のバッチ正規化を使っています。* + + +2. それではコントラスティブ学習を行う任意のネットワークに対してバッチ正規化を使っても良いのでしょうか? + + +**回答**: *一般にはそうです。SimCLRでは、大きなバッチサイズを使った場合を真似するために少し変わったバッチ正規化を使っています。ですので、微調整が加えられたバッチ正規化を使用することで訓練が簡単になっている可能性はあります。* + + +3. バッチ正規化がメモリバンクとして実装されているので、すべての表現が同時に取得されるわけではないと思うのですが、PIRL の論文ではバッチ正規化は機能するのでしょうか?(例えば MoCo の論文ではバッチ正規化は特に使われていないので) + + +**回答**: *そうですね。PIRLでは、同じバッチがすべての表現を持っているわけではないので、バッチ正規化が働くのかもしれません。これは一つのバッチの中で全ての表現が相関しているような別のタスクについては必ずしも成り立つとは限りませんが。* + + +4. ではメモリバンク以外に、n個のペアの損失をどうすればいいかについて、何か提案はありますか?バッチ正規化を使わないものや、AlexNetなどを使うべきでしょうか?それともバッチ正規化層が働かないようにする方法はありますか?(これは動画学習タスクのためのものです。) + + +**回答**: *一般的に動画ではフレーム間に相関があり、相関があるとバッチ正規化の性能が低下します。また、AlexNetの最も単純な実装でも、実際にはバッチ正規化を使用しています。なぜなら、バッチ正規化を用いて学習した方が学習がはるかに安定するからです。より大きな学習率を使用することもできますし、他の下流のタスクにも使用することができます。バッチ正規化の亜種であるグループ正規化は、バッチサイズに依存しないので、例えば動画学習タスクに使うことができます。* + + + +### PIRLの損失関数 + + +1. PIRLでは、データ分布の負の確率だけではなく、損失を最小化するためにNCE(Noise Contrastive Estimator)が使われているのはなぜですか:$h(v_{I},v_{I^{t}})$? + + +**回答**: *実はどちらも使えます。NCEを使う理由は、メモリバンクを提案した論文のセットアップが関係しています。つまり、$k+1$の負例があれば、$k+1$の二値問題を解くのと同じことになります。別の方法として、ソフトマックスを適用する方法もあります。この方法では、ソフトマックスを適用して、負の対数尤度を最小化します。* + + + +### 自己教師あり学習のプロジェクトに関するコツ + + +簡単な自己教師あり学習を機能させるためには?どのように実装し始めれば良いのか? + + +**回答**: *初期の段階で役立ついくつかのテクニックがあります。例えば、pretext taskを見てみるといいでしょう。回転予測は非常に簡単に実装できるタスクです。動かす断片の数は一般的に良い指標になります。既存の手法を実装しようとしているのであれば、著者が言及している詳細をよく見てみる必要があるかもしれません - 使用した正確な学習率、バッチ正規化の使用方法など。このようなものが多くなればなるほど、実装が難しくなります。次に考慮すべき非常に重要なことは、data augumentationです。とりあえず動くものが作れたら、そこにdata augumentationを追加してください。* + + + +### 生成モデル + + +生成モデルとコントラスティブ学習を組み合わせることを考えたことはありますか? + + +**Ans**: *一般に良いアイデアだと思います。しかし、そのようなモデルを訓練するのはトリッキーでどのように行うか非自明非なこともあって、まだ実装されていません。統合的なアプローチは単独のものより実装するのが難しいですが、おそらく進むべき方向性です。* + + + +### 蒸留 + + +柔らかい分布(ソフトラベルも考慮したデータ分布のこと)によってより豊富なターゲットが与えられると、モデルの不確かさが増すのではないでしょうか?また、なぜ蒸留と呼ばれているのでしょうか? + + + +**回答**: *one-hotラベルで訓練すると、モデルは出力結果に対して非常に自信過剰になりがちです。ラベル平滑化のようなトリックがいくつかの手法で使われています。ラベル平滑化は、one-hotベクトルを予測しようとする蒸留の単純な場合にすぎません。ここでは、one-hotベクトル全体を予測しようとするのではなく、その中から確率の値を取り出し、1か0かを予測する代わりに、$0.97$を予測し、残りのベクトルに$0.01$, $0.01$, $0.01$, $0.01$を一様に加えます。蒸留は、この方法をより多くの情報に基づいて行う方法にすぎません。無関係なタスクの確率をランダムに増加させる代わりに、事前学習済みのモデルを使います。一般的に、柔らかい分布は事前学習の方法では非常に有用です。モデルは出力結果を過信しがちなので、柔らかい分布の方が訓練しやすいからです。また、収束の速度も速くなります。蒸留にはこのような利点がみられます。* diff --git a/docs/ja/week10/10-3.md b/docs/ja/week10/10-3.md new file mode 100644 index 000000000..555a9c562 --- /dev/null +++ b/docs/ja/week10/10-3.md @@ -0,0 +1,273 @@ +--- +lang-ref: ch.10-3 +title: The Truck Backer-Upper +lecturer: Alfredo Canziani +authors: Muyang Jin, Jianzhi Li, Jing Qian, Zeming Lin +date: 7 Apr 2020 +translation-date: 14 Aug 2020 +translator: Shiro Takagi +lang: ja +--- + + + + + +## [セットアップ](https://www.youtube.com/watch?v=A3klBqEWR-I&t=59s) + + +このタスクの目的は、任意の初期位置から積荷を積み下ろしする場所へトラックをバックさせる際のハンドルを制御するような、**自己学習する制御システム**を作ることです。 + + +図1に示されているように、**バックしかできない** ことに注意してください。 + + +|![]({{site.baseurl}}/images/week10/10-3/fig1.png)| +|
Fig. 1: トラックとトレーラーと積荷を積み下ろしする場所
| + + +トラックの**状態**は6つのパラメータで表現されます: + + + - $\tcab$: トラックの角度 + - $\xcab, \ycab$: トレーラーの正面の座標 + - $\ttrailer$: トレーラーの角度 + - $\xtrailer, \ytrailer$: トレーラーの後ろ側の座標 + +The **goal** of the controller is to select an appropriate angle $\phi$ at each time $k$, where after the truck will back up in a fixed small distance. Success depends on two criteria: +1. The back of the trailer is parallel to the wall loading dock, e.g. $\ttrailer = 0$. +2. The back of the trailer ($\xtrailer, \ytrailer$) is as close as possible to the point ($x_{dock}, y_{dock}$) as shown above. +制御システムの**目的**は、各時刻$k$ごとにトラックがある固定した小さな距離をバックした後に、適切な角度$\phi$を選択することです。成功は2つの基準に依存します。 +1. トレーラーの後部が、壁の積み込みドックと平行である、例えば、 $\ttrailer = 0$。 +2. トレーラーの後部 ($\xtrailer, \ytrailer$) が、上記で示されているような点($x_{dock}, y_{dock}$) にできるだけ近い。 + + + +## より多くのパラメータと可視化 + + +![]({{site.baseurl}}/images/week10/10-3/fig2.png)| +|
図2: 可視化のためのパラメータ
| + + +ここでは、図2に示したようなあといくつかのパラメータについて考えてみます。 +車の長さ$L$、車とトレーラーの距離$d_1$、トレーラーの長さ$d_2$などが与えられると、角度や位置の変化を計算することができます: + +$$ +\begin{aligned} +\dot{\theta_0} &= \frac{s}{L}\tan(\phi)\\ +\dot{\theta_1} &= \frac{s}{d_1}\sin(\theta_1 - \theta_0)\\ +\dot{x} &= s\cos(\theta_0)\\ +\dot{y} &= s\sin(\theta_0) +\end{aligned} +$$ + + +ここで、$s$は符号付き速度を、$\phi$はハンドルの負の舵角を表しています。 +これで、$\xcab$, $\ycab$, $\theta_0$, $\theta_1$ の4つのパラメータだけで状態を表現できるようになりました。 +これは、長さのパラメータがわかっていて、$\xtrailer, \ytrailer$が$\xcab, \ycab, d_1, \theta_1$で決まるからです。 + + +Deep LearningリポジトリのJupyter Notebook から、 いくつかの環境の例を図3(1-4)に示します: + + +| || +| **Fig. 3.1**: 環境のプロットのサンプル | **Fig. 3.2**: 自分自身に突っ込んでいる (ジャックナイフ) | +| || + + + +| **Fig. 3.3**: 境界の外に出る |**Fig. 3.4**: ドックに到着する| +各時刻$k$で、$-\frac{\pi}{4}$から$\frac{pi}{4}$までのハンドル操作の信号が入力され、トラックはそれに対応した角度で後退する。 + + +トラックの運転が終了する状況はいくつかある。 + - トラックが自分自身に突っ込んだ場合(図 3.2 のようなジャックナイフ)。 + - トラックが境界線の外に出た場合(図 3.3 に示す)。 + - トラックがドックに到達した場合(図 3.4 に示す)。 + + +## [訓練](https://www.youtube.com/watch?v=A3klBqEWR-I&t=1184s) + + +訓練は2段階で行われる。(1)トラックやトレーラーの運動のエミュレータとなるニューラルネットワークの訓練と、(2)トラックを制御するための制御システムとなるニューラルネットワークの訓練である。 + + +| ![]({{site.baseurl}}/images/week10/10-3/fig7.png) | +|
図4: 概要図
| + + +上記のように、概念図では、2つのブロックは訓練される予定の2つのネットワークである。各時間ステップ$k$では、「Trailer Truck Kinematics」、つまり今までエミュレータと呼んでいたものが、6次元の状態ベクトルと制御システムから生成されたハンドル操作信号を入力され、時間$k + 1$で新たな6次元の状態を生成します。 + + + +### エミュレータ + + +エミュレータは、現在の位置($\tcab^t$,$\xcab^t, \ycab^t$, $\ttrailer^t$, $\xtrailer^t$, $\ytrailer^t$)と操舵方向 $phi^t$ を入力として受け取り、次の時間テップの状態を出力します。これは、線形の隠れ層とReLU活性化関数と線形出力層から構成される。損失関数としてMSEを用い、確率的勾配降下法を用いてエミュレータを学習する。 + + +|![]({{site.baseurl}}/images/week10/10-3/fig8.png)| +|
図5: ニューラルネットエミュレータを学習する
| + + +この設定では、現在地とハンドルの角度が与えられていれば、次のステップの位置をシミュレーターが教えてくれます。したがって、シミュレータをエミュレートするニューラルネットは必要ありません。しかし、より複雑なシステムでは、システムの背後にある方程式にアクセスできないかもしれません。例えば、良い計算可能なこの宇宙の法則を私たちは知りません。ハンドル操作の信号とそれに対応するパスを記録したデータを観測できるだけかもしれません。この場合、この複雑なシステムの動きをエミュレートするためにニューラルネットを訓練したいと考えています。 + + +`Class truck`に、エミュレータを訓練するために考慮しなければならない重要な2つの関数があります。 + + +1つ目は、計算後のトラックの出力状態を与える`step`という関数です。 + +```python +def step(self, ϕ=0, dt=1): + + # Check for illegal conditions + if self.is_jackknifed(): + print('The truck is jackknifed!') + return + + if self.is_offscreen(): + print('The car or trailer is off screen') + return + + self.ϕ = ϕ + x, y, W, L, d, s, θ0, θ1, ϕ = self._get_atributes() + + # Perform state update + self.x += s * cos(θ0) * dt + self.y += s * sin(θ0) * dt + self.θ0 += s / L * tan(ϕ) * dt + self.θ1 += s / d * sin(θ0 - θ1) * dt +``` + + +2つ目は、トラックの現在の位置を返す`state`という関数です。 + +```python +def state(self): + return (self.x, self.y, self.θ0, *self._traler_xy(), self.θ1) +``` + + +まず二つのリストを生成します。ランダムに生成されたハンドルの角度`φ`とトラックからの初期状態を付け加えた入力リストを生成します。そして、`truck.step(ϕ)` で計算可能なトラックの出力状態を追加した出力リストを生成します。 + + +これでエミュレーターを訓練できるようになりました。 + +```python +cnt = 0 +for i in torch.randperm(len(train_inputs)): + ϕ_state = train_inputs[i] + next_state_prediction = emulator(ϕ_state) + + next_state = train_outputs[i] + loss = criterion(next_state_prediction, next_state) + + optimiser_e.zero_grad() + loss.backward() + optimiser_e.step() + + if cnt == 0 or (cnt + 1) % 1000 == 0: + print(f'{cnt + 1:4d} / {len(train_inputs)}, {loss.item():.10f}') + cnt += 1 +``` + + +`torch.randperm(len(train_inputs))` は、 $0$ から入力の長さから $1$ を引いた範囲内のインデックスのランダムな並べ替えを与えていることに注意してください。インデックスの並べ替えの後、毎回 `φ_state` が入力リストからインデックス `i` で選択されます。線形出力層を持つエミュレータ関数を通して `φ_state` を入力すると、 `next_state_prediction` が得られます。エミュレータは以下のように定義されたニューラルネットワークであることに注意してください。 + +```python +emulator = nn.Sequential( + nn.Linear(steering_size + state_size, hidden_units_e), + nn.ReLU(), + nn.Linear(hidden_units_e, state_size) +) +``` + + +ここでは MSE を使用して真の次の状態と次の状態の予測の間の誤差を計算します。ただし、真の次の状態は入力リストからの`ϕ_state` のインデックスに対応するインデックス `i` を持つ出力リストから来ています。 + + +### 制御システム + + +図 5 を参照してください。ブロック$\matr{C}$は制御システムを表しています。現在の状態を入力として受けて、ハンドルの角度を出力します。そして、ブロック$\matr{T}$(エミュレータ)は、状態とハンドルの角度の両方を入力として受けて、次の状態を生成します。 + +|![]({{site.baseurl}}/images/week10/10-3/fig13.png)| + +|![]({{site.baseurl}}/images/week10/10-3/fig13.png)| +|
図5: 状態遷移図
| + + +制御システムの学習では、ランダムな初期状態から開始し、トレーラがドックと平行になるまで、$\matr{C}$と$\matr{T}$の手順を繰り返します。誤差はトレーラの位置とドックの位置を比較して計算します。 +その後、誤差逆伝播を用いて勾配を求め、SGDによって制御システムのパラメータを更新します。 + + +### [モデルの構造の詳細](https://www.youtube.com/watch?v=A3klBqEWR-I&t=2328s) + + +これは($m\matr{C}$, $\matr{T}$)の処理の詳細を表したグラフです。まず、状態(6次元ベクトル)から始めて、それに学習可能な重み行列をかけて25個の隠れユニットを得ます。そして、それを別の学習可能な重み行列に通し、出力を得ます。同様に、状態と角度$\phi$ (7次元ベクトル)を2層に分けて入力し、次のステップの状態を生成します。 + +![]({{site.baseurl}}/images/week10/10-3/fig14.png) + + +これをより明確に見るために、エミュレータの正確な実装を示します。 + +```python +state_size = 6 +steering_size = 1 +hidden_units_e = 45 + +emulator = nn.Sequential( + nn.Linear(steering_size + state_size, hidden_units_e), + nn.ReLU(), + nn.Linear(hidden_units_e, state_size) +) + +optimiser_e = SGD(emulator.parameters(), lr=0.005) +criterion = nn.MSELoss() +``` + + + +### 動きの例 + + +次の4つは異なる初期状態から始めた時の例です。各エピソードの時間ステップがばらついていることに注意してください。 + +|![]({{site.baseurl}}/images/week10/10-3/fig16.png) | ![]({{site.baseurl}}/images/week10/10-3/fig17.png) | +|![]({{site.baseurl}}/images/week10/10-3/fig18.png) | ![]({{site.baseurl}}/images/week10/10-3/fig19.png) | + + + +### 追加の情報源: + + +動かせる完全なデモは次のサイトで見ることができます。: [https://tifu.github.io/truck_backer_upper/](https://tifu.github.io/truck_backer_upper/). +次のリンクにあるコードもチェックしてみてください。[https://github.com/Tifu/truck_backer_upper](https://github.com/Tifu/truck_backer_upper). diff --git a/docs/ja/week10/10.md b/docs/ja/week10/10.md new file mode 100644 index 000000000..6cc7ac74b --- /dev/null +++ b/docs/ja/week10/10.md @@ -0,0 +1,30 @@ +--- +lang-ref: ch.10 +title: Week 10 +translation-date: 14 Aug 2020 +translator: Shiro Takagi +lang: ja +--- + + + +## レクチャー パート A + + +このセクションでは、自己教師あり学習(SSL)の動機を理解し、それが何であるかを定義し、NLPやコンピュータビジョンでの応用例を見ていきます。また、pretext taskがどのようにSSLを助けるのかを理解し、画像、動画、音声付き動画などのpretext taskの例を見ます。最後に、pretext taskによって学習された表現の背後にある直感を得ることを目指します。 + + +## レクチャー パート B + + +このセクションでは、pretext taskの欠点について議論し、良い事前学習された特徴を作る性質を定義し、クラスタリングとコントラスティブ学習を用いてどのようにしてこれを達成できるかを説明します。次にClusterFitとそのステップと性能について学びます。さらに、PIRLとして知られるコントラスティブ学習のための特定の単純なフレームワークの説明に移ります。PIRLの動作に加えて様々な文脈での評価についても議論します。 + + +## 演習 + + +今週の実習では、[Truck Backer-Upper](http://neuro.bstu.by/ai/To-dom/My_research/Papers-2.1-done/RL-sparce-reward/9/Ref/truckbackerupper.pdf)についてみていきます(Nguyen & Widrow, '90)。 +この問題は、ニューラルネットワークを用いて非線形制御問題を解く方法を示しています。 +トラックのキネマティクスを学習し、この学習したモデルを用いて制御システムを最適化することで、純粋な観測データを用いて複雑な挙動を学習できることがわかります。 diff --git a/docs/ja/week11/11-1.md b/docs/ja/week11/11-1.md new file mode 100644 index 000000000..2d89765fe --- /dev/null +++ b/docs/ja/week11/11-1.md @@ -0,0 +1,755 @@ +--- +lang-ref: ch.11-1 +lecturer: Yann LeCun +title: Activation and loss functions (part 1) +authors: Haochen Wang, Eunkyung An, Ying Jin, Ningyuan Huang +date: 13 April 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + +## [活性化関数](https://www.youtube.com/watch?v=bj1fh3BvqSU&t=15s) + + +本日の講義では、PyTorchでの重要な活性化関数とその実装をおさらいします。これらの活性化関数は、特定の問題に対してより良い働きをすると主張する様々な論文から来ています。 + + +### ReLU - `nn.ReLU()` + +$$ +\text{ReLU}(x) = (x)^{+} = \max(0,x) +$$ + + +
+
+図1: ReLU +
+ + +### RReLU - `nn.RReLU()` + + +ReLUには様々亜種があります。Random ReLU (RReLU) は以下のように定義されます。 + +$$ +\text{RReLU}(x) = \begin{cases} + x, & \text{if $x \geq 0$}\\ + ax, & \text{otherwise} + \end{cases} +$$ + + +
+
+図2: ReLU, Leaky ReLU/PReLU, RReLU +
+ + +RReLUでは、$a$は、学習中にサンプリングを所定の範囲に保ち、テスト中は固定されたままにするランダム変数であることに注意してください。PReLUでは、$a$も学習されます。Leaky ReLUでは、$a$は固定されています。 + + +### LeakyReLU - `nn.LeakyReLU()` + +$$ +\text{LeakyReLU}(x) = \begin{cases} + x, & \text{if $x \geq 0$}\\ + a_\text{negative slope}x, & \text{otherwise} + \end{cases} +$$ + + +
+
+図3: LeakyReLU +
+ + +ここで、$a$は固定パラメータです。この方程式の一番下の部分は、ReLUニューロンが不活発になってどのような入力に対しても0しか出力しなくなる問題である、ReLUの死滅の問題を防ぎます。負の傾きを使用することで、ネットワークが伝搬して有用なものを学習することができます。 + + + +LeakyReLUは、通常のReLUでは勾配を伝播することがほとんど不可能な狭いニューラルネットに必要です。LeakyReLUを使えば、すべてがゼロになってしまっている領域にいても、ネットワークは勾配を保持することができます。 + +### PReLU - `nn.PReLU()` + +$$ +\text{PReLU}(x) = \begin{cases} + x, & \text{if $x \geq 0$}\\ + ax, & \text{otherwise} + \end{cases} +$$ + + +ここで $a$ は学習可能なパラメータです。 + + +
+
+図4: ReLU +
+ + +上記の活性化関数(すなわち、ReLU、LeakyReLU、PReLU)は、スケール不変です。 + + +### Softplus - `Softplus()` + +$$ +\text{Softplus}(x) = \frac{1}{\beta} * \log(1 + \exp(\beta * x)) +$$ + + +
+
+図5: Softplus +
+ + +SoftplusはReLU関数の滑らかな近似であって、出力が常に正であるように制約を加えるために使うことができます。 + + +この関数は、$\beta$がどんどん大きくなっていくと、ReLUに近づいていきます。 + + +### ELU - `nn.ELU()` + +$$ +\text{ELU}(x) = \max(0, x) + \min(0, \alpha * (\exp(x) - 1) +$$ + + +
+
+図6: ELU +
+ + +ReLUとは異なり、0より小さな値を出力できるので、平均出力をゼロにすることを可能になります。したがって、モデルはより速く収束するかもしれません。そして、そのバリエーション(CELU, SELU)は、単にパラメトリゼーションが異なるだけです。 + + +### CELU - `nn.CELU()` + +$$ +\text{CELU}(x) = \max(0, x) + \min(0, \alpha * (\exp(x/\alpha) - 1) +$$ + + +
+
+図7: CELU +
+ + +### SELU - `nn.SELU()` + +$$ +\text{SELU}(x) = \text{scale} * (\max(0, x) + \min(0, \alpha * (\exp(x) - 1)) +$$ + + +
+
+図8: SELU +
+ + +### GELU - `nn.GELU()` + +$$ +\text{GELU(x)} = x * \Phi(x) +$$ + + +ただし$\Phi(x)$ はガウス分布の累積分布関数です。 + + +
+
+図9: GELU +
+ + +### ReLU6 - `nn.ReLU6()` + +$$ +\text{ReLU6}(x) = \min(\max(0,x),6) +$$ + + +
+
+図10: ReLU6 +
+ + +これはReLUが6で飽和していることを示していますが、6を飽和とする理由は特にありませんので、以下のSigmoid関数を利用することで、より良い結果が得られます。 + +### Sigmoid - `nn.Sigmoid()` + +$$ +\text{Sigmoid}(x) = \sigma(x) = \frac{1}{1 + \exp(-x)} +$$ + + +
+
+図11: Sigmoid +
+ +シグモイドを何層にも重ねると、学習効率が悪くなることがあり、慎重な初期化が必要になります。これは、入力が非常に大きかったり小さかったりすると、シグモイド関数の勾配が0に近くなるからで、この場合、パラメータを更新するための勾配が流れません。これは勾配の飽和として知られています。したがって、ディープニューラルネットワークでは、単一のキンク関数(ReLUなど)が好ましいです。 + + +### Tanh - `nn.Tanh()` + +$$ +\text{Tanh}(x) = \tanh(x) = \frac{\exp(x) - \exp(-x)}{\exp(x) + \exp(-x)} +$$ + + +
+
+図12: Tanh +
+ + +Tanhは、-1から1までの範囲で、中心化されていることを除いて、Sigmoidと基本的に同じです。 関数の出力は、ほぼ平均ゼロです。したがって、モデルはより速く収束します。 各入力変数の平均がゼロに近い場合、収束は通常より速くなることに注意してください。例えば、バッチ正規化は同様の理由で学習を高速化します。 + +### Softsign - `nn.Softsign()` + +$$ +\text{SoftSign}(x) = \frac{x}{1 + |x|} +$$ + + +
+
+図13: Softsign +
+ + +これはSigmoid関数に似ていますが、漸近点への到達が遅く、勾配消失問題を緩和します(ある程度)。 + + +### Hardtanh - `nn.Hardtanh()` + +$$ +\text{HardTanh}(x) = \begin{cases} + 1, & \text{if $x > 1$}\\ + -1, & \text{if $x < -1$}\\ + x, & \text{otherwise} +\end{cases} +$$ + + +線形の範囲である [-1, 1] は `min_val` と `max_val`で調節できます。 + + +
+
+図14: Hardtanh +
+ + +重みが小さな値の範囲に収まっている時に、驚くほどうまくいきます。 + + +### Threshold - `nn.Threshold()` + +$$ + y = \begin{cases} + x, & \text{if $x > \text{threshold}$}\\ + v, & \text{otherwise} + \end{cases} +$$ + + +勾配を逆伝播できないので、ほとんど用いられません。 そしてこれは、60年代、70年代にバイナリーニューロンを使っていた時代に誤差逆伝播法を使うことを妨げていた理由でもあります。 + + +### Tanhshrink - `nn.Tanhshrink()` + +$$ +\text{Tanhshrink}(x) = x - \tanh(x) +$$ + + +
+
+図15: Tanhshrink +
+ + +潜在変数の値を計算するためのスパース符号化以外では、ほとんど使用されません。 + + +### Softshrink - `nn.Softshrink()` + +$$ + \text{SoftShrinkage}(x) = \begin{cases} + x - \lambda, & \text{if $x > \lambda$}\\ + x + \lambda, & \text{if $x < -\lambda$}\\ + 0, & \text{otherwise} + \end{cases} +$$ + + +
+
+図16: Softshrink +
+ + +基本的に変数を0に向かって一定数だけ収縮させ、変数が0に近い場合は0にします。 これは、$\ell_1$基準の勾配のステップと考えることができます。またこれは、反復的収縮-閾値調整アルゴリズム(ISTA)のステップの一つでもあります。しかし、標準的なニューラルネットワークでは活性化関数としてはあまり使われていません。 + + +### Hardshrink - `nn.Hardshrink()` + +$$ + \text{HardShrinkage}(x) = \begin{cases} + x, & \text{if $x > \lambda$}\\ + x, & \text{if $x < -\lambda$}\\ + 0, & \text{otherwise} + \end{cases} +$$ + + +
+
+図17: Hardshrink +
+ + +スパース符号化以外では、ほとんど使用されません。 + + +### LogSigmoid - `nn.LogSigmoid()` + +$$ +\text{LogSigmoid}(x) = \log\left(\frac{1}{1 + \exp(-x)}\right) +$$ + + +
+
+図18: LogSigmoid +
+ + +ほとんどの場合損失関数で用いられますが、活性化関数としては一般的ではありません。 + +### Softmin - `nn.Softmin()` + +$$ +\text{Softmin}(x_i) = \frac{\exp(-x_i)}{\sum_j \exp(-x_j)} +$$ + + +数字を確率分布に変えてくれます。 + + +### Soft(arg)max - `nn.Softmax()` + +$$ +\text{Softmax}(x_i) = \frac{\exp(x_i)}{\sum_j \exp(x_j)} +$$ + + +### LogSoft(arg)max - `nn.LogSoftmax()` + +$$ +\text{LogSoftmax}(x_i) = \log\left(\frac{\exp(x_i)}{\sum_j \exp(x_j)}\right) +$$ + + +損失関数ではほとんど使われていますが、活性化関数として使うのは一般的ではありません。 + + +## [Q&A activation functions](https://www.youtube.com/watch?v=bj1fh3BvqSU&t=861s) + + +### `nn.PReLU()` related questions + + + +- なぜ、すべてのチャンネルで同じ値の $a$ が必要なのでしょうか? + + > チャンネルによって $a$ の値が異なる可能性があります。すべてのユニットのパラメータとして $a$ を使用することができます。それを特徴マップとして共有することもできます。 + + + +- $a$を学習するんですか? $a$を学習することのメリットはなんなのでしょうか? + + > $a$を学習するか、固定するかのどちらかです。 + > 固定する理由は、非線形性が負の領域にあっても、非線形性がゼロではない勾配を与えるようにするためです。 + > 学習可能な$a$にすることで、非線形性を線形写像か完全に修正可能かのどちらかに変えることができるようになります。これは、エッジの極に関係なくエッジ検出器を実装するようないくつかの応用に有用かもしれません。 + + + +- 非線形性はどのくらい複雑にしたいのですか? + + > 理論的には、非線形関数全体を非常に複雑な方法でパラメトライズすることができます。例えば、spring parameterやチェビシェフ多項式などです。パラメトリゼーションは学習過程の一部になるかもしれません。 + + + + +- パラメトライズすることは、ユニットを増やすよりも何かメリットはありますか? + + > それは本当にあなたが何をしたいかに依存します。例えば、低次元空間で回帰を行う場合、パラメトライゼーションは役立つかもしれません。しかし、あなたのタスクが画像認識のような高次元空間の下にある場合は、ただ単に「ある」非線形性が必要なだけであって、単調な非線形性の方がうまくいくでしょう。 + > 要するに、好きな関数をパラメトライズすることはできますが、大きな利点はありません。 + + + +### Kinkに関する質問 + + + +- 一つのkinkと二つのkink + + > ダブルキンクは、その中にスケールが組み込まれています。これは、入力層が2倍(または信号の振幅が2倍)になると、出力が全く異なるものになることを意味します。信号は非線形性が高くなりますので、出力は全く異なる挙動になります。一方、キンクが1つだけの関数を持っている場合、入力を2倍にすると、出力も2倍になります。 + + + + +- キンクを持つ非線形活性化と平滑な非線形活性化の違い。なぜ、あるいはいつ、どちらか一方が好ましいのでしょうか? + + > それはスケールについての等価性の問題です。キンクが鋭い場合は、入力に2を掛けて、出力に2を掛けます。例えば、滑らかな遷移がある場合、入力を100倍にすると、滑らかな部分が100倍に縮小されているので、出力は鋭いキンクがあるように見えます。入力を100で割ると、キンクは非常に滑らかな凸関数になります。このように、入力のスケールを変えることで、活性化ユニットの振る舞いを変えることができます。 + + > 時々、これが問題になることがあります。例えば、2つ続きの層がある多層ニューラルネットを訓練する場合です。一方の層の重みが他方の層の重みに対してどのくらい大きいかをうまく制御できません。スケールを気にする非線形関数を使っている場合を持っている場合、あなたのネットワークは、最初の層で使用できる重み行列の大きさを選択することができません。なぜなら、スケールの変化が挙動を大きく変えてしまうからです。 + + > この問題を解決する一つの方法は、各レイヤーの重みに厳密にスケールを設定することです。これによってバッチ正規化のようにレイヤーの重みを正規化することができます。そうすれば、ユニットに入る分散は常に一定になります。スケールを固定すると、2つのキンク関数で非線形性のどの部分を使用するかを選択する手段を持ちません。この「固定」された部分があまりにも「線形」になってしまうと問題になる可能性があります。例えば、シグモイドはゼロ付近でほぼ線形になり、そのためバッチ正規化の出力(0に近い)は「非線形に」活性化することができないかもしれません。 + > + > なぜディープネットワークが単一のキンク関数でよりよく機能するのかは、完全には明らかではありません。これは、スケールについての等価性に起因すると思われます。 + + +### Temperature coefficient in a soft(arg)max function +### soft(arg)max関数の温度係数 + + + +- 温度係数はいつ使うのか、なぜ使うのか? + + > ある程度、温度は入ってくる重みと重複しています。softmaxに重み付けされた和が入ってくる場合、$$beta$パラメータは重みの大きさと重複しています。 + + > 温度は、出力の分布がどれだけ鋭くなるかを制御します。もし $\beta$ がとても大きいと、ゼロか1に近づきます。小さくなると、滑らかになります。\beta$の極限が0になると、平均値のようになります。もし $\beta$ が無限大になると、argmax関数のように振る舞います。これはもはやsoftmaxではありません。したがって、softmaxの前にある種の正規化があるならば、このパラメータを調整することで、どれだけargmaxに近くかをコントロールすることができます。 + > 時には、小さな$\beta$から始めることができます。そうすれば、うまく勾配効果法を行うことができます。もしattention機構においてはっきりと決定をしたい場合には、温度をあげます。そうすることで、判断を鋭くすることができます。このトリックは、アニーリングと呼ばれています。self-attention機構のようなmixture of expertsシステムでは有効です。 + + + +## [損失関数](https://www.youtube.com/watch?v=bj1fh3BvqSU&t=1990s) + + +PyTorchには多くの損失関数も実装されています。ここではそのうちのいくつかを見ていきましょう。 + + +### `nn.MSELoss()` + + + +この関数は、入力$x$とターゲット$y$の各要素間の平均二乗誤差(L2ノルムの二乗)を与えます。これはL2損失とも呼ばれます。 + +サンプル数が $n$ のミニバッチを使用している場合、バッチ内の各サンプルに対して $n$ の損失があります。損失関数には、この損失をベクトルとして保持させるか、あるいは次元を削減するようにして保持させることができます。 + +次元が削減されていない場合(つまり、`reduction='none'`を設定している場合)、損失は + +$$l(x,y) = L = \{l_1, \dots, l_N\}^\top, l_n = (x_n - y_n)^2$$ + + +となります。ここで、$n$はバッチサイズ、$x$と$y$は、それぞれ合計n個の要素を持つ任意のシェイプのテンソルです。 + + +次元削減オプションは以下の通りです(デフォルト値は `reduction='mean'` であることに注意してください)。 + +$$l(x,y) = \begin{cases}\text{mean}(L), \quad &\text{if reduction='mean'}\\ +\text{sum}(L), \quad &\text{if reduction='sum'} +\end{cases}$$ + + +和演算はすべての要素を対象とし、$n$で除算します。 + +$n$による除算は、 ``reduction = 'sum'``を設定すれば回避できます。 + + +### `nn.L1Loss()` + + + +これは、入力 $x$ とターゲット $y$ (または実際の出力と希望する出力) の各要素間の平均絶対誤差 (MAE) を測定します。 + +次元削減されていない場合 (つまり、`reduction='none'`を設定している場合)、損失は次のようになります。 + +$$l(x,y) = L = \{l_1, I\dots, l_N\}^^top, l_n = \vert x_n - y_n\vert$$ + +ここで、 $N$ はバッチサイズ、$x$ と $y$ はそれぞれ n 個の要素を持つ任意の形状のテンソルです。 + +また、`nn.MSELoss()` と同様に `'mean'` と `'sum'` の `reduction` オプションを持ちます。 + + +**使用例:** L1損失は、L2損失に比べて、外れ値やノイズに対してよりロバストです。L2では、外れ値やノイズのある点の誤差が2乗されるため、コスト関数は外れ値に対して非常に敏感になります。 + +**問題点:** L1損失は底辺(0)のところでは微分できません。したがって、勾配を扱う際には注意が必要です(すなわち、Softshrink)。これが次のSmoothL1Lossを考える動機となっています。 + + +### `nn.SmoothL1Loss()` + + + +この関数は、要素間の絶対誤差が1以下の場合はL2損失、それ以外の場合はL1損失を使用します。 + +$$$text{loss}(x, y) = \frac{1}{n} \sum_i z_i$$$ +ここで、 $z_i$ は次式で与えられます。 + +$$z_i = \begin{cases}0.5(x_i-y_i)^2, \quad &\text{if } |x_i - y_i| < 1\\ +|x_i - y_i| - 0.5, \quad &\text{otherwise} +\end{cases}$$ + +また、`reduction`のオプションもあります。 + +これは、Ross Girshick ([Fast R-CNN](https://arxiv.org/abs/1504.08083)によって宣伝されています。) Smooth L1 Lossは、Huber LossやElastic Networkとしても知られています。 + +**使用例:** MSELossよりも外れ値の影響を受けにくく、底辺が滑らかです。コンピュータビジョンなどでは、外れ値からの保護のためによく使われています。 + +**問題点:** この関数はスケール(上の関数では$0.5$)を持っています。 + + + + +### コンピュータビジョンのためのL1とL2の比較 + +多くの異なる $y$ がある場合の予測を行う際には + +* MSE (L2損失) を用いた場合、すべての $y$ の平均値が得られ、CVではぼやけた画像が得られることを意味します。 +* L1損失を利用する場合,L1距離を最小化する値 $y$ は,ぼやけていない中程度の値ですが,中程度は多次元で定義するのが難しいことに注意してください. + +L1を使うと、予測のための画像がよりシャープになります。 + + +### `nn.NLLLoss()` + + + +これはCクラスの分類問題を学習するときに使われる負の対数尤度損失です。 + +数学的には、`NLLLoss`の入力は(対数)尤度でなければなりませんが、PyTorchはそれを強制しません。そのため、望ましい成分を可能な限り大きくすることが効果的です。 + +次元削減されていない(つまり :attr:`reduction` が ``'none'`` に設定されている)損失は次のように記述できます。 + +$$\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad + l_n = - w_{y_n} x_{n,y_n}, \quad + w_{c} = \text{weight}[c] \cdot \mathbb{1}\{c \not= \text{ignore\_index}\}$$ + + +ただし$N$はバッチサイズです。 + + +もし `reduction` が ``'none'`` でないばあい (デフォルトでは ``'mean'`` です) には、 + +$$\ell(x, y) = \begin{cases} + \sum_{n=1}^N \frac{1}{\sum_{n=1}^N w_{y_n}} l_n, & + \text{if reduction} = \text{'mean';}\\ + \sum_{n=1}^N l_n, & + \text{if reduction} = \text{'sum'.} + \end{cases}$$ + + +この損失関数にはオプション引数の `weight` があり、各クラスに重みを割り当てる1次元テンソルを用いて渡すことができます。これは,不均衡な訓練データを扱う場合に便利です. + + + +#### 重みと不均衡クラス: + + + +カテゴリー/クラスごとにデータの出現頻度が異なる場合は、重みベクトルが便利です。例えば、一般的なインフルエンザの頻度は肺がんよりもはるかに高いです。サンプル数が少ないカテゴリについては、単純に重みを増やすことができます。 + +しかし、重みを設定するよりも、確率的勾配をうまく利用するためには、訓練における出現頻度を均等化した方がよいでしょう. + +学習中のクラスを均等化するには、各クラスのサンプルを別のバッファに入れます。そして、それぞれのバッファから同じ数のサンプルを選んでミニバッチを生成します。小さい方のバッファが使用するサンプルを使い切ったら、小さい方のバッファを最初から繰り返し、大きい方のクラスのサンプルがすべて使用されるまで繰り返します。このようにしてバッファのデータを用いることで、すべてのカテゴリで同じ頻度を得ることができます。大多数のクラスのすべてのサンプルを使用しないという安易な方法で出現頻度を均等化してはいけません。使わないデータを出さないようにしましょう! + +上記の方法の明らかな問題は、NNモデルが実際のサンプルの相対的な出現頻度を知らないことです。これを解決するために、実際のクラスの出現頻度で最後に数回エポックを実行することで、システムを微調整します。 + +このスキームの直観を得るために、医学部の例に戻ってみましょう:学生は頻繁に起こる病気と同じくらい多くの時間を稀な病気に費やします(稀な病気の方が複雑な病気であることが多いので、もっと多くの時間を費やすかもしれません)。彼らは、それらのすべての特徴に適応することを学び、それを修正して、どれが稀な病気かを知ることを学びます。 + + +### `nn.CrossEntropyLoss()` + +This function combines `nn.LogSoftmax` and `nn.NLLLoss` in one single class. The combination of the two makes the score of the correct class as large as possible. + + + +この関数は `nn.LogSoftmax` と `nn.NLLLoss` を一つのクラスにまとめた物です。この2つを組み合わせることで、正しいクラスのスコアをできるだけ大きくすることができます。 + +ここで2つの関数を統合した理由は、勾配計算の数値的安定性を高めるためである。softmax以降の値が1や0に近づくと、その対数が0に近づくか、$-\infty$になることがあります。0に近い log の傾きは $\infty$ に近いので、バックプロパゲーションの中間段階で数値計算上の問題が発生してしまいます。2つの関数を組み合わせると、勾配が飽和するので、最後にはそれなりの数値が得られます。 + +入力は各クラスの正規化されていないスコアであることが想定されています。 + +損失は次のように記述することができます。 + +$$\text{loss}(x, c) = -\log\left(\frac{\exp(x[c])}{\sum_j \exp(x[j])}\right) += -x[c] + \log\left(\sum_j \exp(x[j])\right)$$ + + +あるいは `weight` という引数が指定された場合には、 + +$$\text{loss}(x, c) = w[c] \left(-x[c] + \log\left(\sum_j\exp(x[j])\right)\right)$$ + + +この損失は書くミニバッチの観測についての平均をとったものになっています。 + + +クロスエントロピー損失の物理的な解釈は、2つの分布間のダイバージェンスを測るKullback-Leiblerダイバージェンス(KLダイバージェンス)に関連しています。ここでは、(準)分布はxベクトル(予測値)と目標分布(間違ったクラスに0、正しいクラスに1を持つワンホットベクトル)で表されます。 + + +数学的には、 + +$$H(p,q) = H(p) + \mathcal{D}_{KL} (p \mid\mid q)$$ + + +ただし$$H(p,q) = - \sum_i p(x_i) \log (q(x_i))$$ は(二つの分布の間の)クロスエントロピーで、 $$H(p) = - \sum_i p(x_i) \log (p(x_i))$$はエントロピーで、$$\mathcal{D}_{KL} (p \mid\mid q) = \sum_i p(x_i) \log \frac{p(x_i)}{q(x_i)}$$ は KLダイバージェンスです。 + +### `nn.AdaptiveLogSoftmaxWithLoss()` + + +これは大規模なクラス数(例えば数百万クラス)に対して効率的なソフトマックスの近似計算を行います。計算速度を向上させるためのトリックを実装しています。 + +Details of the method is described in [Efficient softmax approximation for GPUs](https://arxiv.org/abs/1609.04309) by Edouard Grave, Armand Joulin, Moustapha Cissé, David Grangier, Hervé Jégou. +手法の詳細は、Edouard Grave, Armand Joulin, Moustapha Cissé, David Grangier, Hervé Jégouによる[Efficient softmax approximation for GPUs](https://arxiv.org/abs/1609.04309)に記載されています。 diff --git a/docs/ja/week11/11-2.md b/docs/ja/week11/11-2.md new file mode 100644 index 000000000..5d506ef8d --- /dev/null +++ b/docs/ja/week11/11-2.md @@ -0,0 +1,422 @@ +--- +lang-ref: ch.11-2 +lecturer: Yann LeCun +title: Loss Functions (cont.) and Loss Functions for Energy Based Models +authors: Charles Brillo-Sonnino, Shizhan Gong, Natalie Frank, Yunan Hu +date: 13 April 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + +### [Binary Cross Entropy (BCE) Loss - `nn.BCELoss()`](https://www.youtube.com/watch?v=bj1fh3BvqSU&t=3207s) + +$$ +\ell(x,y) = L = \{l_1,...,l_N\}^T, \qquad l_n = -w_n[y_n\log x_n+(1-y_n)\log(1-x_n)] +$$ + + +この損失は、2つのクラスしかない場合のためのクロスエントロピーの特殊なケースであり、より単純な関数として表現できます。これは、例えばオートエンコーダーの再構成誤差を測定するために使われます。この式は、$x$ と $y$ が確率であると仮定しているので、厳密には0と1の間にあります。 + +### Kullback-Leibler Divergence Loss - `nn.KLDivLoss()` + +$$ +\ell(x,y) = L = \{l_1,...,l_N\}^T, \qquad l_n = y_n(\log y_n-x_n) +$$ + + +これは、ターゲットがワンホット分布(*i.e.* $y$がカテゴリ)の場合の単純な損失関数です。ここでも、$x$ と $y$ が確率であると仮定しています。これは、softmaxやlog-softmaxとマージされないという欠点があり、数値的な安定性に問題があるかもしれません。 + + +### BCE Loss with Logits - `nn.BCEWithLogitsLoss()` + +$$ +\ell(x,y) = L = \{l_1,...,l_N\}^T, \qquad l_n = -w_n[y_n\log \sigma(x_n)+(1-y_n)\log(1-\sigma(x_n))] +$$ + + +このバージョンのバイナリクロスエントロピー損失は、softmaxを通過していないスコアを取るため、xが0から1の間であると仮定していません。 そして、その範囲内であることを確認するためにシグモイドに渡されます。損失関数は、このように組み合わせると数値的に安定する可能性が高くなります。 + + +### Margin Ranking Loss - `nn.MarginRankingLoss()` + +$$ +L(x,y) = \max(0, -y*(x_1-x_2)+\text{margin}) +$$ + + +マージン損失は損失の重要なカテゴリーです。2つの入力がある場合、この損失関数は、片方の入力がもう片方の入力よりも少なくとあるマージンの分大きくなるようにしたいということを表しています。この場合、$y$は二値変数 $\in \{ -1, 1}$です。2つの入力が2つのカテゴリのスコアだとします。正しいカテゴリのスコアを、正しくないカテゴリのスコアよりも、少なくともいくつかのマージンで大きくしたいとします。 ヒンジ損失のように、$y*(x_1-x_2)$がマージンよりも大きければ、コストは0になります。 それよりも小さければ、コストは直線的に増加します。これを分類に使う場合、$x_1$ は正解のスコア、$x_2$ はミニバッチの中で最もスコアの高い不正解のスコアとなります。エネルギーベースモデル(後述)で使用する場合、この損失関数は正解 $x_1$ を押し下げ、不正解 $x_2$ を押し上げます。 + + +### Triplet Margin Loss - `nn.TripletMarginLoss()` + +$$ +L(a,p,n) = \max\{d(a_i,p_i)-d(a_i,n_i)+\text{margin}, 0\} +$$ + + +この損失は、サンプル間の相対的な類似度を測定するために用いられます。例えば、同じカテゴリの2つの画像をCNNに通し、2つのベクトルを得たとします。この2つのベクトル間の距離をできるだけ小さくしたいとします。異なるカテゴリを持つ2つの画像をCNNに通すと、それらのベクトル間の距離は可能な限り大きくなります。この損失関数は、最初の距離を0に、2番目の距離をあるマージンよりも大きくしようとします。 しかし、重要なのは、良いペアの間の距離が悪いペアの間の距離よりも小さいということだけです。 + + +
+
+図1: Triplet Margin Loss +
+ + +これは元々、Googleの画像検索システムの訓練に使われていたものです。当時は、Googleにクエリを入力すると、そのクエリをベクトルにエンコードしていました。そして、そのベクトルを、以前にインデックス化された画像のベクトルの束と比較します。そして、Googleはあなたのベクトルに最も近い画像を検索していました。 + + +### Soft Margin Loss - `nn.SoftMarginLoss()` + +$$ +L(x,y) = \sum_i\frac{\log(1+\exp(-y[i]*x[i]))}{x.\text{nelement()}} +$$ + + + +入力テンソル$x$とターゲットテンソル$y$(1または-1を含む)の間の2クラス分類ロジスティック損失を最適化する基準を作成します。 + +* これは,マージン損失のソフトマックス版です。正の値の束と負の値の束があり、ソフトマックスを通過させたいとします。この関数は、正しい$x[i]$の$text{exp}(-y[i]*x[i])$を、他のものよりも小さくしようとします。 +* この損失関数は、$y[i]*x[i]$の正の値をより近くに引き寄せ、負の値をより遠くに引き離そうとしますが、ハードマージンとは対照的に、連続的で指数関数的に減衰する効果を持った損失が得られます。 + + +### Multi-Class Hinge Loss - `nn.MultiLabelMarginLoss()` + +$$ +L(x,y)=\sum_{ij}\frac{max(0,1-(x[y[j]]-x[i]))}{x.\text{size}(0)} +$$ + + +このマージンベースの損失は、異なる入力が様々なターゲットを持つことを可能にします。この場合、高いスコアを出したいカテゴリがいくつかあり、すべてのカテゴリのヒンジ損失を合計します。EBMの場合、この損失関数は、希望するカテゴリを押し下げ、希望しないカテゴリを押し上げます。 + +### Hinge Embedding Loss - `nn.HingeEmbeddingLoss()` + +$$ +\begin{equation} +l_n = +\left\{ + \begin{array}{lr} + x_n, &\quad y_n=1, \\ + \max\{0,\Delta-x_n\}, &\quad y_n=-1 \\ + \end{array} +\right. +\end{equation} +$$ + + +2つの入力が似ているか似ていないかを測定することで、半教師付き学習に使用される、ヒンジ埋め込み損失です。似ているものをまとめて、似ていないものを押しのけます。$y$変数は、スコアのペアがある方向に進む必要があるかどうかを示します。ヒンジ損失を使うと、$y$が1であればスコアは正となり、$y$が-1であればいくつかのマージン$\Delta$が得られます。 + + +### Cosine Embedding Loss - `nn.CosineEmbeddingLoss()` + +$$ +\begin{equation} +l_n = +\left\{ + \begin{array}{lr} + 1-\cos(x_1,x_2), & \quad y=1, \\ + \max(0,\cos(x_1,x_2)-\text{margin}), & \quad y=-1 + \end{array} +\right. +\end{equation} +$$ + + + +この損失は、コサイン距離を用いて2つの入力が似ているか似ていないかを測定するために用いられ、非線形埋め込み学習や半教師付き学習などに用いられます。 + +* 別の言い方をすれば、1から2つのベクトル間の角度のコサインを引いた値が、基本的には正規化されたユークリッド距離となります。 +* これの利点は、2つのベクトルがあって、その距離をできるだけ大きくしたいときに、ベクトルを非常に長くすることで、ネットワークがこれを達成することが非常に簡単にできるということです。もちろんこれは最適ではありません。システムがベクトルを大きくするのではなく、ベクトルを正しい方向に回転させたいので、ベクトルを正規化し、正規化されたユークリッド距離を計算します。 +* 正の場合、この損失は可能な限りベクトルを揃えようとします。負のペアでは、コサインを特定のマージンよりも小さくしようとします。ここでのマージンは小さな正の値である必要があります。 +* 高次元空間では、球の赤道付近に多くの領域があります。正規化後、すべての点は球上で正規化されます。意味的に似ているサンプルが近くにあることが望ましいです。似ていないサンプルは直交していなければなりません。反対の極には1つの点しかないので、それらが互いに反対になって欲しくはありません。むしろ、赤道上には非常に大きなスペースがあるので、この面積を利用できるように、マージンを小さな正の値にしたいのです。 + + +### [Connectionist Temporal Classification (CTC) Loss - `nn.CTCLoss()`](https://www.youtube.com/watch?v=bj1fh3BvqSU&t=4103s) + + + +連続な(分割されていない)時系列とターゲット系列の間の損失を計算します。 +* CTC損失は,入力からターゲットへの可能性のあるアラインメントの確率を合計し、各入力ノードに対して微分可能な損失値を生成します。 +* 入力からターゲットへのアラインメントは、多対一であると仮定され、ターゲット系列の長さが入力の長さ以下になるように制限されます。 +* 出力がカテゴリのスコアに対応するベクトルの系列である場合に便利です。 + + +
+
+図2: 音声認識のためのCTC損失 +
+ + +応用例:音声認識システム +* 目標:10ミリ秒ごとにどの単語が発音されているかを予測します。 +* 各単語は音の系列で表されます。 +* 人の話すスピードに応じて、異なる長さの音が同じ単語にマッピングされることがあります。 +* 入力音列から出力音列への最適なマッピングを見つけます。このための良い方法は、動的プログラミングを使用して、最小コストのパスを見つけることです。 + + +
+
+図3: 多対一マッピングのセットアップ +
+ + + +# エネルギーベースモデル (Part IV) - 損失関数 + + + +## アークテクチャと損失汎関数 + + +エネルギー関数の族: $\mathcal{E} = \{E(W,Y, X) : W \in \mathcal{W}\}$. + + +訓練集合: $S = \{(X^i, Y^i): i = 1 \cdots P\}$ + + +損失汎関数: $\mathcal{L} (E, S)$ +* 汎関数とは、他の関数の関数を意味します。この場合は、汎関数 $mathcal{L} (E, S)$は、エネルギー関数$E$の関数です。 +* $E$ は $W$ でパラメトライズされているので、汎関数を $W$ の損失関数に変えることができます: $\mathcal{L} (W, S)$ +* 訓練集合でエネルギー関数の質を測定する +* サンプルの並べ替えと反復に対して不変 + + +訓練: $W^* = \min_{W\in \mathcal{W}} \mathcal{L}(W, S)$. + +Form of the loss functional: +* $L(Y^i, E(W, \mathcal{Y}, X^i))$ is per-sample loss +* $Y^i$ is desired answer, can be category or a whole image, etc. +* $E(W, \mathcal{Y}, X^i)$ is energy surface for a given $X_i$ as $Y$ varies +* $R(W)$ is regulariser + +損失汎関数の形式: +* $L(Y^i, E(W, \mathcal{Y}, X^i))$ はサンプルごとの損失 +* $Y^i$ は理想の答えで、 カテゴリーか画像全体など +* $E(W, \mathcal{Y}, X^i)$ は与えられた $X_i$ に対して $Y$ の変化に対するエネルギー関数 +* $R(W)$ は正則化項 + +$$ +\mathcal{L}(E, S) = \frac{1}{P} \sum_{i=1}^P L(Y^i, E(W,\mathcal{Y}, X^i)) + R(W) +$$ + + + + +## 良い損失関数の設計 + +**正解のエネルギーを押し下げる**。 + +**不正解のエネルギーを押し上げる**。特に正解よりも小さい場合。 + + + +## 損失関数の例 + +### Energy Loss + +$$ +L_{energy} (Y^i, E(W, \mathcal{Y}, X^i)) = E(W, Y^i, X^i) +$$ + + +この損失関数は、単に正解のエネルギーを押し下げます。ネットワークが正しく設計されていない場合、正解のエネルギーを小さくしようとするだけで他の場所でエネルギーを押し上げないので、それはほとんど平坦なエネルギー関数になるかもしれません。したがって、システムが崩壊する可能性があります。 + + +### Negative Log-Likelihood Loss + +$$ +L_{nll}(W, S) = \frac{1}{P} \sum_{i=1}^P (E(W, Y^i, X^i) + \frac{1}{\beta} \log \int_{y \in \mathcal{Y}} e^{\beta E(W, y, X^i)}) +$$ + + + +この損失関数は正解のエネルギーを押し下げ、確率に比例して全ての答えのエネルギーを押し上げます。これは、$\beta \rightarrow \infty$のとき、パーセプトロンの損失に帰着されます。構造化された出力を用いた識別訓練のために多くのコミュニティで長い間使われてきました。 + +確率モデルとは、以下を満たすEBMのことです + +* エネルギーが、Y(予測される変数)の上で積分できる。 +* 損失関数が負の対数尤度 + + +### [Perceptron Loss](https://www.youtube.com/watch?v=bj1fh3BvqSU&t=4998s) + +$$ +L_{perceptron}(Y^i,E(W,\mathcal Y, X^*))=E(W,Y^i,X^i)-\min_{Y\in \mathcal Y} E(W,Y,X^i) +$$ + +Very similar to the perceptron loss from 60+ years ago, and it's always positive because the minimum is also taken over $Y^i$, so $E(W,Y^i,X^i)-\min_{Y\in\mathcal Y} E(W,Y,X^i)\geq E(W,Y^i,X^i)-E(W,Y^i,X^i)=0$. The same computation shows that it give exactly zero only when $Y^i$ is the correct answer. + +This loss makes the energy of the correct answer small, and at the same time, makes the energy for all other answers as large as possible. However, this loss does not prevent the function from giving the same value to every incorrect answer $Y^i$, so in this sense, it is a bad loss function for non-linear systems. To improve this loss, we define the *most offending incorrect answer*. + +60年以上前のパーセプトロンの損失と非常によく似ていて、最小値も $Y^i$ の上に取られるので、それは常に正です:$E(W,Y^i,X^i)-\min_{Y\in\mathcal Y} E(W,Y,X^i)\geq E(W,Y^i,X^i)-E(W,Y^i,X^i)=0$。同じ計算をすると、$Y^i$が正解のときだけ正確に0を与えることがわかります。 + +この損失は、正解のエネルギーを小さくすると同時に、他のすべての答えのエネルギーをできるだけ大きくします。しかし、この損失は、すべての不正解 $y^i$ に対して同じ値を与えることを妨げるものではないので、この意味では、非線形系にとっては悪い損失関数と言えます。この損失を改善するために、*最も問題となる不正解*を定義します。 + + +## Generalized Margin Loss + + + +**最も問題となる不正解**:離散的な場合 +y$ を離散変数とします。すると、ある訓練サンプル $(X^i,Y^i)$ に対して、*最も問題となる不正解* $\bar Y^i$ は、不正解となる可能性のあるすべての答えの中で、最も低いエネルギーを持つ答えです。すなわち、 + +$$ +\bar Y^i=\text{argmin}_{y\in \mathcal Y\text{ and }Y\neq Y^i} E(W, Y,X^i) +$$ + + + +**最も問題となる不正解**:連続的な場合 +y$を連続変数とします。すると、ある訓練サンプル$(X^i,Y^i)$に対して、*最も問題となる不正解* $\bar Y^i$は、正解から少なくとも$\epsilon$離れているすべての答えの中で、最も低いエネルギーを持っている答えです。つまり + +$$ +\bar Y^i=\text{argmin}_{Y\in \mathcal Y\text{ and }\|Y-Y^i\|>\epsilon} E(W,Y,X^i) +$$ + + + +離散的なケースでは、*最も問題となる不正解*は、正解ではないエネルギーが最も小さいものです。連続の場合、 $Y$ が $Y^i$ に極端に近い場合のエネルギーは、 $E(W,Y^i,X^i)$ に近いはずです。さらに、$Y$の上で評価される$Y^i$と等しくない$Y$の上で評価される$\text{argmin}$は0になります。 その結果、距離$\epsilon$を選び、$Y$の少なくとも$Y_i$からの$\epsilon$だけを「不正解」とすることにします。そのため、最適化は $Y^i$ から少なくとも$\epsilon$離れた $Y$についてだけ行われます。 + +もし、エネルギー関数が、*最も問題となる不正解*のエネルギーが、正解のエネルギーよりも高いことを保証できるならば、このエネルギー関数はうまく機能するはずです。 + + + +## Generalized Margin Loss Functionsの例 + + + +### ヒンジ損失 + +$$ +L_{\text{hinge}}(W,Y^i,X^i)=\max(0,m+E(W,Y^i,X^i))-E(W,\bar Y^i,X^i) +$$ + +ここで、$bar Y^i$は、*最も問題のある不正解*です。この損失は、正解と最も問題のある不正解の差が少なくとも$m$であることを要請します。 + + +
+
+図4: ヒンジ損失 +
+ + + +Q:どのようにして $m$ を選ぶのですか? + +A: 任意ですが、最後の層の重みに影響します。 + + +### Log Loss + +$$ +L_{\log}(W,Y^i,X^i)=\log(1+e^{E(W,Y^i,X^i)-E(W,\bar Y^i,X^i)}) +$$ + + +これは、「ソフト」ヒンジ損失と考えることができます。正解と最も問題のある不正解の差をヒンジで構成するのではなく、ソフトヒンジで構成するようになっています。この損失は「無限のマージン」を強制しようとしますが、傾きが指数関数的に減衰するため、それは起こりません。 + + +
+
+図5: 対数損失 +
+ + +### Square-Square Loss + +$$ +L_{sq-sq}(W,Y^i,X^i)=E(W,Y^i,X^i)^2+(\max(0,m-E(W,\bar Y^i,X^i)))^2 +$$ + + +この損失は、ヒンジの二乗とエネルギーの二乗を組み合わせたものです。この組み合わされたものは、エネルギーを最小化しようとしますが、最も問題のある不正解に対しては、少なくとも$m$のマージンを強制します。これは、Siamese netで使用される損失に非常に似ています。 + + +## Other Losses + + +全体をまとめたものです。良い損失関数と悪い損失関数をまとめてみました。 + + +
+
+図6: EBM損失関数の選択 +
+ + + + +右辺は、エネルギー関数がマージンを強制するかどうかを示しています。昔ながらのエネルギー損失は、どこも押し上げないので、マージンがありません。エネルギー損失はすべての問題に適用できるわけではありません。パーセプトロン損失はエネルギーの線形なパラメトリゼーションの部分がある場合には有効ですが、一般的には有効ではありません。ヒンジ損失のように有限のマージンを持つものもあれば、ソフトヒンジのように無限のマージンを持つものもあります。 + +Q: 連続の場合に最も問題となる不正解 $\bar Y_i$ はどのようにして見つかるのでしょうか? + +A: 近すぎると、ニューラルネットで定義された関数が動きづらいので、パラメータがあまり動かないかもしれないため、$Y^i$から十分に離れた点を押し上げたいと考えます。しかし、一般的には、これは難しく、これは対照的なサンプルを選択する方法が解決しようとする問題です。これには一つの正しい方法はありません。 + +$$ +L(W,X^i,Y^i)=\sum_y H(E(W, Y^i,X^i)-E(W,y,X^i)+C(Y^i,y)) +$$ + + + +ここでは、 $y$ が離散的であると仮定しますが、もし連続的であれば、和は積分に置き換えられます。ここで、 $E(W, Y^i,X^i)-E(W,y,X^i)$は、正解と他の答えで評価された$E$の差です。C(Y^i,y)$はマージンで、一般的には$y^i$と$y$の間の距離の尺度です。モチベーションは、不正解サンプル $y$ で押し上げたい量は、 $y$ と正解サンプル $y_i$ の間の距離に依存しているはずだということです。これは、最適化するのがより困難な損失になる可能性があります。 diff --git a/docs/ja/week11/11-3.md b/docs/ja/week11/11-3.md new file mode 100644 index 000000000..a3a48357e --- /dev/null +++ b/docs/ja/week11/11-3.md @@ -0,0 +1,494 @@ +--- +lang-ref: ch.11-3 +title: Prediction and Policy learning Under Uncertainty (PPUU) +lecturer: Alfredo Canziani +authors: Anuj Menta, Dipika Rajesh, Vikas Patidar, Mohith Damarapati +date: 14 April 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + +## [導入と問題設定](https://www.youtube.com/watch?v=VcrCr-KNBHc&t=63s) + + + +モデルフリー強化学習で運転の仕方を学びたいとしましょう。RLでは、モデルにミスをさせてそこから学習させることでモデルを訓練します。しかし、これは最善の方法ではありません。 + +そこで、もっと「人間的」な方法で車の運転を学ぶ方法を考えてみましょう。車線変更の例を考えてみましょう。車が時速100km +、つまり大体30m/sの速度で動いていると仮定すると、30m先を見た場合、大体1s先を見ていることになります。 + + +
+
+図1: 少し先を予測して運転をする +
+ + + +カーブを切る時には、近い将来のことを考えて判断する必要があります。数メートル先で曲がるためには、今すぐに行動を起こす、ここではハンドルを切る、ということになります。決断をするかどうかは、自分の運転だけでなく、交通の中の周囲の車にも左右されます。私たちの周りの誰もが決定論的ではないので、すべての可能性を考慮に入れることは非常に困難です。 + +このシナリオで何が起こっているかを分解してみましょう。我々は、入力$s_t$(位置、速度、文脈画像)を受け取り、アクション$a_t$(操舵制御、加速、制動)を生成するエージェント(ここでは頭脳で表現)を持っています。 環境は私たちを新しい状態に連れて行き、コスト$c_t$を返します。 + + +
+
+図2: 実世界でのエージェントのイラスト +
+ + + +これは、特定の状態の下で行動を取ると、世界が次の状態と次の結果を与えてくれる単純なネットワークのようなものです。これはモデルフリーで、すべての行動が現実世界と相互作用するからです。しかし、実際に現実世界と対話せずにエージェントを訓練することはできるのでしょうか? + +はい、できます。「world modelを学習する」のセクションでそれを見てみましょう。 + + +
+
+図3: 実世界でのエージェントのイラスト +
+ + + +## データセット + + + +World modelの学習方法を説明する前に、我々が持っているデータセットを調べてみましょう。高速道路に面した30階建ての建物の上に7台のカメラを設置します。カメラを調整してトップダウンビューを取得し、各車両のバウンディングボックスを抽出します。ある時間$t$で、位置を表す$p_t$を求め、速度を表す$v_t$、車両周辺の現在の交通状態を表す$i_t$を求めます。 + +運転のキネマティクスがわかっているので、これらを逆算して、運転者が何をしているのかを知ることができます。例えば、車が直線的な一様運動をしている場合、加速度はゼロ(何もしていないことを意味する)であることがわかります。 + + +
+
+図4: 単一フレームの機械による表現 +
+ + +青色のイラストはフィードで、緑色のイラストは我々が機械表現と呼ぶものです。これをよりよく理解するために、いくつかの車両を分離しました(図中のマーク)。下の図は、これらの車両の視野のバウンディングボックスです。 + + + +## コスト + + +ここでは2種類のコストがあります:車線コストと近接コストです。車線コストは車線内の状態を示し、近接コストは他の車との距離を示します。 + + +
+
+図5: 車線コスト +
+ + +上の図では、点線は実際の車線を表し、赤線は現在の車の位置から車線のコストを計算するのに役立ちます。 赤線は車の移動に合わせて移動します。赤い線と潜在的なカーブの交点の高さ(シアン色)がコストを示しています。車が車線の中心にいる場合は、赤線の両方が実際の車線と重なり、コストはゼロになります。一方、車が中心から離れると、赤線も移動し、コストはゼロではありません。 + +
+
+図6: 近接コスト +
+ + + +近接コストには2つの要素があります($\mathcal{L}_x$と$\mathcal{L}_y$)。この2つの成分は、車線コストと同様に、車の速度に依存します。図6のオレンジ色の曲線が安全距離を示しています。車の速度が速くなると、オレンジ色のカーブが広がります。つまり、車の速度が速くなればなるほど、前方と後方に目を向ける必要が出てくるということです。オレンジ色のカーブと車の交差するところの高さが $mathcal{L}_x$ を決定します。 + +これら2つの成分の積が 近接コストを与えてくれます。 + + + +## World modelを学習する + +
+
+図7: World modelのイラスト +
+ + +World modelは、アクション$a_t$(操縦、ブレーキ、加速)と$s_{1:t}$(各状態をその時の位置、速度、文脈画像で表現した状態の列)を与えられ、次の状態$hat s_{t+1}$を予測します。 一方、実世界を通して実際に何が起こったかを知ることができます($s_{t+1}$)。予測値($\hat s_{t+1}$)と目標値($s_{t+1}$)の間のMSE(平均二乗誤差)を最適化してモデルを学習します。 + + + +## 決定論的な予測器-デコーダ + + +Workd modelを学習する方法の一つは、以下に説明する予測器-デコーダモデルを使用することです。 + + +
+
+図8: World modelを学習するための決定論的な予測器-デコーダ + + +図8に示されているように、状態($s_{1:t}$)と行動($a_t$)のシーケンスが予測器モジュールに提供されています。予測器は、デコーダに渡された将来の潜在表現を出力します。デコーダは、将来の潜在表現をデコードし、予測値($\hat s_{t+1}$)を出力します。そして、予測 $\hat s_{t+1}$ とターゲット $s_{t+1}$ の間のMSEを最小化することでモデルを学習します。 + + +
+
+図9: 実際の未来と決定論的な未来 +
+ + + +残念ながら、これはうまくいきません! + +我々は、決定論的な出力が非常に曖昧になることがわかります。これは、我々のモデルがすべての未来の可能性を平均化しているからです。これは、以前にいくつか前のクラスで議論された、原点に置かれたペンがランダムに落とされる未来のマルチモダリティと比較することができます。すべての場所の平均を取ると、ペンは決して動かなかったという誤った信念を与えてしまいます。 + +我々のモデルに潜在変数を導入することで、この問題に対処できます。 + + + +## [変分予測ネットワーク](https://www.youtube.com/watch?v=VcrCr-KNBHc&t=1779s) + + +前節で述べた問題を解決するために、元のネットワークに低次元の潜在変数 $z_t$ を追加し、これを拡張モジュール $f_{exp}$ を経て次元数を一致させます。 + + +
+
+図10: 変分予測ネットワーク:訓練 +
+ + + +$z_t$は、特定の予測に対してMSEが最小化されるように選択されます。潜在変数をチューニングすることで、潜在空間での勾配法を行うことで、MSEをゼロにすることができます。しかし、これは非常にコストがかかります。実際には、エンコーダを使って潜在変数を予測することができます。エンコーダは将来の状態を取得して、平均と分散を持つ分布を与え、そこから $z_t$ を標本化することができます。 + +訓練の間、未来を見てそこから情報を得て、その情報を使って潜在変数を予測することで、何が起こっているかを見つけることができます。しかし、テスト時には未来にアクセスできません。我々は、KLダイバージェンスを最適化することによって、エンコーダが可能な限り事前分布に近い事後分布を与えるように強制することによって、これを修正します。 + + +
+
+図11: 変分予測ネットワーク:訓練(事前分布つき) +
+ + +では、推論を見てみましょう - 私たちはどのように運転するのでしょうか? + + +
+
+図12: 変分予測ネットワーク:推論 +
+ + + +エンコーダがこの分布に向かうように強制して、低次元の潜在変数 $z_t$ を、事前分布からサンプリングします。予測 $\hat s_{t+1}$ が得られたら、それを元に戻して(自己回帰的なステップで)、次の予測 $\hat s_{t+2}$ を得て、このようにネットワークに送り続けます。 + + +
+
+図13: 実際の未来 vs 決定論的な場合 +
+ + +上図の右側では、正規分布からの4つの異なるサンプルが見られます。同じ初期状態から始めて、潜在変数に異なる200の値を与えています。 + + +
+
+図14: 実際の未来 vs 決定論的な場合:動いた後 +
+ + + +異なる潜在変数を提供することで、異なる行動を持つ異なる状態のシーケンスが生成されることに気づくことができます。つまり、我々は未来を生成するネットワークを持っているということです。非常に魅力的です! + +次は何でしょう? + +この膨大な量のデータを使用して、上で説明した車線と近接コストを最適化することで、方策を訓練することができます。 + +これらの複数の未来は、ネットワークに供給する潜在変数のシーケンスから得られます。勾配上昇法を実行する場合、潜在空間では、他の車があなたに突っ込んでくるような潜在変数のシーケンスを得るために、近接コストを増加させようとします。 + + +## 行動に対する感度の低さと潜在空間でのドロップアウト + + +
+
+図15: 問題:行動に対する感度の低さ +
+ + + + +あなたが実際に未来にアクセスできることを考えると、もしあなたが少しでも左に回れば、すべてが右に回ろうとしており、それはMSEに大きな貢献をするでしょう。潜在変数が、ネットワークの下部に、すべてのものが右に向くことを知らせることができれば、MSEの損失は最小限に抑えることができます - これは私たちが望んでいるものではありません! それは決定論的なタスクなので、すべてのものがいつ右に向くかを知ることができます。 + +図15の大きな矢印は情報の漏洩を意味し、したがって、予測器に提供されている現在の行動に対しては、もはや敏感ではありませんでした。 + + +
+
+図16: 問題:行動に対する感度の低さ +
+ + + +16の図では、一番右の図では、潜在変数(最も正確な未来を得ることができる潜在変数)の実数列があり、専門家がとった行動の実数列があります。この図の左側の2つの図は、ランダムにサンプリングされた潜在変数を持っていますが、本当の行動列を持っていますので、操縦という行動もあることが期待されます。左側の最後の図は、潜在変数ですが任意の行動の実数列を持っており、回転とアクション(他のエピソードからサンプリングされている)を符号化している行動よりも、回転のほとんどが潜在変数から来ていることがはっきりとわかります。 + +この問題を解決するにはどうしたら良いでしょう? + + +
+
+図17: 解決策:潜在変数のドロップアウト +
+ +The problem is not a memory leak but an information leak. We fix this problem by simply dropping out this latent and sampling it from the prior distribution at random. We don't always rely on the output of the encoder ($f_{enc}$) but pick from the prior. In this way, you cannot encode the rotation in the latent variable any more. In this way, information gets encoded in the action rather than the latent variable. + +問題は記憶の漏洩ではなく情報の漏洩です。私たちは、この潜在変数を単に削除して、事前分布からランダムにサンプリングすることで、この問題を解決します。常にエンコーダの出力($f_{enc}$)に頼るのではなく、事前分布からサンプリングします。このようにすることで、もはや潜在変数に回転操作を符号化することはできなくなります。こうして、情報は潜在変数ではなく行動の中に符号化されます。 + + +
+
+図18: 潜在変数のドロップアウトによる性能 +
+ + +右辺では、実際の一連のアクションを持つ2つの異なる潜在変数のセットが見られ、これらのネットワークは潜在変数をドロップアウトするトリックを用いて訓練されています。これで、回転が行動よって符号化され、もはや潜在変数に符号化されていないことがわかります。 + + + +## [エージェントの訓練](https://www.youtube.com/watch?v=VcrCr-KNBHc&t=3232s) + + + +前節では、実世界での経験をシミュレートしてworld modelを得る方法を見ました。 この節では、このworld modelを用いてエージェントを訓練します。 我々の目的は、過去の状態の履歴から、ある行動をとるための方策を学習することです。 ある状態$s_t$(速度、位置、コンテキスト画像)が与えられると、エージェントはアクション$a_t$(加速、ブレーキ、ステアリング)を取り、world modelは次の状態と、その$(s_t, a_t)$のペアに関連付けられたコストを出力します。 + +$$ +c_\text{task} = c_\text{proximity} + \lambda_l c_\text{lane} +$$ + + +前節で議論したように、曖昧な予測を避けるために、将来の状態$s_{t+1}$のエンコーダモジュールから、または事前分布$P(z)$から潜在変数$z_t$をサンプリングする必要があります。 world modelは、前の状態$s_{1:t}$と、エージェントがとった行動と、次の状態を予測するための潜在変数$z_t$を取得します。 これは、最終的な予測と最適化のための損失を与えるために、複数回複製される1つのモジュールを構成しています(図19)。 + + + +
+
+図19: タスク固有のモデルアーキテクチャ +
+ + +モデルの準備が整いました。 どんな風に見えるか見てみましょう + + +
+
+図20: 学習された方策:エージェントはぶつかりあったり、道から離れていきます。 +
+ + + +残念ながら、これはうまくいきません。 このように訓練された方策は、コストがゼロになるので、すべての黒を予測することを学習してしまうので、役に立たないのです。 + +どうすればこの問題に対処できるのでしょうか?予測を改善するために他の車両を真似してみることはできないでしょうか? + + + +## エキスパートの真似をする + + +エキスパートの真似をするにはどうすればいいのでしょうか?ある状態から特定の行動をとった後のモデルの予測が、実際の未来にできるだけ近いものになるようにしたいのです。これは、学習のためのエキスパートによる正則化として機能します。我々のコスト関数には、タスク固有のコスト(近接コストと車線コスト)とこのエキスパートによる正則化の項の両方が含まれています。実際の未来に関する損失も計算しているので、潜在変数は特定の予測を与えるので、モデルから潜在変数を削除しなければなりませんが、この設定は平均予測だけでやる方がうまくいきます。 + + +$$ +\mathcal{L} = c_\text{task} + \lambda u_\text{expert} +$$ + + +
+
+図21: エキスパートによる正則化に基づくモデルアーキテクチャ +
+ + +このモデルはどう振る舞うでしょうか? + + +
+
+図22: エキスパートを真似することで学習された方策 +
+ + + +上の図でわかるように、このモデルは実際には信じられないほどうまく動き、非常に良い予測をするように学習します。これはモデルベースの模倣学習で、私たちはエージェントをモデル化して他の人の真似をしようとしました。 + +しかし、もっとうまくできるのでしょうか? +変分オートエンコーダーを訓練して、最終的にそれを除去しただけなのでしょうか? + +フォワードモデルの予測の不確実性を最小化することに目を向ければ、まだ改善できることがわかりました。 + + + +## フォワードモデルの不確実性を最小化する + + + +フォワードおモデルの不確実性を最小化するとはどういうことでしょうか、また、どのようにしてそれを行うのでしょうか。それに答える前に、3週目の実習で見たことを思い出してみましょう。 + +同じデータで複数のモデルを訓練すると、それらのモデルはすべて訓練領域(赤で示されている)の点で一致し、結果として訓練領域の分散はゼロになります。しかし、訓練領域から遠ざかるにつれて、これらのモデルの損失関数の軌道は発散し始め、分散は増加します。これは図23に描かれています。 しかし、分散は微分可能なので、分散を最小化するために、分散の上で勾配降下を実行することができます。 + + + +
+
+図23: 全入力空間にわたるコストの可視化 +
+ + + +議論に戻りますが、観測データのみを用いて方策を学習することは、実行時に生成される状態の分布が訓練段階で観測されたものと異なる可能性があるため、困難であることがわかります。world modelは、訓練された領域の外で任意の予測をすることがあり、それが間違って低コストになることがあります。その結果、ポリシーネットワークはダイナミクスモデルのこれらの誤差を利用して、誤って楽観的な状態になるような行動を生成する可能性があります。 + +これに対処するために、我々はダイナミクスモデルの予測の不確実性を測定する追加コストを提案します。これは、同じ入力と行動を複数の異なるドロップアウト・マスクに通し、異なる出力間の分散を計算することで計算できます。 これにより、ポリシーネットワークは、フォワードモデルが自信を持っている行動のみを生成するようになります。 + +$$ +\mathcal{L} = c_\text{task} + \lambda c_\text{uncertainty} +$$ + + +
+
+図24: 不確実性に対する正則化を加えたモデルアーキテクチャ +
+ + + +では、不確実性に対する正則化は、より良い方策を学ぶのに役立つのでしょうか? + +はい、そうです。このようにして学習された政策は、以前のモデルよりも優れています。 + + +
+
+図25: 不確実性の正則化に基づいて学習された方策 +
+ + + +## 評価 + + +図26は、我々のエージェントが渋滞している道路でどれだけ運転を学習したかを示しています。 黄色の車が元の運転手で、青の車が学習したエージェントで、緑の車はすべて我々には見えません(よってえ制御できません)。 + + +
+
+図26: 不確実性の正則化つきモデルの性能 +
diff --git a/docs/ja/week11/11.md b/docs/ja/week11/11.md new file mode 100644 index 000000000..edd808e8c --- /dev/null +++ b/docs/ja/week11/11.md @@ -0,0 +1,25 @@ +--- +lang-ref: ch.11 +title: Week 11 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + +## レクチャーパート A + + +このセクションでは、Pytorchにおける共通の活性化機能について議論しました。特に、キンクを伴う活性化関数と滑らかな活性化関数を比較しました。次に、Pytorchにおける一般的な損失関数について学びました。 + + +## レクチャーパート B + + +このセクションでは、損失関数、特にマージンベースの損失とその応用について学びました。続いて、EBMに適した損失関数の設計方法と、よく知られているEBMの損失関数の例について説明しました。ここでは特にマージンベースの損失関数に注目し、「最も問題となる不正解」の考え方を説明しました。 + + +## 演習 + + +本実習では、渋滞している道路の中での運転のための効果的な方策の学習方法を提案しました。異なるコスト関数を最適化して学習した実世界のダイナミクスのモデルを展開することで、複数の方策を学習しました。モデルが訓練された状態からのダイバージェンスを表すコスト項を導入することで、モデルの予測の不確実性を最小化するというアイデアによるものでした。 diff --git a/docs/ja/week12/12-1.md b/docs/ja/week12/12-1.md new file mode 100644 index 000000000..6c4df151c --- /dev/null +++ b/docs/ja/week12/12-1.md @@ -0,0 +1,367 @@ +--- +lang-ref: ch.12-1 +title: Deep Learning for NLP +lecturer: Mike Lewis +authors: Jiayu Qiu, Yuhong Zhu, Lyuang Fu, Ian Leefmans +date: 20 Apr 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + +## [概要](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=44s) + + + +* 近年の驚くべき進歩。 + - 人間は一部の言語では人間の翻訳者よりも機械翻訳を好みます。 + - 多くの質問に答えるデータセットで超人的なパフォーマンスを発揮します。 + - 言語モデルは流暢な段落を生成します。(例:Radford et al.) +* タスクごとに必要とされる専門技術は最小限で、かなり汎用的なモデルでこれらのことを達成することができます。 + + + +## 言語モデル + + +* 言語モデルは、テキストに確率を割り当てます: + $p(x_0, \cdots, x_n)$ +* 可能性のある文章が多いので、分類器の訓練はできません +* 最もポピュラーな方法は、連鎖律を用いて分布を分解する方法です。 + +$$p(x_0,...x_n) = p(x_0)p(x_1 \mid x_0) \cdots p(x_n \mid x_{n-1})$$ + + + +## ニューラル言語モデル + + +基本的には、ニューラルネットワークにテキストを入力すると、ニューラルネットワークはすべてのコンテキストをベクトルに写像します。このベクトルは次の単語を表現し、これによって大きな単語埋め込み行列を得ます。単語埋め込み行列には、モデルが出力できる可能性のあるすべての単語のベクトルが含まれています。そして、文脈ベクトルと各単語ベクトルのドット積によって類似度を計算します。次の単語を予測する尤度を得て、最尤推定によってこのモデルを訓練します。ここで重要なのは、単語を直接扱うのではなく、部分語と呼ばれるものや文字を扱うということです。 + +$$p(x_0 \mid x_{0, \cdots, n-1}) = \text{softmax}(E f(x_{0, \cdots, n-1}))$$ + + +
+ +
図1: ニューラル言語モデル
+
+ + + +### 会話型言語モデル + + + +* 最初のニューラル言語モデル +* 各単語をベクトルとして埋め込みます。これは埋め込み行列のルックアップテーブルです。したがって、どのような文脈で出てきても同じベクトルを得ることになります。 +* 各タイムステップで同じフィードフォワードネットワークを適用します +* 残念ながら、固定長の系列は、制限された文脈でしか条件付けられないことを意味します。 +* これらのモデルは、非常に高速であるという利点があります。 + + +
+ +
図2: 畳み込み言語モデル
+
+ + + +### 再帰的言語モデル + + + +* 数年前までは最もポピュラーなアプローチでした。 +* 概念的には簡単です。各時間ステップで、ある状態(昔の時間ステップからの入力を受け取ります。これはこれまで読んだ内容を表現しています)を持ちます。これは、現在の単語が読まれ、後の状態で使用されているものと組み合わされます。そして、必要な数だけこのプロセスを繰り返します。 +* 制限のない文脈を用いる:原則として、本のタイトルは、本の最後の単語の隠された状態に影響を与えます。 +* 欠点: + - 文書読み取りの全履歴は、このモデルのボトルネックである、各タイムステップで固定サイズのベクトルに圧縮されています。 + - 勾配は長いコンテキストで消失する傾向があります。 + - 時間ステップ間では並列化できないので、訓練が遅くなります。 + + +
+ +
図3: 再帰的言語モデル
+
+ + + +### [Transformer言語モデル(https://www.youtube.com/watch?v=6D4EWKJgNn0&t=828s) + +* Most recent model used in NLP +* Revolutionized penalty +* Three main stages + * Input stage + * $n$ times transformer blocks (encoding layers) with different parameters + * Output stage +* Example with 6 transformer modules (encoding layers) in the original transformer paper: + +* NLPで使用されている最新のモデル +* 革命的なペナルティ +* 3つの主要段階 + * 入力段階 + * $n$ 個の異なるパラメータを持つtransformerブロック(エンコーディング層)の繰り返し + * 出力段階 +* transformerの原論文で用いられた、transformerモジュール(エンコード層)を6個積んだ例。 + + +
+ +
図4:Transformer言語モデル
+
+ + +サブレイヤーは "Add&Norm "と書かれたボックスで接続されています。「Add」の部分はresidual connectionを意味し、勾配が消えるのを防ぐのに役立ちます。ここでの「norm」はlayer normalizationを表しています。 + + +
+ +
図5: エンコーダー層
+
+ + +Transformerは、時間ステップ間で重みを共有することに注意してください。 + + + +# Multi-headed attention + + +
+ +
図6: Multi-headed Attention
+
+ + + +我々が予測しようとしている単語については、**クエリ(q)**と呼ばれる値を計算します。予測に使用するすべての前の単語については、**キー(k)**と呼ばれる値を計算します。クエリは、前の形容詞はなにかといったような文脈を伝えるものです。キーは、現在の単語が形容詞であるかどうかなどの情報を含むラベルのようなものです。qが計算されると、前の単語の分布($p_i$)を導出することができます。 + +$$p_i = \text{softmax}(q,k_i)$$ + + + +次に、前の単語について**バリュー(v)**と呼ばれる量も計算します。バリューは単語の内容を表します。 + +バリューが得られたら,attention分布を最大化することで隠れ状態を計算します。 + + $$h_i = \sum_{i}{p_i v_i}$$ + + +同じものを異なるクエリ、バリュー、キーで複数回並列に計算します。これは、異なるものを使って次の単語を予測したいからです。例えば、前の3つの単語「These」「horned」「silver-white」を使って「unicorns」という単語を予測する場合。私たちは、"horned" "silver-white "によって、それがユニコーンであることを知っています。しかし、"These "によって複数の "unicorns "であることがわかります。したがって、この3つの単語をすべて使って、次の単語が何であるかを知りたいのでしょう。Multi-headed attentionは、それぞれの単語に複数の前の単語を見させる方法です。 + + +Multi-headed attentionの大きな利点は、かなりの並列処理が可能であることです。RNNとは異なり、Multi-headed attentionモジュールのすべてのヘッドとすべての時間ステップを一度に計算します。すべての時間ステップを一度に計算することの問題点は、我々が前の単語だけを条件としたいのに対し、未来の単語も見てしまうことです。これを解決する一つの方法として、**self-attentionマスキング**と呼ばれるものがあります。このマスクは、下の三角形にゼロを、上の三角形に負の無限大を持つ上三角行列です。注意モジュールの出力にこのマスクを追加する効果として、左のすべての単語は右の単語よりもはるかに高い注意スコアを持っているので、実際にはモデルは前の単語だけに焦点を当てることができます。マスクの適用は言語モデルを数学的に正しくするために重要ですが、テキストエンコーダーでは双方向のコンテキストが役立ちます。 + + +トランスフォーマー言語モデルを機能させるための一つの細かいテクニックは、入力にpositional embeddingを追加することです。言語では、順序のようないくつかのプロパティは解釈する上で重要です。ここで使用されている技術は、異なる時間ステップで別々の埋め込みを学習し、それらを入力に追加することです。これが順番の情報を与えます。 + + +
+ +
図7: Transformerのアーキテクチャ
+
+ +**Why the model is so good:** + +1. It gives direct connections between each pair of words. Each word can directly access the hidden states of the previous words, mitigating vanishing gradients. It learns very expensive function very easily +2. All time-steps are computed in parallel +3. Self-attention is quadratic (all time-steps can attend to all others), limiting maximum sequence length + +**このモデルが優れている理由:** + +1. このモデルは、各単語のペア同士を直接的につなげます。各単語は前の単語の隠れ状態に直接アクセスでき、勾配消失を緩和します。それは非常に難しい関数を非常に簡単に学習します。 +2. すべての時間ステップは並列に計算されます。 +3. 3. self-attentionの計算量は二乗オーダーです(すべての時間ステップは他のすべての時間ステップに注意を向けることができる)ので、最大シーケンスの長さが制限されます。 + + + +## [いくつかのコツ (特に multi-head attention と positional encodingについて) と デコーディング言語モデル](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=1975s) + + + +### コツ1: Layer normalizationを多用してトレーニングを安定化させると本当に役に立ちます。 + + + +- Transformerにとってはとても大事なことです + + + +### コツ2:Warm-upと二乗分の一のルートの訓練スケジューリング + + +- 学習率スケジューリングを利用する:transformerをうまく動作させるためには、学習率をゼロから数千ステップまで線形に減衰させる必要があります。 + + + + +### コツ3. 慎重な初期化 + + +- 機械翻訳のようなタスクに本当に役立ちます。 + + + +### コツ4:ラベルの平滑化 + + +- 機械翻訳のようなタスクに本当に役立ちます。 + + +上述したいくつかの方法で行った結果を以下に示します。これらのテストでは、右の `ppl` と呼ばれるメトリックは perplexity です(`ppl` が低いほど良い)。 + + +
+ +
図8: モデル性能の比較
+
+ + +Transformerが導入されると、性能が大幅に向上していることがわかります。 + + + +## Transformer言語モデルについてのいくつかの重要な事実 + + + - 最小限の帰納的バイアス + - すべての単語が直接接続されているため、勾配消失が緩和されます。 + - すべての時間ステップは並列に計算されます。 + + + +Self-attentionの計算量は二乗オーダーである(すべての時間ステップは他のすべての時間ステップに注意を払うことができる)ため、最大シーケンス長が制限されます。 + + + +- Self-attentionは二次的であるため,そのコストは実際には線形的に増加し,問題を引き起こす可能性があります。 + + +
+ +
図9: Transformers vs RNN
+
+ + + +### Transformersはとてもよくスケールする + + +1. 必要とするより遥に膨大な無制限の訓練データ +2. GPT 2は2019年に20億個のパラメータを使用しました。 +3. 最近のモデルでは17Bまでのパラメータを使用し、2020年には + + + + + +## デコーディング言語モデル + +テキストに対する確率分布を学習することができます - 本質的には指数関数的に多くの可能性のある出力を得ることができるので、最大値を計算することはできません。最初の単語にどのような選択をしても、他のすべての決定に影響を与える可能性があります。 +これを受けて、以下のような貪欲デコーディングが導入されました。 + + + + +### 貪欲なデコーディングはうまくいかない + +私たちは、各時間ステップで最も可能性の高い単語を選びます。しかし、この方法で最も可能性の高い単語の順番がわかるという保証はありません。なぜなら,もしある点でそのようなステップを選択しなければならないときに,以前のセッションをやり直すことができないからです。 + + + + +### 網羅的な検索はできない + +これは、すべての可能なシーケンスを計算する必要があり、$O(V^T)$の計算量がかかるため、あまりにも計算コストが高くなります。 + + +## Comprehension Questions and Answers + +1. What is the benefit of multi-headed attention as opposed to a single-headed attention model? + + * To predict the next word you need to observe multiple separate things, in other words attention can be placed on multiple previous words in trying to understand the context necessary to predict the next word. + +2. How do transformers solve the informational bottlenecks of CNNs and RNNs? + + * Attention models allow for direct connection between all words allowing for each word to be conditioned on all previous words, effectively removing this bottleneck. + +3. How do transformers differ from RNNs in the way they exploit GPU parallelization? + + * The multi-headed attention modules in transformers are highly parallelisable whereas RNNs are not and therefore cannot take advantage of GPU technology. In fact transformers compute all time steps at once in single forward pass. + + +## 理解力の問題とその解答 + +1. 1. single-headのattentionモデルとは対照的に、multi-headのattentionモデルの利点は何ですか? + + * 次の単語を予測するためには、複数の別々のものを観察する必要があります。言い換えれば、次の単語を予測するために必要な文脈を理解しようとして、複数の前の単語に注意を向けることができます。 + +2. 2. TransformerはCNNやRNNのinformational bottlenecksをどのように解決するのですか? + + * Attentionモデルはすべての単語間の直接的な接続を可能にし、各単語は前のすべての単語に条件付けされるので、このボトルネックを効果的に除去することができます。 + +3. 3. TransformerはGPU並列化を利用する点でRNNとどのように違うのでしょうか? + + * Transformerのmulti-head attentionモジュールは高度な並列化が可能であるのに対し、RNNはそうではないため、GPU技術を利用することができません。実際、Transformerは単一の順伝播ですべての時間ステップを一度に計算します。 diff --git a/docs/ja/week12/12-2.md b/docs/ja/week12/12-2.md new file mode 100644 index 000000000..2a2527290 --- /dev/null +++ b/docs/ja/week12/12-2.md @@ -0,0 +1,582 @@ +--- +lang-ref: ch.12-2 +title: Decoding Language Models +lecturer: Mike Lewis +authors: Trevor Mitchell, Andrii Dobroshynskyi, Shreyas Chandrakaladharan, Ben Wolfson +date: 20 Apr 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + +## [Beam Search](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=2732s) +## [ビームサーチ](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=2732s) + + + +ビームサーチは、言語モデルを解読してテキストを生成するためのもう一つのデコーディング技術です。各ステップで、アルゴリズムは $k$ 個の最も確率の高い(最良の)部分翻訳(仮説)を追跡し続けます。各仮説のスコアは、その対数確率と同じです。 + +アルゴリズムは、最もスコアの高い仮説を選択します。 + + +
+
+図1: ビームによるデコーディング +
+ + + + + + + + + +ビーム木はどのくらいの深さまで続いているのですか? + +ビームツリーは文末トークンに到達するまで続きます。文末トークンを出力した時点で仮説は終了です。 + +なぜ(NMTでは)ビームサイズが非常に大きいと空の翻訳(中身がない翻訳)になることが多いのですか? + +学習時には、計算量が多いため、アルゴリズムはビームを使用しないことが多いです。その代わりに、自己回帰的な確率の分解(以前の正しい出力が与えられ、$n+1$の最初の単語を予測する)を使用します。モデルは学習中にそれ自身のミスにさらされることがないので、ビームに「nonsense」が現れる可能性があります。 + +まとめ:すべての$k$個の仮説がエンドトークンを生成するまで、または最大解読限界Tに達するまでビーム探索を続けます。 + + + + +### サンプリング + +最も可能性の高い配列は必要ないかもしれません。その代わりに,モデル分布からサンプリングすることができます. + +しかし、モデル分布からサンプリングすることは、それ自体に問題があります。一度「悪い」選択がサンプリングされると、モデルは学習中には決して直面しなかった状態になり、「悪い」評価が続く可能性が高くなります。そのため、アルゴリズムは恐ろしいフィードバックループに陥る可能性があります。 + + + + +### 上位K個のサンプリング + +純粋なサンプリング手法で、分布を $k$個 のベストな値にわけて、その後、正規化して、分布からサンプリングします。 + + + +
+
+図2: 上位K個のサンプリング +
+ + + +#### 質問です。Top-Kサンプリングはなぜそんなにうまくいくのですか? + +この手法は、悪いものをサンプリングするときに、分布の頭だけを使って裾を切り落とすことで、良い言語の多様体から脱落しないようにしようとしているからです。 + + + +## テキスト生成を評価する + +言語モデルを評価するには、単にホールドアウトされたデータの対数尤度を評価する必要があります。しかし、テキストの評価は困難です。一般的には参照を伴う単語オーバーラップ評価指標(BLEU, ROUGEなど)が使われていますが、それぞれに問題があります。 + + +## Sequence-To-Sequence Models + + + + +### 条件付き言語モデル + +条件付き言語モデルは、英語のランダムなサンプルを生成するのには役に立ちませんが、入力が与えられた下でテキストを生成するのには便利です。 + +例を挙げてみましょう。 + +- フランス語の文が与えられると、英語の翻訳を生成する +- 文書が与えられた場合、要約を生成する。 +- 発話が与えられた場合、次の応答を生成する +- 質問が与えられたら、答えを生成する。 + + + +### Sequence-To-Sequence Models + + +一般的に、入力テキストはエンコードされます。この結果として得られる埋め込みは「思考ベクトル」として知られており、これをデコーダに渡して単語ごとにトークンを生成します。 + + +
+
+図3: 思考ベクトル +
+ + + + +Transformerのsequence-to-sequenceモジュールには、2つのスタックがあります。 + +1. エンコーダスタック - Self-attentionはマスクされていないので、入力中のすべてのトークンが入力中の他のすべてのトークンを見ることができます。 + +2. デコーダスタック - それ自身の上にattentionを使用することから離れて、また完全な入力の上にattentionを使用します。 + + + +
+
+図4: Sequence to Sequence Transformer +
+ + + +出力内のすべてのトークンは、出力内のすべての前のトークンと直接接続し、入力内のすべての単語とも接続します。この接続により、このモデルは非常に表現力が高く、強力なものになります。これらの変換器は、以前のリカレントモデルや畳み込みモデルに比べて、翻訳スコアを向上させました。 + + +## [Back-translation](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=3811s) +## [逆翻訳](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=3811s) + +これらのモデルを学習する際には、通常、ラベル付けされた大量のテキストに頼ります。欧州議会の議事録から得たデータが良いソースとなります - テキストは手動で異なる言語に翻訳され、モデルの入出力として使用することができます。 + + +### 問題 + + + +- 欧州議会ではすべての言語が代表されているわけではないので、興味のあるすべての言語の翻訳ペアが得られるわけではありません。データが必ずしも得られない言語の学習用テキストをどうやって見つけるのか?という問題があります。 +- Transformerのようなモデルは、より多くのデータがあればより良い結果が得られるので、どのようにして単言語のテキストを効率的に使うか、つまり入力と出力のペアがないようにするか?という問題が生じます。 + +ドイツ語を英語に翻訳するモデルを訓練したいとします。逆翻訳のアイデアは、最初に英語からドイツ語への逆モデルを訓練することです。 + +- 限られた双対のテキストを使用して、2つの言語で同じ文章を習得することができます。 +- 英語からドイツ語へのモデルができたら、たくさんの単言語の単語を英語からドイツ語に翻訳します。 + +最後に、前のステップで「逆翻訳」されたドイツ語の単語を使って、ドイツ語から英語へのモデルを訓練します。ここで注意したいことがあります。 + +- 逆翻訳モデルがどれだけ優れているかは問題ではありません - 雑音の多いドイツ語の翻訳があっても、最終的にはきれいな英語に翻訳されるかもしれません。 +- 英語とドイツ語のペア(すでに翻訳されている)のデータを超えて、英語を理解することを学ぶ必要があります。 + + +### 反復逆翻訳 + + +- 逆翻訳の手順を反復することで、より多くの双対テキストデータを生成し、より良いパフォーマンスを得ることができます - 単言語データを使ってトレーニングを続けるだけです。 +- 並列データが少ない場合に非常に役立ちます。 + + +## 大規模多言語機械翻訳 + + +
+
+Fig. 5: 多言語機械翻訳 +
+ + + +- ある言語から別の言語への翻訳を学習しようとするのではなく、複数の言語の翻訳を学習するためのニューラルネットを構築してみてください。 +- そのようなモデルは、いくつかの一般的な言語に依存しない情報を学習します。 + + +
+
+図6: 多言語 NN の結果 +
+ + +特に、利用可能なデータが多くない言語を翻訳するためのモデルを訓練したい場合には、素晴らしい結果が得られます(リソースの少ない言語)。 + + +## Unsupervised Learning for NLP + +There are huge amounts of text without any labels and little of supervised data. How much can we learn about the language by just reading unlabelled text? + +## NLPのための教師なし学習 + +ラベルのない膨大な量のテキストがあり、教師付きデータはほとんどありません。ラベルのついていないテキストを読むだけで、その言語についてどれだけのことがわかるのでしょうか? + + +### `word2vec` + + + +直感的説明 - テキスト中に単語が近くに出てくると関連性がありそうなので、ラベルのついていない英文を見ただけで意味がわかるようになることを期待します。 + +- 目標は、単語のベクトル空間表現を学習することです。 + +事前学習タスク - いくつかの単語をマスクして、隣り合う単語を使って空白を埋めます。 + + +
+
+図7: word2vec マスキングの可視化 +
+ + + +例えば、ここでは、「角がある」「銀髪」は、他の何かの動物よりも「ユニコーン」という文脈で出てくる可能性が高いという考え方です。 + +単語を取り、線形投影を適用します。 + + + +
+
+図8: word2vec 埋め込み +
+ + +知りたいもの + +$$ +p(\texttt{unicorn} \mid \texttt{These silver-haired ??? were previously unknown}) +$$ + +$$ +p(x_n \mid x_{-n}) = \text{softmax}(\text{E}f(x_{-n}))) +$$ + + +単語埋め込みはなんらかの構造を持っている + + +
+
+Fig. 9: 埋め込み構造の例 +
+ + +- 訓練後に「王様」の埋め込みを行い、「女性」の埋め込みを加えれば、「女王様」の埋め込みに非常に近い埋め込みが得られるという考えです。 +- ベクトル間の意味のある違いを示しています。 + + + + +#### 質問:単語の表現は文脈に依存しているのですか、独立しているのですか? + +独立していて、他の単語とどのように関係しているかはわかりません。 + + + + +#### 質問:このモデルが苦戦するであろう状況の例は何でしょうか? + +言葉の解釈は文脈に強く依存します。したがって、曖昧な単語や複数の意味を持つかもしれない単語の例では、埋め込みベクトルがその単語を正しく理解するのに必要な文脈を捕捉しないので、モデルは苦戦するでしょう。 + + +### GPT + + + +文脈を追加するために、条件付き言語モデルを訓練することができます。そして、各時間ステップで単語を予測するこの言語モデルが与えられ、モデルの各出力を他の特徴量に置き換えます。 + +- 事前学習 - 次の単語を予測する +- fine-tuning - 特定のタスクに合わせて変更します。 + 例: + - 名詞か形容詞かを予測する + - アマゾンのレビューを構成するいくつかのテキストを与えられた場合、レビューの感情スコアを予測する + +このアプローチは、モデルを再利用できる点で優れています。1つの大きなモデルを事前に学習しておき、他のタスクに合わせて微調整することができます。 + + + + +This is still a "shallow" combination, and we want some more complex interaction between the left and right context. + +### ELMo + +GPTは左方向の文脈しか考慮しないので、モデルは将来の単語に依存することができません - これはモデルができることをかなり制限します。 + +ここでは、2つの言語モデルを学習します。 + +- テキストの左から右に1つ +- テキストの右から左に1つ +- 単語表現を得るために、2つのモデルの出力を連結します。これで、右方向と左方向の文脈の両方に条件をつけることができるようになりました。 + +これはまだ "浅い "組み合わせであり、左右の文脈の間にもう少し複雑な相互作用が欲しいところです。 + + + + + +## BERT + +BERT は、文書穴埋めタスクもあるという意味で word2vec に似ています。しかし、word2vecでは線形投影を行っていましたが、BERTでは、より多くの文脈を見ることができる大規模なtransformerがあります。訓練のために、トークンの15%をマスクし、空白を予測しようとします。 + +BERT(RoBERTa)をスケールアップすることができます。 + +- BERT の事前学習目的関数を単純化する +- バッチサイズのスケールアップ +- 大量のGPUでの学習 +- さらに多くのテキストで学習 + +BERTのパフォーマンスの上にさらに大きな改善 - 質問に答えるタスクのパフォーマンスは、今では超人的です。 + + + +## [NLPのための事前学習](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=4963s) + + +NLPのために研究されてきた様々な自己学習型事前学習アプローチを簡単に見てみましょう。 + +- XLNet: + + XLNetは、すべてのマスクされたトークンを条件付き独立に予測するのではなく、ランダムな順序で自己回帰的に予測します。 + +- SpanBERT: + + トークンの代わりにマスクスパンを用います。 + +- ELECTRA: + + 単語をマスキングするのではなく、トークンを類似したもので置換そます。 そして、そのトークンが置換されたかどうかを予測する二値分類問題を解きます。 + +- ALBERT: + + A Lite Bert: BERTを修正し、レイヤー間で重みを共有することで軽量化する。これにより、モデルのパラメータとそれに伴う計算が削減されます。興味深いことに、ALBERTの作者は精度について多くの妥協をする必要はありませんでした。 + +- XLM: + + 多言語BERT:英語のテキストを与える代わりに、複数の言語からのテキストを与えます。予想通り、言語間のつながりをより良く学習しました。 + +上記の様々なモデルから得られた主なポイントは以下の通りです。 + +- 多くの異なる事前学習の目的関数が効果的に働く + +- 単語間の深い双方向の相互作用をモデル化することが重要 + +- まだ明確な限界がない事前学習のスケールアップからの大きな利益 + +上で議論したモデルのほとんどは、テキストの分類問題を解決するために設計されています。しかし、`seq2seq`モデルのように逐次的に出力を生成するテキスト生成問題を解決するためには、事前学習に少し異なるアプローチが必要です。 + + + + + + +#### 条件付き生成のための事前学習。BARTとT5 + +BART: テキストのノイズ除去による `seq2seq` モデルの事前学習 + +BARTでは、事前学習のために、文を受け取り、ランダムにマスキングトークンによってそれを破損させます。BERTの目的関数のようにマスキングトークンを予測するのではなく、破損した文列全体を与え、正しい文列全体を予測させます。 + +この `seq2seq` 事前学習アプローチは、破損スキームの設計に柔軟性を与えてくれます。文章をシャッフルしたり、フレーズを削除したり、新しいフレーズを導入したりすることができます。 + +BARTはSQUADタスクとGLUEタスクでRoBERTaに匹敵する性能を示しました。しかし、要約、対話、抽象的なQAデータセット上では新しいSOTAを叩き出しました。これらの結果は、BARTがBERT/RoBERTaよりもテキスト生成タスクで優れていることを示しており、BARTへのモチベーションを高めてくれるものです。 + + + + +### NLPにおけるいくつかの未解決問題 + +- 世界の知識をどのように統合すべきか +- 長い文書をどのようにモデル化するか? (BERT ベースのモデルは通常 512 トークンを使用します) +- マルチタスク学習の最善の方法は何か? +- 少ないデータでfine-tuningできるのか? +- これらのモデルは本当に言語を理解しているのか? + + + + +### まとめ + +- 多くのデータでモデルを訓練することは、言語構造を明示的にモデル化することに勝ります。 + +バイアスバリアンスの観点から見ると、トランスフォーマーはバイアスの低い(非常に表現力の高い)モデルです。これらのモデルに多くのテキストを与えることは、明示的に言語構造をモデル化するよりも優れています(高バイアス)。アーキテクチャはボトルネックを介してシーケンスを圧縮する必要があります。 + +- モデルはラベルの付いていないテキストの単語を予測することで、言語について多くのことを学ぶことができます。これは、教師なし学習の優れた目的関数であることがわかります。特定のタスクのためのfine-tuningも簡単です。 + +- 双方向のコンテキストが重要です。 + + + + +### 授業後の質問からの追加の気づき + +言語を理解する」ことを数値化する方法にはどのようなものがあるか?これらのモデルが本当に言語を理解していることをどのようにして知ることができるのでしょうか? + +"The trophy did not fit into the suitcase because it was too big”: という文章を考えます。 +この文では、「it」の参照を解決するのは難しいです。この文の「it」の参照を解決するのは、機械にとっては難しいことです。人間はこの作業が得意です。このような難しい例で構成されたデータセットがあり、人間はそのデータセットで95%のパフォーマンスを達成しました。トランスフォーマーがもたらした革命の前は、コンピュータプログラムは60%程度の性能しか達成できませんでした。現代のトランスフォーマーのモデルは、そのデータセットで90%以上の性能を達成することができます。このことは、これらのモデルが単にデータを記憶/活用するのではなく、データの統計的パターンを通して概念や対象を学習していることを示唆しています。 + +さらに、BERTとRoBERTaは、SQUADとGlueで超人的な性能を達成しています。BARTによって生成された文書要約は、人間には非常にリアルに見えます(BLEUスコアが高い)。これらの事実は、モデルが何らかの形で言語を理解している証拠です。 + + + +#### Grounded Language + +興味深いことに、講師のMike Lewis氏(FAIRの研究員)は「Grounded Language」という概念を研究しています。その研究分野は、雑談や交渉ができる会話エージェントを作ることを目的としています。雑談やネゴシエーションは、テキストの分類や要約に比べて、目的が不明確な抽象的な作業です。 + + + + +#### モデルがすでに世界の知識を持っているかどうかを評価することはできるのでしょうか? + +世界の知識は抽象的な概念です。我々は、非常に基本的なレベルで、我々が興味を持っている概念について簡単な質問をすることによって、モデルが世界の知識を持っているかどうかをテストすることができます。 BERT、RoBERTa、T5のようなモデルは、何十億ものパラメータを持っています。これらのモデルはウィキペディアのような膨大な情報テキストのコーパスで訓練されていることを考えると、パラメータを使って事実を記憶しており、我々の質問に答えることができるでしょう。さらに、あるタスクでモデルをfine-tuningする前と後に同じ知識テストを行うことも考えられます。これは、モデルがどれだけの情報を「忘れてしまった」かの感覚を与えてくれるでしょう。 diff --git a/docs/ja/week12/12-3.md b/docs/ja/week12/12-3.md new file mode 100644 index 000000000..7265dbd3e --- /dev/null +++ b/docs/ja/week12/12-3.md @@ -0,0 +1,571 @@ +--- +lang-ref: ch.12-3 +title: Attention and the Transformer +lecturer: Alfredo Canziani +authors: Francesca Guiso, Annika Brundyn, Noah Kasmanoff, and Luke Martin +date: 21 Apr 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + +## [Attention](https://www.youtube.com/watch?v=f01J0Dri-6k&t=69s) + + + +Transformerのアーキテクチャの話をする前に、attentionの概念を紹介します。attentionには主に2つのタイプがあります:self attention と cross attentionで、これらのカテゴリ内では、ハードなattention と ソフトなattentionがあります。 + +後述しますが、Transformerはattentionモジュールで構成されています。これはシーケンスではなく、集合間の写像です。 + + +### Self Attention (I) + +Consider a set of $t$ input $\boldsymbol{x}$'s: +$t$この入力$\boldsymbol{x}$のなす集合を考えましょう。 + +$$ +\lbrace\boldsymbol{x}_i\rbrace_{i=1}^t = \lbrace\boldsymbol{x}_1,\cdots,\boldsymbol{x}_t\rbrace +$$ + +ただし各$\boldsymbol{x}_i$は$n$次元のベクトルです。その集合は$t$個の要素を持っているので、各要素は$\mathbb{R}^n$に属しており、その集合を行列として表現することができます$\boldsymbol{X}\in\mathbb{R}^{n \times t}$。 + +With self-attention, the hidden representation $h$ is a linear combination of the inputs: +Self-attentionでは、隠れ表現 $h$ は入力の線形結合です。 + +$$ +\boldsymbol{h} = \alpha_1 \boldsymbol{x}_1 + \alpha_2 \boldsymbol{x}_2 + \cdots + \alpha_t \boldsymbol{x}_t +$$ + + +上述した行列表現を用いて、隠れ層を行列積の形で書くことができます。 + +$$ +\boldsymbol{h} = \boldsymbol{X} \boldsymbol{a} +$$ + + +ただし$\boldsymbol{a} \in \mathbb{R}^n$は要素が$\alpha_i$の列ベクトルです。 + + + +これは、これまで見てきた隠れた表現とは異なることに注意してください。 + +ベクトル $\vect{a}$ に課す制約に応じて,ハードattentionとソフトattentionが得られます. + + +#### Hard Attention + + +ハードattentionでは、$\alpha$に次のような制約を課します:$\Vert\vect{a}\Vert_0 = 1$。これは、$\vect{a}$がone-hotベクトルであることを意味しています。したがって、入力の線形結合の係数の1つ以外はすべてゼロに等しく、隠れ表現は、要素$alpha_i=1$に対応する入力$\boldsymbol{x}_i$に帰着されます。 + + +#### Soft Attention + +With soft attention, we impose that $\Vert\vect{a}\Vert_1 = 1$. The hidden representations is a linear combination of the inputs where the coefficients sum up to 1. +ソフトattentionでは、 $V\Vert\vect{a}Vert_1 = 1$ とします。隠れ表現は、係数の和が1になるように入力を線形結合したものです。 + + +### Self Attention (II) + + + +$\alpha_i$はどこから来るのでしょうか。 + +ベクトル$\vect{a} \in \mathbb{R}^t$ は次のようにして得られます: + +$$ +\vect{a} = \text{[soft](arg)max}_{\beta} (\boldsymbol{X}^{\top}\boldsymbol{x}) +$$ + + + + +ここで、$\beta$は、$\text{soft(arg)max}(\cdot)$の逆温度パラメータを表します。$\boldsymbol{X}^{\top}\in\mathbb{R}^{t \times n}$ は、集合の転置行列表現 $\lbrace\boldsymbol{x}_i \rbrace\_{i=1}^t$であり、$\boldsymbol{x}$ は、集合の中の一般的な $\boldsymbol{x}_i$ を表しています。$X^{\top}$の$j$番目の行は、要素$\boldsymbol{x}_j\in\mathbb{R}^n$に対応しています。なので、$\boldsymbol{X}^{\top}\boldsymbol{x}$の$j$番目の行は、$\boldsymbol{x}_j$ のスカラー積となり、$\boldsymbol{x}_i$は、$\lbrace \boldsymbol{x}_i \rbrace\_{i=1}^t$の中の各$\boldsymbol{x}_i$のスカラー積となります。 + + +ベクトル$\vect{a}$の構成要素は、「スコア」とも呼ばれます。なぜなら、二つのベクトルのスカラー積は、二つのベクトルがどれだけ似ているかを教えてくれるからです。したがって、$\vect{a}$の要素は、ある特定の$\boldsymbol{x}_i$に対する全体の集合の類似性についての情報を提供します。 + + +角括弧は任意の引数です。なお、$\arg\max(\cdot)$を使うと、アルファのone-hotベクトルを得てしまうので、注意が必要です。一方、$\text{soft(arg)max}(\cdot)$を使うと、ソフトattentionになります。いずれの場合も、結果として得られるベクトルの成分の和は1となります。 + +Generating $\vect{a}$ this way gives a set of them, one for each $\boldsymbol{x}_i$. Moreover, each $\vect{a}_i \in \mathbb{R}^t$ so we can stack the alphas in a matrix $\boldsymbol{A}\in \mathbb{R}^{t \times t}$. +このようにして$\vect{a}$を生成すると、$\boldsymbol{x}_i$ごとに1つの集合が得られます。さらに、各$\vect{a}_i \in \mathbb{R}^t$は、$\boldsymbol{A}in \mathbb{R}^{t times t}$の行列として積み上げることができます。 + + +それぞれの隠れ状態は、入力$\boldsymbol{X}$とベクトル$\vect{a}$の線形結合なので、$t$の隠れ状態の集合が得られ、これを行列$$\boldsymbol{H}\in \mathbb{R}^{n \times t}$に積み上げることができます。 + +$$ +\boldsymbol{H}=\boldsymbol{XA} +$$ + + + +## [キーバリューストア](https://www.youtube.com/watch?v=f01J0Dri-6k&t=1056s) + + + +キーバリューストアは、保存 (保存)、検索 (クエリ)、連想配列 (辞書 / ハッシュテーブル) の管理のために設計されたパラダイムです。 + +例えば、ラザニアを作るためのレシピを見つけたいとします。レシピブックを持っていて、"lasagne"を検索すると、これがクエリになります。このクエリは、データセット内のすべての可能性のあるキーに対してチェックされます。クエリが各タイトルとどの程度一致しているかをチェックして、クエリとすべてのキーとの間の最大一致スコアを見つけます。もし出力がargmax関数であれば、最も高いスコアを持つ単一のレシピを取得します。そうでなければ、ソフトなargmax関数を使えば、確率分布を得て、最も類似した内容から順に、クエリにマッチするレシピの中から、関連性の低いものから順に検索することができます。 + +基本的には、クエリは質問です。1つのクエリが与えられると、このクエリをすべてのキーに対してチェックして、一致するすべてのコンテンツを検索します。 + + +### Queries, keys and values +### クエリ、キー、バリュー + +$$ +\begin{aligned} +\vect{q} &= \vect{W_q x} \\ +\vect{k} &= \vect{W_k x} \\ +\vect{v} &= \vect{W_v x} +\end{aligned} +$$ + + +それぞれのベクトル$\vect{q}, \vect{k}, \vect{v}$ は、簡単に言えば、特定の入力$\vect{x}$の回転と見ることができます。ここで、$\vect{q}$は、$\vect{W_q}$で回転させただけの$\vect{x}$であり、$\vect{k}$は、$\vect{W_k}$で回転させただけの$\vect{x}$であり、$vect{v}$についても同様です。学習可能なパラメータを導入するのは今回が初めてであることに注意してください。また、attentionは完全に方向性にのみ基づいているので、非線形性も含めていません。 + + +全ての可能なキーと比較するためには、$\vect{q}$ と $\vect{k}$ は同じ次元でなければなりません。例えば、\$\vect{q}, \vect{k} \in \mathbb{R}^{d'}$。 + + +しかし、$\vect{v}$ は任意の次元である可能性があります。ラザニアのレシピの例を続けるならば、クエリは次元をキー、すなわち、検索している異なるレシピのタイトルとして持つ必要があります。検索された対応するレシピの次元、$\vect{v}$は、任意の長さにすることができます。だから、$\vect{v} \in \mathbb{R}^{d''}$です。 + + +ここでは簡単のために、すべてが $d$ の次元であると仮定します。例えば + +$$ +d' = d'' = d +$$ + + +これで、$\vect{x}$の集合、つまりクエリの集合、キーの集合、バリューの集合ができました。$t$本のベクトルを積み重ねたので、これらの集合を、それぞれ $t$ 列を持つ行列に積み重ねることができます; 各ベクトルの高さは $d$ です。 + +$$ +\{ \vect{x}_i \}_{i=1}^t \rightsquigarrow \{ \vect{q}_i \}_{i=1}^t, \, \{ \vect{k}_i \}_{i=1}^t, \, \, \{ \vect{v}_i \}_{i=1}^t \rightsquigarrow \vect{Q}, \vect{K}, \vect{V} \in \mathbb{R}^{d \times t} +$$ + +We compare one query $\vect{q}$ against the matrix of all keys $\vect{K}$: +一つのクエリ$\vect{q}$ 全てのキー$\vect{K}$からなる行列と比較します。 + +$$ +\vect{a} = \text{[soft](arg)max}_{\beta} (\vect{K}^{\top} \vect{q}) \in \mathbb{R}^t +$$ + +Then the hidden layer is going to be the linear combination of the columns of $\vect{V}$ weighted by the coefficients in $\vect{a}$: +そして隠れ層は$\vect{a}$に入っている係数によって重み付られた$\vect{V}$の列の線形結合になります。 + +$$ +\vect{h} = \vect{V} \vect{a} \in \mathbb{R}^d +$$ + +Since we have $t$ queries, we'll get $t$ corresponding $\vect{a}$ weights and therefore a matrix $\vect{A}$ of dimension $t \times t$. +$t$のクエリを持っていますので、それに対応する$t$本の$\vect{a}$重み、したがって$t \times t$次元の行列$\vect{A}$を持っていることになります。 + +$$ +\{ \vect{q}_i \}_{i=1}^t \rightsquigarrow \{ \vect{a}_i \}_{i=1}^t, \rightsquigarrow \vect{A} \in \mathbb{R}^{t \times t} +$$ + + +したがって、行列表記では次のようになります。 + +$$ +\vect{H} = \vect{VA} \in \mathbb{R}^{d \times t} +$$ + + +余談ですが、通常は$beta$を次のように設定します。 + +$$ +\beta = \frac{1}{\sqrt{d}} +$$ + + +これは、次元$d$の選択の違いによって決まる温度を一定に保つために行われるので、次元$d$の数の平方根で割っています。(ベクトル $\vect{1} \in \R^d$ の長さは何か考えてみてください) + +For implementation, we can speed up computation by stacking all the $\vect{W}$'s into one tall $\vect{W}$ and then calculate $\vect{q}, \vect{k}, \vect{v}$ in one go: +実装する上では、全ての$\vect{W}$を一つの$\vect{W}$にスタックしてから$\vect{q}、\vect{k}、\vect{v}$を計算することで、計算の高速化を行えます。 + +$$ +\begin{bmatrix} +\vect{q} \\ +\vect{k} \\ +\vect{v} +\end{bmatrix} = +\begin{bmatrix} +\vect{W_q} \\ +\vect{W_k} \\ +\vect{W_v} +\end{bmatrix} \vect{x} \in \mathbb{R}^{3d} +$$ + + +また、「ヘッド」という概念もあります。上では、ヘッドが一つの例を見ましたが、複数のヘッドを持つこともできます。例えば、$h$個のヘッドがあるとすると、$h$個の $\vect{q}$、 $h$個の $\vect{k}$及び $h$個の $\vect{v}$があり、最終的には、$\mathbb{R}^{3hd}$のベクトルになります。 + +$$ +\begin{bmatrix} +\vect{q}^1 \\ +\vect{q}^2 \\ +\vdots \\ +\vect{q}^h \\ +\vect{k}^1 \\ +\vect{k}^2 \\ +\vdots \\ +\vect{k}^h \\ +\vect{v}^1 \\ +\vect{v}^2 \\ +\vdots \\ +\vect{v}^h +\end{bmatrix} = +\begin{bmatrix} +\vect{W_q}^1 \\ +\vect{W_q}^2 \\ +\vdots \\ +\vect{W_q}^h \\ +\vect{W_k}^1 \\ +\vect{W_k}^2 \\ +\vdots \\ +\vect{W_k}^h \\ +\vect{W_v}^1 \\ +\vect{W_v}^2 \\ +\vdots \\ +\vect{W_v}^h +\end{bmatrix} \vect{x} \in \R^{3hd} +$$ + +However, we can still transform the multi-headed values to have the original dimension $\R^d$ by using a $\vect{W_h} \in \mathbb{R}^{d \times hd}$. This is just one possible way to implement the key-value store. +しかし、元の次元$\R^d$を得るために、$\vect{W_h} \in \mathbb{R}^{d \times hd}$ を使用することでmulti-headの値を変換することができます. これは、キーバリューストアを実装するための一つの方法に過ぎません。 + + +## [The Transformer](https://www.youtube.com/watch?v=f01J0Dri-6k&t=2114s) + + +attentionの知識を拡張して、Transformerの基本的な構成要素を解釈します。特に、基本的なTransformerの順伝播を見ることで、標準的なエンコーダ/デコーダパラダイムでattentionがどのように使用されているのかをみて、RNNのような系列的なアーキテクチャと比較します。 + + +### エンコーダ・デコーダアーキテクチャ + + +この用語には親しまなければなりません。これはオートエンコーダーのデモで最もよく示されており、ここまでの理解が前提となっています。要約すると、入力はエンコーダとデコーダを通して供給され、データにある種のボトルネックを課して、最も重要な情報だけを強制的に通過させます。この情報はエンコーダブロックの出力に格納され、関連性のない様々なタスクに使用されます。 + + +
+
+図1: オートエンコーダーの2つの例の図。左のモデルは、2つのアフィン変換+活性化関数でオートエンコーダーを設計する方法を示しており、右の図は、この単一の「層」を任意の演算モジュールに置き換えています。 +
+ + +私たちの「attention」は、右のモデルに示されているように、オートエンコーダーのレイアウトに引き寄せられていますが、ここで、Transformerの文脈で、内部を見てみましょう。 + + + +### エンコーダーモジュール + + +
+
+図2: transfomerのエンコーダは、入力集合である $\vect{x}$ の入力を受け、隠れ表現の集合おである $\vect{h}^\text{Enc}$ を出力する。 +
+ + +エンコーダモジュールへの一連の入力は、同時にself attentionブロックを通過して `Add, Norm` ブロックに到達するために順次処理されます。この時点で、それらは再び 1D-Convolution と別の `Add, Norm` ブロックを同時に通過し、結果として隠れ表現の集合として出力されます。そして、この隠れ表現の集合は、任意の数のエンコーダモジュール(つまり、より多くの層)を介して送られるか、デコーダに送られます。ここでは、これらのブロックについて詳しく説明します。 + + +### Self-attention + + +self-attentionモデルは、通常のattentionモデルでし。クエリ、キー、バリューは逐次入力の同じ項目から生成されます。系列データをモデル化しようとするタスクでは、この入力の前にpositional encodingが追加されます。このブロックの出力は、attentionで重み付られた値です。Self-attentionブロックは、$1, \cdots , t$からの入力を受け入れ、$1, \cdots, t$のattentionで重み付られた値を出力し、それが残りのエンコーダーに入力されます。 + + +
+
+Figure 3: Self-attentionブロック。 入力系列は、3次元に沿った集合として示され、連結されています。 +
+ + +#### Add, Norm + + +add normブロックは2つの構成要素を持っています。1つ目は、residual connectionであるaddブロックと、layer normalizationです。 + + + +#### 一次元畳み込み + + +このステップに続いて、1D-convolution(別名、位置情報フィードフォワードネットワーク)が適用されます。このブロックは2つの密な層で構成されています.このブロックでは、どのような値を設定するかによって、出力される $\vect{h}^\text{Enc}$ の次元を調整することができます。 + + +### Decoder Module +### デコーダーモジュール + +The transformer decoder follows a similar procedure as the encoder. However, there is one additional sub-block to take into account. Additionally, the inputs to this module are different. +Transformer のデコーダは、エンコーダと同様の手順に従います。しかし、考慮しなければならない追加のサブブロックが1つあります。さらに、このモジュールへの入力が異なります。 + + +
+
+図4: デコーダーのより親切な説明 +
+ + +#### Cross-attention + + +Cross attentionは、self-attentionブロックで使用されるクエリ、キー、バリューの設定に従います。 しかし、入力は少し複雑です。デコーダへの入力は、データ点 $\vect{y}\_i$ であり、これは、self-attentionブロックとadd normブロックを通過し、最終的にcross attentionブロックで終了します。これはcross-attentionへのクエリとして機能します。そこでは、キーバリューのペアは$\vect{h}^\text{Enc}$の出力です。そしてこの出力はσ過去のすべての$\vect{x}\_1, \cdots, \vect{x}\_{t}$を使って計算されます。 + + + +## まとめ + + +$\vect{x}\_1$から$\vect{x}\_{t}$の集合がエンコーダを介して送られてきます。Self-attentionといくつかのブロックを使って、出力の表現 $\lbrace\vect{h}^\text{Enc}\rbrace_{i=1}^t$ を得て、それをデコーダに送ります。これにself-attentionをかけた後、cross-attentionをかけます。このブロックでは、クエリは、対象言語のシンボルの表現に対応し、キーとバリューは、ソース言語の文($\vect{x}\_1$ to $\vect{x}\_{t}$)のものです。直感的には、cross-attentionは、入力文のどの値が、$\vect{y}\_t$を構築するのに最も関連性があり、したがって、最も高いattention係数に値するかを見つけます。このcross-attentionの出力は、別の1次元畳み込みサブブロックを介して与えられ、 $\vect{h}^\text{Dec}$ が得られます。指定された対象言語については、ここから、$\lbrace\vect{h}^\text{Dec}\rbrace_{i=1}^t$ をいくつかの対象データと比較することで、簡単にどのように訓練が起こるのかを見ることができます。 + + + +### 単語言語モデル + + +Transformerの最も重要なモジュールを説明する前に残したいくつかの重要な事実がありますが、Transformerがどのように言語タスクで最先端の結果を達成することができるかを理解するために、今すぐにそれらを議論する必要があります。 + + + + +#### Positional encoding + +アテンション機構を利用することで並列処理が可能になり、モデルの学習時間を大幅に短縮することができますが、逐次的な情報は失われてしまいます。positional encoding機能を用いることで、この文脈を捉えることが可能となります。 + + + + +#### 意味表現 + +トランスフォーマーの訓練を通して、多くの隠れ表現が生成されます。PyTorch の単語モデルの例で使用されているものと同様の埋め込み空間を作成するために、cross-attentionの出力は $x_i$ という単語の意味表現を提供します。これによってこのデータセット上でのさらなる実験が可能となります。 + + + + + +### コードの概要 + +ここからは、上で説明したtransformerのブロックを、はるかにわかりやすい形式で、コードで見ていきましょう! + +最初のモジュールでは、multi-head attentionブロックを見ていきます。このブロックに入力されたクエリー、キー、バリューに応じて、self-attentionにもcross-attentionにも使用できます。 + + +```python +class MultiHeadAttention(nn.Module): + def __init__(self, d_model, num_heads, p, d_input=None): + super().__init__() + self.num_heads = num_heads + self.d_model = d_model + if d_input is None: + d_xq = d_xk = d_xv = d_model + else: + d_xq, d_xk, d_xv = d_input + # Embedding dimension of model is a multiple of number of heads + assert d_model % self.num_heads == 0 + self.d_k = d_model // self.num_heads + # These are still of dimension d_model. To split into number of heads + self.W_q = nn.Linear(d_xq, d_model, bias=False) + self.W_k = nn.Linear(d_xk, d_model, bias=False) + self.W_v = nn.Linear(d_xv, d_model, bias=False) + # Outputs of all sub-layers need to be of dimension d_model + self.W_h = nn.Linear(d_model, d_model) +``` + + + +多頭注意クラスの初期化。`d_input` が与えられた場合はcross-attentionとなります。それ以外の場合はself-attentionとなります。クエリ、キー、バリューの設定は入力 `d_model` の線形変換として構築されます。 + + +```python +def scaled_dot_product_attention(self, Q, K, V): + batch_size = Q.size(0) + k_length = K.size(-2) + + # Scaling by d_k so that the soft(arg)max doesnt saturate + Q = Q / np.sqrt(self.d_k) # (bs, n_heads, q_length, dim_per_head) + scores = torch.matmul(Q, K.transpose(2,3)) # (bs, n_heads, q_length, k_length) + + A = nn_Softargmax(dim=-1)(scores) # (bs, n_heads, q_length, k_length) + + # Get the weighted average of the values + H = torch.matmul(A, V) # (bs, n_heads, q_length, dim_per_head) + + return H, A +``` + + +Attentionベクトルでスケーリングされた後の値のpositional enncodingに対応する隠れ層を返します。シーケンス中のどの値が注目によってマスクアウトされたかを見るために A も返されます。 + +```python +def split_heads(self, x, batch_size): + return x.view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) +``` + + +最後の次元を (`heads` × `depth`) に分割します。(`batch_size` × `num_heads` × `seq_length` × `d_k`) の形にするために転置した後に出力を返します。 + +```python +def group_heads(self, x, batch_size): + return x.transpose(1, 2).contiguous(). + view(batch_size, -1, self.num_heads * self.d_k) +``` + + +Attention headを組み合わせて、バッチサイズと系列の長さに合った正しい形状にします。 + +```python +def forward(self, X_q, X_k, X_v): + batch_size, seq_length, dim = X_q.size() + # After transforming, split into num_heads + Q = self.split_heads(self.W_q(X_q), batch_size) + K = self.split_heads(self.W_k(X_k), batch_size) + V = self.split_heads(self.W_v(X_v), batch_size) + # Calculate the attention weights for each of the heads + H_cat, A = self.scaled_dot_product_attention(Q, K, V) + # Put all the heads back together by concat + H_cat = self.group_heads(H_cat, batch_size) # (bs, q_length, dim) + # Final linear layer + H = self.W_h(H_cat) # (bs, q_length, dim) + return H, A +``` + + + +multi-head attentionの順伝播。 + +入力が q, k, v に分割され、その時点で、これらの値は、スケーリングされたドット積attentionメカニズムを介して入力され、連結され、最終的な線形層へ入力されます。attentionブロックの最後の出力は、見つかったattentionと、残りのブロックに渡される隠れ表現です。 + +Transformer/エンコーダーの次のブロックはAdd,Normですが、これはPyTorchにすでに組み込まれている関数です。このように、これは非常にシンプルな実装であり、独自のクラスを必要としません。次は1次元畳み込みブロックです。詳細は前のセクションを参照してください。 + +これで、すべてのメインクラスがビルドされました(またはビルドしてもらった)ので、次にエンコーダモジュールに移ります。 + +```python +class EncoderLayer(nn.Module): + def __init__(self, d_model, num_heads, conv_hidden_dim, p=0.1): + self.mha = MultiHeadAttention(d_model, num_heads, p) + self.layernorm1 = nn.LayerNorm(normalized_shape=d_model, eps=1e-6) + self.layernorm2 = nn.LayerNorm(normalized_shape=d_model, eps=1e-6) + + def forward(self, x): + attn_output, _ = self.mha(x, x, x) + out1 = self.layernorm1(x + attn_output) + cnn_output = self.cnn(out1) + out2 = self.layernorm2(out1 + cnn_output) + return out2 +``` + + + +最も強力なTransformerでは、これらのエンコーダの任意の数が互いに積み重ねられています。 + +Self-attentionはそれ自体では再帰や畳み込みを持たないことを思い出してください。位置に敏感になるように、我々はpositional encodingを提供します。これらは次のように計算されます。 + + +$$ +\begin{aligned} +E(p, 2) &= \sin(p / 10000^{2i / d}) \\ +E(p, 2i+1) &= \cos(p / 10000^{2i / d}) +\end{aligned} +$$ + + + + +細かい詳細については、あまりスペースを取らないように、ここで使用されている完全なコードについては https://github.com/Atcold/pytorch-Deep-Learning/blob/master/15-transformer.ipynb を参照してください。 + + +positional encodinngと同様に、N個のスタックされたエンコーダ層を持つエンコーダ全体は、以下のように書き出されます + +```python +class Encoder(nn.Module): + def __init__(self, num_layers, d_model, num_heads, ff_hidden_dim, + input_vocab_size, maximum_position_encoding, p=0.1): + self.embedding = Embeddings(d_model, input_vocab_size, + maximum_position_encoding, p) + self.enc_layers = nn.ModuleList() + for _ in range(num_layers): + self.enc_layers.append(EncoderLayer(d_model, num_heads, + ff_hidden_dim, p)) + def forward(self, x): + x = self.embedding(x) # Transform to (batch_size, input_seq_length, d_model) + for i in range(self.num_layers): + x = self.enc_layers[i](x) + return x # (batch_size, input_seq_len, d_model) +``` + + +## Example Use + + +## 使用例 + +エンコーダだけを使ってもできるタスクはたくさんあります。付属のノートブックでは、エンコーダがどのように感情分析に使用できるかを見ています。 + +imdbのレビューデータセットを使って、エンコーダーからテキスト系列の潜在表現を出力し、このエンコーディング過程をバイナリークロスエントロピーで訓練して、映画のレビューが肯定的か否定的かに対応させます。 + +ここでも詳細の説明は省略して、ノートを参照していただきたいのですが、ここではTransoformerで使われている最も重要なアーキテクチャコンポーネントを紹介します。 + + +```python +class TransformerClassifier(nn.Module): + def forward(self, x): + x = Encoder()(x) + x = nn.Linear(d_model, num_answers)(x) + return torch.max(x, dim=1) + +model = TransformerClassifier(num_layers=1, d_model=32, num_heads=2, + conv_hidden_dim=128, input_vocab_size=50002, num_answers=2) +``` + +これはモデルが典型的な方法で訓練されるところです。 + diff --git a/docs/ja/week12/12.md b/docs/ja/week12/12.md new file mode 100644 index 000000000..73ef24a88 --- /dev/null +++ b/docs/ja/week12/12.md @@ -0,0 +1,33 @@ +--- +lang-ref: ch.12 +title: Week 12 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + + +## レクチャーパートA + +このセクションでは、CNN、RNNから始まり、最終的には最新のアーキテクチャであるtransformerまで、NLPの応用で使用される様々なアーキテクチャについて説明します。次に、transformerを構成する様々なモジュールと、それがどのようにtransformerをNLPタスクにおいて有利なものにしているかを議論します。最後に、transformerを効果的に学習させるためのコツについて議論します。 + + + + +## レクチャーパートB + +本節では、貪欲なデコーディングと網羅的探索の中間地点としてのビーム探索を紹介します。ここでは、生成分布からサンプリングしたい場合(テキストを生成する場合)を考え、トップk個のサンプリングを導入します。その後、sequence-tosequenceモデル(transformerを含む)と逆翻訳を紹介します。その後、教師なし学習による埋め込み学習のアプローチを紹介し、word2vec, GPT, BERTについて議論します。 + + + +## 演習 + +ここでは、self-attentionとその入力の隠れ層表現に焦点を当てて、attentionを紹介します。次に、キーバリューストアパラダイムを紹介し、入力の回転としてクエリ、キー、バリューを表現する方法を議論します。最後に、基transformerアーキテクチャを解釈するためにattentionを使用し、本的なtransformerの順伝播を見ることで、エンコーダ/デコーダパラダイムを系列的なアーキテクチャと比較します。 diff --git a/docs/ja/week13/13-1.md b/docs/ja/week13/13-1.md new file mode 100644 index 000000000..b77c93795 --- /dev/null +++ b/docs/ja/week13/13-1.md @@ -0,0 +1,604 @@ +--- +lang-ref: ch.13-1 +title: Graph Convolution Networks I +lecturer: Xavier Bresson +authors: Bilal Munawar, Alexander Bienstock, Can Cui, Shaoling Chen +date: 27 Apr 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + +## 伝統的な畳み込みニューラルネット + + +畳み込みニューラルネットは、高次元の学習問題を解決するための強力なアーキテクチャです。 + + + +### 次元の呪いとは何か? + +1024×1024ピクセルの画像を考えてみましょう。この画像は1,000,000次元の空間の点として見ることができます。1次元あたり10個のサンプルを使うと、${10}^{1,000,000}$の画像が生成されますが、これは非常に大きい値になります。畳み込みニューラルネットは,例に挙げたような高次元の画像データを最適な表現で抽出するために非常に強力です。 + +- dim(image) = **1024 x 1024** = ${10}^{6}$ +- **N = 10** サンプル・次元 --> **${10}^{1,000,000}$ 点** + +
+
+図1: 畳み込みニューラルネットは高次元な画像のデータの表現を抽出する +
+ + +### ConvNetsに関する主な前提条件: + + **1. Data (images, videos, speech) is compositional.** + **1. データ(画像、ビデオ、音声)が構成的である。** + + +データは、以下のようなパターンで構成されると考えます: + +* **Local** A neuron in the neural network is only connected to the adjacent layers, but not to all layers in the network. We call this the local reception field assumption. +* **Stationary** We have some patterns that are similar and are shared across our image domain. For example, the yellow bedsheet in the middle image of figure 2. +* **Hierarchical** Low level features will be combined to form medium level features. Subsequently, these medium level features will combined to progressively form higher and higher level features. For example, a visual representation. + +* **局所性** ニューラルネットワークのニューロンは、隣接する層にしか接続されておらず、ネットワーク内のすべての層に接続されているわけではありません。これを局所的受容野の仮定と呼びます。 +* **定常性** 画像領域全体で共有されている類似したパターンがいくつかあります。例えば、図2の中央の画像にある黄色のベッドシートです。 +* **階層性** 低レベルの特徴を組み合わせて、中レベルの特徴を形成します。その後、これらの中レベルの特徴が組み合わされて、徐々に高レベルの特徴が形成されていきます。例えば、視覚的な表現はこのような階層性を持っています。 + + +
+
+図2: データは構成的である。 +
+ + +**2. 畳み込みニューラルネットは構成的な構造を活用する** + + +構成的な特徴を抽出して、分類器やレコメンダーなどに供給します。 + + +
+
+図3: 畳み込みニューラルネットは構成的な構造を活用する +
+ + +## グラフ領域 + + +### データ領域 + + +* 画像、物体、ビデオは2D、3D、2D+1ユークリッド領域(グリッド)上にあります。各ピクセルは赤、緑、青の値のベクトルで表されます. + + + +
+
+図4: 画像は多次元 +
+ + + +* 文、単語、音声は1次元ユークリッド空間にあります。例えば、各文字は整数で表すことができます。 + + +
+
+ 図5: 系列は一次元 +
+ + + +* これらのドメインは強力な規則的な空間構造を持っているため、畳み込みニューラルネットのすべての操作は高速でwell-definedです。 + + +
+
+ 図6: 発話データは1次元のグリッド +
+ + + +### グラフ領域 + + + +#### グラフ領域を考える動機を与えるような例 + +ソーシャルネットワークを考えてみましょう。ソーシャルネットワークは、2人のユーザ間のペア間の接続がグリッドを形成しないため、グラフ表現で表現するのが最も適しています。グラフのノードはユーザを表し、2つのノード間のエッジは2つのノード(ユーザ)間のつながりを表します。各ユーザは、メッセージ、画像、動画などを含む三次元の特徴行列を持っています。 + + +
+
+図7: ソーシャルネットワークのグラフ表現 +
+ + +神経遺伝病を予測するための脳の構造と機能の関係は、考えるべき動機付けとなる例を提供しています。以下に見られるように、脳はいくつかの関心領域(ROI)で構成されています。これらのROIは、局所的にしか周囲の関心領域に接続されていません。隣接行列は、異なる関心領域間の強さの度合いを表しています。 + + +
+
+図8: 脳のなかの結合のグラフ表現 +
+ + + +量子化学はまた、グラフで表現できるデータの興味深い例を提供しています。各原子はグラフのノードで表され、エッジを使って結合を介して他の原子と接続されています。これらの分子/原子のそれぞれは、関連する電荷、結合タイプなどの異なる特徴を持っています。 + + +
+
+Fig. 9: 量子化学のグラフ表現 +
+ + + +### グラフの定義と特徴 + + + +* グラフ G は次のように定義されます: + * **バーテックスV** + * **エッジE** + * **隣接行列** + +* Graph features: + * **Node features: $h_{i}$, $h_{j}$** (atom type) + * **Edge features: $e_{ij}$** (bond type) + * **Graph features:** g (molecule energy) + +* グラフの特徴量: + * **ノードの特徴量。h_{i}$, $h_{j}$** (原子型) + * **エッジの特徴量。e_{ij}$** (ボンドタイプ) + * **グラフの特徴量** g (分子エネルギー) + + +
+
+図10: グラフ +
+ + + + + +## 伝統的な畳み込みニューラルネットの畳み込み + + +### 畳み込み + +We abstractly define convolution as: + +$$h^{\ell+l} = w^\ell * h^\ell,$$ +where $h^{\ell+1}$ is $n_1\times n_2\times d$-dimensional, $w^\ell$ is $3\times 3\times d$-dimensional, and $h^\ell$ is $n_1\times n_2\times d$-dimensional. +For example, $n_1$ and $n_2$ could be the number of pixels in the $x$ and $y$ directions of an image, respectively, and $d$ is the dimensionality of each pixel (e.g., 3 for a colored image).\\ +So, $h^{\ell+1}$ is a feature at the $(\ell+1)$-th hidden layer obtained by applying the convolution $w^\ell$ to a feature at the $\ell$-th layer.\\ +Usually the kernel is small to represent a local reception field -- $3\times 3$ in this case, or $5\times 5$, for example.\\ +Note: we use padding to ensure the dimensions of $h^{\ell+1}$ are the same as those of $h^\ell$.\\ + +For example, in this image, the kernel may be used to recognize lines. + +畳み込みを抽象的に定義すると + +$$h^{\ell+l} = w^\ell * h^\ell,$$ +となります。ここで、$h^{\ell+1}$は、$n_1\times n_2\times d$次元で、 $w^\ell$は、$3\times 3\times d$次元で、 and $h^\ell$は、$n_1\times n_2\times d$次元です。 +例えば、$n_1$と$n_2$は、それぞれ画像の$x$方向と$y$方向の画素数、$d$は各画素の次元数(例えば、色のついた画像の場合は3)です。 +つまり、$h^{\ell+1}$は、$(\ell+1)$番目の 隠れ層の特徴表現に畳み込み $w^\ell$を適用して得られた、$(\ell+1)$層目の隠れ層の特徴表現です。 +通常、カーネルは、局所的な受信野を表現するために小さくなっています -- この場合は、$3times 3$とか、$5times 5$とかです。 +$h^{\ell+1}$層目の次元が$h^{\ell}$層目の次元と一致するように、パディングを用いていることに注意してください。 + +例えば、この画像では、カーネルを使うことで線を認識しているのかもしれません。 + + +
+
+図11: 線の認識のためにカーネルが使われているかもしれない +
+ + + +### 畳み込みはどのように定義されているのでしょうか? + +より正確には、畳み込みは以下のように定義されています。 + +$$h_i^{\ell_1} = w^\ell * h_i^\ell$$ + +$$ = \sum_{j\in\Omega}\langle w_j^\ell, h_{i-j}^\ell\rangle$$ + +$$ = \sum_{j\in\mathcal{N}_i} \langle w_j^\ell, h_{ij}^\ell\rangle$$ + +$$=\sum_{j\in\mathcal{N}_i} \langle \Bigg[w_j^\ell\Bigg], \Bigg[h_{ij}\Bigg]\rangle$$ + + + +上記では、畳み込みを *テンプレートマッチング*として定義しています。 +通常は $h_{i-j}$ の代わりに $h_{i+j}$ を使います。なぜなら前者は実際には相関で、テンプレートマッチング以上のものだからです。 + + + + + + + + + + + + + +しかし、1行目を使っても2行目を使っても、カーネルが反転しているだけなので、学習には影響しません。 + +3行目では、$h_{i+j}^\ell$を$h_{ij}^\ell$と書くだけです。 + +カーネルは非常に小さいので、2行目のように画像全体$\Omega$で合計するのではなく、3行目のように、セル$i$の近傍$\mathcal{N}_i$で合計します。 + +これにより、畳み込みの計算量は $O(n)$ となります。ここで $n$ は入力画像のピクセル数です。 + +畳み込みは、$n$の各画素に対して、$d$の次元のベクトルの内積を$3 \times 3$の格子上で足し合わせます。 + +よって、計算量は$n\cdot 3\cdot 3\cdot d$、つまり$O(n)$です。さらに、GPUを用いて$n$の各画素で並列計算が可能です。 + + +
+
+図12: ノードは同じように並んでいる +
+ + + +コンピュータビジョンの標準的な画像に対する畳み込みのように、畳み込みをかけているグラフがグリッドである場合、ノードは上の画像のように順序付けられます。 +したがって、 $j_3$ は常にそのパターンの右上にあります。 + +ですから、下の画像のすべてのノード $i$ に対して、 $i$ と $i'$ のように、カーネルのノードの順序は常に同じになります。 +例えば、以下に示すように、パターンの右上隅にある $j_3$ と画像パッチの右上隅にある $j_3$ を常に比較します (ピクセル $i$ に対して畳み込むもの)。 +数学的に言えば + +$$ +\langle\Bigg[w_{j_3}^\ell\Bigg], \Bigg[h_{ij_3}^\ell \Bigg]\rangle +$$ + +と + +$$ +\langle\Bigg[w_{j_3}^\ell\Bigg], \Bigg[h_{i'j_3}^\ell \Bigg]\rangle +$$ + + +は、テンプレートと画像パッチの間の右上隅に常にあります。 + + +
+
+図13: 画像パッチがテンプレートと合う +
+ + + +### テンプレートマッチングをグラフに拡張することはできるでしょうか? + +We have a couple of issues: +1. First, in a graph, there is no ordering of the nodes. + +So in the template shown below in the image, node $j_3$ has no specific position, but just an (arbitrary) index. +So, when we try to match against nodes $i$ and $i'$ in the graph below, we do not know if $j_3$ is matching against the same nodes in both convolutions.\\ +This is because there is no notion of the *top right corner* of the graph.\\ +There is no notion of up, down, left right.\\ +Thus, the template matchings actually have no meaning and we cannot use the definition of template matching directly, as above. + +いくつかの問題があります。 +1. まず、グラフでは、ノードには順序がありません。 + +そのため、下の画像のテンプレートでは、ノード $j_3$ には特定の位置はなく、(任意の)インデックスがあるだけです。 +だから、下のグラフのノード$i$と$i'$にマッチしようとしても、$j_3$が両方の畳み込みで同じノードにマッチしているかどうかはわかりません。 +これは、グラフの右上隅がないからです。 +上下左右という概念がないのです。 +このように、テンプレートマッチングには意味がないので、上記のように、テンプレートマッチングの定義をそのまま使うことはできません。 + + +
+
+図14: グラフではノードに順序がない +
+ + + +2. 2つ目の問題は、近傍のサイズが異なる場合があるということです。 + +つまり、下に示すテンプレート $w^\ell$には4つのノードがありますが、ノード $i$ の近傍には7つのノードがあります。 +この2つを比較するにはどうすればよいのでしょうか? + + +
+
+図15: グラフの中での異なる近傍の大きさ +
+ + + +## グラフ畳み込み + +ここでは、**畳み込み定理**を用いて、グラフの畳み込みを定義します。 + +**畳み込み定理**では、2つの関数の畳み込みのフーリエ変換は、それらのフーリエ変換の各要素ごとの積であるとしています。 + +$$\mathcal{F}(w*h) = \mathcal{F}(w) \odot \mathcal{F}(h) \implies w * h = \mathcal{F}^{-1}(\mathcal{F}(w)\odot\mathcal{F}(h))$$ + + +一般にフーリエ変換は$O(n^2)$の計算量ですが、ドメインがグリッドであれば、FFTで$O(n\log n)$の計算量にすることができます。 + + + +### 畳み込み定理をグラフに拡張できるか? + +これは二つの疑問を投げかけています。 +1. グラフのフーリエ変換はどうやって定義するのか? +2. コンパクトなカーネル(テンプレートマッチングのように)のための高速なスペクトル畳み込みを $O(n)$ 時間で計算するにはどうすればよいか? + +$$w *_{\mathcal{G}} h \stackrel{?}{=} \mathcal{F}^{-1}_{\mathcal{G}}(\mathcal{F}_{\mathcal{G}}(w)\odot\mathcal{F}_{\mathcal{G}}(h))$$ + + +グラフニューラルネットワークには、これらの2つのデザインを使用します。 +テンプレートマッチングは空間的なグラフの畳み込みニューラルネットに、畳み込み定理定理はスペクトル畳み込みニューラルネットに使用されます。 + + + + +## スペクトルグラフ畳み込みニューラルネット + +スペクトル畳み込みを行うには? + +### ステップ 1 : グラフラプラシアン + +スペクトルグラフ理論の中心的な演算子です。 + +以下を定義します + +$$ +\begin{aligned} \mathcal{G}=(V, E, A) & \rightarrow \underset{n \times n}{\Delta}=\mathrm{I}-D^{-1 / 2} A D^{-1 / 2} \\ & \quad \text { where } \underset{n \times n} D=\operatorname{diag}\left(\sum_{j \neq i} A_{i j}\right) \end{aligned} +$$ + + + + +行列 $A$ は隣接行列であり、$\Delta$ はラプラシアンであり、これは単位行列から行列 $D$ で正規化された隣接行列を引いたものに等しいことに注意してください。これは正規化ラプラシアンと呼ばれ、この文脈では通常ラプラシアンと呼ばれています。 + +ラプラシアンは、グラフの滑らかさの測定値、言い換えれば、局所的な値 $h_i$ とその近傍の平均値 $h_j$'s の差と解釈されます。下式の$d_i$はノード$i$の滑らかさであり、$\mathcal{N}_{i}$はノード$i$の近傍全員の滑らかさである。 + +$$ +(\Delta h)_{i}=h_{i}-\frac{1}{d_{i}} \sum_{j \in \mathcal{N}_{i}} A_{i j} h_{j} +$$ + + +上の式は、ノード$i$上の関数$h$にラプラシアンを適用するもので、$h_i$の値から隣接ノード$h_j$の平均値を差し引いたものです。基本的に、信号が非常に滑らかであればラプラシアン値は小さく、その逆もまた然りです。 + + +### ステップ2:フーリエ関数 + + +グラフラプラシアンの固有分解は以下のようになります。 + +$$ +\underset{n \times n}{\Delta}=\Phi^{T} \Lambda \Phi +$$ + + +The Laplacian is factorized into three matrices, $\Phi ^ T$, $\Lambda$, $\Phi$. + +$\Phi$ is defined below, it contains column vectors, or Lap eigenvectors $\phi_1$ to $\phi_n$, each of size $n \times 1$, and those are also called Fourier functions. And Fourier functions form an orthonormal basis. + +ラプラシアンは、$\Phi ^ T$, $\Lambda$, $\Phi$の3つの行列に分解されます。 + +$\Phi$ は、以下のように定義されていて、それぞれの大きさが $n times 1$ である列ベクトル、つまりラップ固有ベクトルを含んでいます。そして、これらはフーリエ関数と呼ばれて、これは正規直交基底を成します。 + +$$ +\begin{array}{l}\text { where } \underset{n \times n}{\Delta}\Phi=\left[\phi_{1}, \ldots, \phi_{n}\right]=\text { and } \Phi^{T} \Phi=\mathrm{I},\left\langle\phi_{k}, \phi_{k^{\prime}}\right\rangle=\delta_{k k^{\prime}} \\\end{array} +$$ + + +$Lambda$ はラプラシアンの固有値を持つ対角行列で、対角線上には $\lambda_1$ から $\lambda_n$ までの値があります。これらの値は、正規化された場合では、典型的には $0$ から $2$ の範囲になります。これらの値は、グラフスペクトルとも呼ばれています。下の式を見てください。 + +$$ +\begin{array}{c}\text { where } \underset{n \times n}\Lambda=\operatorname{diag}\left(\lambda_{1}, \ldots, \lambda_{n}\right) \text { and } 0 \leq \lambda_{1} \leq \ldots \leq \lambda_{n}=\lambda_{\max } \leq 2\end{array} +$$ + + +Below is an example of checking the eigenvalue decomposition. The Laplacian matrix $\Lambda$ is multiplied by an eigenvector $\phi_k$, the shape of the result is $n \times 1$, and the result is $\lambda_k \phi_k$. +以下は、固有値分解を確認する例です。ラプラシアン行列$Lambda$に固有ベクトル$\phi_k$を掛け、結果のシェイプを$n \times 1$とし、結果を$\lambda_k \phi_k$とします。 + +$$ +\begin{array}{ll}\text { and } \underset{n \times 1}{\Delta \phi_{k}}=\lambda_{k} \phi_{k}, & k=1, \ldots, n \\ & \end{array} +$$ + + +下の画像は、1次元ユークリッドラプラシアンの固有ベクトルを可視化したものです。 + + +
+
+図16: グリッド・ユークリッド領域:一次元ユークリッドラプラシアンの固有ベクトル +
+ + +グラフの領域で、左から順に、1番目、2番目、3番目、...のフーリエ関数です。例えば、$\phi_1$では、正(赤)と負(青)の振動があり、$\phi2$, $\phi3$でも同じです。これらの振動は、グラフのトポロジーに依存していて、コミュニティやハブなどのグラフの幾何学的な形状に関係していて、グラフのクラスタリングに役立ちます。以下をみてください。 + + +
+
+図17: グラフ領域:グラフのフーリエ関数 +
+ + +### ステップ3 : フーリエ変換 + +$$ +\begin{aligned} \underset{n \times 1} h &=\sum_{k=1}^{n} \underbrace{\left\langle\phi_{k}, h\right\rangle}_{\mathcal{F}(h)_{k}=\hat{h}_{k}=\phi_{k}^{T} h}\underset{n \times 1}{\phi_{k}} \\ &=\sum_{k=1}^{n} \hat{h}_{k} \phi_{k} \\ &=\underbrace{\Phi \hat{h}}_{ +\mathcal{F}^{-1}(\hat{h}) +} \end{aligned} +$$ + + + +**フーリエ級数:関数 $h$ をフーリエ関数で分解します。** + +関数$h$を取り、各フーリエ関数$phi_k$に射影し、結果としてスケーラーである$k$のフーリエ級数の係数を得て、関数$phi_k$を掛け合わせます。 + + + +フーリエ変換は、基本的には、フーリエ関数に関数 $h$ を射影したもので、その結果がフーリエ級数の係数となります。 + + +**フーリエ変換/フーリエ級数の係数***。 + +$$ +\begin{aligned} \underset{n \times 1}{\mathcal{F}(h)} &=\Phi^{T} h \\ +&=\hat{h} \end{aligned} +$$ + + +**Inverse Fourier Transform** +**逆フーリエ変換** + +$$ +\begin{aligned} \underset{n \times 1}{\mathcal{F}^{-1}(\hat{h})} &=\Phi \hat{h} \\ &=\Phi \Phi^{T} h=h \quad \text { as } \mathcal{F}^{-1} \circ \mathcal{F}=\Phi \Phi^{T}=\mathrm{I} \end{aligned} +$$ + + + +フーリエ変換は、行列 $Phi^{T}$ にベクトル $h$ をかける線形演算です。 + + + + +### ステップ4: 畳み込み定理 + + +2つの関数の畳み込みのフーリエ変換は、それらのフーリエ変換の要素毎の積です。 + +$$ +\begin{aligned} +\underset{n \times 1} {w * h} &=\underbrace{\mathcal{F}^{-1}}_{\Phi}(\underbrace{\mathcal{F}(w)}_{\Phi^{T} w=\hat{w}} \odot \underbrace{\mathcal{F}(h)}_{\Phi^{T} h}) \\ &=\underset{n \times n}{\Phi}\left( \underset{n \times 1}{\hat{w}}\odot \underset{n \times 1}{\Phi^{T} h}\right) \\ &=\Phi\left(\underset{n \times n}{\hat{w}(\Lambda)} \underset{n \times 1}{\Phi^{T} h}\right) \\ &=\Phi \hat{w}(\Lambda) \Phi^{T} h \\ &=\hat{w}(\underbrace{\Phi \Lambda \Phi^{T}}_{\Delta}) h \\ &=\underset{n \times n}{\hat{w}(\Delta)} \underset{n \times1}h \\ & +\end{aligned} +$$ + + + +上の例は、$w$と$h$の畳み込みで、どちらもシェイプが$n \times 1$のものですが、$w$のフーリエ変換と$h$のフーリエ変換の間の要素毎の積の逆数に等しくなります。上の式から、$\hat{w}(\Delta)$と$h$の行列積にも等しいことがわかります。 + +グラフ$h$と$w$上の2つの関数の畳み込みは、$w$のスペクトル関数を取ってラプラシアンに当てはめて$h$と乗算することであり、これがスペクトル畳み込みの定義です。しかし、グラフのノード数$n$ に対して計算量は $\mathrm{O}\left(n^{2}\right)$ です。 + + + +## 限界 + +グラフ領域に対するスペクトル畳み込みは並行移動不変ではないので、平行移動されると関数の形状も変化する可能性がありますが、グリッド/ユークリッド領域では変化しません。 + + +## おすすめの本 + +Spectral graph theory, Fan Chung, (harmonic analysis, graph theory, combinatorial problems, optimization) diff --git a/docs/ja/week13/13-2.md b/docs/ja/week13/13-2.md new file mode 100644 index 000000000..c73277ac6 --- /dev/null +++ b/docs/ja/week13/13-2.md @@ -0,0 +1,518 @@ +--- +lang-ref: ch.13-2 +title: Graph Convolutional Networks (GCNs) - An Insight +lecturer: Xavier Bresson +authors: Neil Menghani, Tejaishwarya Gagadam, Joshua Meisel and Jatin Khilnani +date: 27 Apr 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + +## スペクトルグラフ畳み込みニューラルネット (GCNs) + + +前のセクションでは、グラフの畳み込みを定義する2つの方法のうちの1つであるグラフスペクトル理論について説明しました。 + + +### 通常のスペクトルGCN + + +グラフスペクトル畳み込み層を定義し、 $h^l$ が与えられた層の活性が次のようになるようにします: + +$$ +h^{l+1}=\eta(w^l*h^l), +$$ + + +ここで、$\eta$は非線形活性、$w^l$は空間フィルタです。方程式の右辺は、$\eta(\hat{w}^l(\Delta)h^l)$と等しく、$\hat{w}^l$はスペクトルフィルタ、$\Delta$ はラプラシアンです。方程式の右辺をさらに分解すると、$\eta(\boldsymbol{\phi} \hat{w}^l(\Lambda)\boldsymbol{\phi^\top} h^l)$となります。\ここで、$\boldsymbol{\phi}$ はフーリエ行列、$\Lambda$ は固有値です。これで、最終的な活性方程式は以下のようになります。 + +$$ +h^{l+1}=\eta\Big(\boldsymbol{\phi} \hat{w}^l(\Lambda)\boldsymbol{\phi^\top} h^l\Big) +$$ + + + +目的は、フィルタを作り込む代わりに誤差逆伝播を使ってスペクトルフィルタ$\hat{w}^l(\lambda)$を学習することです。 + +この手法は畳み込みニューラルネットで使われた最初のスペクトル手法ですが、いくつかの制限があります。 +* フィルタの空間的な位置を保証するものではありません。 +* 各層$O(n)$このパラメータを学習する必要があります。(($\hat{w}(\lambda_1)$ to $\hat{w}(\lambda_n)$) +* $boldsymbol{phi}$ は密な行列なので、 学習率は$O(n^2$)$です。 + + + +### スプラインGCNs + + + +スプラインGCNは、局在化された空間フィルタを得るために、滑らかなスペクトルフィルタを計算します。周波数領域の滑らかさと空間位置の関係は、パーセバルの等式(ハイゼンベルグの不確かさの原理)に基づいています:スペクトルフィルタの微分(平滑関数)が小さいほど、空間フィルタの分散が小さい(定位)。 + +滑らかなスペクトルフィルタを得るにはどうしたらいいでしょうか?スペクトルフィルタを、$K$個の滑らかなカーネル$\boldsymbol{B}$ (スプライン)の線形結合に分解して、$\hat{w}^l(\Lambda)=diag(\boldsymbol{B}w^l)$となるようにします。活性方程式は次のようになります。 + +$$ +h^{l+1}=\eta\bigg(\boldsymbol{\phi} \Big(\text{diag}(\boldsymbol{B}w^l)\Big)\boldsymbol{\phi^\top} h^l\bigg) +$$ + + +バックプロパゲーションで学習するパラメータは、レイヤーごとに $O(1)$(定数 $K$)しかありません。しかし、計算量はやはり $O(n^2)$ です + +### LapGCNs + + +線形時間 $O(n)$ (グラフサイズ $n$) で学習するにはどうすればよいのでしょうか?O(n^2)$の計算は、ラプラシアンの固有ベクトルを使うことによる直接的な結果です。固有分解を避ける必要がありますが、これはラプラシアンの関数を直接学習することで実現できます。スペクトル関数は、ここに示すように、ラプラシアンの単項式になります。 + +$$ +w*h=\hat{w}(\Delta)h=\bigg(\sum^{K-1}_{k=0}w_k\Delta^k\bigg)h +$$ + +One nice feature is that filters are localized in exactly k-hop supports. +1つの良い特徴は、フィルターがまさにkごとのサポートに局在していることです。 + + +
+
+図1: 1-hop と 2-hop の近傍の表示 +
+ +We replace the expression $\Delta^kh$ with $X_k$, a recursive equation defined as, +式 $\Delta^kh$ を $X_k$ に置き換えます。再帰的式は次のように定義されます + +$$ +X_k=\Delta X_{k-1} \text{ and } X_0=h +$$ + + +計算量は、スパースな(実世界の)グラフの場合、 $O(E.K)=O(n)$になりました。$X_k$ を $\bar{X}$ に再整形して、線形演算にすることができます。これで、次のような活性方程式ができました。 + +$$ +h^{l+1}=\eta\bigg(\sum^{K-1}_{k=0}w_kX_k\bigg)=\eta\Big((w^l)^\top \bar{X}\Big) +$$ + + + +注:ラプラシアン固有分解が使用されていないため、すべての演算は空間領域(スペクトル領域ではない)にあるので、Spectral GCNと呼ぶのは間違っているかもしれません。さらに、LapGCNのもう一つの欠点は、畳み込み層にはスパースな線形演算が含まれており、GPUが完全に最適化されていないことです。 + +我々は、局所化されたフィルタ($K$ホップサポート)、レイヤーごとの$O(1)$個のパラメータ、$O(n)$だけの計算量の学習によって、通常のGCNの3つの制限を解決しました。しかし、LapGCNの限界は、単項基底($\Delta^0,\Delta^1,\ldots$)を使うと、直交しない(1つの係数を変えると関数の近似が変わる)ため、最適化が不安定になることです。 + + +### ChebNets + + +不安定な基底の問題を解決するために、我々は、任意の正規直交基底を使用することができますが、それは計算量が線形であることを保証するために再帰的な方程式を持っている必要があります。ChebNetsでは、チェビシェフ多項式を使用し、LapGCNのように$T_k(\Delta)h$ ($h$に適用されるチェビシェフ関数)を$X_k$で表現し、再帰方程式を定義します。 + + +$$ +X_k=2\tilde{\Delta} X_{k-1} - X_{k-2}, X_0=h, X_1=\tilde{\Delta}h \text{ and } \tilde{\Delta} = 2\lambda_n^{-1}\Delta - \boldsymbol{I} +$$ + + + +これで、係数に摂動が与えられた下での安定性が得られました。 + +ChebNetsは、任意のグラフ領域に使用できるGCNですが、等方的であるという制限があります。ユークリッドグリッドには方向があるので、標準的なConvNetsは、*異方性*のフィルタを生成しますが、スペクトルGCNは、グラフには方向(上下、左、右)の概念がないので、*等方性*のフィルタを計算します。 + +ChebNetsを2Dスペクトルフィルタを使って複数のグラフに拡張することができます。これは、例えば、映画のグラフやユーザーのグラフがある推薦システムなどで有用です。複数グラフのChebNetsは、以下のような活性式を持ちます。 + + +$$ +h^{l+1}=\eta(\hat{w}(\Delta_1,\Delta_2)*h^l) +$$ + + +### CayleyNets + +ChebNets are unstable to produce filters (localize) with frequency bands of interest (graph communities). In CayleyNets, we instead use as our orthonormal basis Cayley rationals. +ChebNetsは、関心のある周波数帯(グラフコミュニティ)を持つフィルタを生成する(局所化する)ためには不安定です。CayleyNetsでは、代わりに、正規直交基底を用いたケイリー変換を用いている。 + + +$$ +\hat{w}(\Delta)=w_0+2\Re\left\{\sum^{K-1}_{k=0}w_k\frac{(z\Delta-i)^k}{(z\Delta+i)^k}\right\} +$$ + + +CayleyNetsは、ChebNetsと同じ性質を持っています(等方性です)が、周波数が局在しており(スペクトルズームがあります)、より豊富なクラスのフィルタを提供します(同じ次数$K$に対して)。 + + +## Spatial Graph ConvNets + + +### Template Matching + +To understand Spatial Graph ConvNets, we go back to the Template Matching definition of ConvNets. + +The main issue when we perform Template Matching for graphs is the lack of node ordering or positioning for the template. All we have are the indices of nodes, which isn't enough to match information between them. How do we design template matching to be invariant to node re-parametrisation? That is, if we have a graph and one of the nodes had an arbitrary index, say 6, this index could've been 122 as well. So it's essential to be able to perform template matching independent to the index of the node. + +The simplest way to do this is by having only one template vector $w^l$, instead of having $w_{j1}$,$w_{j2}$, $w_{j3}$ or so on. So we match this vector $w^l$ with all other features on our graph. Most Graph Neural Networks today use this property. + +Spatialグラフ畳み込みニューラルネットを理解するために、畳み込みニューラルネットのテンプレート・マッチングの定義に戻ります。 + +グラフのテンプレート・マッチングを行う際に問題となるのは、テンプレートにノードの順序や位置がないことです。ノードのインデックスしかなく、ノード間の情報をマッチングさせるには十分ではありません。どのようにしてテンプレートマッチングを設計すれば、ノードのリパラメトライゼーションに不変になるのでしょうか?つまり、あるグラフがあってそのノードの1つが任意のインデックス(例えば6)を持っていた場合、このインデックスは122となっていた可能性もあります。ですから、ノードのインデックスに依存しないテンプレートマッチングを実行できることが不可欠です。 + +これを行う最も簡単な方法は、 $w_{j1}$,$w_{j2}$, $w_{j3}$ などのテンプレートベクトルを持つのではなく、 $w^l$ だけを持つことです。そして、このベクトル $w^l$ を、グラフ上の他のすべての特徴と一致させます。今日のほとんどのグラフニューラルネットワークは、この性質を利用しています。 + + +
+
+図2: テンプレートベクトルを用いたテンプレートマッチング +
+ +Mathematically, for one feature we have, +数学的には、一つの特徴に対して、以下を得ることになります。 + +$$h_{i}^{l+1}=\eta\bigg(\sum_{j \in N_{i}} \langle w^l,h_{ij}^l \rangle \bigg)$$ + + +ただし$w^l$は$l$層目の$d \times 1$次元のテンプレートベクトルで、$h_{ij}^l$はノード$j$の$d \times 1$次元ベクトルで、これは$i$番目のノードについてスカラー値$h_{i}^{l+1}$を返します。 + + +より多くの($d$の)特徴量については、 + +$$h_{i}^{l+1}=\eta\bigg(\sum_{j \in N_{i}} \boldsymbol{W}^l,h_{ij}^l\bigg)$$ + + +ここで、$\boldsymbol{W}^l$ は、次元数 $d \times d$ であり、$h_{i}^{l+1}$ は、あるベクトル表現 + +$$h^{l+1}=\eta(\boldsymbol{A} h^l \boldsymbol{W}^l)$$ + +に対して、次元数$d \times 1$ です。ここで、$\boldsymbol{A}$は次元数$n \times n$の隣接行列であり、$h^l$は次元数$n \times d$の$l$層目の活性化関数です。 + +このテンプレートマッチングの定義に基づいて、空間GSNには、等方的GCNと異方的GCNの2種類が定義できます。 + + + + +## 等方的GCNs + + + +### 通常のSpatial GCNs + + + +これは前と同じ定義ですが、式の中に対角行列を加えて、近傍の平均値を求めるようにしています。 + +すると、行列表現は次のようになります + +$$h^{l+1} = \eta(\boldsymbol{D}^{-1}\boldsymbol{A}h^{l}\boldsymbol{W}^{l})$$ + + + +ここで、\boldsymbol{A}の次元は、$n \times n$、$h^{l}$の次元は、$n \times d$ 、$W^{l}$の次元は、$d \times d$となり、$n \times d$次元の行列$h^{l+1}$となります。 + +そして、ベクトル表現は次のようになります + +$$h_{i}^{l+1} = \eta\bigg(\frac{1}{d_{i}}\sum_{j \in N_{i}}\boldsymbol{A}_{ij}\boldsymbol{W}^{l}h_{j}^{l}\bigg)$$ + + + +ここで、$h_{i}^{l+1}$は、$d \times 1$次元です。 + + + +ベクトル表現は、ノードのリパラメトライゼーションの際に不変である、ノードの順序がない場合の処理を担当しています。つまり、前の例に加えて、もしノードが6であり、これが122 に変更された場合、次の層の$h^{l+1}$ での活性化関数の計算では何も変わりません。 + + +異なる大きさの近傍を扱うこともできます。つまり、4ノードでも10ノードでも何も変わらないということです。 + +We are given the local reception field by design, that is, with Graph Neural Networks we only have to consider the neighbours. +その構成からして局所的受容野が与えられているということになります。つまり、グラフニューラルネットワークでは、近傍を考慮するだけでよいのです。 + + +重みを共有しているので、グラフの位置に関係なく、すべての特徴表現に対して同じ行列$\boldsymbol{W}^{l}$が得られます。これは畳み込み演算の性質です。 + + +すべての演算が局所的に行われるので、この定式化はグラフの大きさにも依存しません。 + + +これは等方的なモデルなので、隣り合う行列は同じ 行列$\boldsymbol{W}^{l}$を持つことになります。 + + +
+
+図3: 等方的なモデル +
+ +$$h_{i}^{l+1} = f_\text{GCN}(h_{i}^{l}, \{h_{j}^l: j \rightarrow i\})$$ + + +つまり、次の層 $h_{i}^{l+1}$ の活性化、ノード $i$ と $i$ の近傍での前の層 $h_{i}^{l}$ の活性を引数にとる関数となります。この関数を変えると、グラフの族全体ができあがります。 + + + +### ChebNetsと通常のSpatial GCNs + + +上で定義した通常のSpatial GCNは、ChebNetsの単純化です。最初の2つのチェビシェフ関数を使ってChebNetの展開された部分を切り捨てることで、次のようになります + +$$h_{i}^{l+1} = \eta\bigg(\frac{1}{\hat{d_{i}}}\sum_{j \in N_{i}}\hat{\boldsymbol{A}_{ij}}\boldsymbol{W}^{l}h_{j}^{l}\bigg)$$ + + +### GraphSage + +If the Adjacency matrix $\boldsymbol{A}_{ij} = 1$ for the edges in Vanilla Spatial GCNs, we get, +通常のspatial GCNのエッジに対して隣接行列を$\boldsymbol{A}_{ij} = 1$とすると、次のようになります + +$$h_{i}^{l+1} = \eta\bigg(\frac{1}{d_{i}}\sum_{j \in N_{i}}\boldsymbol{W}^{l}h_{j}^{l}\bigg)$$ + + +この方程式では、中心/中心頂点 $i$ とその近傍に同じテンプレートウェイト $\boldsymbol{W}^{l}$ を与えます。中心点を$\boldsymbol{W}\_{1}^{l}$とし、one-hot近傍には別のテンプレートノード$\boldsymbol{W}_{2}^{l}$を与えることで、これを区別することができます。これにより、GNNの性能はかなり改善されます。このモデルは、近傍が同じ重みを持っているため、本質的にはまだ等方的であると考えられます。 + +$$h_{i}^{l+1} = \eta\bigg(\boldsymbol{W}_{1}^{l} h_{i}^{l} + \frac{1}{d_{i}} \sum_{j \in N_{i}} \boldsymbol{W}_{2}^{l} h_{j}^{l}\bigg)$$ + + +ここで、$\boldsymbol{W}\_{1}^{l}$と$\boldsymbol{W}\_{2}^{l}$ は$d \times d$次元です。そして、$h_{i}^{l}$と$h_{j}^{l}$は$d \times 1$次元です。 + +In this equation, we can find the summation or maximum of $\boldsymbol{W}\_{2}^{l} h_{j}^{l}$ or the Long-Short Term Memory of $h_{j}^{l}$, instead of the mean. +この方程式では、$\boldsymbol{W}\_{2}^{l} h_{j}^{l}$や$h_{j}^{l}$の長期短期記憶の平均ではなく、その和や最大値をとる操作を行っています + + +
+
+図4: GraphSage +
+ + +### Graph Isomorphism Networks (GIN) + + + +同型ではないグラフを区別できるアーキテクチャ。*同型性*とは、グラフ間の等価性を表す尺度です。下の図では、2つのグラフが互いに同型であると考えられています。同型グラフは同じように扱われ、非同型グラフは異なるように扱われます。 + +GINは等方的なGCNです。 + +$$h_{i}^{l+1} = \texttt{ReLU}(\boldsymbol{W}_{2}^{l}\space \texttt{ReLU}(\texttt{BN}(\boldsymbol{W}_{1}^{l} \hat(h_{j}^{l+1})))$$ + + +ここで、$\texttt{BN}$はバッチ正規化を表しています。 + +$$h_{i}^{l+1} = (1 + \epsilon)h_{i}^{l} + \sum_{j \in N_{i}} h_{j}^{l}$$ + + +
+
+図5: 二つの同型グラフの例 +
+ + + +## 等方的でないGCNs + + +標準的なCNNは,異方性フィルタ-特定の方向を好むフィルタ-を生成する能力を持っている.これは、方向構造が上下左右に基づいているからである。しかし,上述のGCNは方向の概念を持たないため,等方性フィルタしか生成できない.異方性は、エッジの特徴を利用して自然に導入することができる。例えば、分子は一重結合、二重結合、三重結合を持つことができる。グラフィカルには、異なる隣人に異なる重み付けを導入します。 + +### MoNets + + +MoNetsは、ガウス混合モデル(GMM)のパラメータを学習するためにグラフの次数を使用します。 + + +
+
+図6: MoNet +
+ + +### Graph Attention Networks (GAT) + + +GATはattentionメカニズムを使用することで、近傍を集約する関数に異方性を導入します。 + + +
+
+図7: GAT +
+ + +### Gated Graph ConvNets + + +これらは単純なエッジのゲーティング機構を使用しており、GATで使用されているスパースなattention機構のように、よりソフトなattention機構と見ることができます。 + + +
+
+図8: Gated Graph ConvNet +
+ + +### Graph Transformers + + +
+
+図9: Graph Transformer +
+ +This is the graph version of the standard transformer, commonly used in NLP. If the graph is fully connected (every two nodes share an edge), we recover the definition of a standard transformer. + +Graphs obtain their structure from sparsity, so the fully connected graph has trivial structure and is essentially a set. Transformers then can be viewed as **Set** Neural Networks, and are in fact the best technique currently to analyse sets/bags of features. + +これはNLPでよく使われる標準的なtransformerのグラフ版です。グラフが完全に接続されている(2つのノードがすべて1つの辺を共有している)場合、標準的なtransformerと同じになります。 + +グラフは、スパース性によってその構造が決まるので、完全に接続されたグラフは些細な構造を持ち、本質的には単なる集合と変わりません。Transformerは、**集合**ニューラルネットワークとして見ることができ、実際には、現在のところ、特徴の集合/集まりを分析するのに最適な技術です。 + + + + +## GNNsのベンチマーク + + + +ベンチマークは、どのような分野でも進歩に欠かせないものである。最近リリースされたベンチマーク[Benchmarking Graph Neural Networks](https://arxiv.org/pdf/2003.00982.pdf/)には、グラフ分類、グラフ回帰、ノード分類、エッジ分類という4つの基本的なグラフ問題に使用できる6つの中規模データセットがあります。これらのデータセットは中規模ではありますが、様々なGNNの傾向を統計的に分離するには十分な大きさです。 + +**グラフ回帰**の例として、分子の溶解度を予測したいとします。 + + + +
+
+図10: グラフ回帰タスク:量子化学 +
+ +
+
+図11: 回帰タスクに対する様々なGCNsの性能 +
+ +We notice that in most cases anisotropic GCNs perform better compared to isotropic GCNs because we use directional properties. + +For a **Graph Classification task**, a Computer Vision problem was chosen where we have super nodes of images and we want to classify the image. + +ほとんどの場合、異方的なGCNの方が等方的なGCNよりも性能が良いことがわかります。 + +**グラフ分類タスク**では,画像のスーパーノードがあり,その画像を分類したいというコンピュータビジョンの問題が選ばれました. + + + + +
+
+図12: グラフ分類タスク +
+ +
+
+図13: 様々なGCNの、グラフ分類タスクに対する性能 +
+ + +**エッジの分類タスク**では、巡回セールスマン問題(TSP)の組合せ最適化問題を考慮しています。ここでは、特定のエッジが最適解に属しているかどうかを知りたい場合、そのエッジが最適解に属していればクラス1、そうでなければクラス0になります。 ここでは、明示的なエッジ特徴が必要であり、これに適したモデルはGatedGCNだけです。 + + + +
+
+図14: エッジ分類タスク +
+ +
+
+図15: エッジ分類タスクに対する、様々なGCNの性能 +
+ + +GCNは、教師あり学習モデルに限定されるものではなく、自己教師あり学習タスクにも利用できます。Yann LeCun博士によると、ほとんどすべての自己教師あり学習タスクは、何らかのグラフ構造を利用しているといいます。テキストで自己教師あり学習タスクを行う場合、単語の列を取り、不足している単語や新しい文を予測することを学習します。ここにはグラフ構造があり、ある単語が他の単語から何回離れて出現するかを表しています。テキストは線形グラフになり、選択された近傍はTransformerを訓練するために使用されます。対照学習の場合、似ている2つのサンプルと似ていない2つのサンプルがある場合、これは本質的には類似性グラフであり、2つのサンプルが似ているときはリンクされ、リンクされていないときには似ていないとみなされます。 + + +## 結論 + + + +GCNはCNNをグラフ上のデータに一般化します。そのためには畳み込み演算子をグラフ上のデータに再設計する必要がありました。これをテンプレートマッチングについて行うことでspatial GCNが、スペクトル畳み込みに対して行うことでスペクトルGCNが生まれました。 + +スパースなグラフとGPUでの実装に対しては(GPUでの実装はスパースな行列の乗算に対しては最適化されていませんが)計算量が線形オーダーです。応用例は以下のように豊富です。 + + +
+
+図16: 応用例 +
diff --git a/docs/ja/week13/13-3.md b/docs/ja/week13/13-3.md new file mode 100644 index 000000000..8c8deaad3 --- /dev/null +++ b/docs/ja/week13/13-3.md @@ -0,0 +1,412 @@ +--- +lang-ref: ch.13-3 +title: Graph Convolutional Network +lecturer: Alfredo Canziani +authors: Go Inoue, Muhammad Osama Khan, Muhammad Shujaat Mirza, Muhammad Muneeb Afzal +date: 28 Apr 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + +## Graph Convolutional Network (GCN)の紹介 + +Graph Convolutional Network (GCN) is one type of architecture that utilizes the structure of data. +Before going into details, let's have a quick recap on self-attention, as GCN and self-attention are conceptually relevant. + +GCN(Graph Convolutional Network)は、データの構造を利用したアーキテクチャの一種です。 +GCNとself-attentionは概念的に関係があるので、詳細に入る前に、self-attentionについて簡単に復習しておきましょう。 + + +### Self-attentionのおさらい + +- In self-attention, we have a set of input $\lbrace\boldsymbol{x}\_{i}\rbrace^{t}_{i=1}$. +Unlike a sequence, it does not have an order. +- Hidden vector $\boldsymbol{h}$ is given by linear combination of the vectors in the set. +- We can express this as $\boldsymbol{X}\boldsymbol{a}$ using matrix vector multiplication, where $\boldsymbol{a}$ contains coefficients that scale the input vector $\boldsymbol{x}_{i}$. + +- Self-attentionでは、入力$\lbrace\boldsymbol{x}\_{i}\rbrace^{t}_{i=1}$の集合があります。 +系列と違って、順番がありません。 +- 隠れベクトル $\boldsymbol{h}$ は、この集合の中のベクトルの線形結合で与えられます。 +- これを行列ベクトルの掛け算を使って $\boldsymbol{X}\boldsymbol{a}$ と表現します。ここで$\boldsymbol{a}$ には入力ベクトル $\boldsymbol{x}_{i}$ をスケーリングする係数が含まれています。 + + +*詳しい説明は、第12週のノート({{site.baseurl}}/en/week12/12-3/)を参照してください。* + + +### ノーテーション + + +
+
+図1: グラフ畳み込みニューラルネット +
+ + +図1において、頂点 $v$ は、入力 $\boldsymbol{x}$ とその隠れ表現 $\boldsymbol{h}$ の2つのベクトルで構成されています。 +また、複数の頂点 $v_{j}$ があり、これは $\boldsymbol{x}_j$ と $\boldsymbol{h}_j$ で構成されています。 +このグラフでは、頂点は有向辺で結ばれています。 + + + +この有向辺を、隣接ベクトル $\boldsymbol{a}$ で表現し、各要素 $\alpha_{j}$ は、$v_{j}$ から $v$ への有向辺があれば $1$ とします。 + +$$ +\alpha_{j} \stackrel{\tiny \downarrow}{=} 1 \Leftrightarrow v_{j} \rightarrow v +\tag{Eq. 1} +$$ + +次数(入ってくる辺の数)$d$は、この隣接関係ベクトルのノルム、すなわち、$\Vert\boldsymbol{a}$の中の1の数である$Vert_{1}$として定義されます。 + +$$ + d = \Vert\boldsymbol{a}\Vert_{1} +\tag{Eq. 2} +$$ + + +隠れベクトル $\boldsymbol{h}$ は次の式で与えられます。 + +$$ + \boldsymbol{h}=f(\boldsymbol{U}\boldsymbol{x} + \boldsymbol{V}\boldsymbol{X}\boldsymbol{a}d^{-1}) +\tag{Eq. 3} +$$ + + + +ここで、$f(\cdot)$は、ReLU $(\cdot)^{+}$, Sigmoid $\sigma(\cdot)$, hyperbolic tangent $\tanh(\cdot)$などの非線形関数です。 + +この$\boldsymbol{U}\boldsymbol{x}$という項は、入力$v$に回転$\boldsymbol{U}$を適用することで、頂点$v$自体を考慮しています。 + + + +Self-attentionでは、隠れベクトル $\boldsymbol{h}$ は、$\boldsymbol{X}\boldsymbol{a}$ で計算され、$\boldsymbol{X}$ の列は、$\boldsymbol{a}$の要素でスケーリングされることを覚えておいてください。 +GCNの文脈では、これは、隣接ベクトルの中に複数の辺が入ってくると(例えば隣接行列$\boldsymbol{a}$のなかの複数の要素)$\boldsymbol{X}\boldsymbol{a}$が大きくなることを意味します。 +一方、入ってくる辺が1つしかない場合は、この値は小さくなります。 +この値が流入辺の数に比例するという問題を解決するために、流入辺の数$d$で割ってみましょう。 +そして、$\boldsymbol{X}\boldsymbol{a}d^{-1}$に回転$\boldsymbol{V}$をかけます。 + +この隠れ表現$\boldsymbol{h}$を、入力の全集合 $\boldsymbol{x}$に対して、次のような行列記法で表現することができます。 + +$$ +\{\boldsymbol{x}_{i}\}^{t}_{i=1}\rightsquigarrow \boldsymbol{H}=f(\boldsymbol{UX}+ \boldsymbol{VXAD}^{-1}) +\tag{Eq. 4} +$$ + + +ただし$\vect{D} = \text{diag}(d_{i})$。 + + + +## Residual Gated GCNの理論とコード + + +Residual Gatedグラフ畳み込みニューラルネットは、図2に示すようなGCNの一種である。 + + +
+
+図2: Residual Gatedグラフ畳み込みニューラルネット +
+ + + +標準的な GCN と同様に、頂点 $v$ は、入力 $\boldsymbol{x}$ とその隠れ表現 $\boldsymbol{h}$ の 2つのベクトルで構成されています。ただし、この場合、エッジにも特徴表現があり、入力辺の表現を $\boldsymbol{e_{j}^{x}}$、隠れ辺の表現を $\boldsymbol{e_{j}^{h}}$ とします。 + +頂点 $v$ の隠れ辺表現 $\boldsymbol{h}$ は,次式で求められます. + +$$ + \boldsymbol{h}=\boldsymbol{x} + \bigg(\boldsymbol{Ax} + \sum_{v_j→v}{\eta(\boldsymbol{e_{j}})\odot \boldsymbol{Bx_{j}}}\bigg)^{+} +\tag{Eq. 5} +$$ + + + +ここで、$\boldsymbol{x}$ は入力表現です。$\boldsymbol{Ax}$ は、入力$\boldsymbol{x}$の回転を表し、$\sum_{v_j→v}{\eta(\boldsymbol{e_{j}})\odot \boldsymbol{Bx_{j}}}$ は、回転させた入力特徴量$\boldsymbol{Bx_{j}}$とゲート$\eta(\boldsymbol{e_{j}})$との要素毎の乗算の和を表します。上で紹介した標準的なGCNでは入力表現を平均化するのに対し、ゲート項は、エッジ表現に基づいて入力表現を変調することができるので、Residual GatedGCNの実装には重要です。 + +なお、和は、頂点${v}$へ入力されるエッジを持つ頂点${v_j}$のみを対象としていることに注意してください。Residual Gated GCNにおけるresidualという用語は、隠れ表現 $\boldsymbol{h}$ を計算するために、入力表現 $\boldsymbol{x}$ を加えることに由来します。ゲート項$\eta(\boldsymbol{e_{j}})$は,次のように計算されます。 + +$$ + \eta(\boldsymbol{e_{j}})=\sigma(\boldsymbol{e_{j}})\bigg(\sum_{v_k→v}\sigma(\boldsymbol{e_{k}})\bigg)^{-1} +\tag{Eq. 6} +$$ + + +ゲート値 $\eta(\boldsymbol{e_{j}})$ は、入ってくる辺のシグモイドをすべての入ってくる辺のシグモイドの和で割った正規化シグモイドです。ゲート項を計算するためには、次の式を用いて計算できるエッジの表現 $\boldsymbol{e_{j}}$ が必要です。 + +$$ + \boldsymbol{e_{j}} = \boldsymbol{Ce_{j}^{x}} + \boldsymbol{Dx_{j}} + \boldsymbol{Ex} +\tag{Eq. 7} +$$ + +$$ + \boldsymbol{e_{j}^{h}}=\boldsymbol{e_{j}^{x}}+(\boldsymbol{e_{j}})^{+} +\tag{Eq. 8} +$$ + + + +隠れ辺表現 $\boldsymbol{e_{j}^{h}}$ は、辺表現の初期値 $\boldsymbol{e_{j}^{x}}$ と$\boldsymbol{e_{j}}$に適用された$\texttt{ReLU}(\cdot)$の和です。ここで、$\boldsymbol{e_{j}}$は、$\boldsymbol{e_{j}^{x}}$に適用される回転の和で与えられます。この回転は頂点 $v_{j}$ の入力表現 $\boldsymbol{x_{j}}$に対する回転と、頂点 $v$ の入力表現 $boldsymbol{x}$ に対する回転です。 + +*注:下流の隠れ表現(例えば $2^\text{nd}$ 層の隠れ表現)を計算するには,入力特徴表現を上式の $1^\text{st}$ 層の特徴表現に置き換えれば大丈夫です。 + + + +### グラフ分類とResidual Gated GCN Layer + + +ここでは、グラフ分類の問題点を紹介し、Residual Gated GCN層をコードに落としこみます。通常のimport文に加えて、以下を追加します。 + +```python +os.environ['DGLBACKEND'] = 'pytorch' +import dgl +from dgl import DGLGraph +from dgl.data import MiniGCDataset +import networkx as nx +``` + + + +In this notebook, the task is to classify a given graph structure into one of 8 graph types. The dataset obtained from `dgl.data.MiniGCDataset` yields some number of graphs (`num_graphs`) with nodes between `min_num_v` and `max_num_v`. Hence, all the graphs obtained do not have the same number of nodes/vertices. + +*Note: In order to familiarize yourself with the basics of `DGLGraphs`, it is recommended to go through the short tutorial [here](https://docs.dgl.ai/api/python/graph.html).* + +Having created the graphs, the next task is to add some signal to the domain. Features can be applied to nodes and edges of a `DGLGraph`. The features are represented as a dictionary of names (strings) and tensors (**fields**). `ndata` and `edata` are syntax sugar to access the feature data of all nodes and edges. + +最初の行では、DGLにPyTorchをバックエンドとして使うように指示しています。Deep Graph Library ([DGL](https://www.dgl.ai/) はグラフに関する様々な機能を提供しています。 + +このnotebookでは、与えられたグラフ構造を8つのグラフタイプのうちの1つに分類することを課題としています。`dgl.data.MiniGCDataset` から得られるデータセットには、`min_num_v` から `max_num_v` の間にノードを持つグラフ (`num_graphs`) がいくつか含まれています。したがって、得られたグラフはすべて同じ数のノード/頂点を持つわけではありません。 + +*注: `DGLGraphs` の基本を理解するためには、チュートリアル [こちら](https://docs.dgl.ai/api/python/graph.html) を参照することをお勧めします. + +グラフを作成したら、次の作業はドメインにシグナルを追加することです。特徴表現は、名前(文字列)とテンソル(**fields**)の辞書として表現されます。`ndata` と `edata` は,すべてのノードとエッジの特徴データにアクセスするための糖衣構文です。 + + +以下のコードスニペットは、特徴量がどのように生成されるかを示しています。各ノードには入射エッジの数に等しい値が割り当てられ、各エッジには値1が割り当てられます。 + +```python +def create_artificial_features(dataset): + for (graph, _) in dataset: + graph.ndata['feat'] = graph.in_degrees().view(-1, 1).float() + graph.edata['feat'] = torch.ones(graph.number_of_edges(), 1) + return dataset +``` + + +訓練データとテストデータが作成され、特徴量が次のように割り当てられます。 + +```python +trainset = MiniGCDataset(350, 10, 20) +testset = MiniGCDataset(100, 10, 20) + +trainset = create_artificial_features(trainset) +testset = create_artificial_features(testset) +``` + + +訓練データ集合のサンプルグラフは以下のような表現です。ここで、このグラフは15個のノードと45個のエッジを持ち、ノードもエッジも期待通りの形状 `(1,)` の特徴表現を持っていることがわかります。さらに,`0`はこのグラフがクラス0に属していることを示しています。 + +```python +(DGLGraph(num_nodes=15, num_edges=45, + ndata_schemes={'feat': Scheme(shape=(1,), dtype=torch.float32)} + edata_schemes={'feat': Scheme(shape=(1,), dtype=torch.float32)}), 0) +``` + + + +### DGLのMessage関数とReduce関数に関する注意 + + + +>DGLでは、*メッセージ関数*は**Edge UDF**(ユーザー定義関数)として表現されます。Edge UDFは単一の引数 `edges` を持ちます。エッジUDFは、ソースノードの特徴、到達ノードの特徴、エッジの特徴にそれぞれアクセスするために、`src`, `dst`, `data` の3つのメンバを持ちます。 +**Node UDF**は、*reduce関数*です。ノードUDFは単一の引数 `nodes` を持ち、その引数には2つのメンバ `data` と `mailbox` を持ちます。`data`にはノードの特徴が含まれ、`mailbox`にはすべての受信メッセージの特徴が含まれ、2番目の次元に沿って積み上げられています(そのため、`dim=1`引数が指定されています←次元は0から始まるので)。 +`update_all(message_func, reduce_func)` は,すべてのエッジを経由してメッセージを送信し、すべてのノードを更新します。 + + + +### Gated Residual GCN層の実装 + + + +Gated Residual GCN層は、以下のコードスニペットのように実装されています。 + +まず、`__init__`関数内に、`nn.Linear`層を定義して、入力表現 `h`, `e` を `forward` 関数内の線形層を介してフォワード伝搬させることで、入力特徴量 $\boldsymbol{Ax}$, $\boldsymbol{Bx_{j}}$, $\boldsymbol{Ce_{j}^{x}}$, $\boldsymbol{Dx_{j}}$, $\boldsymbol{Ex}$ のすべての回転を計算します。 + +```python +class GatedGCN_layer(nn.Module): + + def __init__(self, input_dim, output_dim): + super().__init__() + self.A = nn.Linear(input_dim, output_dim) + self.B = nn.Linear(input_dim, output_dim) + self.C = nn.Linear(input_dim, output_dim) + self.D = nn.Linear(input_dim, output_dim) + self.E = nn.Linear(input_dim, output_dim) + self.bn_node_h = nn.BatchNorm1d(output_dim) + self.bn_node_e = nn.BatchNorm1d(output_dim) +``` + + +次に、エッジ表現を計算します。これは `message_func` 関数の中で行われ、すべての辺を反復処理して辺の表現を計算します。具体的には、`e_ij = edges.data['Ce'] + edges.src['Dh'] + edges.dst['Eh']` という行で*(Eq. 7)*を計算します。関数 `message_func` は、`Bh_j` (これは (Eq. 5)の$\boldsymbol{Bx_{j}}$ です) と `e_ij` (Eq. 7) を、エッジを経由して宛先ノードのメールボックスに送信します。 + +```python +def message_func(self, edges): + Bh_j = edges.src['Bh'] + # e_ij = Ce_ij + Dhi + Ehj + e_ij = edges.data['Ce'] + edges.src['Dh'] + edges.dst['Eh'] + edges.data['e'] = e_ij + return {'Bh_j' : Bh_j, 'e_ij' : e_ij} +``` + + +第三に、`reduce_func`関数は、`message_func`関数によって配送されたメッセージを収集します。メールボックスからノードデータ `Ah` と配送されたデータ `Bh_j`, `e_ij` を収集した後、`h = Ah_i + torch.sum(sigma_ij * Bh_j, dim=1) / torch.sum(sigma_ij, dim=1)` 行により、(Eq. 5)で示されるように、各ノードの隠れ表現を計算します。ただし、これは$\texttt{ReLU}(\cdot)$とresidual connectionなしで $(\boldsymbol{Ax} + \sum_{v_j→v}{\eta(\boldsymbol{e_{j}})\odot \boldsymbol{Bx_{j}}})$項だけを表しています。 + +```python +def reduce_func(self, nodes): + Ah_i = nodes.data['Ah'] + Bh_j = nodes.mailbox['Bh_j'] + e = nodes.mailbox['e_ij'] + # sigma_ij = sigmoid(e_ij) + sigma_ij = torch.sigmoid(e) + # hi = Ahi + sum_j eta_ij * Bhj + h = Ah_i + torch.sum(sigma_ij * Bh_j, dim=1) / torch.sum(sigma_ij, dim=1) + return {'h' : h} +``` + +Inside the `forward` function, having called `g.update_all`, we obtain the results of graph convolution `h` and `e`, which represent the terms $(\boldsymbol{Ax} + \sum_{v_j→v}{\eta(\boldsymbol{e_{j}})\odot \boldsymbol{Bx_{j}}})$ from (Eq.5) and $\boldsymbol{e_{j}}$ from (Eq. 7) respectively. Then, we normalize `h` and `e` with respect to the graph node size and graph edge size respectively. Batch normalization is then applied so that we can train the network effectively. Finally, we apply $\texttt{ReLU}(\cdot)$ and add the residual connections to obtain the hidden representations for the nodes and edges, which are then returned by the `forward` function. +関数 `forward` の中で `g.update_all` を呼び、グラフの畳み込み `h` と `e` の結果を得ます。これは (Eq.5)より、$(\boldsymbol{Ax} + \sum_{v_j→v}{\eta(\boldsymbol{e_{j}})\odot \boldsymbol{Bx_{j}}})$を、(Eq.7)より$\boldsymbol{e_{j}}$を表しています。そして、グラフのノードサイズとグラフのエッジサイズを基準にして `h` と `e` を正規化します。その後、ネットワークを効率的に学習できるように、バッチ正規化を行います。最後に、$\texttt{ReLU}(\cdot)$を適用し、residual connectionを加えて、ノードとエッジの隠れ表現を得ます。 + +```python +def forward(self, g, h, e, snorm_n, snorm_e): + + h_in = h # residual connection + e_in = e # residual connection + + g.ndata['h'] = h + g.ndata['Ah'] = self.A(h) + g.ndata['Bh'] = self.B(h) + g.ndata['Dh'] = self.D(h) + g.ndata['Eh'] = self.E(h) + g.edata['e'] = e + g.edata['Ce'] = self.C(e) + + g.update_all(self.message_func, self.reduce_func) + + h = g.ndata['h'] # result of graph convolution + e = g.edata['e'] # result of graph convolution + + h = h * snorm_n # normalize activation w.r.t. graph node size + e = e * snorm_e # normalize activation w.r.t. graph edge size + + h = self.bn_node_h(h) # batch normalization + e = self.bn_node_e(e) # batch normalization + + h = torch.relu(h) # non-linear activation + e = torch.relu(e) # non-linear activation + + h = h_in + h # residual connection + e = e_in + e # residual connection + + return h, e +``` + + + +次に、完全に接続された複数のレイヤ(FCN)を含む `MLP_Layer` モジュールを定義します。全結合層のリストを作成し、順伝播を定義します。 + +最後に、`GatedGCN_layer` と `MLP_layer` という先に定義したクラスからなる `GatedGCN` モデルを定義します。`GatedGCN`モデルの定義を以下に示します。 + + ```python + class GatedGCN(nn.Module): + def __init__(self, input_dim, hidden_dim, output_dim, L): + super().__init__() + self.embedding_h = nn.Linear(input_dim, hidden_dim) + self.embedding_e = nn.Linear(1, hidden_dim) + self.GatedGCN_layers = nn.ModuleList([ + GatedGCN_layer(hidden_dim, hidden_dim) for _ in range(L) + ]) + self.MLP_layer = MLP_layer(hidden_dim, output_dim) + def forward(self, g, h, e, snorm_n, snorm_e): + # input embedding + h = self.embedding_h(h) + e = self.embedding_e(e) + # graph convnet layers + for GGCN_layer in self.GatedGCN_layers: + h, e = GGCN_layer(g, h, e, snorm_n, snorm_e) + # MLP classifier + g.ndata['h'] = h + y = dgl.mean_nodes(g,'h') + y = self.MLP_layer(y) + return y + ``` + + + +私たちのコンストラクタでは、`e`と`h`の埋め込み(`self.embedding_e ` と `self.embedding_h`)、`self.GatedGCN_layers`を定義しています。これは以前定義したモデル`GatedGCN_layer`からなるサイズ$L$のリストです。また、`self.MLP_layer`も定義します。これも以前定義したものです。次に、これらの初期化を使って、順伝播して `y` を出力します。 + +モデルをより理解しやすくするために、モデルのオブジェクトを初期化してしてprintします。 + +```python +# instantiate network +model = GatedGCN(input_dim=1, hidden_dim=100, output_dim=8, L=2) +print(model) +``` + + +モデルの主な構造をいかに示します。 + +```python +GatedGCN( + (embedding_h): Linear(in_features=1, out_features=100, bias=True) + (embedding_e): Linear(in_features=1, out_features=100, bias=True) + (GatedGCN_layers): ModuleList( + (0): GatedGCN_layer(...) + (1): GatedGCN_layer(... )) + (MLP_layer): MLP_layer( + (FC_layers): ModuleList(...)) +``` + + + +Moving on, we define our `train` and `evaluate` functions. In our `train` function, we have our generic code which takes samples from `dataloader`. Next, `batch_graphs`, `batch_x`, `batch_e`, `batch_snorm_n` and `batch_snorm_e` are fed into our model which returns `batch_scores` (of size 8). The predicted scores are compared with the ground truth in our loss function: `loss(batch_scores, batch_labels)`. Then, we zero out gradients (`optimizer.zero_grad()`), perform backprop (`J.backward()`) and updates our weights (`optimizer.step()`). Finally, loss for epoch and training accuracy is calculated. Furthermore, we use a similar code for our `evaluate` function. + +Finally, we are ready to train! We found that after 40 epochs of training, our model has learned to classify the graphs with a test accuracy of $87$%. + + +驚くことではありませんが、`GatedGCN_layer`の2つのレイヤー(`L=2`なので)と、`MLP_layer`の2つのレイヤーがあり、最終的には8つの値が出力されます。 + +次に、`train` と `evaluate` 関数を定義します。`train` 関数では、`dataloader` からサンプルを取得する汎用コードを定義しています。 次に、`batch_graphs`, `batch_x`, `batch_e`, `batch_snorm_n`, `batch_snorm_e` をモデルに入力し、`batch_scores` (サイズ8) を返します。予測されたスコアは,損失関数 `loss(batch_scores, batch_labels)` を用いて真の値と比較されます。次に,勾配をゼロにし (`optimizer.zero_grad()`)、逆伝播を行い (`J.backward()`),重みを更新します (`optimizer.step()`)。最後に、各エポックの損失と学習精度を計算します。さらに、同様のコードを `evaluate` 関数にも用います。 + +最後に、訓練の準備ができました。40エポックの学習を行った結果、我々のモデルはテスト精度$87$%でグラフを分類することを学習したことがわかりました。 diff --git a/docs/ja/week13/13.md b/docs/ja/week13/13.md new file mode 100644 index 000000000..c933a4aa8 --- /dev/null +++ b/docs/ja/week13/13.md @@ -0,0 +1,28 @@ +--- +lang-ref: ch.13 +title: Week 13 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + +## レクチャーパートA + + +このセクションでは、従来の畳み込みニューラルネットワークのアーキテクチャと畳み込みについて議論する。次に、これをグラフ領域に拡張します。グラフの特性を理解し、グラフ畳み込みを定義します。最後に、スペクトルグラフ畳み込みニューラルネットワークを紹介し、スペクトル畳み込みの実行方法について議論します。 + + + +## レクチャーパートB + + +このセクションでは、スペクトルネットワークによるスペクトル畳み込みの実装から始まり、グラフ畳み込みネットワーク(GCN)の全範囲をカバーしています。次に、他の畳み込み定義であるテンプレートマッチングのグラフへの適用可能性についての洞察を提供し、spatialネットワークを紹介します。2つのアプローチを採用した様々なアーキテクチャが、対応する長所と短所、実験、ベンチマーク、アプリケーションとともに詳細に説明されます。 + + + +## 演習 + + +ここでは、データの構造を利用したアーキテクチャの一つであるグラフ畳み込みネットワーク(Graph Convolutional Network: GCN)について紹介します。 実は、GCNの概念はself-attentionと密接に関係しています。GCNの一般的な表記法、表現法、方程式を理解した後、Residual Gated GCNと呼ばれる特定のタイプのGCNの理論とコードを掘り下げていきます。 diff --git a/docs/ja/week14/14-1.md b/docs/ja/week14/14-1.md new file mode 100644 index 000000000..5f0f40e3b --- /dev/null +++ b/docs/ja/week14/14-1.md @@ -0,0 +1,331 @@ +--- +lang-ref: ch.14-1 +lecturer: Yann LeCun +title: 構造化予測のための深層学習 +authors: Junrong Zha, Muge Chen, Rishabh Yadav, Zhuocheng Xu +date: 4 May 2020 +translation-date: 14 Aug 2020 +translator: Shiro Takagi +lang: ja +--- + + + +## 構造化予測 + + +構造化予測という問題は、スカラーの離散値や実数値ではなく、相互に依存し、相互に制約をしあってる入力xに対して、変数yを予測するという問題です。出力変数は単一のカテゴリに属するものではなく、指数関数的な値を持つこともあれば、無限に多くの種類の値をとりうることもあります。 +例:音声/手書き文字の認識や自然言語翻訳の場合、出力は文法的に正しくなければならず、とりうる出力の数を制限することはできません。モデルが解くタスクは、問題の領域における逐次構造、空間構造、または組み合わせ構造を捉えることです。 + + + +### 構造化予測の初期の研究 + + +このベクトルは、モデルシステムの場合カテゴリを表すsoftmaxと比較することができる特徴ベクトルを与えるTDNNに入力されます。発音された単語を認識する場合に問題となるのは、同じ単語でも人によって発音の仕方や速さが異なることです。これを解決するために、動的時間伸縮法(Dynamic Time Warping)が使用されます。 + + + +これは、誰かによって記録されたシーケンスまたは特徴ベクトルに対応する事前に記録されたテンプレートをシステムに提供するという考え方です。ニューラルネットワークはテンプレートと同時に訓練され、システムは異なる発音の単語を認識するように学習します。潜在変数により、テンプレートの長さに一致するように特徴ベクトルをタイムワープ(時系列の別の時刻に、該当する特徴ベクトルに対応するものを考えることができることを意味していると思われる)させることができる。 + + + +
+
+図1 +
+ + +これはTDNNの特徴ベクトルを水平方向に、単語テンプレートを垂直方向に並べることで、行列として可視化することができます。行列の各エントリーは特徴ベクトル間の距離に対応しています。これは、左下からスタートし、距離を最小にするパスを通って右上に到達することを目的としたグラフ問題として可視化することができます。 + + +この潜在変数モデルを訓練するために、正解のエネルギーを可能な限り小さくしながら各正解に対してより大きくする必要があります。これを行うために、入力された間違った単語のテンプレートを現在の特徴量の列からそれらを押しのける目的関数を用いて、勾配を逆伝播させます。 + + +## エネルギーベース因子グラフ + + +エネルギーベース因子グラフの背後にある考え方は、エネルギーが部分的なエネルギー項の和であったり、確率が因子の積である場合に、エネルギーベースモデル構築することです。これらのモデルの利点は、効率的な推論アルゴリズムを採用できることです。 + + +
+
+図2 +
+ + + +### シーケンスのラベル付け + +このモデルは、入力音声信号Xを受けて、総エネルギー項を最小化するようなラベルYを出力します。 + +
+
+図3 +
+ + +
+
+図4 +
+ + +この場合、エネルギーは、入力変数の特徴ベクトルを生成するニューラルネットワークである青い四角で表される3つの項の和である。音声認識の場合、Xは音声信号と考えることができ、四角は文法的制約を実装し、Yは生成された出力ラベルを表します。 + + +## エネルギーベース因子グラフの効率的な推論 + + +A Tutorial on Energy-Based Learning (Yann LeCun, Sumit Chopra, Raia Hadsell, Marc’Aurelio Ranzato, and Fu Jie Huang 2006): + + +エネルギーベースモデルを用いた学習と推論においては、答えの集合 $\mathcal{Y}$ と潜在変数 $\mathcal{Z}$ の上のエネルギーを最小化する。この最小化は、$Mathcal{Y}Times \mathcal{Z}$の濃度が大きい場合には、難解な問題となる。エネルギー関数の構造を利用して効率的に最小化を行うのがこれに対処する一つの方法です。この構造を利用できる1つのケースは、エネルギーがYとZの変数の異なる部分集合にそれぞれ依存する個々の関数(因子と呼ばれる)の和として表現できる場合です。これらの依存感k性は因子グラフの形で最もよく表現することができます。因子グラフは、グラフィカルモデルまたは信念ネットワークの一般的な形式です。 + + +
+
+図5 +
+ + +因子グラフの簡単な例を図19(上)に示します。エネルギー関数は4つの因子の和です。 + +$$E(Y, Z, X) = E_a(X, Z_1) + E_b(X, Z_1, Z_2) + E_c(Z_2, Y_1) + E_d(Y_1, Y_2)$$ + + +ここで、 $Y = [Y_1, Y_2]$ は出力変数であり、 $Z = [Z_1, Z_2]$ は潜在変数です。各因子は、入力変数の値の間のソフトな制約を表していると見ることができます。推論は、以下を見つけることで行われます。 + +$$(\bar{Y}, \bar{Z})=\operatorname{argmin}_{y \in \mathcal{Y}, z \in \mathcal{Z}}\left(E_{a}\left(X, z_{1}\right)+E_{b}\left(X, z_{1}, z_{2}\right)+E_{c}\left(z_{2}, y_{1}\right)+E_{d}\left(y_{1}, y_{2}\right)\right)$$ + + +ここで、 $Z_1$, $Z_2$, $Y_1$ が離散的な二項変数であり、 $Y_2$ が三値変数であるとします。X は常に観測されるので、 $X$ のドメインの濃度は重要ではありません。Xが与えられたときの $Z$ と $Y$ の可能な構成の数は、 $2 \times 2 \times 2 times 3 = 24$ であす。徹底的な探索による愚直な最小化アルゴリズムでは、エネルギー関数全体を24回評価することになります(96回の単因子評価)。 + + + +しかし、与えられた $X$ に対して、 $E_a$ は、 $Z_1 = 0$ と $Z_1 = 1$ の2つの入力の構成しかありえないことに気づきます。同様に、 $E_b$ と $E_c$ は4つの入力の構成しかなく、 $E_d$ は6つの入力の構成しかないことがわかります。したがって、$2 + 4 + 4 + 6 = 16$以上の単一の因子の評価は必要はありません。 + + +したがって、図19(下)に示すように、16個の因子の値を事前に計算して格子の円弧上に置くことができます。 + + +各列のノードは、1つの変数の可能な値を表します。各エッジは、その入力変数の対応する値に対する因子の出力エネルギーによって重み付けされます。この表現では、開始ノードから終了ノードまでの1本のパスが、すべての変数の1つの可能な構成を表します。パスに沿った重みの合計は、対応する構成の総エネルギーに等しくなります。したがって、推論問題は、このグラフ内の**最短パス**を探す問題に落とし込む事ができます。これは、ビタビアルゴリズムやA*アルゴリズムのような動的計画法を用いて行うことができます。コストは辺の数(16)に比例しますが,これは一般にパスの数よりも指数関数的に小さくなります. + + +E(Y, X) = \min_{z\in Z} E(Y, z, X)$を計算するには、同じ手順に従いますが、グラフを、$Y$の所定の値と互換性のある円弧の部分集合に制限します。 + + + +上記の手順は、最小和アルゴリズムと呼ばれることもありますが、これは従来のグラフィカルモデルの最大積の対数領域版です。この手順は、因子が2つ以上の変数を入力とする因子グラフや、連鎖構造ではなく木構造を持つ因子グラフに簡単に一般化できます。 + + +しかし,これは,(ループのない)二部木の因子グラフにのみ適用されます。グラフにループが存在する場合、最小和アルゴリズムは、繰り返し適用する事で近似解を与えるかもしれないし、全く収束しないかもしれません。この場合、焼きなまし法のような降下アルゴリズムが使用されます。 + + + +## 「浅い」因子を持つ単純なエネルギベース因子グラフ + + +
+
+図6 +
+ + +図20に示す因子グラフは、線形構造化モデル(我々が話している「単純なエネルギーベース因子グラフ」)の対数領域の因子グラフです。 + + +各因子は、訓練可能なパラメータの線形関数です。それは、入力 $$ と一対のラベル $(Y_m, Y_n)$ に依存します。一般的に、各因子は2つ以上のラベルに依存しえますが、表記を簡単にするために2つで1組の因子に限定します。 + +$$E(W, Y, X)=\sum_{(m, n) \in \mathcal{F}} W_{m n}^{T} f_{m n}\left(X, Y_{m}, Y_{n}\right)$$ + + +ここで、$mathcal{F}$は因子の集合(直接相互依存性を持つ個々のラベルの組の集合)を表し、$W_{m n}$は因子$(m, n),$のパラメータベクトルであり、$f_{m n} \left(X, Y_{m}, Y_{n}\right)$は(固定された)特徴量ベクトルです。グローバルパラメータベクトル $W$ は、すべての $W_{m n}$ を連結したものです。 + + +そして、どのようなタイプの損失関数があるかを考えます。ここで、いくつかのモデルが出てきます。 + + +### 条件付きランダム場 + + +線形構造化モデルを訓練するために負の対数尤度損失関数を使うことができます。 + + +これが、条件付きランダム場です。 + + +直感的には、正解のエネルギーを以下のようにして、正解を含むすべての解の指数の対数を大きくしたいということです。 + + +以下に負の対数尤度損失関数の正式な定義を示します。 + +$$\mathcal{L}_{\mathrm{nll}}(W)=\frac{1}{P} \sum_{i=1}^{P} E\left(W, Y^{i}, X^{i}\right)+\frac{1}{\beta} \log \sum_{y \in \mathcal{Y}} e^{-\beta E\left(W, y, X^{i}\right)}$$ + + + +### 最大マージンマルコフネットとlatent SVM + + +また、最適化のためにヒンジ損失関数を使用することもできます。 + + +その背後にある直感は、正解のエネルギーを低くして、そして全ての間違った答えやよくない答えの構成の中で、最もエネルギーが低いものを探します。そして、この答えのエネルギーを押し上げていきます。他の悪い解答のエネルギーを押し上げる必要はありません。 + + +これが最大マージンマルコフネットとlatent SVMです。 + + + +### 構造化パーセプトロンモデル + + +線形構造化モデルはパーセプトロン損失を用いて学習することができます。 + + +Collins [Collins, 2000, Collins, 2002]は、NLPの文脈で線形構造化モデルに使用することを提唱しています。 + +$$ +\mathcal{L}_{\text {perceptron }}(W)=\frac{1}{P} \sum_{i=1}^{P} E\left(W, Y^{i}, X^{i}\right)-E\left(W, Y^{* i}, X^{i}\right) +$$ + +ただし $Y^{* i}=\operatorname{argmin}_{y \in \mathcal{Y}} E\left(W, y, X^{i}\right)$ はシステムの出力した答えです。 + + + +#### 音声・手書き認識のための識別訓練の初期段階の軌跡 + + +最小経験誤差関数 (Ljolje, and Rabiner 1990): + + +シーケンスレベルで学習することで、この音やあの場所をシステムに教えるのではなく、入力文と単語の書き起こしを与え、タイムワープをしてシステムに理解するように求めます。彼らは二ューラルネットを使用しておらず、別の方法で音声信号を音声のカテゴリに変換しています。 + + +## グラフトランスフォーマーネット + + +ここでの問題は、入力に数字の列があるがセグメンテーションの方法がわからないということです。そこでできることは、各パスが文字列を分割する方法となるようなグラフを構築することです。これがどのように機能するのか、具体的な例を示します。 + + +入力画像34があります。これをセグメンテーションツールで実行すると、複数の代替的なセグメンテーションが得られます。これらのセグメンテーションは、これらをグループ化する方法です。セグメンテーショングラフの各パスは、インクの塊をグループ化する特定の方法に対応しています。 + + + +
+
+図7 +
+ + +それぞれを同じ charecter 文字認識ConvNet で実行し、10 点のスコアのリストを得ます(ここでは 2 点ですが、本質的には 10 のカテゴリを表す 10 点でなければなりません)。例えば、1 [0.1]はカテゴリ1のエネルギーが0.1であることを意味します。このようにしてグラフが得られますが、これは少し変わったテンソルだと考えることができます。これは本当に疎なテンソルです。これはこの変数の可能な各構成について、その変数のコストを要求するテンソルです。エネルギーの話をしているので、テンソルの分布というよりも、対数分布のようなものです。 + + +
+
+図8 +
+ + +このグラフを見て 正解のエネルギーを計算してみましょう 正解は34です。それらのパスの中から選んで、34と書いてあるものを見つけてください。 それら2つのうち1つはエネルギーが3.4 + 2.4 = 5.8で、もう一つは、0.1 + 0.6 = 0.7です。エネルギーが最も低いものを選びます。ここでは、エネルギー0.7のパスが出てきます。 + +
+
+図9 +
+ + +したがって、パスを見つけることは、どのパスを選ぶかを表す潜在変数について最小化するようなものです。概念的には、潜在変数をパスとするエネルギーモデルです。 + + + +これで、正しいパスのエネルギーは0.7になりました。ここで必要なのは、最終的なエネルギーが下がるようにConvNetの重みを変えることができるようにこの構造全体を通して勾配を逆伝播することです。難しそうに見えますが、完全に可能です。このシステム全体は既に知っている要素で構築されているので、二ューラルネットは通常通りで、Path Selector と Viterbi Transformer は基本的に特定のエッジを選ぶかどうかのスイッチです。 + + + +では、どうやって逆伝播するのでしょうか。点0.7は0.1と0.6の和です。つまり、点0.1と0.6の両方が勾配+1を持っています。これはブラケットで表現します。すると、Viterbi Transformerは2つのパスのうち1つのパスを選択します。なので、入力グラフの対応する辺の勾配をコピーして、選択されていない他のパスの勾配を0に設定するだけです。これはMax-PoolingやMean-Poolingで起こっていることと全く同じです。パスを選択するものも同じで、正解を選択するシステムになっているだけです。グラフの3 [0.1] (0)はこの段階では3 [0.1] (1)であるべきで、あとで後者に戻ってくることに注意してください。これで正解のエネルギーが小さくなります。 + + +ここで重要なのは、新しい入力を入れると二ューラルネットのインスタンスの数がセグメンテーションの数と一緒に変化して、導出されたグラフも同様に変化するという意味で、この構造が動的であるということです。この動的な構造で誤差逆伝播をする必要があります。これがPyTorchのようなものが非常に重要になるところです。 + + +この誤差逆伝播の段階は、正解のエネルギーを小さくしてくれます。そして、不正解のエネルギーを大きくするという段階もあります。この場合、システムに好きな答えを選ばせます。これは、知覚損失を利用した構造予測のための識別訓練の簡略化された形になりそうです。 + + + +二つ目の段階のはじめは、最初の段階と全く同じです。ここでのViterbi Transformerは、エネルギーが最も低い最良のパスを選ぶだけで、そのパスが正しいパスかどうかは気にしません。ここで得られるエネルギーは、可能なすべてのパスの中で最も小さいので、第一段階から得られるエネルギーと同じか、それより小さくなるでしょう。 + + +
+
+図10 +
+ + +段階1と2を一緒にします。損失関数は energy1 - energy2 とします。 前回は左の部分を逆伝播する方法を紹介しましたが、今回は構造全体を逆伝播する必要があります。左側のパスは+1、右側のパスは-1となり、両方のパスに3 [0.1]が出現するので、勾配は0となります。 このようにすれば、システムは最終的に、正解のエネルギーと最良解のエネルギーの差を最小化することになります。ここでの損失関数は知覚損失です。 + + +
+
+図11 +
+ + + +## 質問と回答 + + + +#### 質問1: なぜエネルギーベース因子グラフにおいて推論が簡単になるのですか? + + +潜在変数を持つエネルギーベースのモデルの場合の推論では、エネルギーを最小化するために勾配降下法のような全探索的な手法を使用しますが、この場合のエネルギーは因子の総和であるため、動的計画法のような手法を代わりに使用することができます。 + + + +#### 質問2: 因子グラフの潜在変数が連続変数だったらどうなるのですか?まだ和を最小化するアルゴリズムを使えるのですか? + + +できません。すべての因子値に対して可能なすべての組み合わせを検索することができないからです。しかし、この場合でも、独立した最適化を行うことができるという利点があります。図19の$Z_1$と$Z_2$の組み合わせは、$E_b$にしか影響しないようなものです。独立した最適化と動的計画法で推論を行うことができます。 + + +#### 質問3: NNとある箱は別々のConvNetsを表しているのですか? + + +共有されています。同じConvNetの複数のコピーです。ただの文字認識ネットワークです。 diff --git a/docs/ja/week14/14-2.md b/docs/ja/week14/14-2.md new file mode 100644 index 000000000..f107af1c3 --- /dev/null +++ b/docs/ja/week14/14-2.md @@ -0,0 +1,397 @@ +--- +lang-ref: ch.14-2 +lecturer: Yann LeCun +title: Graphical Energy-based Methods +authors: Yada Pruksachatkun, Ananya Harsh Jha, Joseph Morag, Dan Jefferys-White, and Brian Kelly +date: 4 May 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + +## 誤差を比較する + + +
+
+図1: ネットワークアーキテクチャ +
+ + + +上の図では、正しくないパスには-1がつきます。 + +LeCun教授は、上の図のグラフtransformerモデルの例で使われているパーセプトロン損失から始めます。目的は、間違った答えのエネルギーを大きくし、正しい答えのエネルギーを小さくすることです。 + +実装の面では、円弧の可視化をベクトルで表現します。各カテゴリごとに別々の弧を描くのではなく、1つのベクトルにカテゴリと各カテゴリのスコアの両方が含まれています。 + +Q: 上記のモデルでは、セグメンテーションはどのように実装されていますか? + +A: セグメンターは手作りのヒューリスティックです。エンドツーエンドで学習可能にする方法もありますが、このモデルでは手動で作られたセグメントを使用しています。このハンドクラフトされた手動のアプローチは、文字認識のためのスライディングウィンドウアプローチに取って代わられました。 + + + +## 損失のおさらい + + +
+テーブル 1: 様々な損失の式 +
+ + +| 名前 | 式 | マージン | +| :---- | :----: | ---:| +| Energy Loss | $\text{E}(\text{W}, \text{Y}^i, \text{X}^i)$ | None | +| Perceptron | $\text{E}(\text{W}, \text{Y}^i, \text{X}^i)-\min\limits_{\text{Y}\in\mathcal{Y}}\text{E}(\text{W}, \text{Y}, \text{X}^i)$ | 0 | +| Hinge | $\max\big(0, m + \text{E}(\text{W}, \text{Y}^i,\text{X}^i)-\text{E}(\text{W}, \overline{\text{Y}}^i,\text{X}^i)\big)$ | $m$ | +| Log | $\log\bigg(1+\exp\big(\text{E}(\text{W}, \text{Y}^i,\text{X}^i)-\text{E}(\text{W}, \overline{\text{Y}}^i,\text{X}^i)\big)\bigg)$ | >0 | +| LVQ2 | $\min\bigg(M, \max\big(0, \text{E}(\text{W}, \text{Y}^i,\text{X}^i)-\text{E}(\text{W}, \overline{\text{Y}}^i,\text{X}^i)\big)\bigg)$ | 0 | +| MCE | $\bigg(1+\exp\Big(-\big(\text{E}(\text{W}, \text{Y}^i,\text{X}^i)-\text{E}(\text{W}, \overline{\text{Y}}^i,\text{X}^i)\big)\Big)\bigg)^{-1}$| >0 | +| Square-Square | $\text{E}(\text{W}, \text{Y}^i,\text{X}^i)^2-\bigg(\max\big(0, m - \text{E}(\text{W}, \overline{\text{Y}}^i,\text{X}^i)\big)\bigg)^2$ | $m$ | +| Square-Exp | $\text{E}(\text{W}, \text{Y}^i,\text{X}^i)^2 + \beta\exp\big(-\text{E}(\text{W}, \overline{\text{Y}}^i,\text{X}^i)\big)$ | >0 | +| NNL/MMI | $\text{E}(\text{W}, \text{Y}^i,\text{X}^i) + \frac{1}{\beta}\log\int_{y\in\mathcal{Y}}\exp\big(-\beta\text{E}(\text{W}, y,\text{X}^i)\big)$ | >0 | +| MEE |$1-\frac{\exp\big(-\beta E(W,Y^i,X^i)\big)}{\int_{y\in\mathcal{Y}}\exp\big(-\beta E(W,y,X^i)\big)}$ | >0 | + + + + +上の表のパーセプトロンの損失にはマージンがないため,損失が崩壊する危険性があります. + +* ヒンジ損失は最も問題のある答えと正しい答えのエネルギーを取り、その差を計算します。直感的には、マージンがmの場合、ヒンジは、正解のエネルギーが最も問題のあるエネルギーよりも少なくともm以上低い場合にのみ、損失が0になります。 +* MCE損失は音声認識に使用され、シグモイドに似ています。 +* NLL損失は、正解のエネルギーを小さくし、方程式の対数成分を大きくすることを目的としています。 + +Q: ヒンジ損失はどうにしてNLL損失よりも優れているのでしょうか? + +A: NLL損失は正解と他の解答の差を無限大にしようとするのに対し、ヒンジ損失はそれをある値(マージンm)よりも大きくしようとするだけなので、NLLよりも優れています。 + + + +### 定義: + +デコーダは、個々の音や画像のスコアやエネルギーを示す一連のベクトルを入力として受け、可能な限り最適な出力を選び出します。 + +Q: デコーダを利用できる問題の例を教えてください。 +A: 言語モデリング、機械翻訳、系列へのタグ付けなどです。 + +## グラフtransformerネットワークにおける順伝播アルゴリズム + +### グラフの合成 + +グラフの合成では、2つのグラフを組み合わせることができます。この例では、$trie$(グラフ)として表現された言語モデルの辞書と、ニューラルネットワークによって生成された識別グラフを見ることができます。 + + +
+
+図2: グラフの合成 +
+ + + +識別グラフは、(各円弧に関連付けられた)異なるエネルギー値で、ある文字が特定のステップでどの程度の可能性があるかを指定します。 + +さて、この例では、グラフの合成操作で答える質問は、この識別グラフの中で、私たちの辞書と一致する最良のパスは何か、ということです。 + +識別グラフと文法の間のステップ1からステップ2への共通ホップは、エネルギー0.4の文字$c$です。したがって、我々の解釈グラフには、ステップ 1 とステップ 2 の間に $c$ に対応する円弧が 1 つだけ含まれています。同様に、ステップ2とステップ3の間にあり得る文字は、識別グラフでは、$x$, $u$, $a$です。文法グラフの$c$に続く枝には、$u$と$a$が含まれています。そこで、グラフ合成演算は、解釈グラフに存在する円弧 $u$ と $a$ を選び出します。また、識別グラフからコピーした円弧を、それらのエネルギー値に関連付けます。 + +もし文法にも円弧に関連するエネルギー値が含まれていたとしたら、グラフの合成はエネルギー値を追加するか、他の演算子を使ってそれらを結合していたでしょう。 + +同様の流れで、グラフの合成はまた、ニューラルネットワークによって表現される2つの知識ベースを結合することを可能にします。上で説明した例では、文法は本質的に次の文字を予測するニューラルネットワークとして表現することができます。NNのsoftmax出力は、与えられたノードから次の文字への遷移確率を提供してくれます。 + +余談ですが、この例で示されている言語モデルがニューラルネットワークであれば、構造全体を誤差逆伝播することができます。これは、ループ、if条件、再帰などを含むプログラムをバックプロパゴスする微分可能なプログラムの例になります。 + + +### 90年代半ばのチェックリーダー + + +90年代半ばのチェックリーダーの全体のアーキテクチャは非常に複雑ですが、私たちが主に興味を持っているのは、識別グラフを生成する文字識別器から始まる部分です。 + + +
+
+図3: チェックリーダー +
+ --> + +この識別グラフは、2つの別々の合成操作を受けます。1つは正しい解釈(または真の値)で、2つ目は文法で、これによってすべての可能な解釈のグラフを作成します。 + +システム全体は負の対数尤度損失関数を使って学習されます。負の対数尤度は、解釈グラフの各パスが可能な解釈であり、そのパスに沿ったエネルギーの総和がその解釈のエネルギーであると言います。 + +ここで、ビタビアルゴリズムの代わりに、フォワードアルゴリズムを使用します。以下のサブセクションでは、2つのアプローチの違いを議論します。 + + + +#### ビタビアルゴリズム + + +ビタビアルゴリズムは、与えられたグラフの中で最も可能性の高いパス(またはエネルギーが最小となるパス)を見つけるために使用される動的計画法です。これは,潜在変数 z に関するエネルギーを最小化します。 + +$$F (x, y) = \min_{z} \; E(x, y, z)$$ + + +#### フォワードアルゴリズム + + +一方、フォワードアルゴリズムは、すべてのパスのエネルギーの負の値の指数の和の対数を計算します。これは、以下の式で簡単にわかります。 + +$$F_{\beta} (x, y) = -\frac{1}{\beta} \; \log \; \sum_{z \, \in \, \text{paths}} \; \exp \, (- \beta \; E(x, y, z))$$ + + + +これは、解釈グラフのパスを定義する潜在変数zを周辺化しています。このアプローチでは,特定のノードへのすべての可能なパスについて,この対数和指数値を計算します。これは、ソフトミニマムな方法で、すべての可能なパスのコストを計算するようなものです。 + +フォワードアルゴリズムは実装が安価で、ビタビアルゴリズムよりもコストがかかりません。また、グラフ上のノードを経由して誤差逆伝播することも可能です。 + +フォワードアルゴリズムの動作は、解釈グラフ上に定義された以下の例を用いて示すことができます。 + + +
+
+図4: 解釈グラフ +
+ + + + +入力ノードから赤い網掛けのノードまでのコストは、赤いノードに到達する可能性のあるすべてのパスを周辺化することによって計算されます。赤いノードに入る矢印は、この例ではこれらの可能なパスを定義しています。 + +赤色のノードでは、ノードでのエネルギーの値は次のように与えられます。 + +$$-\frac{1}{\beta} \; \log \; [ \, \exp \, (- \, \beta (e_1 \, + \, e_3)) \; + \; \exp \, (- \, \beta (e_2 \, + \, e_4)) \, ]$$ + + +#### フォワードアルゴリズムのアナロジーとしてのニューラルネットワーク + + + +フォワードアルゴリズムは、基礎となるグラフが鎖グラフである場合の信念伝播アルゴリズムの特殊なケースです。このアルゴリズム全体は、各ノードでの関数が指数と加算項の対数和であるフィードフォワードニューラルネットワークとして見ることができます。 + +解釈グラフの各ノードについて、変数$\alpha$を維持します。 + +$$ \alpha_{i} = - \; \log \; \biggl[ \sum_{k \, \in \, \text{parent} \, (i)} \; \exp \, (- \, \beta \; (\alpha_k \, + \, e_{ki})) \biggl]$$ + + +ここで、$e_{ki}$は、ノード$k$からノード$i$へのリンクのエネルギーです。 + + + +このニューラルネットワークにおいて、$alpha_i$はノード$i$の活性を形成し、$e_{ki}$はノード$k$とノード$i$の間の重みです。この定式化は、対数領域における通常のニューラルネットワークの重み付き和演算と代数的に等価です。 + +フォワードアルゴリズムを適用した動的解釈グラフ(例から例へと変化するので)を誤差逆伝播することができます。解釈グラフのエッジを定義する $e_{ki}$ の重みを用いて,グラフの最後のノードで計算された $F(x, y)$ の勾配を計算することができます. + + +
+
+図5: チェックリーダー +
+ + +チェック・リーダーの例に戻り、2つのグラフ合成にフォワードアルゴリズムを適用し、対数和指数を使用して最後のノードでのエネルギー値を求めます。これらのエネルギー値の差が負の対数尤度損失です。 + +正解グラフと識別グラフの間のグラフ構成にフォワードアルゴリズムを適用して得られる値は、正解の対数和指数値である。対照的に、識別グラフと文法の間のグラフ構成の最後のノードでの対数和指数値は、すべての可能性のある有効な解釈にわたって周辺化された値です。 + + + +# 誤差逆伝播のラグランジアンによる定式化 +入力 $x$ と目標出力 $y$ に対して、ネットワークを関数 $f_k$ と重み $w_k$ の集合として定式化すると、ネットワークの連続するステップが $z_{k+1} = f_k(z_k, w_k)$ で $z_k$ を出力するようになります。教師あり学習の場合では、ネットワークの目標は、ネットワークの $n$番目の出力のコストである $C(z_n, y)$ を、真の値に対して最小化することです。これは、制約 $z_{k+1} = f_k(z_k, w_k)$ と $z_0 = x$ に対して $C(z_n, y)$ を最小化する問題と等価です。 + + +ラグランジアンは次のように書くことができます: + +$$ \mathcal{L}(x, y, \lambda_i, z_i, w_i) = C(z_n, y) + \sum\limits_{k=0}^{n-1} \lambda^T_{k+1}(z_{k+1} - f_k(z_k, w_k)) $$ + +ここで $ \lambda $ の項はラグランジュ乗数を表します(Calc 3 が少し前のものであれば、[Paul's online notes](http://tutorial.math.lamar.edu/Classes/CalcIII/LagrangeMultipliers.aspx)を参照してください)。 + +$\mathcal{L}$を最小化するためには、$\mathcal{L}$の偏微分を、それぞれの引数についてゼロにして解く必要があります。 + + + +- $\lambda$について、単に制約: $\frac{\partial{\mathcal{L}}}{\partial \lambda_{k+1}} = 0 \rightarrow z_{k+1} = f_k(z_k, w_k)$を復元します。 +- $z_k$について、$\frac{\partial \mathcal{L}}{\partial z_k} = 0 \rightarrow \lambda^T_k - \lambda^T_{k+1} \frac{\partial f_k(z_k, w)}{\partial z_k} \rightarrow \lambda_k = \frac{\partial f_k(z_k, w_k)^T}{\partial z_k}\lambda_{k+1}$。これは、単なる普通の誤差逆伝播の式です。 + + +このアプローチは、古典力学の文脈でラグランジュとハミルトンに由来します。そこでは最小化はシステムのエネルギーについて行っており、$lambda$項は、システムの物理的な制約を示しています。例えば二つの球を金属の棒でくっつけることで、二つの球が固定した距離を保っているように強制するようなものです。 + + +時間ステップごとに $k$ のコスト $C$ を最小化する必要がある状況では、ラグランジアンは次のようになります +$$ \mathcal{L} = \sum_k \left(C_k(z_k, y_k) + \lambda^T_{k+1}(z_{k+1} - f_k(z_k, w_k)) \right) $$ + +# Neural Ordinary Differential Equation + + +この誤差逆伝播の式を使って、ニューラルODEという新しいクラスのモデルについて話すことができます。これらは、基本的にはリカレントネットワークであり、 $t$ における状態 $z$ は次のように与えられます。 +$ z_{t+\text{d}t} = z_t + f(z_t, W) dt $。ここで、$W$ は固定パラメータの集合を表します。これは,常微分方程式(偏微分なし)で表現することもできます: $\frac{\text{d}z}{\text{d}t} = f(z_t, W)$。 + +このようなラグランジュ方程式を用いたネットワークの学習は非常に簡単です。目標$y$があり、システムの状態が時間$T$までに$y$に到達するようにしたい場合、コスト関数を$z_T$と$y$の間の距離として設定するだけです。ネットワークのもう一つの目的は、システムの安定した状態、つまり、ある点を境に変化しなくなる状態を見つけることかもしれません。数学的には、これは $\frac{\text{d}z}{\text{d}t} = f(y, W) = 0$ とするのと同じです。一般的に、この方程式の解 $y$ を見つけることは、時間の逆伝播よりもはるかに簡単です。なぜなら、ネットワークは、全シーケンスに関する勾配を記憶する必要がなく、 $f$ または $\lvert f \rvert^2$ を最小化すればよいからです。固定点に到達するためのニューラルODEの訓練については、 [(Lecun88)](http://yann.lecun.com/exdb/publis/pdf/lecun-88.pdf)を参照してください。 + + +# エネルギーの意味における変分推論 + + +## 導入 + +ある初等的なエネルギー関数 $E(x,y,z)$ に対して、変数 z に対して周辺化して、 $x$ と $y$ と $L(x,y)$ だけの損失を得るには、次の計算をしなければなりません。 + +$$L(x,y) = -\frac{1}{\beta}\int_z \exp(-\beta E(x,y,z))$$ + + +$\frac{q(z)}{q(z)}$をかけると、 次の式を得ます +$$L(x,y) = -\frac{1}{\beta}\int_z q(z) \frac{\exp({-\beta E(x,y,z)})}{q(z)}$$ + + +$q(z)$を$z$上の確率変数とすると、書き直した損失関数の積分を、 分布$\frac{\exp({-\beta E(x,y,z)})}{q(z)}$に関する期待値として解釈することができます。 + + + +この解釈、イェンセンの不等式、サンプリングに基づく近似を用いて、間接的に損失関数を最適化します。 + + +## イェンセンの不等式 + + +イェンセンの不等式は、次のようなことをノベル幾何学的な観察です:凸関数がある場合、その関数の*期待値*は、ある範囲にわたって、範囲の最初と最後に評価された関数の平均値よりも小さくなります。幾何学的に説明すると、これは非常に直感的です。 + + + +
+
+図6: イェンセンの不等式 ([Wikipedia](https://en.wikipedia.org/wiki/Jensen%27s_inequality)から) +
+ +同様に、 $F$ が凸である場合、固定確率分布 $q$ に対して、イェンセンの不等式から、 $z$ の範囲にわたって、 $f$ が凸であることが推論できます。 + +$$F\Bigg(\int_z q(z)h(z)\Bigg) \leq \int_z q(z)F(h(z)) \tag{1}$$ + + +今、$\frac{q(z)}{q(z)}$がかけられた後の、周辺化された$L(x,y)$は、次のようになることを思い出してください +$$L(x,y) = -\frac{1}{\beta}\int_z q(z) \frac{\exp({-\beta E(x,y,z)})}{q(z)}$$ + + +$h(z) = -\frac{1}{\beta} \frac{\exp({-\beta E(x,y,z)})}{q(z)}$とすると、イェンセンの不等式$(1)$から、次のことがわかります + +$$F\Bigg(\int_z q(z)\frac{\exp({-\beta E(x,y,z)})}{q(z)}\Bigg) \leq \int_z q(z)F\Bigg(\frac{\exp({-\beta E(x,y,z)})}{q(z)}\Bigg)$$ + + +引き続き、具体的な凸の損失関数 $F(x) = -\log(x)$ を使ってみましょう。 + +$$-\log\Bigg(-\frac{1}{\beta}\int_z q(z)\frac{\exp({-\beta E(x,y,z)})}{q(z)}\Bigg) \leq \int_z q(z) * \frac{-1}{\beta}\log\Bigg(\frac{\exp({-\beta E(x,y,z)})}{q(z)}\Bigg)$$ + +$$\leq \int_z q(z)[E(x,y,z) + \frac{1}{\beta}\log(q(z))]$$ + +$$\leq \int_z q(z)E(x,y,z) + \frac{1}{\beta}\int_z q(z)\log(q(z))$$ + + +すばらしい!これで損失関数 $L(x,y)$の上限がわかりました。 上限は私たちが知っている2つの項で構成されています 最初の項 $\int_z q(z)E(x,y,z)$ は *平均* エネルギーです。 そして、2番目の項 $\frac{1}{\beta}\int_z\log(q(z))$ は、いくつかの因子($-\frac{1}{\beta}$)に、分布$q$の*エントロピー*をかけたものです。 + + + +# 要点は何でしょうか? + +これで、複雑な積分を避けることができるように上界を定式化することができました。複雑な積分をする代わりに、我々の選択した代理分布($q(z)$)からサンプリングすることで、これらの値を単純に近似することができます! + +上界の関数の最初の項の値を得るために、その分布からサンプリングし、サンプリングした $z$ を適用して得られる $L$ の平均値を計算します。 + +2番目の項(エントロピーの因子)は、分布族の性質であり、同様に $q$ のランダムサンプリングで近似することができます。 + +最後に、パラメータ(例えば、ネットワーク $W$ の重み)に関して $L$ を最小化することで、 $L$ を最小化することができます。この最小化は、2つの変数を更新することで行います。(1) $q$のエントロピー、(2)モデルのパラメータ$W$です。 + + +## まとめ +これは「エネルギーの視点から見た」変分推論です。指数の和の対数を計算する必要がある場合、関数の平均にエントロピー項を加えたものに置き換えます。これにより、上界が得られます。そして、この上界を最小化することで、実際に関心のある関数を最小化することができます。 + diff --git a/docs/ja/week14/14-3.md b/docs/ja/week14/14-3.md new file mode 100644 index 000000000..51e3b8918 --- /dev/null +++ b/docs/ja/week14/14-3.md @@ -0,0 +1,470 @@ +--- +lang-ref: ch.14-3 +title: Overfitting and regularization +lecturer: Alfredo Canziani +authors: Karl Otness, Xiaoyi Zhang, Shreyas Chandrakaladharan, Chady Raach +date: 5 May 2020 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + + +## 過学習 + +Consider a regression problem. A model could underfit, right-fit, or overfit. + +If the model is insufficiently expressive for the data it will underfit. If the model is more expressive than the data (as is the case with deep neural networks), it runs the risk of overfitting. + +In this case, the model is powerful enough to fit both the original data *and* the noise, producing a poor solution for the task at hand. + +Ideally we would like our model to fit the underlying data and not the noise, producing a good fit for our data. We would especially like to do this without needing to reduce the power of our models. Deep learning models are very powerful, often much more than is strictly necessary in order to learn the data. We would like to keep that power (to make training easier), but still fight overfitting. + +回帰問題を考えてみましょう。モデルは、学習不足、適切な学習、過学習のいずれかになります。 + +モデルの表現力がデータに対して不十分な場合、過少適合となります。モデルがデータよりも表現力が高い場合(ディープニューラルネットワークの場合のように)、過学習のリスクがあります。 + +この場合、モデルは元のデータとノイズの両方を適合させるのに十分な力を持っているので、手元のタスクに対する貧弱な解を生み出します。 + +理想的には、モデルがノイズではなく基礎となるデータにフィットして、データに良好なフィットをもたらすことが望まれます。特に、モデルのパワーを下げることなく、これを実現したいと考えています。ディープラーニングモデルは非常に強力で、多くの場合、データを学習するために厳密に必要とされる以上のパワーを持っています。そのパワーを維持しつつ(訓練を容易にするために)、過学習と戦いたいと考えています。 + + + + + + +### デバッグのための過学習 + +過学習は、デバッグ中など、いくつかのケースで有用です。学習データの小さなサブセット(単一のバッチやランダムなノイズテンソルのセットでさえも)でネットワークをテストして、ネットワークがこのデータに過学習できることを確認することができます。学習に失敗した場合は、バグがある可能性があることを示しています。 + + + + +## 正則化 + +正則化を導入することで過学習に対抗しようとすることができます。正則化の量はモデルの検証性能に影響を与えます。正則化が少なすぎると、過学習問題の解決に失敗します。正則化が多すぎると、モデルははるかに効果的ではなくなります。 + +*正則化*は、モデルに事前知識を追加します;パラメータに事前分布が指定されます。これは、学習可能な関数の集合に対する制限として機能します。 + +Ian Goodfellowによる正則化のもう一つの定義。 +> 正則化とは、学習アルゴリズムの汎化誤差を減らすことを意図していますが、訓練誤差を減らすことは意図していない、学習アルゴリズムに行う修正のことです。 + + + +### Initialization techniques + +We can select a prior for our network parameters by initializing the weights according to a particular distribution. One option: [Xavier initialization](https://pytorch.org/docs/stable/nn.init.html#torch.nn.init.xavier_normal_). + +### 初期化テクニック + +特定の分布に従って重みを初期化することで、ネットワークパラメータの優先順位を選択することができます。選択肢の一つです。[Xavier initialization](https://pytorch.org/docs/stable/nn.init.html#torch.nn.init.xavier_normal_)。 + + + + +### 重み減衰正則化 + +重み減衰は我々の最初の正則化手法です。重み減衰は機械学習では広く使われていますが、ニューラルネットワークではあまり使われていません。 PyTorchでは、オプティマイザのパラメータとして重み減衰が提供されています(例えば、 [SGD](https://pytorch.org/docs/stable/optim.html#torch.optim.SGD)の`weight_decay`パラメータを参照してください)。 + +これは以下のようにも呼ばれています。 + +- L2 +- リッジ +- ガウス事前分布 + +パラメータに作用する目的関数を考えることができます。 + +$$J_{\text{train}}(\theta) = J^{\text{old}}_{\text{train}}(\theta)$$ + + +すると、次の更新式が得られます + +$$\theta \gets \theta - \eta \nabla_{\theta} J^{\text{old}}_{\text{train}}(\theta)$$ + + +重み減衰では、ペナルティ項を導入します。 + +$$J_{\text{train}}(\theta) = J^{\text{old}}_{\text{train}}(\theta) + \underbrace{\frac\lambda2 {\lVert\theta\rVert}_2^2}_{\text{penalty}}$$ + + +これから、次の更新式が得られます + +$$\theta \gets \theta - \eta \nabla_{\theta} J^{\text{old}}_{\text{train}}(\theta) - \underbrace{\eta\lambda\theta}_{\text{decay}}$$ + + +この更新式の新しい項は、パラメータ $\theta$ をわずかにゼロに向けて動かし、更新のたびに重みにいくつかの「減衰」を追加します。 + + + +### L1正則化 + + +PyTorchにも選択肢として用意されています [optimizers](https://pytorch.org/docs/stable/optim.html). + + +これは次のようにも呼ばれています。 + +- LASSO: Least Absolute Shrinkage Selector Operator +- ラプラシアン事前分布 +- スパース事前分布 + +これをラプラス分布を事前分布として用いたものとして見ると、この正則化は、ガウス分布よりも多くの確率質量をゼロに近づけます。 + +上と同じ更新から始めて、これを別のペナルティを追加したと見ることができます。 + +$$J_{\text{train}}(\theta) = J^{\text{old}}_{\text{train}}(\theta) + \underbrace{\lambda{\lVert\theta\rVert}_1}_{\text{penalty}}$$ + + +これは次の更新式を生み出します。 + +$$\theta \gets \theta - \eta \nabla_{\theta} J^{\text{old}}_{\text{train}}(\theta) - \underbrace{\eta\lambda\cdot\mathrm{sign}(\theta)}_{\text{penalty}}$$ + + +$L_2$ 重み減衰とは異なり、$L_1$ 正則化はパラメータ空間の軸に近い成分を "殺す "のであって、パラメータベクトルの長さを均等に減らすのではありません。 + + + + + +### ドロップアウト + +ドロップアウトでは、訓練中に特定のニューロン数をランダムにゼロに設定します。これにより、ネットワークが入力から出力への特異な経路を学習することができなくなります。同様に、ニューラルネットワークのパラメトリゼーションが大きいため、ニューラルネットワークが入力を効果的に記憶することが可能です。しかし、ドロップアウトの場合、ドロップアウトは毎回異なる無限個のネットワークを効果的に訓練するので入力は毎回異なるネットワークに投入されることになり、これははるかに困難となります。したがって、ドロップアウトは、過学習を制御する強力な方法となり、入力の小さな変動に対してより強固なものとなります。 + + + +
+
+図1: ドロップアウトのあるネットワーク +
+ +
+
+図2: ドロップアウトのあるネットワーク +
+ +In PyTorch, we can set a random dropout rate of neuron. +PyTorchでは、ランダムなニューロンのドロップアウト率を設定することができます。 + + +
+
+図3: ドロップアウトのコード +
+ + +訓練後、推論中には、ドロップアウトはもう使いません。推論のための最終的なネットワークを作成するために、ドロップアウト中に作成された個々のネットワークをすべて平均化し、推論に使用します。同様に、すべての重みに $1/1-p$ をかけます。ただし$p$ はドロップアウト率です。 + + + +### 早期打ち切り + + +訓練中に、検証誤差が増加し始めたら、訓練を中止して、これまでに見つかった最も良い重みを使用します。これにより、重みが大きくなりすぎて、ある時点で検証性能に支障をきたし始めるのを防ぐことができます。実際には、一定の間隔で検証性能を計算し、検証誤差が減少しなくなったら停止するのが一般的です。 + +
+
+図 4: 早期打ち切り +
+ + + + +# 間接的に過学習と戦う + +パラメータを正則化する副作用を持つテクニックがありますが、それ自体は正則化するものではありません。 + + +## バッチ正規化 + +Q. バッチ正規化はどのようにしてトレーニングを効率化するのですか? +A. バッチ正規化を適用すると、より大きな学習率を使うことができます。 + +バッチ正規化はニューラルネットワークの内部共変量シフトを防ぐために使われますが、実際にこれを行うのかどうか、本当の効果は何なのかについては多くの議論があります。 + + + +
+
+図5: バッチ正規化 +
+ + + +バッチ正規化は、基本的にニューラルネットワークの入力を正規化するロジックを、ネットワーク内の各隠れ層の入力を正規化することに拡張したものです。基本的な考え方は、ニューラルネットワークの後続の各層に固定された分布を与えることです。というのも、固定された分布を持っているときに学習が最もよく行われるからです。これを行うために、各隠れ層の前に各バッチの平均と分散を計算し、これらのバッチ固有の統計量で入力値を正規化します。 + +各バッチが異なるため、正規化効果に関しては、各サンプルはそのバッチに基づいてわずかに異なる統計量で正規化されます。 そのため、ネットワークは1つの入力の様々なわずかに変化したバージョンを見ることになり、入力のわずかな変化に対してよりロバストな学習を行い、過学習を防ぐことができます。 + +バッチ正規化のもう一つの利点は、訓練が非常に速くなることです。 + + +### より多くのデータ + +より多くのデータを収集することは、過学習を防ぐための簡単な方法ですが、コストがかかる場合もありますし、実現不可能な場合もあります。 + + +### データを増やすことで、過学習を防ぐことができます。 + +Torchvisionを使用した変換は、摂動に鈍感になる方法をネットワークに教えることで、正規化の効果を得ることができます。 + + + +
+
+図6: Torchvisionによるデータ拡張 +
+ + + + + + +### 転移学習 (TF) fine-tuning (FT) + +転移学習 (TF) は,事前に学習されたネットワークの上に最終的な分類器を学習することを意味します(一般的にデータが少ない場合に使用されます)。 + +Fine-tuning (FT) は,事前に学習されたネットワークの部分的/全体的な部分を学習することを指します(一般的にデータが多い場合に用いられます)。 + +Q. 一般的に、どういう時に事前学習したモデルの層を学習しないようにさせるのですか? +A. 学習データが少ない場合です。 + +4 一般的なケース。 +1) 似たような分布を持つデータが少ない場合は,単に転移学習を行うことができます。 +2) 似たような分布を持つ多くのデータがあれば,特徴抽出器の性能を向上させるためにfine-tuningを行うことができます。 +3) データが少なく、分布が異なる場合は、特徴抽出器の最終的な学習層の一部を削除すべきです。 +4) 多くのデータがあり、それらが異なる分布からのものであれば、すべての部分を学習することができます。 + +注意:パフォーマンスを向上させるために、異なる層に対して異なる学習率を使用することもできます。 + + +過学習と正則化についての議論をさらに深めるために、以下の可視化を見てみましょう。これらの可視化は、[Notebook](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/12-regularization.ipynb)のコードを使用して生成されました。 + + + + + +
+
+図7: ドロップアウトがない場合の誤差曲線 +
+ +
+
+図8: ドロップアウトがある場合の誤差曲線 +
+ +
+
+図9: 重みに対する正則化の効果 +
+ + + +図7と図8から、ドロップアウトが汎化誤差、すなわち訓練損失と検証損失の差に与える劇的な効果を理解することができます。図7では、ドロップアウトがない場合、訓練誤差は検証誤差よりもはるかに低いため、明らかに過学習が見られます。しかし、図8では、ドロップアウトがある場合、訓練誤差と検証誤差はほぼ連続的に重なっており、モデルがサンプル外集合の代理として機能する検証集合にうまく汎化していることを示しています。もちろん、別のホールドアウトテスト集合を使用して、実際のサンプル外集合に対する性能を測定することができます。 + +図9では、正則化(L1とL2)がネットワークの重みに与える効果を観察しています。 + +- L1正則化を適用すると、ゼロの赤いピークから、ほとんどの重みがゼロであることがわかります。ゼロに近い小さな赤い点は、モデルの非ゼロの重みです。 + +- 対照的に、L2正則化では、ゼロに近い青いピークから、重みのほとんどがゼロに近いがゼロではないことがわかります。 + +- 正則化がない場合(ラベンダー)、重みは、はるかに柔軟で、正規分布に似たゼロの周りに広がっています。 + + + + +## ベイズニューラルネットワーク:予測の不確実性の推定 + +ニューラルネットワークの不確実性に注目しているのは、ネットワークがどの程度の確信度を持って予測しているかを知る必要があるからです。 + +例:車の操縦を予測するためにニューラルネットワークを構築する場合、ネットワークの予測がどれだけ確信度が高いかを知る必要があります。 + +ドロップアウトを持つニューラルネットワークを使って、予測値の信頼区間を求めることができます。ここでは、ドロップアウトのあるネットワークを訓練してみましょう。 + +通常、推論の際には、ネットワークを検証モードに設定し、すべてのニューロンを使って最終的な予測を行います。予測を行う際には、訓練中にニューロンが落ちてしまうことを考慮して、重み $\delta$ を $\dfrac{1}{1-r}$ でスケーリングします。 + +この方法では、各入力に対して1つの予測が得られる。しかし、予測の信頼区間を得るためには、同じ入力に対して複数の予測が必要だ。そこで、推論中にネットワークを検証モードに設定する代わりに、トレーニングモードで保持します。このドロップアウトネットワークを使って複数回予測を行うと、同じ入力に対して、ドロップされるニューロンに応じて異なる予測が得られます。これらの予測を使用して、最終的な予測の平均値とその周りの信頼区間を推定します。 + +以下の画像では、ネットワークの予測値の信頼区間を推定しています。これらの可視化は、[Bayesian Neural Networks Notebook](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/13-bayesian_nn.ipynb)のコードを使用して生成されました。赤い線が予測値を表しています。予測値の周りの紫色の網掛け領域は、不確実性、すなわち予測値の分散を表しています。 + + + + +
+
+図10: ReLU活性化関数を使った不確実性の推定 +
+ +
+
+図11: Tanh活性化関数を使った不確実性の推定 +
+ + +上の画像で観察できるように、これらの不確かさの推定は較正されていません。活性化関数の違いによって異なります。画像の中で注目すべきは、データ点の周りの不確かさが低いことです。さらに、観察できる分散は微分可能な関数です。そのため、この分散を最小化するために勾配降下を実行することができます。そうすることで、より信頼性の高い予測が可能になります。 + + + + + +#### EBMモデルにおいて、総損失に寄与する複数の項がある場合、それらはどのように相互作用するのでしょうか? + +EBMモデルでは、総損失を推定するために、異なる項を単純かつ便利に合計することができます。 + +**余談**。潜在変数の長さを罰する項は,モデル内の多くの損失項の1つとして機能します。ベクトルの長さは、それが持つ次元の数にほぼ比例します。したがって、次元の数を減らすと,ベクトルの長さは減少し、その結果、より少ない情報を符号化します。オートエンコーダーの設定では、これによりモデルが最も重要な情報を保持していることが確認されます。したがって、潜在空間の情報をボトルネックにする1つの方法は、潜在空間の次元数を減らすことです。 + + +#### 正則化のためのハイパーパラメータはどのようにして決定すればよいのでしょうか? + +実際には,正則化に最適なハイパーパラメータ,すなわち正則化の強さを決定するには,以下の方法を用いることができます。 + +- ベイズハイパーパラメータ最適化 +- グリッドサーチ +- ランダムサーチ + +これらの探索を行っている間、通常、最初の数エポックあれば正則化がどのように機能しているかの感覚を得るのに十分です。ですから、モデルを広範囲に訓練する必要があります。 diff --git a/docs/ja/week14/14.md b/docs/ja/week14/14.md new file mode 100644 index 000000000..778f3e89c --- /dev/null +++ b/docs/ja/week14/14.md @@ -0,0 +1,33 @@ +--- +lang-ref: ch.14 +title: Week 14 +lang: ja +translation-date: 6 Dec 2020 +translator: Shiro Takagi +--- + + + + +## レクチャーパートA + +本節では、構造化予測について考察しました。まず、エネルギーベース因子グラフとその効率的な推論について紹介しました。次に、"浅い"因子を持つ単純なエネルギーベース因子グラフの例を示しました。最後に、グラフ変換ネットについて述べました。 + + + + +## レクチャーパートB + +講義の第2項では、エネルギーベースのモデルへのグラフィカルモデルの手法の適用についてさらに議論します。異なる損失関数を比較した後、ビタビアルゴリズムとフォワードアルゴリズムのgraphical transformerネットワークへの適用について議論します。その後、誤差逆伝播のラグランジュ方程式の議論に移り、エネルギーベースのモデルのための変分推論に移ります。 + + + +## 演習 + +ディープニューラルネットワークのような高度にパラメトライズされたモデルを学習する場合、学習データに過学習するリスクがあります。これは、より大きな汎化誤差につながります。過学習を減らすために、訓練に正則化を導入して、モデルがノイズに適合するような解を見つけることを抑制することができます。 diff --git a/docs/ko/README-KO.md b/docs/ko/README-KO.md index 16c463132..561005dba 100644 --- a/docs/ko/README-KO.md +++ b/docs/ko/README-KO.md @@ -3,8 +3,8 @@ [웹사이트](https://atcold.github.io/pytorch-Deep-Learning/ko/)를 방문해보세요! 비디오와 텍스트 형식의 모든 강의 자료를 확인하실 수 있습니다! - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md)   [🇧🇩](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/bn/README-BN.md) # 시작하기 diff --git a/docs/pt/README-PT.md b/docs/pt/README-PT.md new file mode 100644 index 000000000..91a51c764 --- /dev/null +++ b/docs/pt/README-PT.md @@ -0,0 +1,107 @@ + +# Aprendizagem Profunda (com PyTorch) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Atcold/pytorch-Deep-Learning/master) + + +Este repositório de *notebooks* possui um [página web complementar](https://atcold.github.io/pytorch-Deep-Learning/es/), onde todo o material do curso pode ser encontrado em formato textual e em vídeo. + + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md) + + +# Começando + + +Para poder seguir os exercícios, precisa ter um computador com Miniconda (uma versão minimalista do Anaconda) e vários pacotes Python instalados. +As instruções a seguir funcionarão para os usuários de Mac ou Ubuntu Linux. Os usuários Windows precisarão instalar e trabalhar em um terminal [Git BASH](https://gitforwindows.org/). + + +## Download e instalação do Miniconda + + +Vá à [página web do Anaconda](https://conda.io/miniconda.html). +Faça o download e instale *a última* versão do Miniconda para *Python* 3.7 para seu sistema operacional. + + +```bash +wget +sh +``` + + +## Clone o repositório git contendo os exercícios + + +Uma vez que a instalação do Miniconda esteja concluída, baixe o repositório do curso faça a configuração do ambiente: + +```bash +git clone https://github.com/Atcold/pytorch-Deep-Learning +``` + + +## Crie um ambiente Miniconda isolado + + +Mude o diretório (`cd`) para a pasta do curso, e digite: + +```bash +# cd pytorch-Deep-Learning +conda env create -f environment.yml +source activate pDL +``` + + +## Inicie uma sessão Jupyter Notebook ou JupyterLab + + +Começe a partir do terminal, como padrão: + +```bash +jupyter lab +``` + + +Ou, para a interface clássica: + +```bash +jupyter notebook +``` + + +## Visualização de notebooks + + +Os *Jupyter Notebooks* irão ser utilizados nas aulas para a exploração e visualização interativa de dados. + + +Utilizamos estilos escuros para *GitHub* e *Jupyter Notebook*. +Deveria tentar seguir o mesmo padrão, ou ficarão feios. +JupyterLab tem disponível um tema escuro, sendo que somente precisará instalar alguma coisa adicional se desejar utilizar a interface clássica dos notebooks. +Para ver o conteúdo adequadamente na interface clássica, instale o seguinte: + + + - [Design escuro para *Jupyter Notebook*](https://userstyles.org/styles/153443/jupyter-notebook-dark); + - [Design escuro para *GitHub*](https://userstyles.org/styles/37035/github-dark) e descomente o seginte trecho de código `invert #fff to # 181818`. diff --git a/docs/ru/README-RU.md b/docs/ru/README-RU.md index f973de65f..2c5c8ff80 100644 --- a/docs/ru/README-RU.md +++ b/docs/ru/README-RU.md @@ -7,8 +7,8 @@ У данного репозитория с рабочими тетрадями сейчас есть [сопровождающий сайт](https://atcold.github.io/pytorch-Deep-Learning/ru), где Вы можете все материалы в текстовом и видео-формате. - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md)   [🇧🇩](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/bn/README-BN.md) diff --git a/docs/ru/index.md b/docs/ru/index.md index 1dff0c5a6..197308036 100644 --- a/docs/ru/index.md +++ b/docs/ru/index.md @@ -325,6 +325,23 @@ lang: ru 🎥 + + + + Практикум + Вывод для энергетических моделей со скрытыми переменными + + 🖥️ + 🎥 + + + + Обучение энергетических моделей со скрытыми переменными + + 🖥️ + 🎥 + + diff --git a/docs/ru/week12/12-1.md b/docs/ru/week12/12-1.md new file mode 100644 index 000000000..0ccab0ef6 --- /dev/null +++ b/docs/ru/week12/12-1.md @@ -0,0 +1,431 @@ +--- +lang: ru +lang-ref: ch.12-1 +title: Глубокое обучение для обработки естественного языка +lecturer: Mike Lewis +authors: Jiayu Qiu, Yuhong Zhu, Lyuang Fu, Ian Leefmans +date: 20 Apr 2020 +translation-date: 01 Dec 2020 +translator: Evgeniy Pak +--- + + + + +## [Обзор](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=44s) + +* Поразительный прогресс за несколько последних лет : + - Люди предпочитают машинный перевод человеческому для некоторых языков + - Серхчеловеческая производительность на многих выборках данных с ответами на вопросы + - Модели языка генерируют плавные параграфы (например Radford и др. 2019) +* Минимальные специальные техники, необходимые для задач, которые можно решить при помощи довольно общих моделей + + + + +## Модели языка + +* Модели языка присваивают тексту вероятность: + $p(x_0, \cdots, x_n)$ +* Много возможных предложений, значит мы не можем просто обучить классификатор +* Наиболее популярный метод заключается в факторизации распределения, используя цепное правило: + +$$p(x_0,...x_n) = p(x_0)p(x_1 \mid x_0) \cdots p(x_n \mid x_{n-1})$$ + + + +## Нейронные модели языка + +В основном мы вводим текст в нейронную сеть, нейронная сеть подбирает соответствующий вектор для всего контекста. Этот вектор представляет следующее слово и мы получаем некоторую большую матрицу характеристик слов. Эта матрица содержит по вектору для каждого слова, которое может выдать модель. Затем мы вычисляем сходство посредством скалярного произведения контекстного вектора и вектора для каждого слова. Мы получим вероятность предсказания следующего слова, затем обучим эту модель, максимизируя вероятность. Ключевой момент здесь: мы не работаем со словами напрямую, но имеем дело с сущностями, называемыми подсловами или символами. + +$$p(x_0 \mid x_{0, \cdots, n-1}) = \text{softmax}(E f(x_{0, \cdots, n-1}))$$ + +
+ +
Рис.1 : Нейронная модель языка
+
+ + + + +### Свёрточные модели языка + +* Первая нейронная модель языка +* Интерпретирует каждое слово как вектор, являясь таблицей поиска, по отношению к матрице характеристик, таким образом слово получит один и тот же вектор независимо от того, в каком контексте оно появляется +* Применяет одну и ту же сеть с прямой связью на каждом временном шаге +* К сожалению, история с фиксированной длиной означает, что она может быть обусловленна только ограниченным контекстом +* У этих моделей есть преимущество быстродействия + +
+ +
Рис.2 : Свёрточная модель языка
+
+ + + + +### Рекуррентные модели языка + +* Наиболее популярный подход вплоть до недавних лет +* Концептуально прямолинейны: на каждом временном шаге мы поддерживаем некоторое состояние (полученное из предыдущего временного шага), которое представляет то, что мы уже прочитали до сих пор. Это комбинируется с текущим прочитанным словом и используется в последующих состояниях. Затем мы повторяем этот процесс столько временных шагов, сколько нам необходимо. +* Пользуется неограниченным контекстом: в принципе название книги повлияет на скрытое состояние последнего слова в книге. +* Недостатки: + - Вся история чтения документа сжимается в вектор фиксированной размерности на каждом временном шаге, что является узким местом этой модели + - Градиенты имеют тенденцию исчезать при длинном контексте + - Нет возможности параллелизации по временным шагам, отсюда медленное обучение. + +
+ +
Рис.3 : Рекуррентная модель языка
+
+ + + +### [Модель языка трансформер](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=828s) + +* Новейшая модель, используемая в естественной обработке языка +* Революционный штраф +* Три основных этапа + * Входной этап + * $n$ блоков трансформеров (кодирующих слоёв) с различными параметрами + * Выходной этап +* Пример с 6 модулями трансформерами (кодирующими слоями) в статье первоисточнике о трансформерах: + +
+ +
Рис.4: Модель языка трансформер
+
+ +Подслои соединяются посредством элементов, отмеченных "Add&&Norm". Часть "Add" означает остаточное соединение, которое помогает остановить исчезание градиента. Норма здесь обозначает нормализацию слоя. + +
+ +
Рис.5: Кодирующий слой
+
+ +Следует отметить, что трансформеры делятся весами между временными шагами + + + + + +# Многоголовое внимание + +
+ +
Рис.6: Многоголовое внимание
+
+ + +Для слов, которые мы пытаемся предсказать, мы вычисляем значения, называемые **query(q)**. Все предыдущие слова, используемые для предсказания, мы называем **keys(k)**. Запрос - это то, что говорит о контексте, например предыдущие прилагательные. Ключ - это что-то наподобие метки, содержащей информацию о текущем слове, такую как является ли оно прилагательным или нет. После вычисления q, мы можем получить распределение предыдущих слов ($p_i$): + +$$p_i = \text{softmax}(q,k_i)$$ + +Затем мы также вычисляем величины, называемые **values(v)** для предыдущих слов. Значения представляют содержимое слов. + +Как только мы получили значения, вычисляем скрытые состояния, максимизируя распределение внимания: + + $$h_i = \sum_{i}{p_i v_i}$$ + +Мы вычисляем ту же самую вещь с различными запросами, значениями и ключами множество раз параллельно. Причина в том, что мы хотим предсказать следующее слово, используя различные вещи. Например, когда мы предсказываем слово "единороги", используя три предыдущих слова "Эти" "рогатые" и "серебристо-белые". Мы знаем, что это единорог по словам "рогатый" и "серебристо-белый". Однако, мы можем узнать о множественном числе "единороги" по "Эти". Поэтому мы, вероятно, захотим использовать все три слова,чтобы знать, каким должно быть следующее. Многоголовое внимание - это способ позволить каждому слову посмотреть на несколько предыдущих. + +Одним из больших преимуществ многоголового внимания является его хорошая параллелизуемость. В отличие от RNNs, оно вычисляет все головы модулей многоголового внимания и все временные шаги за раз. Одна из проблем одновременного вычисления всех временных шагов заключается в том, что также возможно смотреть на будущие слова, в то время как мы хотим учитывать только предыдущие. Одно из решений этой проблемы - это так называемая **self-attention маскировка**. Маска - это верхнетреугольная матрица, имеющая нули в нижнем треугольнике и минус бесконечность в верхнем. Эффект добавления этой маски к выходу модуля внимания состоит в том, что каждое слово слева имеет гораздо более высокую оценку внимания, чем слова справа, поэтому модель на практике фокусируется только на предыдущих словах. Применение маски имеет решающее значение в модели языка, поскольку оно делает её математически правильной, однако в кодировщиках текста двунаправленный контекст может быть полезным. + +Одна деталь, заставляющяя модель языка трансформер работать, - добавление позиционных характеристик ко входу. В языке некоторые свойства такие, как порядок важны для интерпретации. Используемая здесь техника заключается в обучении отдельных характеристик на различных временных шагах и добавлении их ко входу, так что теперь вход является суммой вектора слова и позиционного вектора. Это придаёт порядок информации. + +
+ +
Рис.7: Архитектура трансформер
+
+ +**Почему модель так хороша:** + +1. Она даёт прямые соединения между каждой парой слов. Каждое слово может быть напрямую получить доступ к скрытому состоянию предыдущих слов, смягчая исчезание градиентов. Она довольно легко обучает очень дорогие функции. +2. Все временные шаги вычисляются параллельно +3. Self-attention квадратично (все временные шаги могут следить за всеми другими), ограничивая максимальную длину последовательности + + + + +## [Некоторые прёмы (особенно для многоголового внимания и позиционного кодирования) и декодирующие модели языка](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=1975s) + + + +### Приём 1: Широкое применение нормализации слоёв действительно полезно для стабилизации обучения + +- Действительно важно для трансформеров + + +### Приём 2: Разогрев (Warm-up) + график обучения обратный квадратный корень + +- Используйте график скорости обучения: чтобы трансформеры работали хорошо, вы должны сделать скорость обучения линейно-уменьшающейся от нуля до тысячных шагов. + + + +### Приём 3: Тщательная инициализация + +- Действительно полезна для таких задач, как машинный перевод + + + +### Приём 4: Сглаживание меток + +- Действительно полезно для таких задач, как машинный перевод + +Ниже приведены результаты некоторых методов, упомянутых выше. В этих тестах, метрикой справа, называемой `ppl` была перплексия (чем меньше `ppl`, тем лучше) + +
+ +
Рис.8: Сравнение производительности моделей
+
+ +Вы могли видеть, что с появлением трансформеров, производительность значительно улучшилась. + + + +## Некоторые важные факты о моделях языка трансформерах + + - Минимальный индуктивный сдвиг. + - Все слова напрямую связаны, что смягчает исчезание градиентов. + - Все временные шаги вычисляются параллельно. + + +Self-attention квадратично (все временные шаги могут следить за всеми другими), ограничивая максимальную длину последовательности. + +- Поскольку self-attention квадратично, его стоимость растёт линейно на практике, что может вызывать проблемы. + +
+ +
Рис.9: Трансформеры *против* RNNs
+
+ + + +### Трансформеры очень хорошо масштабируются + +1. Неограниченные обучающие данные, даже больше, чем вам нужно +2. GPT 2 использовала 2 миллиарда параметров в 2019 +3. Последние модели используют до 17Млрд параметров в 2020 + + + +## Декодирующие модели языка + +Мы можем сейчас обучить вероятностное распределение по тексту - теперь, по сути, мы можем получить экспоненциально много различных выходов, поэтому мы не можем вычислить максимум. Какой бы выбор вы ни сделали для первого слова, оно может повлиять на все остальные решения. Таким образом, учитывая это, жадное декодирование было представлено следующим образом. + + + +### Жадное декодирование не работает + +Мы берём наиболее вероятное слово на каждом временном шаге. Однако, нет никаких гарантий, что такой подход даст наиболее вероятную последовательность, потому что если вы сделали этот шаг в какой-то момент, у вас нет пути отслеживания предыдущих шагов, чтобы отменить предыдущие решения. + + + +### Полный перебор также невозможен + +Он требует вычисления всех возможных последовательностей и поскольку сложность порядка $O(V^T)$, это будет очень дорого + + + + +## Вопросы и ответы для понимания +1. В чём преимущество многоголового внимания по сравнению с моделью одноголового внимания? + * Чтобы предсказать следующее слово, вам нужно наблюдать несколько различных вещей, другими словами внимание можно сосредоточить на нескольких предыдущих словах, пытаясь понять контекст, необходимый для предсказания следующего слова + +2. Как трансформеры решают информационно узкие места CNNs и RNNs ? + * Модели внимания позволяют установить прямую связь между всеми словами, позволяя каждому слову быть обусловленным всеми предыдущими, эффективно устраняя это узкое место. + +3. Чем трансформеры отличаются от RNN в смысле использования параллелизации GPU? + * Модули многоглового внимания в трансформерах хорошо параллелизуемы, тогда как RNNs - нет, и поэтому рекуррентные сети не могут использовать преимущество GPU технологий. По факту трансформеры вычисляют все временные шаги за раз в один прямой проход. + diff --git a/docs/ru/week12/12-2.md b/docs/ru/week12/12-2.md new file mode 100644 index 000000000..27e206918 --- /dev/null +++ b/docs/ru/week12/12-2.md @@ -0,0 +1,638 @@ +--- +lang: ru +lang-ref: ch.12-2 +title: Декодирующие модели языка +lecturer: Mike Lewis +authors: Trevor Mitchell, Andrii Dobroshynskyi, Shreyas Chandrakaladharan, Ben Wolfson +date: 20 Apr 2020 +translation-date: 03 Dec 2020 +translator: Evgeniy Pak +--- + + + + +## [Лучевой поиск](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=2732s) + +Лучевой поиск - это ещё одна техника декодирования модели языка и генерации текста. На каждом шаге алгоритм отслеживает $k$ наиболее вероятных (наилучших) частичных переводов (гипотез). Оценка каждой гипотезы равна логарифму её вероятности. + +Алгоритм выбирает гипотезы с лучшей оценкой. + +
+
+Рис. 1: Лучевое декодирование +
+ +Как глубоко разветвляется лучевое дерево ? + +Лучевое дерево продолжается, пока не достигнет конца предложения. После вывода конца предложения, гипотеза завершена. + +Почему (в нейронном машинном переводе) очень большие размерности луча часто приводят к пустому переводу? + +В момент обучения алгоритм часто не использует луч, поскольку это очень дорого. Вместо этого используется авторегрессивная факторизация (по данному предыдущему корректному выходу, предсказывает $n+1$ первых слов). Модель не отображает собственные ошибки в процессе обучения, так что возможно появление "бессмыслицы" в луче. + +Сводка: Продолжайте лучевой поиск, пока все $k$ гипотез порождают конечный токен или пока не достигнете максимального предела декодирования T. + + + + +### Семплирование + +Нам может быть не нужна наиболее вероятная последовательность. Вместо этого мы можем семплировать из распределения модели. + +Однако выборка из распределения модели приносит свои проблемы. После "плохого" выбора, модель находится в состоянии, с которым никогда не сталкивалась в процессе обучения, возрастает вероятность продолжения "плохой" оценки. Алгоритм может затем застрять в ужасных циклах обратной связи. + + + + + +### Топ-K семлирование + +Чистая техника семплирования, где вы усекаете распределение до $k$ наилучших и затем перенормализуете и выбираете из распределения. + +
+
+Рис. 2: Топ K семлирование +
+ + + + + +#### Вопрос: Почему Топ-K семплирование работает так хорошо? + +Этот метод работает хорошо, поскольку он по сути пытается предотвратить выход за пределы многообразия хорошего языка, когда мы выбираем что-то плохое, используя только головную часть распределения и обрезая хвостовую часть. + + + + + +## Оценка генерации текста + +Оценка модели языка требует просто вычислить логарифм вероятности выведенных данных. Однако, таким образом сложно оценить текст. Обычно используются метрики совпадения слов с упоминанем (BLEU, ROUGE etc.), но у них есть свои проблемы. + + + + +## Sequence-To-Sequence модели + + + + +### Обусловленные модели языка + +Обусловленные модели языка не подходят для генерации случайых семплов на английском, но они полезны для генерации текста по заданному входу. + +Примеры: + +- По заданному предложению на французском сгенерируйте английский перевод +- По заданному документу сгенерируйте краткое изложение +- По заданному диалогу сгенерируйте следующий ответ +- По заданному вопросу сгенерируйте ответ + + + + + +### Sequence-To-Sequence модели + +Обычно входной текст закодирован. Эта результирующая характеристика известна как "thought vector", которая затем передаётся декодеру для генерации токенов слово за слово. + +
+
+Рис. 3: Thought Vector +
+ + + + + +### Sequence-To-Sequence трансформер + +Sequence-to-sequence варианты трансформеров имеют 2 стека: + +1. Стек кодировщик – Self-attention не маскируется, так что каждый входной токен может смотреть на любой другой токен входа + +2. Стек декодировщик – Помимо использования внимания на себе, он также использует внимание по всему входу + +
+
+Рис. 4: Sequence to Sequence трансформер +
+ +Каждый токен на выходе имеет прямую связь с каждым предыдущим выходным токеном, а также с каждым входным словом. Связи делают модели очень выразительными и мощными. Эти трансформеры улучшили оценку в машинном переводе по сравнению с предыдущими рекуррентными и свёрточными моделями. + + + + + +## [Обратный перевод](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=3811s) + +При обучении этих моделей мы обычно полагаемся на большие объёмы размеченного текста. Хороший источник данных - это отчёты Европейского Парламента - текст вручную переведён на несколько языков, который мы можем затем использовать как входы и выходы модели. + + + + + +### Проблемы + +- Не все языки представлены в Европейском Парламенте, означая, что мы не получим пары переводов по всем языкам, в которых мы можем заинтересоваться. Как мы находим текст для обучения на языке, для которого мы не можем получить данные? +- Поскольку модели как трансформеры намного более производительны при большем количестве данных, как мы используем монолингвистический текст эффективно, *т.е.* нет входных / выходных пар? + +Предположим, мы хотим обучить модель для перевода с немецкого языка на английский. Идея обратного перевода заключается в том, что сперва обучаем обратную модель с английского на немецкий. + +- Используя некоторый ограниченный парный текст, мы можем получать одинаковые предложения на двух различных языках +- Как только мы имеем модель перевода с английского языка на немецкий, переводим множество монолингвистических слов с английского на немецкий. + +Наконец, обучаем модель перевода с немецкого языка на английский, используя немецкие слова, которые были 'обратно переведены' на предыдущем шаге. Отметим, что: + +- Неважно, насколько хороша обратная модель - мы можем иметь зашумленные немецкие переводы, но в итоге чисто перевести на английский. +- Нам нужно обучить модель, чтобы понимать английский хорошо за пределами данных англиских/немецких пар (уже переведённых) - использовать большие объёмы монолингвистических данных на английском языке + + + + + +### Итеративный обратный перевод + +- Мы можем итерировать процедуру обратного перевода, чтобы генерировать ещё больше двунаправленных текстовых данных и достичь лучшей производительности - просто продолжая обучаться на монолингвистических данных. +- Сильно помогает, когда немного параллельных данных + + + + + +## Массивный мультиязычный машинный перевод + +
+
+Рис. 5: мультиязычный машинный перевод +
+ +- Вместо того, чтобы пытаться обучить модель переводить с одого языка на другой, попытаться создать нейронную сеть для обучения переводам на несколько языков. +- Модель изучает некоторую общую языко-независимую информацию. + +
+
+Рис. 6: Результаты мультиязычной нейронной сети +
+ +Отличные результаты, особенно если мы хотим обучить модель переводить на язык, для которого у нас нет много доступных данных (низко ресурсный язык). + + + + + +## Обучение без учителя для естественной обработки языка + +Есть большое количество текстовых данных без какой-либо разметки и немного размеченных данных. Как много мы можем изучить о языке, просто читая неразмеченный текст? + + + + + +### `word2vec` + +Наитие - если слова появляются близко друг к другу в тексте, они вероятно связаны между собой, поэтому мы надеемся, что просто посмотрев на неразмеченный английский текст, мы можем обучиться, что они значат. + +- Целью является изучить векторное пространство представлений слов (изучить характеристики) + +Задача предобучения - замаскируем некоторые слова и используем соседние слова, чтобы заполнить пробелы. + +
+
+Рис. 7: word2vec визуализация маскировки +
+ +Например, здесь, идея заключается в том, что "рогатый" и "седовласый" более вероятно появятся в контексте "единорога", чем какого-то другого животного. + +Возьмём слова и применим линейную проекцию + +
+
+Рис. 8: word2vec характеристики +
+ +Хотим узнать + +$$ +p(\texttt{единороги} \mid \texttt{Эти седовласые ??? были ранее неизвестны}) +$$ + +$$ +p(x_n \mid x_{-n}) = \text{softmax}(\text{E}f(x_{-n}))) +$$ + +Характеристики слов придерживаются некоторой структуры + +
+
+Рис. 9: Пример структуры характеристик +
+ +- Идея заключается в том, что если мы возьмём характеристический вектор для слова "король" после обучения и добавим характеристический вектор для слова "женский" мы получим характеристику, очень близкую к слову "королева" +- Показывает некоторые выразительные разности между векторами + + + + +#### Вопрос: Представления слов зависимы или независимы от контекста? + +Независимы и не имеют представления, как они зависят от других слов + + + + +#### Вопрос: Какой может быть пример ситуации, затруднительный для данной модели? + +Интерпретация слов сильно зависит от контекста. Поэтому на примерах двусмысленных слов - слов, которые могут иметь множество значений - модель будет затрудняться, поскольку характеристические вектора не будут захватывать контекст, необходимый для корректного понимания слова. + + + +### GPT + +Чтобы добавить контекст, мы можем обучить обусловленную модель языка. Затем, по заданной модели языка, которая предсказывает слово на каждом временном шаге, заменяем каждый выход модели на некоторую другую характеристику. + +- Предобучение - предсказываем следующее слово +- Тонкая настройка - заменяем на специфическую задачу. Например: + - Предсказываем где существительное, а где прилагательное + - По заданному некоторому тексту, содержащему обзор с Amazon, предсказать оценку настроения для обзора + +Этот подход хорош, поскольку мы можем использовать модель повторно. Мы предобучаем одну большую модель и можем тонко настраивать её для других задач. + + + + + +### ELMo + +GPT рассматривает только левосторонний контекст, что означает модель не может зависеть от каких-либо будущих слов - это ограничивает, что модель не может делать довольно много. + +Подход заключается в обучении _двух_ моделей языка + +- Одну на тексте слева направо +- Одну на тексте справа налево +- Конкатенируем выходы двух моделей, чтобы получить представление слова. Теперь можно обусловливать на обоих: правостороннем и левостороннем контексте. + +Это до сих пор "поверхностная" комбинация, и мы хотим некоторое более сложное взаимодействие между левым и правым контекстом. + + + + + +### BERT + +BERT похож на word2vec в том смысле, что у нас также есть задача заполнения пробелов. Однако, в word2vec у нас есть линейные проекции в то время, как в BERT есть большой трансформер, которые может посмотреть больше контекста. Для обучения мы маскируем 15% токенов и пытаемся предсказать пробелы. + +Можем увеличить масштаб BERT (RoBERTa): + +- Упростим задачу предобучения BERT +- Увеличим размер батча +- Обучим на большом количестве GPUs +- Обучим на ещё большем количестве текста + +Ещё больше улучшений поверх BERT производительности - в задаче ответов на вопросы сейчас производительность свехрчеловека. + + + + + +## [Предобучение для обработки естественного языка](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=4963s) + +Давайте кратко рассмотрим различные подходы предобучения самостоятельного обучения, разработанные для естественной обработки языка. + +- XLNet: + + Вместо того, чтобы предсказывать все замаскированные токены условно-независимо, XLNet предсказывает замаскированные токены авторегрессивно в случайном порядке + +- SpanBERT + + Маскирует диапазон (последовательность слов) вместо токенов + +- ELECTRA: + + Вместо маскировки слов, мы заменяем токены на похожие. Затем мы решаем задачу бинарной классификации, пытаясь предсказать, где были заменены токены. + +- ALBERT: + + Облегченный Bert: Мы модифицируем BERT и облегчаем его уменьшая количество весов the weights в слоях. Это уменьшает количество параметров модели и сложные вычисления. Интересно, что авторам ALBERT не пришлось сильно жертвовать точностью. + +- XLM: + + Мультиязычный BERT: Вместо подачи английского текста, мы подаём текст из множества языков. Как и ожидалось, она изучает межязыковые соединения лучше. + +Ключевые выводы из различных моделей, упомянутых выше: + +- Много различных задач предобучения работают хорошо! + +- Глубина модели критична, двунаправленные взаимодействия между словами + +- Большой выигрыш от увеличения масштабов предобучения, до сих пор без чётких ограничений. + + +Большинство моделей, обсуждённых выше разработаны для решения задачи классификации текста. Однако, для решения задачи генерации текста, где мы генерируем выход последовательно, очень похоже на `seq2seq` модель, нам нужен немного другой подход для предобучения. + + + + + +#### Предобучение для обусловленной генерации: BART и T5 + +BART: предобучение `seq2seq` модели посредством очищения текста от шумов + +В BART для предобучения мы берём последовательность и искажаем её, маскируя токены случайным образом. Вместо предсказания замаскированных токенов (как в задаче BERT), мы подаём целую искажённую последовательность и пытаемся предсказать искажённую последовательность целиком. + +Этот `seq2seq` подход предобучения даёт нам гибкость в дизайне наших искажённых схем. Мы можем перемешивать предложения, удалять фразы, вставлять новые фразы и т. д. + +BART сопоставим с RoBERTa на задачах SQUAD и GLUE. Однако, он был новым SOTA на обобщениях, диалогах и абстрактных вопросах/ответах выборках данных. Эти результаты усиливают нашу мотивацию для BART, быть лучше в задачах генерации текста, чем BERT/RoBERTa. + + + + + +### Некоторые открытые вопросы в естественной обработке языка NLP + +- Как нам интегрировать мировые знания +- Как нам моделировать длинные документы? (модели на основе BERT обычно используют 512 токенов) +- Как нам лучше всего выполнять многозадачное обучение? +- Можем ли мы выполнять тонкую настройку с меньшим количеством данных? +- Эти модели на самом деле понимают язык? + + + + + +### Резюме + +- Обучение моделей на большом количестве данных лучше, чем явное моделирование лингвистической структуры + +С точки зрения дисперсии смещения, трансформеры малосмещённые (очень выразительные) модели. Подавая этим моделям большое количество текста лучше явного моделирования лингвистических структур (сильно смещённых). Архитектуры должны сжимать последовательность дл прохождения через узкие места + +- Модели могут изучить много о языке, предсказывая слова в неразмеченном тексте. Это оказывается отличной задачей обучения без учителя. Тонкая настройка для специфических задач после проста. + +- Двунаправленность контекста критична + + + + + +### Дополнительные идеи из вопросов после лекции: + +Какими способами можно измерить 'понимание языка’? КАк мы можем узнать, что эти модели действительно понимают язык? + +"Трофей не поместился в чемодан, поскольку он был очень большим”: Разрешить ссылку ‘оно’ в этом предложении сложно для машин. Люди хороши в этой задаче. Есть выборка данных, состоящая из подобных сложных примеров и люди достигают 95% точности на этой выборке. Компьютерные программы были способны достичь лишь около 60% до революции, совершённой трансформерами. Современные модели транфсормеры способны достигать больше 90% на этой выборке данных. Это повзоляет предположить, что эти модели не просто запоминают / эксплуатируют данные, но изучают концепции и объекты посредством статистических шаблонов в данных. + +Более того, BERT и RoBERTa достигают сверхчеловеческой производительности на SQUAD и Glue. Текстовые сводки, сгенерированные BART,смотрятся очень реалистично для людей (высокие оценки BLEU). Эти факты свидетельства того, что модели понимают язык в каком-то плане. + + + + + +#### Приземлённый язык + +Интересно, что лектор (Майк Льюис, Учёный исследователь, FAIR) работает над концепцией, называемой ‘Grounded Language’. Цель этой области исследований создать разоговорных агентов, которые будут способны болтать или вести переговоры. Болтовня и переговоры абстрактные задачи с нечёткими целями по сравнению с классификацией текста или резюмирование текста. + + + + + +#### Можем ли мы оценить, когда модель уже обладает мировыми знаниями? + +‘Мировые знания’ это абстрактная концепция. Мы можем тестировать модели на очень базовом уровне на их мировые знания, спрашивая их простые вопросы о концепциях, которые нам интересны. Модели как BERT, RoBERTa и T5 имеют миллиарды параметров. Учитывая, что эти модели обучаются на большом своде информационного текста, как Википедия, они запомнили бы факты, используя их параметры и смогли бы ответить на наши вопросы. Более того, мы можем также подумать о проведении того же самого теста знаний до и после тонкой настройки модели для какой-либо задачи. Это даст нам представление о том, как много информации "забыла" модель. diff --git a/docs/ru/week12/12-3.md b/docs/ru/week12/12-3.md new file mode 100644 index 000000000..3e95e9603 --- /dev/null +++ b/docs/ru/week12/12-3.md @@ -0,0 +1,886 @@ +--- +lang: ru +lang-ref: ch.12-3 +title: Внимание и Трансформер +lecturer: Alfredo Canziani +authors: Francesca Guiso, Annika Brundyn, Noah Kasmanoff, and Luke Martin +date: 21 Apr 2020 +translation-date: 05 Dec 2020 +translator: Evgeniy Pak +--- + + + + + +## [Внимание](https://www.youtube.com/watch?v=f01J0Dri-6k&t=69s) + +Введём концепцию внимания перед тем, как говорить об архитектуре Трансформеров. Есть два основных типа внимания: self attention *против.* перекрёстного внимания, среди этих категорий мы можем выделить жёсткое *против.* мягкого внимания. + +Как мы увидим позже, трансформеры составлены из модулей внимания, которые являются отображениями множеств, скорее чем последовательностей, что значит мы не навязываем порядок нашим входам/выходам. + + + + + +### Self Attention (I) + +Рассмотрим множество $t$ входов $\boldsymbol{x}$'s: + +$$ +\lbrace\boldsymbol{x}_i\rbrace_{i=1}^t = \lbrace\boldsymbol{x}_1,\cdots,\boldsymbol{x}_t\rbrace +$$ + +гд каждый $\boldsymbol{x}_i$ есть $n$-мерный вектор. Поскольку в множестве есть $t$ элементов, каждый из которых принадлежит $\mathbb{R}^n$, мы можем представить множество как матрицу $\boldsymbol{X}\in\mathbb{R}^{n \times t}$. + +При self-attention внутреннее представление $h$ является линейной комбинацией входов: + +$$ +\boldsymbol{h} = \alpha_1 \boldsymbol{x}_1 + \alpha_2 \boldsymbol{x}_2 + \cdots + \alpha_t \boldsymbol{x}_t +$$ + +Используя матрицу представлений, описанную выше, мы можем записать внутренний слой, как произведение матриц: + +$$ +\boldsymbol{h} = \boldsymbol{X} \boldsymbol{a} +$$ + +где $\boldsymbol{a} \in \mathbb{R}^n$ вектор-столбец с компонентами $\alpha_i$. + +Отметим, что это отличается от внутреннего представления, которое мы видели до сих пор, где входы умножались на матрицу весов. + +В зависимости от ограничений налагаемых на вектор $\vect{a}$, мы получаем жёсткое или мягкое внимание. + + + + + +#### Жётское Внимание + +При жёстком внимании, мы налагаем следующие ограничения на альфы: $\Vert\vect{a}\Vert_0 = 1$. Это значит $\vect{a}$ является унитарным вектором. Следовательно все, кроме одного, коэффициенты в линейной комбинации входов равняются нулю, и внутренние представления сокращаются до входа $\boldsymbol{x}_i$, соответствующего элементу $\alpha_i=1$. + + + + + +#### Мягкое внимание + +При мягком внимании, мы налагаем ограничение $\Vert\vect{a}\Vert_1 = 1$. Внутреннее представление является линейной комбинацией входов, где сумма коэффициентов равна единице. + + + + + +### Self Attention (II) + +Откуда берутся $\alpha_i$? + +Мы получаем вектор $\vect{a} \in \mathbb{R}^t$ следующим образом: + +$$ +\vect{a} = \text{[soft](arg)max}_{\beta} (\boldsymbol{X}^{\top}\boldsymbol{x}) +$$ + +Где $\beta$ представляет параметр обратной температуры $\text{soft(arg)max}(\cdot)$. $\boldsymbol{X}^{\top}\in\mathbb{R}^{t \times n}$ есть транспонированная матрица представлений множества $\lbrace\boldsymbol{x}_i \rbrace\_{i=1}^t$, и $\boldsymbol{x}$ представляет собой набор $\boldsymbol{x}_i$ из множества. Заметим, что $j$-я строка $X^{\top}$ соответствует элементу $\boldsymbol{x}_j\in\mathbb{R}^n$, так что $j$-я строка $\boldsymbol{X}^{\top}\boldsymbol{x}$ является скалярным произведением $\boldsymbol{x}_j$ с каждым $\boldsymbol{x}_i$ из $\lbrace \boldsymbol{x}_i \rbrace\_{i=1}^t$. + +Компоненты вектора $\vect{a}$ также называются "оценки", потому что скалярное произведение двух векторов говорит нам, как направлены или схожи два вектора. Следовательно элементы $\vect{a}$ предоставляют информацию о схожести всего множества с частным $\boldsymbol{x}_i$. + +Квадратные скобки представляют represent необязательный аргумент. Заметим, что если используется $\arg\max(\cdot)$, мы получаем унитарный вектор альф, результирующий в жёсткое внимание. С другой стороны, $\text{soft(arg)max}(\cdot)$ приводит к мягкому вниманию. В каждом случае компоненты результирующего вектора $\vect{a}$ в сумме дают 1. + +Генерируя $\vect{a}$ таким образом даёт их множество, по одному для каждого $\boldsymbol{x}_i$. Более того, каждый $\vect{a}_i \in \mathbb{R}^t$, так что мы можем образовать из альф матрицу $\boldsymbol{A}\in \mathbb{R}^{t \times t}$. + +Поскольку каждое внутреннее состояние является линейной комбинацией входов $\boldsymbol{X}$ и вектора $\vect{a}$, мы получаем множество $t$ внутренних состояний, которые можем объединить в матрицу $\boldsymbol{H}\in \mathbb{R}^{n \times t}$. + +$$ +\boldsymbol{H}=\boldsymbol{XA} +$$ + + + + + +## [Хранилище ключ-значение](https://www.youtube.com/watch?v=f01J0Dri-6k&t=1056s) + +Хранилище ключ-значение - парадигма разработанная для хранения (сохранения), извлечения (запроса) и управления ассоциативными массивами (словарями / хеш-таблицами). + +Например, скажем нам нужно найти рецепт лазаньи. У нас есть книга рецептов и поисковое слово "лазанья" - это запрос. Этот запрос проверяется для каждого возможного из ключей вашей выборки данных - в этом случае это могут быть названия всех рецептов в книге. Мы проверяем как направлен запрос по отношению к каждому названию, чтобы найти максимальную оценку совпадения между запросом и всем соответствующими ключами. Если нашим выходом является функция argmax - мы получаем один рецепт с наивысшей оценкой. В другом случае, если мы используем функцию soft argmax, мы получим вероятностное распределение и можем получить рецепты в порядке от наиболее схожего содержимого до менее и менее релевантного, соответствующего запросу. + +По сути, запрос есть вопрос. По заданному запросу, мы проверяем этот запрос по каждому ключу и получаем всё соответствующее содержимое. + + + + + +### Запросы, ключи и значения + +$$ +\begin{aligned} +\vect{q} &= \vect{W_q x} \\ +\vect{k} &= \vect{W_k x} \\ +\vect{v} &= \vect{W_v x} +\end{aligned} +$$ + +Каждый из векторов $\vect{q}, \vect{k}, \vect{v}$ может быть представлен как поворот определённого входа $\vect{x}$. Где $\vect{q}$ есть просто $\vect{x}$ повёрнутый $\vect{W_q}$, $\vect{k}$ просто $\vect{x}$ повёрнутый посредством $\vect{W_k}$ и аналогично для $\vect{v}$. Заметим, что мы впервые вводим "обучаемые" параметры. Мы также не включаем каких-либо нелинейностей, поскольку внимание полностью опирается на направление. + +Чтобы сравнить запрос с каждым из возможных ключей, $\vect{q}$ и $\vect{k}$ должны быть одинаковой размерности, *т.е.* $\vect{q}, \vect{k} \in \mathbb{R}^{d'}$. + +Однако, $\vect{v}$ может быть любой размерности. Если мы продолжим нажпример с рецептом лазаньи - нам нужно, чтобы запрос имел такую же размерность, как у ключей, *т.е.* названий различных рецептов по которым мы будем искать. Размерность соответствующего полученного рецепта, $\vect{v}$, однако может быть сколь угодно большой. Таким образом мы имеем, что $\vect{v} \in \mathbb{R}^{d''}$. + +Для простоты здесь мы сделаем предположение, что у всего размерность $d$, т.е. + +$$ +d' = d'' = d +$$ + +Так что сейчас у нас есть множество $\vect{x}$-ов, множество запросов, множество ключей и множество значений. Мы можем объединить эти множества в матрицы, каждая с $t$ столбцами, поскольку мы объединяем $t$ векторов; каждый вектор длины $d$. + +$$ +\{ \vect{x}_i \}_{i=1}^t \rightsquigarrow \{ \vect{q}_i \}_{i=1}^t, \, \{ \vect{k}_i \}_{i=1}^t, \, \, \{ \vect{v}_i \}_{i=1}^t \rightsquigarrow \vect{Q}, \vect{K}, \vect{V} \in \mathbb{R}^{d \times t} +$$ + +Мы сравниваем один запрос $\vect{q}$ с матрицей всех ключей $\vect{K}$: + +$$ +\vect{a} = \text{[soft](arg)max}_{\beta} (\vect{K}^{\top} \vect{q}) \in \mathbb{R}^t +$$ + +Затем внутренний слой будет линейной комбинацией столбцов $\vect{V}$, взвешенной коэффициентами из $\vect{a}$: + +$$ +\vect{h} = \vect{V} \vect{a} \in \mathbb{R}^d +$$ + +Поскольку у нас $t$ запросов, мы получим $t$ соответствующих $\vect{a}$ весов и следовательно матрицу $\vect{A}$ размерности $t \times t$. + +$$ +\{ \vect{q}_i \}_{i=1}^t \rightsquigarrow \{ \vect{a}_i \}_{i=1}^t, \rightsquigarrow \vect{A} \in \mathbb{R}^{t \times t} +$$ + +Следовательно в матричной записи мы имеем: + +$$ +\vect{H} = \vect{VA} \in \mathbb{R}^{d \times t} +$$ + +Отдельно мы обычно устанавливаем $\beta$ значение: + +$$ +\beta = \frac{1}{\sqrt{d}} +$$ + +Это делается для того, чтобы поддерживать постоянную температуру на протяжении различных выборов размерности $d$, и поэтому мы делим на квадратный корень числа измерений $d$. (Подумайте какая длина вектора $\vect{1} \in \R^d$.) + +Во время реализации мы можем ускорить вычисления объединяя все $\vect{W}$-ки в одну $\vect{W}$ и затем вычислить $\vect{q}, \vect{k}, \vect{v}$ за один проход: + +$$ +\begin{bmatrix} +\vect{q} \\ +\vect{k} \\ +\vect{v} +\end{bmatrix} = +\begin{bmatrix} +\vect{W_q} \\ +\vect{W_k} \\ +\vect{W_v} +\end{bmatrix} \vect{x} \in \mathbb{R}^{3d} +$$ + +Существует также концепция "голов". Выше мы видели пример с одной головой, но у нас может быть много голов. Например, скажем у нас $h$ голов, значит у нас $h$ $\vect{q}$-ек, $h$ $\vect{k}$-ек и $h$ $\vect{v}$-ек и мы получаем вектор из $\mathbb{R}^{3hd}$: + +$$ +\begin{bmatrix} +\vect{q}^1 \\ +\vect{q}^2 \\ +\vdots \\ +\vect{q}^h \\ +\vect{k}^1 \\ +\vect{k}^2 \\ +\vdots \\ +\vect{k}^h \\ +\vect{v}^1 \\ +\vect{v}^2 \\ +\vdots \\ +\vect{v}^h +\end{bmatrix} = +\begin{bmatrix} +\vect{W_q}^1 \\ +\vect{W_q}^2 \\ +\vdots \\ +\vect{W_q}^h \\ +\vect{W_k}^1 \\ +\vect{W_k}^2 \\ +\vdots \\ +\vect{W_k}^h \\ +\vect{W_v}^1 \\ +\vect{W_v}^2 \\ +\vdots \\ +\vect{W_v}^h +\end{bmatrix} \vect{x} \in \R^{3hd} +$$ + +Однако, всё ещё можем преобразовать многоголовые значения, чтобы иметь изначальную размерность $\R^d$, используя $\vect{W_h} \in \mathbb{R}^{d \times hd}$. Это просто один из возможных способов реализации хранилища ключ-значение. + + + + + +## [Трансформер](https://www.youtube.com/watch?v=f01J0Dri-6k&t=2114s) + +Расширяя наши знания о внимании в частности, мы теперь интерпретируем фундаментальные строительные блоки трансформера. В частности, мы возьмём прямой проход через базовый трансформер, и посмотрим, как внимание используется в стандартной парадигме кодировщик-декодировщик и сравним последовательные архитектуры с RNNs. + + + + + +### Архитектура Кодировщик-Декодировщик + +Мы уже знакомы с этой терминологией. Наиболее заметно это было показано на примере автокодировщика, и необходимо понимание этого момента. Резюмируя, вход подаётся в кодировщик и декодировщик налагает некоторого рода ограничения на данные, стимулируя использовать только самую важную информацию. Эта информация сохранена в выходе кодирующего блока, и может быть использована в множестве не связанных задач. + +
+
+Рисунок 1: Два примера диаграм автокодировщика. Модель слева показывает, как автокодировщик может быть спроектирован с двумя аффинными преобразованиями + активациями, где изображение справа заменяет единственный "слой" на произвольный модуль операций. +
+ +Наше "внимание" изображено на схеме автокодировщика, как показано в модели справа, и сейчас заглянем внутрь в контексте трансформеров. + + + + + +### Модуль Кодировщик + +
+
+Рисунок 2: Кодировщик трансформера, которые принимает множество входов $\vect{x}$, и выводит множество внутренних представлений $\vect{h}^\text{Enc}$. +
+ +Кодирующий модуль принимает множество входов, которые сразу подаются на блок self attention и проходят через него, достигая блока `Add, Norm`. В этот момент, они снова проходят через 1D-Свёртку и другой `Add, Norm` блок, и в результате выводятся как мнрожество внутренних представлений. Это множество внутренних представлений затем либо проходит через произвольное число кодирующих модулей (*т.е.* больше слоёв), либо через декодировщик. Теперь обсудим эти блоки более подробно. + + + + + +### Self-attention + +Модель self-attention есть обычная модель внимания. Запросы, ключи и значения сгенерированы из того же самого последовательного входа. В задачах, которые пытаются моделировать последовательные данные, позиционные кодировщики добавляются перед этим входом. Вход этого блока есть взвешенные вниманием значения. Блок self-attention принимает множество входов, из $1, \cdots , t$, и выводит $1, \cdots, t$ взевешнных вниманием значений, которые проходят через остальную часть кодировщика. + +
+
+Рисунок 3: Блок self-attention. Последовательность входов изображена как множество в третьем измерении и сконкатенирована. +
+ + + + + +#### Сумма, Норма + +Блок суммы нормы содержит два компонента. Первый - это блок суммы, который есть остаточное соеденение, и нормализация по слою. + + + + + +#### 1D-свёртка + +Продолжая этот шаг, применяется 1D-свёртка (позиционная прямая сеть). Этот блок состоит из двух полносвязных слоёв. В зависимости от заданных значений, этот блок позволяет вам настраивать размеры выхода $\vect{h}^\text{Enc}$. + + + + + +### Модуль декодировщик + +Декодировщик трансформера следует процедуре, похожей на кодировщик. Однако, тут есть дополнительный блок, который принимается во внимание. Дополнительно, входы этого модуля различны. + +
+
+Рисунок 4: Более дружелюбное объяснение декодировщика. +
+ + + + + +#### Перекрёстное-внимание + +Перекрёстное внимание следует настройке запросов, ключей и значений, используемой в блоках self-attention. Однако, входы немного более сложные. Вход в декодировщик - это точка данных $\vect{y}\_i$, которая затем проходит через self attention и блоки суммы нормы, и наконец завершается блоком перекрёстного внимания. Это служит запоросом перекрёстного внимания, где пары ключей и значений есть выходы $\vect{h}^\text{Enc}$, где этот выход рассчитывается со всеми прошлыми входами $\vect{x}\_1, \cdots, \vect{x}\_{t}$. + + + + + +## Резюме + +Множество от $\vect{x}\_1$ до $\vect{x}\_{t}$ проходит через кодировщик. Используя self-attention и несколько других блоков, получаем представление выхода $\lbrace\vect{h}^\text{Enc}\rbrace_{i=1}^t$, которое подаётся на декодировщик. После применения к нему self-attention, применяется перекрёстное внимание. В этом блоке запрос соответствует представлению символа в целевом языке $\vect{y}\_i$, а ключ и значения из предложения на исходном языке (от $\vect{x}\_1$ до $\vect{x}\_{t}$). Интуитивно, перекрёстное внимание находит, какие значения во входной последовательности наиболее релевантны к построению $\vect{y}\_t$, и затем заслуживают наивысшие коэффициенты внимания. Выход этого перекрёстного внимания затем проходит через ещё один блок 1D-свёртки, имеем $\vect{h}^\text{Dec}$. Для указанного целевого языка, отсюда легко увидеть, как начать обучение, сравнивая $\lbrace\vect{h}^\text{Dec}\rbrace_{i=1}^t$ с некоторыми целевыми данными. + + + + + +### Мировые модели языка + +Есть несколько важных фактов, которые мы опустили выше, чтобы объяснить наиболее важных модулей трансформера, но нам нужно обсудить их сейчас, чтобы понимать, как трансформеры могут достичь state-of-the-art результатов в задачах языка. + + + + + +#### Позиционное кодирование + +Механизмы внимания позволяют нам параллелизовать операции и сильно ускорить время обучения модели, но теряется последовательность информации. Функция позционного кодирования позволяет нам захватить этот контекст. + + + + + +#### Сематические представления + +На протяжении обучения трансформера, генерируется множество внутренних представлений. Чтобы создать пространство характеристик, подобное тому, которое использовалось в примере модели мирового языка на PyTorch, выход перекрёстного внимания предоставит семантическое представление слова $x_i$, после чего можно проводить дальнейшие эксперименты на этой выборке данных. + + + + + +### Резюме кода + +Сейчас мы увидим блоки трансформера, обсуждённые выше в намного более понятном формате, давайте кодить! + +Первый модуль, который мы рассмотрим - блок много-голового внимания. В зависимости от запроса, ключа и значений поданных на вход этого блока, он может быть использован, либо для self-attention, либо для перекрёстного внимания. + + +```python +class MultiHeadAttention(nn.Module): + def __init__(self, d_model, num_heads, p, d_input=None): + super().__init__() + self.num_heads = num_heads + self.d_model = d_model + if d_input is None: + d_xq = d_xk = d_xv = d_model + else: + d_xq, d_xk, d_xv = d_input + # Embedding dimension of model is a multiple of number of heads + assert d_model % self.num_heads == 0 + self.d_k = d_model // self.num_heads + # These are still of dimension d_model. To split into number of heads + self.W_q = nn.Linear(d_xq, d_model, bias=False) + self.W_k = nn.Linear(d_xk, d_model, bias=False) + self.W_v = nn.Linear(d_xv, d_model, bias=False) + # Outputs of all sub-layers need to be of dimension d_model + self.W_h = nn.Linear(d_model, d_model) +``` + + +Инициализация класса многоголового внимания. Если подан `d_input`, он становится перекрёстным вниманием. В ином случае - self-attention. Настройка запроса, ключа, значения строится как линейное преобразование входа `d_model`. + + +```python +def scaled_dot_product_attention(self, Q, K, V): + batch_size = Q.size(0) + k_length = K.size(-2) + + # Scaling by d_k so that the soft(arg)max doesnt saturate + Q = Q / np.sqrt(self.d_k) # (bs, n_heads, q_length, dim_per_head) + scores = torch.matmul(Q, K.transpose(2,3)) # (bs, n_heads, q_length, k_length) + + A = nn_Softargmax(dim=-1)(scores) # (bs, n_heads, q_length, k_length) + + # Get the weighted average of the values + H = torch.matmul(A, V) # (bs, n_heads, q_length, dim_per_head) + + return H, A +``` + +Возвращает внутренний слой, соответствующий кодам значений после масштабирования вектором внимания. Для целей учёта (какие значения в последовательности были замаскированы вниманием?) A также возвращается. + +```python +def split_heads(self, x, batch_size): + return x.view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) +``` + +Разделим последнюю размерность на (`heads` × `depth`). Возвращает результат после транспонирования в форме (`batch_size` × `num_heads` × `seq_length` × `d_k`) + +```python +def group_heads(self, x, batch_size): + return x.transpose(1, 2).contiguous(). + view(batch_size, -1, self.num_heads * self.d_k) +``` + +Комбинирует головы внимания вместе, чтобы получить правильную форму, совместимую с размером батча и длиной последовательности. + +```python +def forward(self, X_q, X_k, X_v): + batch_size, seq_length, dim = X_q.size() + # After transforming, split into num_heads + Q = self.split_heads(self.W_q(X_q), batch_size) + K = self.split_heads(self.W_k(X_k), batch_size) + V = self.split_heads(self.W_v(X_v), batch_size) + # Calculate the attention weights for each of the heads + H_cat, A = self.scaled_dot_product_attention(Q, K, V) + # Put all the heads back together by concat + H_cat = self.group_heads(H_cat, batch_size) # (bs, q_length, dim) + # Final linear layer + H = self.W_h(H_cat) # (bs, q_length, dim) + return H, A +``` + +Прямой проход многоголового внимания. + +Заданные входы разделяет на q, k и v, после чего эти значения проходят через масштабированное скалярное произведение механизма внимания, конкатенируются и проходят через конечный линейный слой. Последний выход блока внимания есть полученное внимание, и внутреннее предстваление, которое проходит через остальные блоки. + +Следующий блок, демонстрируемый в трансформере/кодировщике, является Суммой,Нормой, которые являются функциями, уже встроенными в PyTorch. Таким образом, это чрезвычайно простая реализация, и для неё не нужен отдельный класс. Затем идёт 1-D свёрточный блок. Пожалуйста обратитесь к предыдущим разделами для более подробной информации. + +Теперь, когда все наши основные классы построены (или встроены для нас), мы перейдём к модулю кодировщику. + +```python +class EncoderLayer(nn.Module): + def __init__(self, d_model, num_heads, conv_hidden_dim, p=0.1): + self.mha = MultiHeadAttention(d_model, num_heads, p) + self.layernorm1 = nn.LayerNorm(normalized_shape=d_model, eps=1e-6) + self.layernorm2 = nn.LayerNorm(normalized_shape=d_model, eps=1e-6) + + def forward(self, x): + attn_output, _ = self.mha(x, x, x) + out1 = self.layernorm1(x + attn_output) + cnn_output = self.cnn(out1) + out2 = self.layernorm2(out1 + cnn_output) + return out2 +``` + +В самых мощных трансформерах произвольно большое количество этих кодировщиков соединены друг с другом. + +Вспомните, что self attention само по себе не имеет каких-либо циклов или свёрток, но это то, что позволяет выполнять его так быстро. Чтобы сделать его чувствительным к положению, мы обеспечиваем позиционные кодировки. Они вычисляются следующим образом: + + +$$ +\begin{aligned} +E(p, 2i) &= \sin(p / 10000^{2i / d}) \\ +E(p, 2i+1) &= \cos(p / 10000^{2i / d}) +\end{aligned} +$$ + + +Чтобы не занимать слишком много места на мелких деталях, мы отсылаем вас к https://github.com/Atcold/pytorch-Deep-Learning/blob/master/15-transformer.ipynb для полного кода, использованного здесь. + + +Весь кодировщик, с N последовательными слоями кодировщиками, а также позиционные характеристики, написаны следующим образом: + + +```python +class Encoder(nn.Module): + def __init__(self, num_layers, d_model, num_heads, ff_hidden_dim, + input_vocab_size, maximum_position_encoding, p=0.1): + self.embedding = Embeddings(d_model, input_vocab_size, + maximum_position_encoding, p) + self.enc_layers = nn.ModuleList() + for _ in range(num_layers): + self.enc_layers.append(EncoderLayer(d_model, num_heads, + ff_hidden_dim, p)) + def forward(self, x): + x = self.embedding(x) # Transform to (batch_size, input_seq_length, d_model) + for i in range(self.num_layers): + x = self.enc_layers[i](x) + return x # (batch_size, input_seq_len, d_model) +``` + + + + + +## Пример использования + +Есть множество задач, где вы можете использовать только Кодировщик. В прилагаемой рабочей тетради, мы увидим, как кодировщик может быть использован для анализа настроений. + +Используя выборку данных обзоров imdb, мы можем выводить из кодировщика скрытое представление последовательности текста, и обучить этот процесс кодирования с двоичной перекрёстной энтропией, соответствующей положительному или негативному обзору фильма. + +Опять мы опускаем азы, и направляем вас к рабочей тетради, но здесь есть наиболее важные компоненты архитектуры, используемые в трансформере: + + + +```python +class TransformerClassifier(nn.Module): + def forward(self, x): + x = Encoder()(x) + x = nn.Linear(d_model, num_answers)(x) + return torch.max(x, dim=1) + +model = TransformerClassifier(num_layers=1, d_model=32, num_heads=2, + conv_hidden_dim=128, input_vocab_size=50002, num_answers=2) +``` +Где эта модель обучается типичным образом. diff --git a/docs/ru/week12/12.md b/docs/ru/week12/12.md new file mode 100644 index 000000000..6bea6d8f9 --- /dev/null +++ b/docs/ru/week12/12.md @@ -0,0 +1,30 @@ +--- +lang: ru +lang-ref: ch.12 +title: Неделя 12 +translation-date: 01 Dec 2020 +translator: Evgeniy Pak +--- + + + +## Часть A лекции + + + +В этом разделе мы обсуждаем различные архитектуры, используемые в приложениях обработки естественного языка, начиная с CNNs, RNNs, и, в конечном итоге, рассматривая state-of-the-art архитектуру, трансформеры. Затем мы обсуждаем различные модули, которые включают трансформеры и то, как они дают преимущество трансформерам в задачах естественной обработки языка. В итоге мы обсудим приёмы, позволяющие эффективно обучать трансформеры. + + + +## Часть B лекции + + + +В этом разделе мы знакомим с лучевым поиском как золотой серединой между жадным декодированием и полным перебором. Мы рассматриваем случай, когда требуется выборка из порождающего распределения (*т.e.* при генерации текста) и вводим понятие "top-k" выборки. Затем мы знакомим с моделями sequence to sequence (в варианте трансформера) и обратным переводом. После рассматриваем подход обучения без учителя к обучению характеристик и обсуждаем word2vec, GPT и BERT. + + +## Практикум + + + +Вводим понятие внимания, фокусируясь на self-attention и его представлениях входов на скрытом слое. Затем мы представляем парадигму хранилища ключ-значение и обсуждаем, как представить запросы, ключи и значения, как повороты входов. Наконец мы используем внимание для интерпретации архитектуры трансформер, взяв результат прямого прохода через базовый трансформер и сравнивая парадигму кодирования-декодирования с последовательной архитектурой. diff --git a/docs/sr/README-SR.md b/docs/sr/README-SR.md index 868fdfff4..3d0b42e44 100644 --- a/docs/sr/README-SR.md +++ b/docs/sr/README-SR.md @@ -1,9 +1,9 @@ # Duboko učenje (u PyTorch-u) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Atcold/pytorch-Deep-Learning/master) -Ovaj repozitorijum ima [prateći sajt](https://atcold.github.io/pytorch-Deep-Learning/) gde se svi materijali kursa mogu naći u video i tekstualnom formatu. +Ovaj repozitorijum ima [prateći sajt](https://atcold.github.io/pytorch-Deep-Learning/) gde se svi materijali kursa mogu naći u video i tekstualnom formatu. - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md) # Podešavanja @@ -15,7 +15,7 @@ Naredne instrukcije rade za Mac i Ubuntu Linux, a za Windows je potrebno da se i ## Podešavanje radnog okruženja Potrebno je otići na [sajt Anaconda](https://conda.io/miniconda.html). -Skinuti i instalirat *najnoviju* Miniconda verziju za *Python* 3.7 za vaš operativni sistem. +Skinuti i instalirati *najnoviju* Miniconda verziju za *Python* 3.7 za vaš operativni sistem. ```bash wget @@ -60,7 +60,7 @@ jupyter notebook ## Vizuelizacija Notebook-a -*Jupyter Notebooks* se koriste kroz lekcije za interaktivnu analizu podataka i vizualizaciju. +*Jupyter Notebooks* se koriste kroz lekcije za interaktivnu analizu podataka i vizualizaciju. Koristimo tamni stil i za *GitHub* i *Jupyter Notebook*. Trebalo bi podesiti isto jer inače neće izgledati lepo. diff --git a/docs/sr/index.md b/docs/sr/index.md index 245ed9069..d77300643 100644 --- a/docs/sr/index.md +++ b/docs/sr/index.md @@ -1,8 +1,9 @@ --- layout: default -title: DEEP LEARNING +title: DUBOKO UČENJE author: Alfredo Canziani lang-ref: home +lang: sr --- **DS-GA 1008 · PROLEĆE 2020 · [NYU CENTAR ZA DATA SCIENCE](http://cds.nyu.edu/)** @@ -10,13 +11,13 @@ lang-ref: home | PREDAVAČI | Yann LeCun & Alfredo Canziani | | LEKCIJE | Ponedeljak 16:55 – 18:35, [GCASL C95](http://library.nyu.edu/services/campus-media/classrooms/gcasl-c95/) | | VEŽBE | Utorak 19:10 – 20:00, [GCASL C95](http://library.nyu.edu/services/campus-media/classrooms/gcasl-c95/) | -| [PIAZZA](https://piazza.com/nyu/spring2020/dsga1008/home) | Pristupni kod: `DLSP20` | +| FORUM | [r/NYU_DeepLearning](https://www.reddit.com/r/NYU_DeepLearning/) | | MATERIJALI | [Google Drive](https://bitly.com/DLSP20), [Notebooks](https://github.com/Atcold/pytorch-Deep-Learning) | ## Opis -Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacije. Fokusira se na nadgledano i nenadgledano učenje, embedding metode, učenje metrika, konvolucione i rekurentne neuronske mreže, sa primenama u kompjuterskoj viziji, razumevanju prirodnog jezika i prepoznavanju govora. Potrebno predznanje: [DS-GA 1001 Intro to Data Science](https://cds.nyu.edu/academics/ms-curriculum/) ili kurs mašinskog učenja na nivou master ili doktorskih studija. +Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. Fokusira se na nadgledano i nenadgledano učenje, embedding metode, učenje metrika, konvolucione i rekurentne neuronske mreže, sa primenama u računarskoj viziji, razumevanju prirodnog jezika i prepoznavanju govora. Potrebno predznanje: [DS-GA 1001 Intro to Data Science](https://cds.nyu.edu/academics/ms-curriculum/) ili kurs mašinskog učenja na nivou master ili doktorskih studija. ## Lekcije @@ -135,7 +136,7 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacije. F 🎥 - Rekurentne neuronske mreže (RNN) i attention mehanizam + Rekurentne neuronske mreže (RNN) i mehanizam pažnje (attention) Praktikum Obučavanje RNN @@ -176,7 +177,7 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacije. F 🎥 - Regularizovani latent + Regularizovani latentni modeli energije Praktikum Obučavanje varijacionih autoenkodera (VAE) @@ -210,13 +211,13 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacije. F Lekcije - Kompjuterska vizija (CV) SSL I + Računarska vizija (CV) SSL I 🖥️ 🎥 - Kompjuterska vizija (CV) SSL II + Računarska vizija (CV) SSL II Praktikum Prediktivno upravljanje @@ -261,7 +262,7 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacije. F Duboko učenje za obradu prirodnih jezika (NLP) II Praktikum - Attention mehanizam i transformer + Mehanizmi pažnje (attention) i Transformeri 🖥️ 📓 @@ -272,16 +273,16 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacije. F Lekcije - Graf-konvolucione mreže (GCN) I + Grafovske konvolucione mreže (GCN) I 🖥️ 🎥 - Graf-konvolucione mreže (GCN) II + Grafovske konvolucione mreže (GCN) II Praktikum - Graf-konvolucione mreže (GCN) III + Grafovske konvolucione mreže (GCN) III 🖥️ 📓 @@ -298,7 +299,7 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacije. F 🎥 - Grafovske metode + Grafičke metode Praktikum Regularizacija i Bajesovske neuronske mreže @@ -318,10 +319,10 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacije. F | Uloga| Slika | Kontakt | O nama | |:-----|:-----:|:--------|:------| -|Predavač ||Yann LeCun
yann@cs.nyu.edu|Silver profesor računarskih nauka na NYU
i dobitnih Turing nagrade| +|Predavač ||Yann LeCun
yann@cs.nyu.edu|Silver Profesor računarskih nauka na NYU
i dobitnih Turing nagrade| |Predavač ||Alfredo Canziani
canziani@nyu.edu|Asst. Prof. računarskih nauka na NYU| -|Asistent ||Mark Goldstein
goldstein@nyu.edu|PhD student računarskih nauka na NYU| -|Webmaster ||Zeming Lin
zl2799@nyu.edu|PhD student računarskih nauka na NYU| +|Asistent ||Mark Goldstein
goldstein@nyu.edu|Doktorski student računarskih nauka na NYU| +|Webmaster ||Zeming Lin
zl2799@nyu.edu|Doktorski student računarskih nauka na NYU| -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md)   [🇧🇩](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/bn/README-BN.md) diff --git a/docs/vi/README-VI.md b/docs/vi/README-VI.md index bd683d594..4e4369886 100644 --- a/docs/vi/README-VI.md +++ b/docs/vi/README-VI.md @@ -2,8 +2,8 @@ Notebook này hiện đang được phát hành tại [trang web](https://atcold.github.io/pytorch-Deep-Learning/), nơi tất cả tài liệu của khóa học có thể được tìm thấy ở định dạng video hoặc văn bản. - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md)   [🇧🇩](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/bn/README-BN.md) # Bắt đầu diff --git a/docs/vi/index.md b/docs/vi/index.md index 660d019a0..d04f32ad1 100644 --- a/docs/vi/index.md +++ b/docs/vi/index.md @@ -18,7 +18,7 @@ translator: Huynh Nguyen ## Mô tả khóa học -Khóa học này liên quan đến các kỹ thuật mới nhất trong học sâu (Deep learning) và học biểu diễn (Representation learning), nội dung tập trung vào học sâu có giám sát (Supervised earning) và không giám sát (Unsupervised learning), phương pháp nhúng (Embedding method), học số liệu (Metric learning), mạng tích chập (Convolutional) và lặp lại (recurrent nets), với các ứng dụng cho thị giác máy tính (Computer vision), hiểu ngôn ngữ tự nhiên (Natural language understanding) và nhận diện giọng nói (Speech recognition). Các điều kiện tiên quyết, bao gồm: Giới thiệu về khoa học dữ liệu ([DS-GA 1001](https://cds.nyu.edu/academics/ms-curriculum/)) hoặc các khóa học máy học cấp độ sau đại học. +Khóa học này liên quan đến các kỹ thuật mới nhất trong học sâu (Deep learning) và học biểu diễn (Representation learning), nội dung tập trung vào học sâu có giám sát (Supervised learning) và không giám sát (Unsupervised learning), các phương pháp nhúng (Embedding methods), học số liệu (Metric learning), mạng tích chập (Convolutional) và lặp lại (recurrent nets), với các ứng dụng cho thị giác máy tính (Computer vision), hiểu ngôn ngữ tự nhiên (Natural language understanding) và nhận diện giọng nói (Speech recognition). Các điều kiện tiên quyết, bao gồm: Giới thiệu về khoa học dữ liệu ([DS-GA 1001](https://cds.nyu.edu/academics/ms-curriculum/)) hoặc các khóa học máy học cấp độ sau đại học. ## Bài giảng diff --git a/docs/vi/week01/01-1.md b/docs/vi/week01/01-1.md index 03fe03fb8..8351fa17e 100644 --- a/docs/vi/week01/01-1.md +++ b/docs/vi/week01/01-1.md @@ -12,58 +12,58 @@ translator-date: 01 Oct 2020 ## [Nội dung](https://www.youtube.com/watch?v=0bMe_vCZo30&t=217s) -- Kiến thức cơ bản của học có giám sát (Supervised Learning), mạng thần kinh (Neural Nets) và học sâu (Deep Learning) -- Lan truyền ngược và các thành phần kiến trúc -- Mạng lưới thần kinh tích chập và các ứng dụng của nó -- Các kiến trúc học sâu -- Thủ thuật quy định hóa/ Thủ thuật tối ưu hóa/ Hiểu cách hoạt động của Học sâu -- Mô hình dưa trên năng lượng -- Học giám sát và hơn thế nữa +- Kiến thức cơ bản của học có giám sát (Supervised Learning), mạng thần kinh (Neural Nets) và học sâu (Deep Learning). +- Lan truyền ngược và các thành phần kiến trúc của nó. +- Mạng lưới thần kinh tích chập và các ứng dụng của nó. +- Các kiến trúc học sâu. +- Thủ thuật quy định hóa/ Thủ thuật tối ưu hóa/ Hiểu cách hoạt động của học sâu. +- Mô hình dựa trên năng lượng. +- Học giám sát và hơn thế nữa. ## Cảm hứng của học sâu và lịch sử của nó -Ở cấp độ khái niệm, học sâu được truyền từ bộ não người, nhưng không phải tất cả các chi tiết của bộ não người điều có liên quan. Để so sánh, máy bay được lấy cảm hứng từ chim. Nguyên lý bay thì giống nhau, nhưng các chi tiết thì hoàn toàn khác nhau. +Ở cấp độ khái niệm, học sâu được truyền cảm hứng từ bộ não người, nhưng không phải tất cả các chi tiết của bộ não người điều có liên quan. Để so sánh, máy bay được lấy cảm hứng từ chim, về nguyên lý bay thì giống nhau, nhưng các chi tiết thì hoàn toàn khác nhau. -Lịch sử của học sâu được quay trở lại từ một lĩnh vực đã được đổi tên là điều khiển học. Nó bắt đầu bởi McCulloch và Pitts vào những năm 1940. Họ đã đưa ra ý tưởng rằng các nơ-ron những đơn vị ngưỡng có trạng thái bật và tắt. Bạn có thể xây dựng mạch Boolean bằng cách kết nối các nơ-ron với nhau và tiến hành suy luận logic với các nơ-ron đó. Bộ não người về cơ bản là một cổ máy suy luận logic bởi vì các tế bào thần kinh là một hệ nhị phân.Các tế bào thần kinh tính toán tổng trọng số của các đầu vào so sánh tổng trọng số đó với ngưỡng của nó. Nó sẽ bật nếu nó ở trên ngưỡng và tắt nếu ở dưới ngưỡng, đó là cái nhìn đơn giảng về cách mạng lưới thần kinh hoạt động. +Lịch sử của học sâu được quay trở lại từ một lĩnh vực đã được đổi tên gọi là điều khiển học. Nó bắt đầu bởi McCulloch và Pitts vào những năm 1940. Họ đã đưa ra ý tưởng rằng các nơ-ron (thần kinh) những đơn vị ngưỡng có trạng thái bật và tắt. Bạn có thể xây dựng mạch Boolean bằng cách kết nối các nơ-ron với nhau và tiến hành suy luận logic với các nơ-ron đó. Bộ não người về cơ bản là một cổ máy suy luận logic bởi vì các tế bào thần kinh là một hệ nhị phân. Các tế bào thần kinh tính toán tổng trọng số của các đầu vào so sánh tổng trọng số đó với ngưỡng của nó. Nó sẽ bật nếu nó ở trên ngưỡng và tắt nếu ở dưới ngưỡng, đó là cái nhìn đơn giản về cách mạng lưới thần kinh hoạt động. -Năm 1947, Donald Hebb có ý tưởng rằng các tế bào thần kinh trong não hoạt động bằng cách điều chỉnh độ bền của các kết nối giữa các nơ-ron với nhau. Đây được gọi là siêu học (hyper learning, trong đó nếu hai tế bào thần kinh được kích hoạt cùng nhau, thì kết nối liên kết giữa chúng sẽ tăng lên; nếu chúng không được kích hoạt bằng nhau, thì kết nối liên kết giữa chúng sẽ giảm xuống. +Năm 1947, Donald Hebb có ý tưởng rằng các tế bào thần kinh trong não hoạt động bằng cách điều chỉnh độ bền của các kết nối giữa các nơ-ron với nhau. Đây được gọi là siêu học (hyper learning), trong đó nếu hai tế bào thần kinh được kích hoạt cùng nhau, thì kết nối liên kết giữa chúng sẽ tăng lên; nếu chúng không được kích hoạt bằng nhau, thì kết nối liên kết giữa chúng sẽ giảm xuống. Sau đó vào năm 1948, điều khiển học được Norbert Wiener đề xuất, ý tưởng rằng bằng cách có các hệ thống với cảm biến và cơ cấu chấp hành, bạn có một vòng phản hồi và một hệ thống tự điều chỉnh. Các quy luật của cơ chế phản hồi của ô tô đều xuất phát từ công việc này. -Năm 1957, Frank Rosenblatt đề xuất Perceptron, là một thuật toán học sửa đổi trọng số của các mạng nơ-ron rất đơn giản. +Năm 1957, Frank Rosenblatt đề xuất Perceptron, nó là một thuật toán phân lớp sửa đổi trọng số của các mạng nơ-ron rất đơn giản. Nhìn chung, ý tưởng cố gắng tạo ra những cỗ máy trí tuệ bằng cách mô phỏng rất nhiều tế bào thần kinh ra đời vào những năm 1940, phát triển vào những năm 1950 và hoàn toàn chết vào cuối những năm 1960. Những lý do chính khiến lĩnh vực này chết dần vào năm 1960 là: -- Các nhà nghiên cứu đã sử dụng các tế bào thần kinh có dạng nhị phân (binary). Tuy nhiên, cách để lan truyền ngược (backpropagation) hoạt động là sử dụng các chức năng kích hoạt (activation functions) liên tục. Vào thời điểm đó, các nhà nghiên cứu không có ý tưởng sử dụng các tế bào thần kinh liên tục và họ cũng không nghĩ rằng họ có thể đào tạo với độ dốc (gradient) vì các tế bào thần kinh nhị phân không khác biệt. +- Các nhà nghiên cứu đã sử dụng các tế bào thần kinh có dạng nhị phân (binary). Tuy nhiên, cách để lan truyền ngược (backpropagation) hoạt động là sử dụng các hàm kích hoạt (activation functions) liên tục. Vào thời điểm đó, các nhà nghiên cứu không có ý tưởng sử dụng các tế bào thần kinh liên tục và họ cũng không nghĩ rằng họ có thể đào tạo với độ dốc (gradient) vì các tế bào thần kinh nhị phân không khác biệt. - Với các tế bào thần kinh liên tục, người ta sẽ phải nhân kích hoạt của một tế bào thần kinh với một trọng số để có được một phần đóng góp vào tổng trọng số. Tuy nhiên, trước năm 1980, phép nhân hai số, đặc biệt là các số thập phân, rất chậm. Điều này dẫn đến một động cơ khác để tránh sử dụng các tế bào thần kinh liên tục. -Học dâu lại thành công trở lại vào 1985 với sự xuất hiện của việc lan truyền ngược. Năm 1995, lĩnh vực này lại chết một lần nữa và cộng đồng máy học (machine learning) từ bỏ ý tưởng về mạng lưới thần kinh. Năm 2010, mọi người bắt đầu sử dụng mạng nơ-ron trong nhận dạng giọng nói với sự cải thiện hiệu xuất rất lớn và sau đó nó được triển khai rộng rãi trong lĩnh vực thương mại. Năm 2013, thị giác máy tính bắt đầu chuyển sang mạng nơ-ron. Năm 2016, quá trình chuyển đổi tương tự cũng xảy ra trong xử lý ngôn ngữ tự nhiên. Chẳng bao lâu nữa, các cuộc cách mạng tương tự sẽ xảy ra trong lĩnh vực robot, điều khiển và nhiều lĩnh vực khác. +Học sâu lại thành công trở lại vào 1985 với sự xuất hiện của việc lan truyền ngược. Năm 1995, lĩnh vực này lại chết một lần nữa và cộng đồng máy học (Machine learning) từ bỏ ý tưởng về mạng lưới thần kinh. Năm 2010, mọi người bắt đầu sử dụng mạng nơ-ron trong nhận dạng giọng nói với sự cải thiện hiệu xuất rất lớn và sau đó nó được triển khai rộng rãi trong lĩnh vực thương mại. Năm 2013, thị giác máy tính bắt đầu chuyển sang mạng nơ-ron. Năm 2016, quá trình chuyển đổi tương tự cũng xảy ra trong xử lý ngôn ngữ tự nhiên. Chẳng bao lâu nữa, các cuộc cách mạng tương tự sẽ xảy ra trong lĩnh vực robot, điều khiển và nhiều lĩnh vực khác. ### Học giám sát -90% các ứng dụng học sâu sử dụng phương pháp học giám sát. Học giám sát là một quá trìn, trong đó các bạn thu thập một loạt các cặp đầu vào và đầu ra, và các đầu vào được đưa vào một máy để học các đầu ra chính xác. Khi các đầu ra chính xác, bạn không cần làm gì nữa. Nếu đầu ra sai, bạn chỉnh lại tham số của máy và sửa đầu ra theo hướng bạn muốn. Bí quyết ở đây là cách bạn tìm ra hướng và mức độ các bạn điều chỉnh tham số và điều này quay trở lại tính toán độ dôc (gradient) và lan truyền ngược. +90% các ứng dụng học sâu sử dụng phương pháp học giám sát. Học giám sát là một quá trình, trong đó các bạn thu thập một loạt các cặp đầu vào và đầu ra, và các đầu vào được đưa vào một máy để học các đầu ra chính xác. Khi các đầu ra chính xác, bạn không cần làm gì nữa. Nếu đầu ra sai, bạn chỉnh lại tham số của máy và sửa đầu ra theo hướng bạn muốn. Bí quyết ở đây là cách bạn tìm ra hướng, mức độ các bạn điều chỉnh tham số và điều này quay trở lại tính toán độ dốc (gradient) và lan truyền ngược. Học giám sát bắt nguồn từ Perceptron và Adaline. Adaline dựa trên cùng một kiến trúc với các đầu vào có trọng số, khi nó ở trên ngưỡng, nó sẽ bật và dưới ngưỡng, nó sẽ đóng. Perceptron là một nơ-ron 02 lớp, lớp thứ 02 có thể huấn luyện được và lớp thứ 01 được cố định. Hầu hết thời gian, lớp đầu tiên được xác định ngẫu nhiên và đó là những gì họ gọi là các lớp liên kết (associative layers) ## [Lịch sử của nhận dạng mẫu (Pattern recognition) và giới thiệu về giảm dần độ dốc (Gradient Descent)](https://www.youtube.com/watch?v=0bMe_vCZo30&t=1461s) -Những điều đã nói ở trên là cơ sở của khái niệm nhận dạng mẫu trước khi học sâu được phát triển. Mô hình của nhận dạng mẫu bao gồm bộ trích xuất đặc trưng và bộ phân loại có thể đào tạo được. Đầu vào đi vào trình trích xuất đặc trưng, trích xuất các đặc điểm hữu ích có liên quan của đầu vào, chẳng hạn như phát hiện mặt cho mục đích nhận dạng gương mặt. Sau đó, các vec-tơ dặc trưng được đưa đến bộ phân loại có thể đào tạo để tính toán tổng trọng số và so sánh nó với ngưỡng. Ở đây, một bộ phân loại có thể đào tạo được có thể là một Perceptron hoặc là một mạng lưới thần kinh. Vấn đề trích xuất đặc trưng nên được tạo ra bằng tay. Có nghĩa là, nhận dạng mẫu hoặc thị giác máy tính tập trung vào trình trích xuất đặc trưng xm xét đến cách thiết kế nó cho một vấn đề cụ thể, không dành nhiều cho bộ phân loại có thể đào tạo dược, +Những điều đã nói ở trên là cơ sở của khái niệm nhận dạng mẫu trước khi học sâu được phát triển. Mô hình của nhận dạng mẫu bao gồm bộ trích xuất đặc trưng và bộ phân loại có thể đào tạo được. Đầu vào đi vào trình trích xuất đặc trưng, trích xuất các đặc điểm hữu ích có liên quan của đầu vào, chẳng hạn như phát hiện mặt cho mục đích nhận dạng gương mặt. Sau đó, các véc-tơ dặc trưng được đưa đến bộ phân loại có thể đào tạo để tính toán tổng trọng số và so sánh nó với ngưỡng. Ở đây, một bộ phân loại có thể đào tạo được có thể là một Perceptron hoặc là một mạng lưới thần kinh. Vấn đề trích xuất đặc trưng nên được tạo ra bằng tay. Có nghĩa là "nhận dạng mẫu hoặc thị giác máy tính tập trung vào trình trích xuất đặc trưng xem xét đến cách thiết kế nó cho một vấn đề cụ thể, không dành nhiều cho bộ phân loại có thể đào tạo dược". -Sau sự xuất hiện và phát triển của học sâu, quy trình 2 giai đoạn được chuyển sang trình tự của các mô-đun. Mỗi mô-đun có các tham số và phi tuyến tính có thể điều chỉnh. Sau đó, xếp chúng thành nhiều lớp. Đây là lý do tại sao nó được gọi là “học sâu”. Lý do tại sao sử dụng phi tuyến tính thay vì tuyến tính? Là hai lớp tuyến tính có thể có một lớp tuyến tính nhưng đả bảo khi hợp thành của hai tuyến tính là tuyến tính. +Sau sự xuất hiện và phát triển của học sâu, quy trình 2 giai đoạn được chuyển sang trình tự của các mô-đun. Mỗi mô-đun có các tham số và phi tuyến tính có thể điều chỉnh. Sau đó, xếp chúng thành nhiều lớp. Đây là lý do tại sao nó được gọi là “học sâu”. Lý do tại sao sử dụng phi tuyến tính thay vì tuyến tính? Là hai lớp tuyến tính có thể là một lớp tuyến tính, vì thành phần của hai tuyến tính là tuyến tính. -Kiến trúc nhiều lớp đơn giản nhất với tham số và phi tuyến tính có thể được điều chỉnh là: Đầu vào được biểu dưới dạng vec-tơ như hình ảnh hay âm thanh. Đầu vào này được nhân với một ma trận trọng số có hệ số là một tham số có thể điều chỉnh được. Sau đó, mọi thành phần của vec-tơ kết quả được chuyển qua một hàm phi tuyến tính như ReLU. Lặp lại quá trình này, nó sẽ trở thành một mạng nơ-ron cơ bản.Lý do tại sao nó được gọi là mạng nơ-ron? Là vì kiến trúc này tính toán tổng trọng số của các thành phần đầu vào theo các hàng tương ứng của ma trận. +Kiến trúc nhiều lớp đơn giản nhất với tham số và phi tuyến tính có thể được điều chỉnh là: Đầu vào được biểu dưới dạng véc-tơ như hình ảnh hay âm thanh. Đầu vào này được nhân với một ma trận trọng số có hệ số là một tham số có thể điều chỉnh được. Sau đó, mọi thành phần của véc-tơ kết quả được chuyển qua một hàm phi tuyến tính như ReLU. Lặp lại quá trình này, nó sẽ trở thành một mạng nơ-ron cơ bản. Lý do tại sao nó được gọi là mạng nơ-ron? Là vì kiến trúc này tính toán tổng trọng số của các thành phần đầu vào theo các hàng tương ứng của ma trận. -Quay lại quan điểm của học giám sát, chúng tôi so sánh kết quả đầu ra với đầu ra mục tiêu, sau đó tối ưu hóa hàm mục tiêu là mất mát/ tổn thất, có nghĩa là tính toán khoảng cách giữa kết quả đầu ra với mục tiêu. Sau đó, tính trung bình hàm chi phí (cost function) này trên tập huấn luyện. Đây là mục đích mà chúng tôi muốn giảm thiểu. Nói cách khác, chúng tôi muốn tìm giá trị của các tham số tốt thiểu trung bình này. +Quay lại quan điểm của học giám sát, chúng tôi so sánh kết quả đầu ra với đầu ra mục tiêu, sau đó tối ưu hóa hàm mục tiêu là mất mát/ tổn thất, có nghĩa là tính toán khoảng cách giữa kết quả đầu ra với đầu ra mục tiêu. Sau đó, tính trung bình hàm chi phí (cost function) này trên tập huấn luyện. Đây là mục đích mà chúng tôi muốn giảm thiểu. Nói cách khác, chúng tôi muốn tìm giá trị của các tham số tốt thiểu trung bình này. -Phương pháp tìm nó là tính toán độ dốc. Ví dụ, nếu chúng ta đang lạc vào một ngọn núi đầy sương mù và muốn đến một ngôi làng trong thung lũng. Một cách là quay đầu lại và xem con đường nào dốc nhất và đi xuống với từng bước nhỏ. Hướng đi là độ dốc âm. Với giả định rằng thung lũng là mặt lồi, như thế chúng ta có thể đi đến thung lũng. +Phương pháp tìm nó là tính toán độ dốc. Ví dụ, nếu chúng ta đang lạc vào một ngọn núi đầy sương mù và muốn đến một ngôi làng trong thung lũng. Một cách là quay đầu lại và xem con đường nào dốc nhất và đi xuống với từng bước nhỏ. Hướng đi là độ dốc âm. Với giả định rằng thung lũng là lồi, như thế chúng ta có thể đi đến thung lũng. -Cách hiệu qua hơn được gọi là SGD (Stochastic Gradient Descent - giảm dần độ dốc ngẫu nhiên). Vì chúng tôi muốn giảm thiểu tổn thất trung bình trên tập huấn luyện, chúng tôi lấy một mẫu hoặc một nhóm mẫu nhỏ và tính toán sai số, sau đó sử dụng phương pháp giảm dần độ dốc. Tiếp đến, chúng tôi lấy một mẫu mới và nhận một giá trị mới cho lỗi, sau đó và sau đó nhận được một độ dốc là hướng khác bình thường. Hai lý do chính sử dụng SGD là nó nó giúp một mô hình hội tụ nhanh theo kinh nghiệm nếu tập huấn luyện rất lớn và nó cho phép tổng quát hóa tốt hơn, có nghĩa là có được hiệu suất tương tự trên các tập dữ liệu khác nhau. +Cách hiệu qua hơn được gọi là SGD (Stochastic Gradient Descent - giảm dần độ dốc ngẫu nhiên). Vì chúng tôi muốn giảm thiểu tổn thất trung bình trên tập huấn luyện, chúng tôi lấy một mẫu hoặc một nhóm mẫu nhỏ và tính toán sai số, sau đó sử dụng phương pháp giảm dần độ dốc. Tiếp đến, chúng tôi lấy một mẫu mới và nhận một giá trị mới cho lỗi, sau đó nhận được một độ dốc là hướng khác bình thường. Hai lý do chính sử dụng SGD là nó giúp một mô hình hội tụ nhanh theo kinh nghiệm nếu tập huấn luyện rất lớn và nó cho phép tổng quát hóa tốt hơn, có nghĩa là có được hiệu suất tương tự trên các tập dữ liệu khác nhau. ### [Tính toán độ dốc bằng phương pháp lan truyền ngược](https://www.youtube.com/watch?v=0bMe_vCZo30&t=2336s) -Tính toán độ dóc bằng phương pháp lan truyền ngược là một ứng dụng thực tế của quy tắc chuỗi. Phương trình lan truyền ngược cho các độ dốc đầu vào như sau: +Tính toán độ dốc bằng phương pháp lan truyền ngược là một ứng dụng thực tế của quy tắc chuỗi. Phương trình lan truyền ngược cho các độ dốc đầu vào như sau: $$ \begin{aligned} @@ -81,12 +81,12 @@ $$ \end{aligned} $$ -Lưu ý rằng thay vì đầu vào vô hướng, chúng sẽ là véc-tơ đầu vào. Tổng quan hơn là các đầu vào đa chiều. Sự lan truyền ngược cho phép bạn tính toán đạo hàm của sự khác biệt đầu ra bạn muốn và đầu ra bạn nhân được (là giá trị của hàm mục tiêu) đối với bất kỳ giá trị nào của bên trong mạng. Cuối cùng, lan truyền ngược là điều cần thiết vì nó áp dụng cho nhiều lớp. +Lưu ý rằng: "thay vì đầu vào vô hướng, chúng sẽ là véc-tơ đầu vào". Tổng quan hơn là các đầu vào đa chiều. Sự lan truyền ngược cho phép bạn tính toán đạo hàm của sự khác biệt đầu ra bạn muốn và đầu ra bạn nhân được (là giá trị của hàm mục tiêu) đối với bất kỳ giá trị nào của bên trong mạng. Cuối cùng, lan truyền ngược là điều cần thiết vì nó áp dụng cho nhiều lớp. -Điều quan trọng là phải xem xét cách giải thích đầu vào. Ví dụ, một hình ảnh 256x256 sẽ yêu cầu một ma trận có giá trị 200,000. Đây sẽ là những ma trận khổng lồ mà các lớp mạng nơ-ron sẽ cần xử lý. Nó sẽ không thực tế nếu sử dụng những ma trận như vậy. Do đó, điều quan trọng là phải đưa ra giả thuyết về cấu trúc của ma trận. +Điều quan trọng là phải xem xét cách giải thích đầu vào. Ví dụ, một hình ảnh 256*256 sẽ yêu cầu một ma trận có giá trị 200,000. Đây sẽ là những ma trận khổng lồ mà các lớp mạng nơ-ron sẽ cần xử lý. Nó sẽ không thực tế nếu sử dụng những ma trận như vậy. Do đó, điều quan trọng là phải đưa ra giả thuyết về cấu trúc của ma trận. ## Biểu diễn phân cấp của vỏ não thị giác Các thí nghiệm của Fukushima đã cho chúng ta hiểu về cách bộ não của chúng ta diễn giải đầu vào cho mắt của chúng ta. Tóm lại, người ta phát hiện ra rằng các tế bào thần kinh phía trước võng mạc của chúng ta nén đầu vào (được gọi là bình thường hóa độ tương phản) và tín hiệu truyền từ mắt đến não của chúng ta. Sau đó, hình ảnh được xử lý theo từng giai đoạn và một số tế bào thần kinh nhất định được kích hoạt cho một số danh mục nhất định. Do đó, vỏ não thị giác thực hiện nhận dạng mẫu theo cách phân cấp. -Các thí nghiệm trong đó các nhà nghiên cứu chọc vào các điện cực trong các khu vực cụ thể của vỏ não thị giác, đặc biệt là khu vực V1, khiến các nhà nghiên cứu nhận ra rằng một số tế bào thần kinh nhất định phản ứng với các mô típ xuất hiện trong một khu vực rất nhỏ trong trường thị giác và tương tự với các tế bào thần kinh lân cận và các khu vực lân cận trong trường thị giác . Ngoài ra, các tế bào thần kinh phản ứng với cùng một trường thị giác, phản ứng với các loại cạnh khác nhau một cách có tổ chức ( ví dụ như các cạnh dọc hoặc ngang). Cũng cần lưu ý rằng cũng có ý kiến ​​cho rằng quá trình trực quan về cơ bản là một quá trình chuyển tiếp nguồn cấp dữ liệu. Do đó, bằng cách nào đó có thể thực hiện nhận dạng nhanh mà không cần một số kết nối lặp lại. +Các thí nghiệm trong đó các nhà nghiên cứu chọc vào các điện cực trong các khu vực cụ thể của vỏ não thị giác, đặc biệt là khu vực V1, khiến các nhà nghiên cứu nhận ra rằng một số tế bào thần kinh nhất định phản ứng với các mô-típ xuất hiện trong một khu vực rất nhỏ trong trường thị giác và tương tự với các tế bào thần kinh lân cận và các khu vực lân cận trong trường thị giác . Ngoài ra, các tế bào thần kinh phản ứng với cùng một trường thị giác, phản ứng với các loại cạnh khác nhau một cách có tổ chức (ví dụ như các cạnh dọc hoặc ngang). Cũng cần lưu ý rằng cũng có ý kiến ​​cho rằng quá trình trực quan về cơ bản là một quá trình chuyển tiếp nguồn cấp dữ liệu. Do đó, bằng cách nào đó có thể thực hiện nhận dạng nhanh mà không cần một số kết nối lặp lại. diff --git a/docs/vi/week01/01-2.md b/docs/vi/week01/01-2.md index ad128d487..c88ff1754 100644 --- a/docs/vi/week01/01-2.md +++ b/docs/vi/week01/01-2.md @@ -14,19 +14,19 @@ translator-date: 15 Oct 2020 Trong bộ não động vật, tế bào thần kinh phản ứng lại với các cạnh có định hướng cụ thể. Các nhóm tế bào thần kinh phản ứng lại với các định hướng giống nhau được sao chép trên toàn bộ trường thị giác. -Fukushima (1982) đã xây dựng một mạng lưới thần kinh (NN) hoạt động theo cách giống như bộ não, dựa trên 02 khai niệm. Đầu tiên, các tế bào thần kinh được tái tạo trên toàn bộ trường thị giác. Thức hai, có những ô phức tạp tập hợp thông tintừ các ô đơn giản (đơn vị chọn lọc định hướng). Kết quả là, sự dịch chuyển của bức tranh sẽ thay đổi sự hoạt hóa của các ô đơn giản, nhưng sẽ không ảnh hưởng đến sự kích hoạt tích hợp của ô phức tạp (tích hợp chập). +Fukushima (1982) đã xây dựng một mạng lưới thần kinh (NN) hoạt động theo cách giống như bộ não, dựa trên 02 khái niệm. Đầu tiên, các tế bào thần kinh được tái tạo trên toàn bộ trường thị giác. Thức hai, có những ô phức tạp tập hợp thông tin từ các ô đơn giản (đơn vị chọn lọc định hướng). Kết quả là, sự dịch chuyển của bức tranh sẽ thay đổi sự hoạt hóa của các ô đơn giản, nhưng sẽ không ảnh hưởng đến sự kích hoạt tích hợp của ô phức tạp (tích hợp chập). -LeCun (1990) đã sử dụng backprop để huấn luyện CNN nhận dạng các chữ viết tay. Có một bản thử nghiệm từ năm 1992, trong đó thuật toán nhận dạng các chữ số viết tay của bất kỳ kiểu nào. Thực hiện nhận dạng ký tự/ mẫu bằng cách sử dụng một mô hình được đào tạo từ đầu đến cuối là điều mới mẻ vào thời điểm đó. Trước đây, mọi người đã sử dụng trình trích xuất tính năng với mô hình được giám sát ở trên cùng. +LeCun (1990) đã sử dụng Backprop để huấn luyện CNN nhận dạng các chữ số viết tay. Có một bản thử nghiệm từ năm 1992, trong đó thuật toán nhận dạng các chữ số viết tay của bất kỳ kiểu nào. Thực hiện nhận dạng ký tự/ mẫu bằng cách sử dụng một mô hình được đào tạo từ đầu đến cuối là điều mới mẻ vào thời điểm đó. Trước đây, mọi người đã sử dụng trình trích xuất đặc trưng với mô hình được giám sát ở trên cùng. Các hệ thống CNN mới này có thể nhận dạng nhiều ký tự trong ảnh cùng một lúc. Để làm điều đó, mọi người đã sử dụng một cửa sổ nhập liệu nhỏ cho CNN và trượt nó qua toàn bộ hình ảnh. Nếu nó được kích hoạt, nó có nghĩa là có một nhân vật cụ thể hiện diện. -Sau đó, ý tưởng này đã được áp dụng để phát hiện khuôn mặt / người và phân đoạn ngữ nghĩa (phân loại theo pixel). Ví dụ bao gồm Hadsell (2009) và Farabet (2012). Điều này cuối cùng đã trở nên phổ biến trong công nghiệp, được sử dụng trong các ứng dụng Xe tự lái như theo dõi làn đường. +Sau đó, ý tưởng này đã được áp dụng để phát hiện khuôn mặt người và phân đoạn ngữ nghĩa (phân loại theo pixel). Ví dụ bao gồm Hadsell (2009) và Farabet (2012). Điều này cuối cùng đã trở nên phổ biến trong công nghiệp, được sử dụng trong các ứng dụng Xe tự lái như theo dõi làn đường. Các loại phần cứng đặc biệt để đào tạo CNN là một chủ đề nóng trong những năm 1980, sau đó sự quan tâm giảm xuống và bây giờ nó đã trở nên phổ biến trở lại. -Cuộc cách mạng học sâu (mặc dù thuật ngữ này chưa được sử dụng vào thời điểm đó) bắt đầu phổ biến vào năm 2010-2013. Các nhà nghiên cứu tập trung vào việc phát minh ra các thuật toán có thể giúp đào tạo các CNN lớn nhanh hơn. Krizhevsky (2012) đã đưa ra AlexNet, một CNN lớn hơn nhiều so với các CNN được sử dụng trước đây và đào tạo nó trên ImageNet (1,3 triệu mẫu) bằng cách sử dụng GPU. Sau khi chạy trong vài tuần, AlexNet đã đánh bại hiệu suất của các hệ thống cạnh tranh tốt nhất bằng một biên độ lớn - tỷ lệ lỗi top-5 là 25,8% so với 16,4%. +Cuộc cách mạng học sâu (mặc dù thuật ngữ này chưa được sử dụng vào thời điểm đó) bắt đầu phổ biến vào năm 2010 - 2013. Các nhà nghiên cứu tập trung vào việc phát minh ra các thuật toán có thể giúp đào tạo các CNN lớn nhanh hơn. Krizhevsky (2012) đã đưa ra AlexNet, một CNN lớn hơn nhiều so với các CNN được sử dụng trước đây và đào tạo nó trên ImageNet (1,3 triệu mẫu) bằng cách sử dụng GPU. Sau khi chạy trong vài tuần, AlexNet đã đánh bại hiệu suất của các hệ thống cạnh tranh tốt nhất bằng một biên độ lớn - tỷ lệ lỗi top-5 là 25,8% so với 16,4%. -Sau khi chứng kiến ​​thành công của AlexNet, cộng đồng thị giác máy tính (CV) đã tin rằng CNN có tác dụng. Trong khi tất cả các bài báo từ năm 2011-2012 có đề cập đến CNN đều đã bị từ chối, kể từ năm 2016, hầu hết các bài báo CV được chấp nhận đều sử dụng CNN. +Sau khi chứng kiến ​​thành công của AlexNet, cộng đồng thị giác máy tính (CV) đã tin rằng CNN có tác dụng. Trong khi tất cả các bài báo từ năm 2011 - 2012 có đề cập đến CNN đều đã bị từ chối, kể từ năm 2016, hầu hết các bài báo CV được chấp nhận đều sử dụng CNN. Trong những năm qua, số lượng các lớp được sử dụng ngày càng tăng: LeNet - 7, AlexNet - 12, VGG - 19, ResNet - 50. Tuy nhiên, có một sự cân bằng giữa số lượng hoạt động cần thiết để tính toán đầu ra, kích thước của mô hình và độ chính xác của nó. Vì vậy, một chủ đề phổ biến hiện nay là làm thế nào để nén mạng làm cho việc tính toán nhanh hơn. @@ -34,9 +34,9 @@ Trong những năm qua, số lượng các lớp được sử dụng ngày càn Mạng đa lớp thành công vì chúng khai thác cấu trúc tổng hợp của dữ liệu tự nhiên. Trong cấu trúc phân cấp thành phần, sự kết hợp của các đối tượng tại một lớp trong cấu trúc phân cấp tạo thành các đối tượng ở lớp tiếp theo. Nếu chúng ta bắt chước hệ thống phân cấp này thành nhiều lớp và để mạng tìm hiểu sự kết hợp thích hợp của các đặc trưng, chúng ta sẽ có được cái gọi là kiến ​​trúc Học sâu. Do đó, mạng Học sâu có bản chất là thứ bậc. -Kiến trúc học sâu đã dẫn đến một tiến bộ đáng kinh ngạc trong các nhiệm vụ thị giác máy tính, từ xác định và tạo mặt nạ chính xác xung quanh các đối tượng đến xác định các thuộc tính không gian của một đối tượng. Kiến trúc Mask-RCNN và RetinaNet chủ yếu dẫn đến cải tiến này. +Kiến trúc học sâu đã dẫn đến một tiến bộ đáng kinh ngạc trong các nhiệm vụ thị giác máy tính, từ xác định và tạo mặt nạ (mask) chính xác xung quanh các đối tượng đến xác định các thuộc tính không gian của một đối tượng. Kiến trúc Mask-RCNN và RetinaNet chủ yếu dẫn đến cải tiến này. -Các RCNN mặt nạ đã tìm thấy công dụng của chúng trong việc phân đoạn các đối tượng riêng lẻ, tức là tạo mặt nạ (mask) cho từng đối tượng trong một hình ảnh. Đầu vào và đầu ra đều là hình ảnh. Kiến trúc cũng có thể được sử dụng để phân đoạn cá thể, tức là xác định các đối tượng khác nhau của cùng một kiểu trong một hình ảnh. Detectron, một hệ thống phần mềm Nghiên cứu AI của Facebook (FAIR), thực hiện tất cả các thuật toán phát hiện đối tượng hiện đại này và là mã nguồn mở. +Các Mask-RCNN đã tìm thấy công dụng của chúng trong việc phân đoạn các đối tượng riêng lẻ, tức là tạo mặt nạ (mask) cho từng đối tượng trong một hình ảnh. Đầu vào và đầu ra đều là hình ảnh. Kiến trúc cũng có thể được sử dụng để phân đoạn cá thể, tức là xác định các đối tượng khác nhau của cùng một kiểu trong một hình ảnh. Detectron, một hệ thống phần mềm Nghiên cứu AI của Facebook (FAIR), thực hiện tất cả các thuật toán phát hiện đối tượng hiện đại này và là mã nguồn mở. Một số ứng dụng thực tế của CNN là hỗ trợ Xe tự lái và phân tích hình ảnh y tế. @@ -60,7 +60,7 @@ Do tính chất tổng hợp của dữ liệu, các đối tượng địa lý ## [Học đại diện](https://www.youtube.com/watch?v=0bMe_vCZo30&t=4767s) -Có những người bác bỏ Deep Learning: nếu chúng ta có thể tính gần đúng bất kỳ hàm nào có 2 lớp, tại sao lại có nhiều hơn? +Có những người bác bỏ học sâu: nếu chúng ta có thể tính gần đúng bất kỳ hàm nào có 2 lớp, tại sao lại có nhiều hơn? Ví dụ: SVM tìm thấy một siêu phẳng phân tách "trong khoảng dữ liệu", có nghĩa là các dự đoán dựa trên so sánh với các ví dụ đào tạo. SVM về cơ bản là một mạng nơ-ron 2 lớp rất đơn giản, trong đó lớp đầu tiên xác định "mẫu" và lớp thứ hai là bộ phân loại tuyến tính. Vấn đề với ngụy biện 2 lớp là độ phức tạp và kích thước của lớp giữa là theo cấp số nhân $ N $ (để làm tốt một nhiệm vụ khó, cần RẤT NHIỀU mẫu). Nhưng nếu bạn mở rộng số lớp thành $ \ log (N) $, các lớp sẽ trở thành tuyến tính trong $ N $. Có sự đánh đổi giữa thời gian và không gian. diff --git a/docs/vi/week01/01-3.md b/docs/vi/week01/01-3.md index d1162277f..547e68e01 100644 --- a/docs/vi/week01/01-3.md +++ b/docs/vi/week01/01-3.md @@ -19,7 +19,7 @@ bằng cách tìm kiếm trên Twitter của Alfredo, chẳng hạn như nhập Như một ví dụ thúc đẩy, chúng ta hãy xem xét về phân loại hình ảnh. Giả sử chúng ta chụp ảnh bằng máy ảnh 1 Megapixel. Hình ảnh này sẽ có khoảng 1.000 pixel theo chiều dọc và 1.000 pixel theo chiều ngang. Và mỗi pixel sẽ có 03 kênh màu cho đỏ, xanh lục và xanh lam (còn gọi là xanh dương) (RGB). -Mỗi hình ảnh cụ thể sau đó có thể được coi là một điểm trong không gia 3 triệu chiều. +Mỗi hình ảnh cụ thể sau đó có thể được coi là một điểm trong không gian 3 triệu chiều. Với kích thước khổng lồ như vậy, nhiều hình ảnh thú vị mà chúng ta có thể muốn phân loại, chẳng hạn như là một con chó và một con mèo - về cơ bản nằm trong cùng một vùng không gian. @@ -33,7 +33,7 @@ Nhớ lại rằng trong không gian 2D, một phép biến đổi tuyến tính Lưu ý rằng một mình phép tịnh tuyến không phải là tuyến tính vì 0 sẽ không phải lúc nào cũng được ánh xạ thành 0, nhưng nó là một phép biến đổi affine. Quay trở lại hình ảnh ví dụ của chúng tôi, chúng tôi có thể biến đổi các điểm dữ liệu bằng cách dịch chuyển sao cho các điểm được nhóm xung quanh không và chia tỷ lệ với ma trận -đường chéo để chúng tôi "phóng to" vùng đó. Cuối cùng, chúng ta có thể phân loại bằng cách tìm các đường ngangqua không gian để phân loại các điểm khác nhau thành các lớp tương ứng của chúng. Nói cách khác, ý tưởng là sử dụng các phép biến đổi tuyến tính và phi tuyến tính để ánh xạ các điểm vào một không gian sao cho chúng có thể phân tách tuyến tính. Ý tưởng này sẽ được thực hiện cụ thể hơn trong các phần sau. +đường chéo để chúng tôi "phóng to" vùng đó. Cuối cùng, chúng ta có thể phân loại bằng cách tìm các đường ngang qua không gian để phân loại các điểm khác nhau thành các lớp tương ứng của chúng. Nói cách khác, ý tưởng là sử dụng các phép biến đổi tuyến tính và phi tuyến tính để ánh xạ các điểm vào một không gian sao cho chúng có thể phân tách tuyến tính. Ý tưởng này sẽ được thực hiện cụ thể hơn trong các phần sau. ## Trực quan hóa dữ liệu - tách các điểm theo màu bằng mạng @@ -42,7 +42,7 @@ Trong hình dung của chúng ta, chúng ta có 05 nhánh của một hình xo |
|
| | (a) Điểm đầu vào, trước mạng | (b) Điểm đầu ra, sau mạng | -Hình 1: Hình xoắn ốc năm màu mạng \"kéo dài\" dải không gian để tách từng điểm thành các không gian con khác nhau. Tại sự hội tụ, mạng phân tách từng màu thành các không gian con khác nhau của đa tạp cuối cùng. Nói cách khác, mỗi màu trong không gian mới này sẽ được phân tách tuyến tính bằng cách sử dụng hồi quy một *so với* tất cả. Các vectơ trong sơ đồ có thể được biểu diễn bằng ma trận năm x hai; ma trận này có thể được nhân lên từng điểm để trả về điểm cho từng màu trong số năm màu. Mỗi điểm sau đó có thể được phân loại theo màu sắc bằng cách sử dụng điểm tương ứng của chúng. Ở đây, kích thước đầu ra là năm, một cho mỗi màu và kích thước đầu vào là hai, một cho tọa độ *x và y* của mỗi điểm. +Hình 1: Hình xoắn ốc năm màu mạng \"kéo dài\" dải không gian để tách từng điểm thành các không gian con khác nhau. Tại sự hội tụ, mạng phân tách từng màu thành các không gian con khác nhau của đa tạp cuối cùng. Nói cách khác, mỗi màu trong không gian mới này sẽ được phân tách tuyến tính bằng cách sử dụng hồi quy một *so với* tất cả. Các véc-tơ trong sơ đồ có thể được biểu diễn bằng ma trận năm x hai; ma trận này có thể được nhân lên từng điểm để trả về điểm cho từng màu trong số năm màu. Mỗi điểm sau đó có thể được phân loại theo màu sắc bằng cách sử dụng điểm tương ứng của chúng. Ở đây, kích thước đầu ra là năm, một cho mỗi màu và kích thước đầu vào là hai, một cho tọa độ *x và y* của mỗi điểm. ### Kiến trúc mạng diff --git a/docs/vi/week01/01.md b/docs/vi/week01/01.md index 1d05aaf2e..a0e2f0263 100644 --- a/docs/vi/week01/01.md +++ b/docs/vi/week01/01.md @@ -9,12 +9,12 @@ translator: Huynh Nguyen ## Bài giảng phần A -Trong phần này, chúng ta thảo luận về động lực đằng sau học sâu (Deep Learning). Chúng ta bắt đầu với lịch và nguồn cảm hứng (inspiration) của học sâu. Sau đó, chúng ta thảo luận về lịch sử của nhận dạng mẫu và giới thiệu về giảm độc dốc (gradient descent) bằng phương pháp tính toán truyền ngược (backpropagation). Cuối cùng, chúng ta thảo luận về sự biểu diễn cấp bậc (hierarchital representation) của vỏ não thị giác (visual cortex). +Trong phần này, chúng ta thảo luận về động lực đằng sau học sâu (Deep Learning). Chúng ta bắt đầu với lịch sử và nguồn cảm hứng (inspiration) của học sâu. Sau đó, chúng ta thảo luận về lịch sử của nhận dạng mẫu và giới thiệu về giảm độc dốc (gradient descent) bằng phương pháp lan truyền ngược (backpropagation). Cuối cùng, chúng ta thảo luận về sự biểu diễn cấp bậc (hierarchital representation) của vỏ não thị giác (visual cortex). ## Bài giảng phần B -Trước tiên, chúng ta thảo luận về sự bùng nổ của CNNs, từ Fukushima đến LeCun và AlexNet. Sau đó, chúng ta thảo luận một vài ứng dụng của CNNs, bao gồm: phân đoạn hình ảnh (image segmentation), xe tự lái (autonomous vehicles), và phân tích hình ảnh y tế (medical image analysis). Chúng ta thảo luận về bản chất phân cấp của mạng học sâu và các thuộc tính làm cho nó trở nên phổ biến. Kết thúc, chúng tôi thảo luận về cách tạo và học từ các đặc trung/ sự biểu diễn. +Trước tiên, chúng ta thảo luận về sự bùng nổ của CNNs, từ Fukushima đến LeCun và AlexNet. Sau đó, chúng ta thảo luận một vài ứng dụng của CNNs, bao gồm: phân đoạn hình ảnh (image segmentation), xe tự lái (autonomous vehicles) và phân tích hình ảnh y tế (medical image analysis). Chúng ta thảo luận về bản chất phân cấp của mạng học sâu và các thuộc tính làm cho nó trở nên phổ biến. Kết thúc, chúng tôi thảo luận về cách tạo và học từ các đặc trung/ sự biểu diễn. ## Thực hành diff --git a/docs/vi/week02/02.md b/docs/vi/week02/02.md new file mode 100644 index 000000000..0f40658ee --- /dev/null +++ b/docs/vi/week02/02.md @@ -0,0 +1,22 @@ +--- +lang: vi +lang-ref: ch.02 +title: Tuần 02 +translation-date: 07 Dec 2020 +translator: Huynh Nguyen +--- + +## Bài giảng phần A + +Chúng tôi bắt đầu bằng cách hiểu các mô hình tham số là gì và sau đó là thảo luận về hàm mất mát là gì. Tiếp đến, chúng tôi sẽ xem xét các phương pháp dựa trên độ dốc (graident) và các nó được sử dụng trong thuật toán lan truyền ngược trong mạng nơ-ron truyền thống. +Chúng tôi kết thúc phần này bằng cách tìm hiểu cách triển khai mạng nơ-ron trong Pytorch. Sau đó là thảo luận về một hình thức lan truyền ngược tổng quát hơn. + +## Bài giảng phần B + +Chúng tôi bắt đầu với một ví dụ cụ thể về sự lan truyền ngược và thảo luận về các kích thước của ma trận Jacobian. Sau đó, chúng tôi sẽ xem xét các mô-đun mạng nơ-ron cơ bản khác nhau và tính toán độ dốc của chúng. +Tiếp theo là một cuộc thảo luận ngắn về softmax và logsoftmax. Chủ đề thảo luận khác trong phần này là thủ thuật thực hành lan truyền ngược. + +## Thực hành + +Chúng tôi giới thiệu ngắn gọn về học có giám sát bằng cách sử dụng mạng nơ-ron nhân tạo. Chúng tôi giải thích về vấn đề công thức và quy ước dữ liệu được sư dụng để đào tạo các mạng này. +Chúng tôi cũng thảo luận về cách đào tạo mạng nơ-ron để phân loại nhiều lớp và cách thực hiện suy luận sau khi mạng được đào tạo. diff --git a/docs/zh/README-ZH.md b/docs/zh/README-ZH.md index 780ffe03a..26bf5612b 100644 --- a/docs/zh/README-ZH.md +++ b/docs/zh/README-ZH.md @@ -3,8 +3,8 @@ 这份笔记的仓库具有[同步网站](https://atcold.github.io/pytorch-Deep-Learning/zh/),在那里您可以获得所有课程资料的视频与文本. - -[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md) + +[🇬🇧](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md)   [🇨🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/zh/README-ZH.md)   [🇰🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ko/README-KO.md)   [🇪🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/es/README-ES.md)   [🇮🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/it/README-IT.md)   [🇹🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/tr/README-TR.md)   [🇯🇵](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ja/README-JA.md)   [🇸🇦](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ar/README-AR.md)   [🇫🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fr/README-FR.md)   [🇮🇷](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/fa/README-FA.md)   [🇷🇺](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/ru/README-RU.md)   [🇻🇳](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/vi/README-VI.md)   [🇷🇸](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md)   [🇵🇹](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/pt/README-PT.md)   [🇧🇩](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/bn/README-BN.md) # 开始 From b04ae98d730bd143e1fd8304eaddcc178d07549c Mon Sep 17 00:00:00 2001 From: EmaPajic Date: Sat, 12 Dec 2020 01:11:30 +0100 Subject: [PATCH 17/48] add initial week1 --- docs/sr/week01/01-1.md | 92 +++++++++++++++++++++++++++++++ docs/sr/week01/01-2.md | 84 ++++++++++++++++++++++++++++ docs/sr/week01/01-3.md | 122 +++++++++++++++++++++++++++++++++++++++++ docs/sr/week01/01.md | 19 +++++++ 4 files changed, 317 insertions(+) create mode 100644 docs/sr/week01/01-1.md create mode 100644 docs/sr/week01/01-2.md create mode 100644 docs/sr/week01/01-3.md create mode 100644 docs/sr/week01/01.md diff --git a/docs/sr/week01/01-1.md b/docs/sr/week01/01-1.md new file mode 100644 index 000000000..08ca393df --- /dev/null +++ b/docs/sr/week01/01-1.md @@ -0,0 +1,92 @@ +--- +lang-ref: ch.01-1 +lecturer: Yann LeCun +title: Motivation of Deep Learning, and Its History and Inspiration +authors: Yunya Wang, SunJoo Park, Mark Estudillo, Justin Mae +date: 27 Jan 2020 +--- + + +## [Course plan](https://www.youtube.com/watch?v=0bMe_vCZo30&t=217s) + +- Basics of Supervised Learning, Neural Nets, Deep Learning +- Backpropagation and architectural components +- Convolutional neural network and its applications +- More Deep Learning Architectures +- Regularization Tricks / Optimization Tricks / Understanding how Deep Learning works +- Energy-based models +- Self-supervised learning and beyond + + +## Inspiration of Deep Learning and its history + +On a conceptual level, deep learning is inspired by the brain but not all of the brain's details are relevant. For a comparison, aeroplanes were inspired by birds. The principle of flying is the same but the details are extremely different. + +The history of deep learning goes back to a field which changed its name now to cybernetics. It started in the 1940s with McCulloch and Pitts. They came up with the idea that neurons are threshold units with on and off states. You could build a Boolean circuit by connecting neurons with each other and conduct logical inference with neurons. The brain is basically a logical inference machine because neurons are binary. Neurons compute a weighted sum of inputs and compare that sum to its threshold. It turns on if it's above the threshold and turns off if it's below, which is a simplified view of how neural networks work. + +In 1947, Donald Hebb had the idea that neurons in the brain learn by modifying the strength of the connections between neurons. This is called hyper learning, where if two neurons are fired together, then the connection linked between them increases; if they don't fire together, then the connection decreases. + +Later in 1948, cybernetics were proposed by Norbert Wiener, which is the idea that by having systems with sensors and actuators, you have a feedback loop and a self-regulatory system. The rules of the feedback mechanism of a car all come from this work. + +In 1957, Frank Rosenblatt proposed the Perceptron, which is a learning algorithm that modifies the weights of very simple neural nets. + +Overall, this idea of trying to build intellectual machines by simulating lots of neurons was born in 1940s, took off in 1950s, and completely died in late 1960s. The main reasons for the field dying off in 1960 are: + +- The researchers used neurons that were binary. However, the way to get backpropagation to work is to use activation functions that are continuous. At that time, researchers didn't have the idea of using continuous neurons and they didn't think they can train with gradients because binary neurons are not differential. +- With continuous neurons, one would have to multiply the activation of a neuron by a weight to get a contribution to the weighted sum. However, before 1980, the multiplication of two numbers, especially floating-point numbers, were extremely slow. This resulted in another incentive to avoid using continuous neurons. + +Deep Learning took off again in 1985 with the emergence of backpropagation. In 1995, the field died again and the machine learning community abandoned the idea of neural nets. In early 2010, people start using neuron nets in speech recognition with huge performance improvement and later it became widely deployed in the commercial field. In 2013, computer vision started to switch to neuron nets. In 2016, the same transition occurred in natural language processing. Soon, similar revolutions will occur in robotics, control, and many other fields. + + +### Supervised Learning + +$90\%$ of deep learning applications use supervised learning. Supervised learning is a process by which, you collect a bunch of pairs of inputs and outputs, and the inputs are feed into a machine to learn the correct output. When the output is correct, you don't do anything. If the output is wrong, you tweak the parameter of the machine and correct the output toward the one you want. The trick here is how you figure out which direction and how much you tweak the parameter and this goes back to gradient calculation and backpropagation. + +Supervised learning stems from Perceptron and Adaline. The Adaline is based on the same architecture with weighted inputs; when it is above the threshold, it turns on and below the threshold, it turns off. The Perceptron is a 2-layer neuron net where the second layer is trainable and the first layer is fixed. Most of the time, the first layer is determined randomly and that's what they call associative layers. + + +## [History of Pattern Recognition and introduction to Gradient Descent](https://www.youtube.com/watch?v=0bMe_vCZo30&t=1461s) + +The foregoing is the conceptual basis of pattern recognition before deep learning developed. The standard model of pattern recognition consists of feature extractor and trainable classifier. Input goes into the feature extractor, extracting relevant useful characteristics of inputs such as detecting an eye when the purpose is recognizing the face. Then, the vector of features is fed to the trainable classifier for computing weighted sum and comparing it with the threshold. Here, a trainable classifier could be a perceptron or single neural network. The problem is feature extractor should be engineered by hand. Which means, pattern recognition/computer vision focus on feature extractor considering how to design it for a particular problem, not much devoted to a trainable classifier. + +After the emergence and development of deep learning, the 2-stage process changed to the sequences of modules. Each module has tunable parameters and nonlinearity. Then, stack them making multiple layers. This is why it is called “deep learning”. The reason why using nonlinearity rather than linearity is that two linear layers could be one linear layer since the composition of two linear is linear. + +The simplest multi-layer architecture with tunable parameters and nonlinearity could be: the input is represented as a vector such as an image or audio. This input is multiplied by the weight matrix whose coefficient is a tunable parameter. Then, every component of the result vector is passed through a nonlinear function such as ReLU. Repeating this process, it becomes a basic neural network. The reason why it is called a neural network is that this architecture calculates the weighted sum of components of input by corresponding rows of a matrix. + +Back to the point of supervised learning, we are comparing the resulting output with target output then optimize the objective function which is the loss, computing a distance/penalty/divergence between the result and target. Then, average this cost function over the training set. This is the goal we want to minimize. In other words, we want to find the value of the parameters that minimize this average. + +The method of how to find it is computing gradient. For example, if we are lost in a smooth mountain at foggy night and want to go to the village in the valley. One way could be turning around and seeing which way the steepest way is to go down then take a small step down. The direction is (negative) gradient. With the assumption that the valley is convex, we could reach the valley. + +The more efficient way is called Stochastic Gradient Descent (SGD). Since we want to minimize average loss over the training set, we take one sample or small group of samples and calculate the error, then use gradient descent. Then, we take a new sample and get a new value for the error, then get the gradient which is a different direction normally. Two of the main reasons for using SGD are that it helps a model to converge fast empirically if the training set is very large and it enables better generalization, which means getting similar performance on various sets of data. + + +### [Computing gradients by backpropagation](https://www.youtube.com/watch?v=0bMe_vCZo30&t=2336s) + +Computing gradients by backpropagation is a practical application of the chain rule. The backpropagation equation for the input gradients is as follows: + +$$ +\begin{aligned} +\frac{\partial C}{\partial \boldsymbol{x}_{i - 1}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial \boldsymbol{x}_i}{\partial \boldsymbol{x}_{i - 1}} \\ +\frac{\partial C}{\partial \boldsymbol{x}_{i - 1}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial f_i(\boldsymbol{x}_{i - 1}, \boldsymbol{w}_i)}{\partial \boldsymbol{x}_{i - 1}} +\end{aligned} +$$ + +The backpropagation equation for the weight gradients is as follows: + +$$ +\begin{aligned} +\frac{\partial C}{\partial \boldsymbol{w}_{i}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial \boldsymbol{x}_i}{\partial \boldsymbol{w}_{i}} \\ +\frac{\partial C}{\partial \boldsymbol{w}_{i}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial f_i(\boldsymbol{x}_{i - 1}, \boldsymbol{w}_i)}{\partial \boldsymbol{w}_{i}} +\end{aligned} +$$ + +Note that instead of scalar inputs, they will be vector inputs. More generally, multi-dimensional inputs. Backpropagation allows you to compute the derivative of the difference of the output you want and the output you get (which is the value of the objective function) with respect to any value inside the network. Finally, backpropagation is essential as it applies to multiple layers. + +It is important to consider how to interpret inputs. For example, an image of 256$$\times$$256 would require a 200,000 valued matrix. These would be huge matrices that the neural network layers will need to handle. It would be impractical to utilize such matrices. Therefore, it is important to make hypothesis of the structure of the matrix. + + +## Hierarchical representation of the Visual Cortex + +Experiments by Fukushima gave us an understanding of how our brain interprets the input to our eyes. In summary, it was discovered that neurons in front of our retina compress the input (known as contrast normalization) and the signal travels from our eyes to our brain. After this, the image gets processed in stages and certain neurons get activated for certain categories. Hence, the visual cortex does pattern recognition in a hierarchical manner. + +Experiments in which researchers poked electrodes in specific areas of the visual cortex, specifically the V1 area made researchers realize that certain neurons react to motifs that appear in a very small area in a visual field and similarly with neighbouring neurons and neighbouring areas in the visual field. Additionally, neurons that react to the same visual field, react to different types of edges in an organized manner (*e.g.* vertical or horizontal edges). It is also important to note that there's also the idea that the visual process is essentially a feed forward process. Hence, somehow fast recognition can be done without some recurrent connections. diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md new file mode 100644 index 000000000..172640773 --- /dev/null +++ b/docs/sr/week01/01-2.md @@ -0,0 +1,84 @@ +--- +lang-ref: ch.01-2 +lecturer: Yann LeCun +title: Evolution and Uses of CNNs and Why Deep Learning? +authors: Marina Zavalina, Peeyush Jain, Adrian Pearl, Davida Kollmar +date: 27 Jan 2020 +--- + + +## [Evolution of CNNs](https://www.youtube.com/watch?v=0bMe_vCZo30&t=2965s) + +In animal brains, neurons react to edges that are at particular orientations. Groups of neurons that react to the same orientations are replicated over all of the visual field. + +Fukushima (1982) built a neural net (NN) that worked the same way as the brain, based on two concepts. First, neurons are replicated across the visual field. Second, there are complex cells that pool the information from simple cells (orientation-selective units). As a result, the shift of the picture will change the activation of simple cells, but will not influence the integrated activation of the complex cell (convolutional pooling). + +LeCun (1990) used backprop to train a CNN to recognize handwritten digits. There is a demo from 1992 where the algorithm recognizes the digits of any style. Doing character/pattern recognition using a model that is trained end-to-end was new at that time. Previously, people had used feature extractors with a supervised model on top. + +These new CNN systems could recognize multiple characters in the image at the same time. To do it, people used a small input window for a CNN and swiped it over the whole image. If it activated, it meant there was a particular character present. + +Later, this idea was applied to faces/people detection and semantic segmentation (pixel-wise classification). Examples include Hadsell (2009) and Farabet (2012). This eventually became popular in industry, used in autonomous driving applications such as lane tracking. + +Special types of hardware to train CNN were a hot topic in the 1980s, then the interest dropped, and now it has become popular again. + +The deep learning (though the term was not used at that time) revolution started in 2010-2013. Researchers focused on inventing algorithms that could help train large CNNs faster. Krizhevsky (2012) came up with AlexNet, which was a much larger CNN than those used before, and trained it on ImageNet (1.3 million samples) using GPUs. After running for a couple of weeks AlexNet beat the performance of the best competing systems by a large margin -- a 25.8% *vs.* 16.4% top-5 error rate. + +After seeing AlexNet's success, the computer vision (CV) community was convinced that CNNs work. While all papers from 2011-2012 that mentioned CNNs had been rejected, since 2016 most accepted CV papers use CNNs. + +Over the years, the number of layers used has been increasing: LeNet -- 7, AlexNet -- 12, VGG -- 19, ResNet -- 50. However, there is a trade-off between the number of operations needed to compute the output, the size of the model, and its accuracy. Thus, a popular topic now is how to compress the networks to make the computations faster. + + + +## [Deep Learning and Feature Extraction](https://www.youtube.com/watch?v=0bMe_vCZo30&t=3955s) + +Multilayer networks are successful because they exploit the compositional structure of natural data. In compositional hierarchy, combinations of objects at one layer in the hierarchy form the objects at the next layer. If we mimic this hierarchy as multiple layers and let the network learn the appropriate combination of features, we get what is called Deep Learning architecture. Thus, Deep Learning networks are hierarchical in nature. + +Deep learning architectures have led to an incredible progress in computer vision tasks ranging from identifying and generating accurate masks around the objects to identifying spatial properties of an object. Mask-RCNN and RetinaNet architectures mainly led to this improvement. + +Mask RCNNs have found their use in segmenting individual objects, *i.e.* creating masks for each object in an image. The input and output are both images. The architecture can also be used to do instance segmentation, *i.e.* identifying different objects of the same type in an image. Detectron, a Facebook AI Research (FAIR) software system, implements all these state-of-the-art object detection algorithms and is open source. + +Some of the practical applications of CNNs are powering autonomous driving and analysing medical images. + +Although the science and mathematics behind deep learning is fairly understood, there are still some interesting questions that require more research. These questions include: Why do architectures with multiple layers perform better, given that we can approximate any function with two layers? Why do CNNs work well with natural data such as speech, images, and text? How are we able to optimize non-convex functions so well? Why do over-parametrised architectures work? + +Feature extraction consists of expanding the representational dimension such that the expanded features are more likely to be linearly separable; data points in higher dimensional space are more likely to be linearly separable due to the increase in the number of possible separating planes. + +Earlier machine learning practitioners relied on high quality, hand crafted, and task specific features to build artificial intelligence models, but with the advent of Deep Learning, the models are able to extract the generic features automatically. Some common approaches used in feature extraction algorithms are highlighted below: + +- Space tiling +- Random Projections +- Polynomial Classifier (feature cross-products) +- Radial basis functions +- Kernel Machines + +Because of the compositional nature of data, learned features have a hierarchy of representations with increasing level of abstractions. For example: + +- Images - At the most granular level, images can be thought of as pixels. Combination of pixels constitute edges which when combined forms textons (multi-edge shapes). Textons form motifs and motifs form parts of the image. By combining these parts together we get the final image. +- Text - Similarly, there is an inherent hierarchy in textual data. Characters form words, when we combine words together we get word-groups, then clauses, then by combining clauses we get sentences. Sentences finally tell us what story is being conveyed. +- Speech - In speech, samples compose bands, which compose sounds, which compose phones, then phonemes, then whole words, then sentences, thus showing a clear hierarchy in representation. + + + +## [Learning representations](https://www.youtube.com/watch?v=0bMe_vCZo30&t=4767s) + +There are those who dismiss Deep Learning: if we can approximate any function with 2 layers, why have more? + +For example: SVMs find a separating hyperplane "in the span of the data", meaning predictions are based on comparisons to training examples. SVMs are essentially a very simplistic 2 layer neural net, where the first layer defines "templates" and the second layer is a linear classifier. The problem with 2 layer fallacy is that the complexity and size of the middle layer is exponential in $N$ (to do well with a difficult task, need LOTS of templates). But if you expand the number of layers to $\log(N)$, the layers become linear in $N$. There is a trade-off between time and space. + +An analogy is designing a circuit to compute a boolean function with no more than two layers of gates -- we can compute **any boolean function** this way! But, the complexity and resources of the first layer (number of gates) quickly becomes infeasible for complex functions. + +What is "deep"? + +- An SVM isn't deep because it only has two layers +- A classification tree isn't deep because every layer analyses the same (raw) features +- A deep network has several layers and uses them to build a **hierarchy of features of increasing complexity** + +How can models learn representations (good features)? + +Manifold hypothesis: natural data lives in a low-dimensional manifold. Set of possible images is essentially infinite, set of "natural" images is a tiny subset. For example: for an image of a person, the set of possible images is on the order of magnitude of the number of face muscles they can move (degrees of freedom) ~ 50. An ideal (and unrealistic) feature extractor represents all the factors of variation (each of the muscles, lighting, *etc.*). + +Q&A from the end of lecture: + +- For the face example, could some other dimensionality reduction technique (*i.e.* PCA) extract these features? + - Answer: would only work if the manifold surface is a hyperplane, which it is not + diff --git a/docs/sr/week01/01-3.md b/docs/sr/week01/01-3.md new file mode 100644 index 000000000..c713810e9 --- /dev/null +++ b/docs/sr/week01/01-3.md @@ -0,0 +1,122 @@ +--- +lang-ref: ch.01-3 +title: Problem Motivation, Linear Algebra, and Visualization +lecturer: Alfredo Canziani +authors: Derek Yen, Tony Xu, Ben Stadnick, Prasanthi Gurumurthy +date: 28 Jan 2020 +--- + + +## Resources + +Please follow Alfredo Canziani [on Twitter @alfcnz](https://twitter.com/alfcnz). Videos and textbooks with relevant details on linear algebra and singular value decomposition (SVD) can be found by searching Alfredo's Twitter, for example type `linear algebra (from:alfcnz)` in the search box. + + +## [Transformations and motivation](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=233s) + +As a motivating example, let us consider image classification. Suppose we take a picture with a 1 megapixel camera. This image will have about 1,000 pixels vertically and 1,000 pixels horizontally, and each pixel will have three colour dimensions for red, green, and blue (RGB). Each particular image can then be considered as one point in a 3 million-dimensional space. With such massive dimensionality, many interesting images we might want to classify -- such as a dog *vs.* a cat -- will essentially be in the same region of the space. + +In order to effectively separate these images, we consider ways of transforming the data in order to move the points. Recall that in 2-D space, a linear transformation is the same as matrix multiplication. For example, the following are linear transformations: + +- Rotation (when the matrix is orthonormal). +- Scaling (when the matrix is diagonal). +- Reflection (when the determinant is negative). +- Shearing. + +Note that translation alone is not linear since 0 will not always be mapped to 0, but it is an affine transformation. Returning to our image example, we can transform the data points by translating such that the points are clustered around 0 and scaling with a diagonal matrix such that we "zoom in" to that region. Finally, we can do classification by finding lines across the space which separate the different points into their respective classes. In other words, the idea is to use linear and nonlinear transformations to map the points into a space such that they are linearly separable. This idea will be made more concrete in the following sections. + + +## [Data visualization - separating points by colour using a network](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=798s) + +In our visualization, we have five branches of a spiral, with each branch corresponding to a different colour. The points live in a two dimensional plane and can be represented as a tuple; the colour represents a third dimension which can be thought of as the different classes for each of the points. We then use the network to separate each of the points by colour. + +|
|
| +| (a) Input points, pre-network | (b) Output points, post-network | + +
Figure 1: Five colour spiral
+The network \"stretches\" the space fabric in order to separate each of the points into different subspaces. At convergence, the network separates each of the colours into different subspaces of the final manifold. In other words, each of the colours in this new space will be linearly separable using a one *vs.* all regression. The vectors in the diagram can be represented by a five by two matrix; this matrix can be multiplied to each point to return scores for each of the five colours. Each of the points can then be classified by colour using their respective scores. Here, the output dimension is five, one for each of the colours, and the input dimension is two, one for the x and y coordinates of each of the points. To recap, this network basically takes the space fabric and performs a space transformation parametrised by several matrices and then by non-linearities. + + +### Network architecture + +
+
+Figure 2: Network Architecture +
+ +The first matrix maps the two dimensional input to a 100 dimensional intermediate hidden layer. We then have a non-linear layer, `ReLU` or Rectified Linear Unit, which is simply *positive part* $(\cdot)^+$ function. Next, to display our image in a graphical representation, we include an embedding layer that maps the 100 dimensional hidden layer input to a two-dimensional output. Lastly, the embedding layer is projected to the final, five-dimensional layer of the network, representing a score for each colour. + + +## [Random projections - Jupyter Notebook](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=1693s) + +The Jupyter Notebook can be found [here](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/02-space_stretching.ipynb). In order to run the notebook, make sure you have the `pDL` environment installed as specified in [`README.md`](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md). + + +### PyTorch `device` + +PyTorch can run on both the CPU and GPU of a computer. The CPU is useful for sequential tasks, while the GPU is useful for parallel tasks. Before executing on our desired device, we first have to make sure our tensors and models are transferred to the device's memory. This can be done with the following two lines of code: + +```python +device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") +X = torch.randn(n_points, 2).to(device) +``` + +The first line creates a variable, called `device`, that is assigned to the GPU if one is available; otherwise, it defaults to the CPU. In the next line, a tensor is created and sent to the device's memory by calling `.to(device)`. + + +### Jupyter Notebook tip + +To see the documentation for a function in a notebook cell, use `Shift + Tab.` + + +### Visualizing linear transformations + +Recall that a linear transformation can be represented as a matrix. Using singular value decomposition, we can decompose this matrix into three component matrices, each representing a different linear transformation. + +$$ +W = U\begin{bmatrix}s_1 & 0 \\ 0 & s_2 \end{bmatrix} V^\top +$$ + +In eq. (1), matrices $U$ and $V^\top$ are orthogonal and represent rotation and reflection transformations. The middle matrix is diagonal and represents a scaling transformation. + +We visualize the linear transformations of several random matrices in Fig. 3. Note the effect of the singular values on the resulting transformations. + +The matrices used were generated with Numpy; however, we can also use PyTorch's `nn.Linear` class with `bias = False` to create linear transformations. + +| ![]({{site.baseurl}}/images/week01/01-3/initial_scatter_lab1.png) | ![]({{site.baseurl}}/images/week01/01-3/matrix_multiplication_lab1.png) | ![]({{site.baseurl}}/images/week01/01-3/matrix_multiplication_lab1_2.png) | +| (a) Original points | (b) $s_1$ = 1.540, $s_2$ = 0.304 | (c) $s_1$ = 0.464, $s_2$ = 0.017 | + +
Figure 3: Linear transformations from random matrices
+ + +### Non-linear transformations + +Next, we visualize the following transformation: + +$$ +f(x) = \tanh\bigg(\begin{bmatrix} s & 0 \\ 0 & s \end{bmatrix} \bigg) +$$ + +Recall, the graph of $\tanh(\cdot)$ in Fig. 4. + +
+
+Figure 4: hyperbolic tangent non-linearity +
+ +The effect of this non-linearity is to bound points between $-1$ and $+1$, creating a square. As the value of $s$ in eq. (2) increases, more and more points are pushed to the edge of the square. This is shown in Fig. 5. By forcing more points to the edge, we spread them out more and can then attempt to classify them. + +| | | +| (a) Non-linearity with $s=1$ | (b) Nonlinearity with $s=5$ | + +
Figure 5: Non-linear Transformations
+ + +### Random neural net + +Lastly, we visualize the transformation performed by a simple, untrained neural network. The network consists of a linear layer, which performs an affine transformation, followed by a hyperbolic tangent non-linearity, and finally another linear layer. Examining the transformation in Fig. 6, we see that it is unlike the linear and non-linear transformations seen earlier. Going forward, we will see how to make these transformations performed by neural networks useful for our end goal of classification. + +
+
+Figure 6: Transformation from an untrained neural network +
diff --git a/docs/sr/week01/01.md b/docs/sr/week01/01.md new file mode 100644 index 000000000..1082cbb61 --- /dev/null +++ b/docs/sr/week01/01.md @@ -0,0 +1,19 @@ +--- +lang-ref: ch.01 +title: Week 1 +--- + + +## Lecture part A + +We discuss the motivation behind deep learning. We begin with the history and inspiration of deep learning. Then we discuss the history of pattern recognition and introduce gradient descent and its computation by backpropagation. Finally, we discuss the hierarchical representation of the visual cortex. + + +## Lecture part B + +We first discuss the evolution of CNNs, from Fukushima to LeCun to AlexNet. We then discuss some applications of CNN's, such as image segmentation, autonomous vehicles, and medical image analysis. We discuss the hierarchical nature of deep networks and the attributes of deep networks that make them advantageous. We conclude with a discussion of generating and learning features/representations. + + +## Practicum + +We discuss the motivation for applying transformations to data points visualized in space. We talk about Linear Algebra and the application of linear and non-linear transformations. We discuss the use of visualization to understand the function and effects of these transformations. We walk through examples in a Jupyter Notebook and conclude with a discussion of functions represented by neural networks. From 048baeb9fcba9adfd2bce895b93d5180861f1774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sat, 12 Dec 2020 02:54:26 +0100 Subject: [PATCH 18/48] add first 2 chapters translation --- docs/sr/week01/01-1.md | 52 ++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/docs/sr/week01/01-1.md b/docs/sr/week01/01-1.md index 08ca393df..df7db5290 100644 --- a/docs/sr/week01/01-1.md +++ b/docs/sr/week01/01-1.md @@ -1,49 +1,47 @@ --- lang-ref: ch.01-1 -lecturer: Yann LeCun -title: Motivation of Deep Learning, and Its History and Inspiration -authors: Yunya Wang, SunJoo Park, Mark Estudillo, Justin Mae -date: 27 Jan 2020 +predavač: Yann LeCun +naslov: Motivacija iza dubokog učenja, istorija i inspiracija +autori: Yunya Wang, SunJoo Park, Mark Estudillo, Justin Mae +datum: 27 Jan 2020 --- -## [Course plan](https://www.youtube.com/watch?v=0bMe_vCZo30&t=217s) +## [Plan kursa](https://www.youtube.com/watch?v=0bMe_vCZo30&t=217s) -- Basics of Supervised Learning, Neural Nets, Deep Learning -- Backpropagation and architectural components -- Convolutional neural network and its applications -- More Deep Learning Architectures -- Regularization Tricks / Optimization Tricks / Understanding how Deep Learning works -- Energy-based models -- Self-supervised learning and beyond +- Osnove nadgledanog učenja, Neuronske mreže, Duboko učenje +- Propagacija unazad i komponente arhitekture +- Konvolucione neuronske mreže i njihove primene +- Više o arhitekturama dubokih neuronskih mreža +- Trikovi regularizacije / trikovi optimizacije / Razumevanje kako radi duboko učenje +- Modeli zasnovani na energiji +- Samonadgledano učenje i više -## Inspiration of Deep Learning and its history +## Inspiracija za duboko učenje i njegova istorija -On a conceptual level, deep learning is inspired by the brain but not all of the brain's details are relevant. For a comparison, aeroplanes were inspired by birds. The principle of flying is the same but the details are extremely different. +Na konceptualnom nivou, duboko učenje je inspirisano mozgom, ali su neki detalji zanemareni. Kao poređenje, avioni su inspirisani pticama - princip letenja je isti, ali su detalji veoma različiti. -The history of deep learning goes back to a field which changed its name now to cybernetics. It started in the 1940s with McCulloch and Pitts. They came up with the idea that neurons are threshold units with on and off states. You could build a Boolean circuit by connecting neurons with each other and conduct logical inference with neurons. The brain is basically a logical inference machine because neurons are binary. Neurons compute a weighted sum of inputs and compare that sum to its threshold. It turns on if it's above the threshold and turns off if it's below, which is a simplified view of how neural networks work. +Istorija dubokog učenja počinje sa oblašću nauke koja se trenutno zove kibernetika 1940-ih sa McCulloch-om i Pitts-om. Oni su došli na ideju da su neuroni jedinice koje mogu da budu u uključenm ili isključenom stanju i da postoji neki prag kada menjaju stanje. Moglo je da se napravi Bulovo kolo (matematički model za kombinatorna digitalna logička kola) povezivanjem neurona i da se donose neki zaključci preko njih. Mozak je predstavljen kao mašina koja donosi zaključke preko neurona koji su binarni. Neuroni računaju težinsku sumu ulaza i porede je sa svojim pragom. Uključuju se ako je suma veća od praga, a isključuju ako je manja, što je uprošćen pogled na to kako mozak radi. -In 1947, Donald Hebb had the idea that neurons in the brain learn by modifying the strength of the connections between neurons. This is called hyper learning, where if two neurons are fired together, then the connection linked between them increases; if they don't fire together, then the connection decreases. +1947., Donald Hebb je došao na ideju da mozak uči promenama jačine veza između neurona. To je nazvano hiper učenje: ako dva neurona ispale impuls zajedno, veza između njih se pojačava, u suprotnom slabi. -Later in 1948, cybernetics were proposed by Norbert Wiener, which is the idea that by having systems with sensors and actuators, you have a feedback loop and a self-regulatory system. The rules of the feedback mechanism of a car all come from this work. +Kasnije u toku 1948., Norbert Wiener je predložio kibernetiku, što je ideja da postoje sistemi koji imaju senzore i aktuatore, povratnu spregu i samoregulišući sistem. Pravila povratnog mehanizma automobila dolaze iz ovog rada. -In 1957, Frank Rosenblatt proposed the Perceptron, which is a learning algorithm that modifies the weights of very simple neural nets. +1957., Frank Rosenblatt je smislio perceptron, algoritam koji modifikuje težine veoma jednostavnih neuronskih mreža. -Overall, this idea of trying to build intellectual machines by simulating lots of neurons was born in 1940s, took off in 1950s, and completely died in late 1960s. The main reasons for the field dying off in 1960 are: +Ideja da se naprave inteligentne mašine simulacijom velikog broja neurona nastala je 1940-ih, razvijala se tokom 1950-ih, i komplentno je napuštena krajem 1960-ih. Glavni razlozi za napuštanje ove ideje 1960-ih su: -- The researchers used neurons that were binary. However, the way to get backpropagation to work is to use activation functions that are continuous. At that time, researchers didn't have the idea of using continuous neurons and they didn't think they can train with gradients because binary neurons are not differential. -- With continuous neurons, one would have to multiply the activation of a neuron by a weight to get a contribution to the weighted sum. However, before 1980, the multiplication of two numbers, especially floating-point numbers, were extremely slow. This resulted in another incentive to avoid using continuous neurons. +- Naučnici su koristili neurone koji su binarni. Međutim, da bi propagacija unazad radila, aktivacione funkcije su morale da budu kontinualne. U to vreme, naučnici nisu došli do ideje da upotrebe kontinualne neurone i nisu mislili da je moguće da se obučava preko gradijenata jer binarni neuroni nisu diferencijabilni. +- Kod kontinualnih neurona, aktivaciju neurona treba pomnožiti težinom da bi se dobio doprinos težinskoj sumi. Međutim, pre 1980-te, množenje dva broja, pogotovu decimalnih brojeva je bilo veoma sporo. To je bio još jedan razlog da se izbegne upotreba kontinualnih neurona. -Deep Learning took off again in 1985 with the emergence of backpropagation. In 1995, the field died again and the machine learning community abandoned the idea of neural nets. In early 2010, people start using neuron nets in speech recognition with huge performance improvement and later it became widely deployed in the commercial field. In 2013, computer vision started to switch to neuron nets. In 2016, the same transition occurred in natural language processing. Soon, similar revolutions will occur in robotics, control, and many other fields. +Duboko učenje je nastavilo da se razvija 1985. sa pojavom propagacije unazad. 1995., oblast je ponovo pala u zaborav i napuštena je ideja neuronskih mreža. Početkom 2010-ih, neuronske mreže su upotrebljene u prepoznavanju govora i postigle veliko poboljšanje performansi, a zatim se upotreba veoma reširila. 2013-te, računarska vizija je počela da većinski koristi neuronske mreže. 2016-te, isto se desilo i sa obradom prirodnih jezika. Uskoro će se slične revolucije desiti i u robotici, automatskom upravljanju i mnogim drugim oblastima. +### Nadgledano učenje -### Supervised Learning - -$90\%$ of deep learning applications use supervised learning. Supervised learning is a process by which, you collect a bunch of pairs of inputs and outputs, and the inputs are feed into a machine to learn the correct output. When the output is correct, you don't do anything. If the output is wrong, you tweak the parameter of the machine and correct the output toward the one you want. The trick here is how you figure out which direction and how much you tweak the parameter and this goes back to gradient calculation and backpropagation. - -Supervised learning stems from Perceptron and Adaline. The Adaline is based on the same architecture with weighted inputs; when it is above the threshold, it turns on and below the threshold, it turns off. The Perceptron is a 2-layer neuron net where the second layer is trainable and the first layer is fixed. Most of the time, the first layer is determined randomly and that's what they call associative layers. +$90\%$ primena dubokog učenja koriste nadgledano učenje. Nadgledano učenje je proces gde se mreži da veliki broj parova ulaza i izlaza iz kojih treba da nauči kako da za novi dati ulaz predvidi tačan izlaz. U procesu obučavanja, kada je izlaz tačan, ne radi se ništa. Ako je izlaz netačan, malo se promene parametri mreže i ispravi izlaz ka onome koji želimo. Trik je znati u kom smeru i koliko promeniti parametre - i to nas dovodi do računanja gradijenata i propagacije unazad. +Nadgledano učenje potiče od perceptrona i Adaline. Adaline mreža je bazirana na istoj arhitekturi sa težinskim ulazima - iznad praga se uključuje, a ispod isključuje. Perceptron je neuronska mreža sa 2 sloja. Drugi sloj se obučava, a prvi sloj je fiksiran. Većinu vremena, prvi sloj je određen nasumično i zove se asocijativni sloj. ## [History of Pattern Recognition and introduction to Gradient Descent](https://www.youtube.com/watch?v=0bMe_vCZo30&t=1461s) From 60bd44b59f223a098e5bde0b8181531b873e7aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 13 Dec 2020 01:55:23 +0100 Subject: [PATCH 19/48] translated 01-1 --- docs/sr/week01/01-1.md | 43 ++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/docs/sr/week01/01-1.md b/docs/sr/week01/01-1.md index df7db5290..cb4a13253 100644 --- a/docs/sr/week01/01-1.md +++ b/docs/sr/week01/01-1.md @@ -1,9 +1,12 @@ --- +lang: Serbian lang-ref: ch.01-1 -predavač: Yann LeCun -naslov: Motivacija iza dubokog učenja, istorija i inspiracija -autori: Yunya Wang, SunJoo Park, Mark Estudillo, Justin Mae -datum: 27 Jan 2020 +lecturer: Yann LeCun +title: Motivacija iza dubokog učenja, istorija i inspiracija +authors: Yunya Wang, SunJoo Park, Mark Estudillo, Justin Mae +date: 27 Jan 2020 +translation-date: 13 Dec 2020 +translator: Ema Pajić --- @@ -43,24 +46,23 @@ $90\%$ primena dubokog učenja koriste nadgledano učenje. Nadgledano učenje je Nadgledano učenje potiče od perceptrona i Adaline. Adaline mreža je bazirana na istoj arhitekturi sa težinskim ulazima - iznad praga se uključuje, a ispod isključuje. Perceptron je neuronska mreža sa 2 sloja. Drugi sloj se obučava, a prvi sloj je fiksiran. Većinu vremena, prvi sloj je određen nasumično i zove se asocijativni sloj. -## [History of Pattern Recognition and introduction to Gradient Descent](https://www.youtube.com/watch?v=0bMe_vCZo30&t=1461s) +## [Istorija prepoznavanja oblika i uvod u gradijentni spust](https://www.youtube.com/watch?v=0bMe_vCZo30&t=1461s) -The foregoing is the conceptual basis of pattern recognition before deep learning developed. The standard model of pattern recognition consists of feature extractor and trainable classifier. Input goes into the feature extractor, extracting relevant useful characteristics of inputs such as detecting an eye when the purpose is recognizing the face. Then, the vector of features is fed to the trainable classifier for computing weighted sum and comparing it with the threshold. Here, a trainable classifier could be a perceptron or single neural network. The problem is feature extractor should be engineered by hand. Which means, pattern recognition/computer vision focus on feature extractor considering how to design it for a particular problem, not much devoted to a trainable classifier. +U nastavku su opisane konceptualne osnove prepoznavanja oblika pre razvoja dubokog učenja. Standardan model za prepoznavanje oblika ima deo koji izvlači obeležja i klasifikator koji se obučava. Ulazni podaci prvo idu na izvlačenje obeležja, gde se izvlače relevantne korisne karakteristike ulaza kao na primer detektovanje oka ako je cilj prepoznati lice. Nakon toga, vektor obeležja se prosleđuje klasifikatoru koji računa težinske sume i poredi sa pragom. Klasifikator koji obučavamo može da bude perceptron ili neuronska mreža. Problem je što je odluku koja obeležja izvlačimo mora da napravi čovek. To znači da se prepoznavanje oblika / računarska vizija fokusira na izvlačenje odlika i njegov dizajn za specifičan problem, a klasifikatoru se nije posvećivalo puno vremena. -After the emergence and development of deep learning, the 2-stage process changed to the sequences of modules. Each module has tunable parameters and nonlinearity. Then, stack them making multiple layers. This is why it is called “deep learning”. The reason why using nonlinearity rather than linearity is that two linear layers could be one linear layer since the composition of two linear is linear. +Nakon pojave i razvoja dubokog učenja, umesto ova 2 dela počela je da se koristi sekvenca modula. Svaki modul ima podesive parametre i nelinearnost. Tako naređani moduli čine više slojeva i zato se ova oblast i zove duboko učenje. Razlog za korišćenje nelinearnosti umesto linearnosti je to što dva linearna sloja mogu da budu jedan linearan sloj jer je kompozicija dva linearna sloja linearna. -The simplest multi-layer architecture with tunable parameters and nonlinearity could be: the input is represented as a vector such as an image or audio. This input is multiplied by the weight matrix whose coefficient is a tunable parameter. Then, every component of the result vector is passed through a nonlinear function such as ReLU. Repeating this process, it becomes a basic neural network. The reason why it is called a neural network is that this architecture calculates the weighted sum of components of input by corresponding rows of a matrix. +Najjednostavnija višeslojna arhitektura sa podesivim parametrima i nelinearnošću može da bude: ulaz (recimo slika ili audio) je predstavljen kao vektor. Ulaz se pomnoži sa matricom težina čiji koeficijenti su podesivi. Zatim, svaka komponenta vektora rezultata se prosledi nelinearnoj funkciji kao što je ReLU. Ponavljajući taj proces, dobijamo običnu neuronsku mrežu. Razlog zašto se zove neuronska mreža je to što ova arhitektura računa težinsku sumu komponenti ulaza sa odgovarajućim redovima matrice. -Back to the point of supervised learning, we are comparing the resulting output with target output then optimize the objective function which is the loss, computing a distance/penalty/divergence between the result and target. Then, average this cost function over the training set. This is the goal we want to minimize. In other words, we want to find the value of the parameters that minimize this average. +Da se vratimo na poentu nadgledanog učena, poredimo izlaz koji vraća neuronska mreža sa ciljanim izlazima i optimizujemo funkciju gubitka, koja računa rastojanje / kaznu / divergenciju između dobijenog i ciljanog rezultata. Zatim, usrednjujemo ovu funkciju cene po obučavajućem skupu podataka. To je vrednost koju želimo da minimizujemo. Drugim rečima, želimo da nađemo vrednosti parametara koje minimizuju prosečnu grešku na obučavajućem skupu. -The method of how to find it is computing gradient. For example, if we are lost in a smooth mountain at foggy night and want to go to the village in the valley. One way could be turning around and seeing which way the steepest way is to go down then take a small step down. The direction is (negative) gradient. With the assumption that the valley is convex, we could reach the valley. +Način kako da nađemo željene parametre je računanjem gradijenata. Na primer, ako zamislimo da smo se izgubili na planini u maglovitoj noći i želimo da se spustimo do sela koje se nalazi u uvali, jedan način bi bio da se okrenemo oko sebe i pronađemo najstrmiji put dole i zakoračimo u tom smeru. Taj smer je (negativni) gradijent. Sa pretpostavkom da je uvala konveksna, mogli bismo da stignemo do sela. -The more efficient way is called Stochastic Gradient Descent (SGD). Since we want to minimize average loss over the training set, we take one sample or small group of samples and calculate the error, then use gradient descent. Then, we take a new sample and get a new value for the error, then get the gradient which is a different direction normally. Two of the main reasons for using SGD are that it helps a model to converge fast empirically if the training set is very large and it enables better generalization, which means getting similar performance on various sets of data. +Efikasniji način se zove stohastički gradijentni spust (SGD). Pošto želimo da minimizujemo prosečni gubitak na obučavajućem skupu, uzmemo jedan odbirak ili malu grupu odbiraka i izračunamo grešku, zatim primenimo gradijentni spust. Zatim uzmemo novi odbirak i dobijemo novu vrednost za grešku, zatim gradijent koji je obično u drugom smeru. Dva glavna razloga za korišćenje stohastičkog gradijentnog spusta su to što pomaže modelu da brže konvergra empirijski ako je obučavajući skup veoma veliki i omogućava bolju generalizaciju, što znači dobijanje sličnih performansi na različitim skupovima podataka. +### [Računanje gradijenata propagacijom unazad](https://www.youtube.com/watch?v=0bMe_vCZo30&t=2336s) -### [Computing gradients by backpropagation](https://www.youtube.com/watch?v=0bMe_vCZo30&t=2336s) - -Computing gradients by backpropagation is a practical application of the chain rule. The backpropagation equation for the input gradients is as follows: +Računanje gradijenata propagacijom unazad je praktična primena lančanog pravila. Jednačina propagacije unazad za ulazne gradijente je: $$ \begin{aligned} @@ -69,7 +71,7 @@ $$ \end{aligned} $$ -The backpropagation equation for the weight gradients is as follows: +Jednačina propagacije unazad za težinske gradijente je: $$ \begin{aligned} @@ -78,13 +80,14 @@ $$ \end{aligned} $$ -Note that instead of scalar inputs, they will be vector inputs. More generally, multi-dimensional inputs. Backpropagation allows you to compute the derivative of the difference of the output you want and the output you get (which is the value of the objective function) with respect to any value inside the network. Finally, backpropagation is essential as it applies to multiple layers. +Napomena: umesto skalarnih ulaza, ulazi će biti vektori - uopštenije, multidimenzionalni ulazi. Propagacija unazad omogućava računanje izvoda razlike izlaza koji želimo i koji smo dobili (funkcije gubitka) po bilo kojoj vrednosti u mreži. Na kraju, propagacija unazad je neophodna jer se primenjuje na više slojeva. -It is important to consider how to interpret inputs. For example, an image of 256$$\times$$256 would require a 200,000 valued matrix. These would be huge matrices that the neural network layers will need to handle. It would be impractical to utilize such matrices. Therefore, it is important to make hypothesis of the structure of the matrix. +Bitno je razmotriti kako da se interpretiraju ulazi. Na primer, slika 256$$\times$$256 bi zahtevala matricu sa 200,000 vrednosti. To bi bile ogromne matrice koje bi mreža morala da koristi i bilo bi nepraktično koristiti ih. Iz tog razloga, bitno je pretpostaviti strukturu matrice. +## Hijerarhijska reprezentacija vizuelnog korteksa -## Hierarchical representation of the Visual Cortex +Eksperimenti koje je radio Fukušima doveli su do razumevanja kako mozak interpretira ono što oči vide. Ukratko, otkriveno je da neuroni na početku retine kompresuju ulaz (ovo je poznato kao normalizacija kontrasta) i signal putuje od naših očiju do mozga. Zatim, slika se procesira u fazama i određeni neuroni se aktiviraju za određene kategorije. Dakle, vizuelni korteks radi prepoznavanje oblika hijerarhijski. -Experiments by Fukushima gave us an understanding of how our brain interprets the input to our eyes. In summary, it was discovered that neurons in front of our retina compress the input (known as contrast normalization) and the signal travels from our eyes to our brain. After this, the image gets processed in stages and certain neurons get activated for certain categories. Hence, the visual cortex does pattern recognition in a hierarchical manner. +Eksperimenti u kojima su naučnici postavljali elektrode u specifične regije vizuelnog korteksa, specifično V1 regija, doveli su do zaključka da određeni neuroni reaguju na motive koji se pojavljuju u veoma maloj površini vidnog polja i da susedni neuroni vide bliske delove vidnog polja. +Dodatno, neuroni koji reaguju na isti deo vidnog polja, reaguju na različite tipove ivica (na primer, vertikalne ili horizontalne ivice). Takođe, u nauci je većinom prihvaćena ideja da je vizuelni proces direktan, unapred propagiran proces. Dakle, donekle brzo prepoznavanje se može uraditi bez rekurentnih konekcija. -Experiments in which researchers poked electrodes in specific areas of the visual cortex, specifically the V1 area made researchers realize that certain neurons react to motifs that appear in a very small area in a visual field and similarly with neighbouring neurons and neighbouring areas in the visual field. Additionally, neurons that react to the same visual field, react to different types of edges in an organized manner (*e.g.* vertical or horizontal edges). It is also important to note that there's also the idea that the visual process is essentially a feed forward process. Hence, somehow fast recognition can be done without some recurrent connections. From c98dd134e30cc35724e544baed6b6166dd69cea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 13 Dec 2020 02:02:15 +0100 Subject: [PATCH 20/48] translated 01 --- docs/sr/week01/01.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/sr/week01/01.md b/docs/sr/week01/01.md index 1082cbb61..d9e61ca3b 100644 --- a/docs/sr/week01/01.md +++ b/docs/sr/week01/01.md @@ -1,19 +1,22 @@ --- +land: Serbian lang-ref: ch.01 -title: Week 1 +title: 1. Nedelja +translation-date: 13 Dec 2020 +translator: Ema Pajić --- -## Lecture part A +## Lekcija, deo A -We discuss the motivation behind deep learning. We begin with the history and inspiration of deep learning. Then we discuss the history of pattern recognition and introduce gradient descent and its computation by backpropagation. Finally, we discuss the hierarchical representation of the visual cortex. +Objašnjavamo motivaciju za nastajanak dubokog učenja. Počinjemo sa istorijom i inspiracijom za nastanak dubokog učenja. Zatim diskutujemo istoriju prepoznavanja oblika i uvodimo gradijentni spust i njegovo računanje propagacijom unazad. Na kraju, diskutujemo hijerarhijsku reprezentaciju vizuelnog korteksa. -## Lecture part B +## Lekcija, deo B -We first discuss the evolution of CNNs, from Fukushima to LeCun to AlexNet. We then discuss some applications of CNN's, such as image segmentation, autonomous vehicles, and medical image analysis. We discuss the hierarchical nature of deep networks and the attributes of deep networks that make them advantageous. We conclude with a discussion of generating and learning features/representations. +Prvo ćemo diskutovati evoluciju konvolucionih neuronskih mreža (CNN), od Fukušime do LeCun-a, do AlexNet-a. Zatim ćemo videti neke primene konvolucionih neuronskih mreža kao što je segmentacija slike, autonomna vozila i analiza medicinskih slika. Na kraju diskutujemo hijerarhijsku prirodu dubokih neuronskih mreža i svojstva koja ih čine povoljnim. Završavamo pričom o generaciji i učenju obeležja / reprezentacija. -## Practicum +## Praktikum -We discuss the motivation for applying transformations to data points visualized in space. We talk about Linear Algebra and the application of linear and non-linear transformations. We discuss the use of visualization to understand the function and effects of these transformations. We walk through examples in a Jupyter Notebook and conclude with a discussion of functions represented by neural networks. +Prvo ćemo pričati o motivaciji za primenu transformacija na podatke vizualizovane u prostoru, zatim o linearnoj algebri i primeni linearnih i nelinearnih transformacija. Razmatramo upotrebu vizualizacije za razumevanje funkcije i efekte ovih transformacija. Prolazimo kroz primere u Jupyter Notebook-u i zaključujemo sa diskusijom o funkciji koju reprezentuje neuronska mreža. From dd5023c015741703ef057cfb240086483ebbb5fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 13 Dec 2020 02:02:43 +0100 Subject: [PATCH 21/48] small fix 01 --- docs/sr/week01/01.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01.md b/docs/sr/week01/01.md index d9e61ca3b..d90dcf5fb 100644 --- a/docs/sr/week01/01.md +++ b/docs/sr/week01/01.md @@ -1,5 +1,5 @@ --- -land: Serbian +lang: Serbian lang-ref: ch.01 title: 1. Nedelja translation-date: 13 Dec 2020 From 5a68983b80e3c063fec3a657353cac1052f01a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 13 Dec 2020 15:27:45 +0100 Subject: [PATCH 22/48] translation 01-2 part1 --- docs/sr/week01/01-2.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md index 172640773..3431dec02 100644 --- a/docs/sr/week01/01-2.md +++ b/docs/sr/week01/01-2.md @@ -1,31 +1,34 @@ --- +lang: Serbian lang-ref: ch.01-2 lecturer: Yann LeCun title: Evolution and Uses of CNNs and Why Deep Learning? authors: Marina Zavalina, Peeyush Jain, Adrian Pearl, Davida Kollmar date: 27 Jan 2020 +translation-date: 13 Dec 2020 +translator: Ema Pajić --- -## [Evolution of CNNs](https://www.youtube.com/watch?v=0bMe_vCZo30&t=2965s) +## [Evolucija konvolucionih neuronskih mreža (CNN)](https://www.youtube.com/watch?v=0bMe_vCZo30&t=2965s) -In animal brains, neurons react to edges that are at particular orientations. Groups of neurons that react to the same orientations are replicated over all of the visual field. +U mozgu životinja, neuroni reaguju na ivice koje su specifične orijentacije. Grupe neurona koje reaguju na istu orijentaciju nalaze se svuda po vidnom polju. -Fukushima (1982) built a neural net (NN) that worked the same way as the brain, based on two concepts. First, neurons are replicated across the visual field. Second, there are complex cells that pool the information from simple cells (orientation-selective units). As a result, the shift of the picture will change the activation of simple cells, but will not influence the integrated activation of the complex cell (convolutional pooling). +Fukušima je 1982. godine napravio neuronsku mrežu koja je radila na isti način kao i mozak, bazirano na 2 koncepta. Prvo, neuroni su postavljeni po celom vidnom polju. Drugo, postoje kompleksne ćelije koje agregiraju informacije iz jednostavnih ćelija (jedinica koje reaguju na orijentaciju). Kao rezultat, pomeraj slike će uticati na aktivacije jednostavnih ćelija, ali neće uticati na agregiranu aktivaciju komplikovane ćelije (agregiranje konvolucijom). -LeCun (1990) used backprop to train a CNN to recognize handwritten digits. There is a demo from 1992 where the algorithm recognizes the digits of any style. Doing character/pattern recognition using a model that is trained end-to-end was new at that time. Previously, people had used feature extractors with a supervised model on top. +LeCun je 1990. godine iskoristio propagaciju unazad da obuči konvolucionu neuronsku mrežu da prepozna rukom pisane cifre. Postoji video iz 1992. gde algoritam prepoznaje cifre napisane različitim stilovima. Prepoznavanje karaktera / oblika koristeći model koji rešava problem od početka do kraja je bilo novo u to vreme. Ranije je bilo neophodno izvlačenje obeležja pre modela nadgledanog učenja. -These new CNN systems could recognize multiple characters in the image at the same time. To do it, people used a small input window for a CNN and swiped it over the whole image. If it activated, it meant there was a particular character present. +Ovi novi CNN sistemi su mogli da prepoznaju više karaktera na slici istovremeno. To se radilo tako što je postojao mali prozor koji se pomerao po celoj slici i on je prosleđivan na ulaz modela. Ako se aktivira, to znači da je prisutan određeni karakter. -Later, this idea was applied to faces/people detection and semantic segmentation (pixel-wise classification). Examples include Hadsell (2009) and Farabet (2012). This eventually became popular in industry, used in autonomous driving applications such as lane tracking. +Kasnije je ova ideja primenjena na detekciju lica / ljudi i semantičku segmentaciju (klasifikaciju piksela na slici). Primeri za to su Hadsel (2009) i Farabet (2012). Vremenom je ovo postalo popularno u industriji i koristi se, na primer, za praćenje trake na putu u autonomnoj vožnji. -Special types of hardware to train CNN were a hot topic in the 1980s, then the interest dropped, and now it has become popular again. +Specijalan hardver za obučavanje konvolucionih neuronskih mreža je bila popularna tema 1980-ih, zatim je interesovanje opalo, ali se ponovo vratilo u skorije vreme. -The deep learning (though the term was not used at that time) revolution started in 2010-2013. Researchers focused on inventing algorithms that could help train large CNNs faster. Krizhevsky (2012) came up with AlexNet, which was a much larger CNN than those used before, and trained it on ImageNet (1.3 million samples) using GPUs. After running for a couple of weeks AlexNet beat the performance of the best competing systems by a large margin -- a 25.8% *vs.* 16.4% top-5 error rate. +Revolucija dubokog učenja (doduše, ovaj termin se nije koristio u to vreme) je počela 2010.-2013. Naučnici su se fokusirali na smišljanje algoritama koji bi mogli da ubrzaju treniranje velikih konvolucionih neuronskih mreža. Križevski je 2012. smislio AlexNet, mnogo veću konvolucionu neuronsku mrežu nego što su ranije koriščene, i obučio je na ImageNet-u (skupu podataka sa oko 1.3 miliona odbiraka) koristeći GPU (Grafičku procesorsku jedinicu). Nakon obučavanja nekoliko nedelja, AlexNet je imao značajno bolje rezultate od najboljih rivalskih sistema -- 25.8% *vs.* 16.4% top-5 procenat greške. -After seeing AlexNet's success, the computer vision (CV) community was convinced that CNNs work. While all papers from 2011-2012 that mentioned CNNs had been rejected, since 2016 most accepted CV papers use CNNs. +Nakon uspeha AlexNet-a, naučnici iz oblasti računarske vizije su bili ubeđeni da konvolucione neuronske mreže rade. Dok su svi radovi iz 2011.-2012. koji su pominjali CNN bili odbijeni, nakon 2016. najveći broj objavljenih radova koristi CNN. -Over the years, the number of layers used has been increasing: LeNet -- 7, AlexNet -- 12, VGG -- 19, ResNet -- 50. However, there is a trade-off between the number of operations needed to compute the output, the size of the model, and its accuracy. Thus, a popular topic now is how to compress the networks to make the computations faster. +Vremenom se broj slojeva povećavao: LeNet -- 7, AlexNet -- 12, VGG -- 19, ResNet -- 50. Međutim, postoji kompromis između broja operacija potrebnog da se sračuna izlaz modela, veličine modela i njegove tačnosti. Iz tog razloga, trenutno popularna tema je kako kompresovati mreže da bi bile brže. From f71b7bd7cae47a786c9d7a183ad9e753f0f58366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 13 Dec 2020 20:53:09 +0100 Subject: [PATCH 23/48] translated 01-2 --- docs/sr/week01/01-2.md | 60 +++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md index 3431dec02..6910740bd 100644 --- a/docs/sr/week01/01-2.md +++ b/docs/sr/week01/01-2.md @@ -32,56 +32,56 @@ Vremenom se broj slojeva povećavao: LeNet -- 7, AlexNet -- 12, VGG -- 19, ResNe -## [Deep Learning and Feature Extraction](https://www.youtube.com/watch?v=0bMe_vCZo30&t=3955s) +## [Duboko učenje i izvlačenje obeležja](https://www.youtube.com/watch?v=0bMe_vCZo30&t=3955s) -Multilayer networks are successful because they exploit the compositional structure of natural data. In compositional hierarchy, combinations of objects at one layer in the hierarchy form the objects at the next layer. If we mimic this hierarchy as multiple layers and let the network learn the appropriate combination of features, we get what is called Deep Learning architecture. Thus, Deep Learning networks are hierarchical in nature. +Višeslojne mreže su uspešne jer koriste kompozitnu strukturu podataka. U kompozitnoj hijerarhiji, kombinacije objekata na jednom sloju hijerarhije kreiraju objekte na sledećem sloju. Ako imitiramo tu hijerarhiju pomoću više slojeva i pustimo mrežu da uči odgovarajuću kombinaciju obeležja, dobijemo arhitekturu duboke neuronske mreže. Dakle, duboke neuronske mreže su prirodno hijerarhijske. -Deep learning architectures have led to an incredible progress in computer vision tasks ranging from identifying and generating accurate masks around the objects to identifying spatial properties of an object. Mask-RCNN and RetinaNet architectures mainly led to this improvement. +Arhitekture dubokog učenja dovele su do neverovatnog napretka u računarskoj viziji, na raznim problemima, počevši od identifikacije i generacije tačnih "maski" objekata do identifikacije prostornih odlika objekta. Mask-RCNN i RetinaNet arhitekture su većinom dovele do ovog napretka. -Mask RCNNs have found their use in segmenting individual objects, *i.e.* creating masks for each object in an image. The input and output are both images. The architecture can also be used to do instance segmentation, *i.e.* identifying different objects of the same type in an image. Detectron, a Facebook AI Research (FAIR) software system, implements all these state-of-the-art object detection algorithms and is open source. +Mask-RCNN mreže su pronašle primenu u segmentaciji pojedinačnih objekata, na primer kreiranju maske svakog objekta na slici. Ulaz i izlaz iz mreže su oba slike. Arhitektura takođe može da se primeni na segmentaciju instanci, tj identifikaciju različitih objekata istog tipa na slici. Detectron, softverski sistem Facebook AI Research (FAIR) centra, implementira sve najbolje algoritme detekcije objekata i open source-uje ih. -Some of the practical applications of CNNs are powering autonomous driving and analysing medical images. +Neke od primena konvolucionih neuronskih mreža su i omogućavanje autonomne vožnje i analiza medicinskih slika. -Although the science and mathematics behind deep learning is fairly understood, there are still some interesting questions that require more research. These questions include: Why do architectures with multiple layers perform better, given that we can approximate any function with two layers? Why do CNNs work well with natural data such as speech, images, and text? How are we able to optimize non-convex functions so well? Why do over-parametrised architectures work? +Iako je nauka i matematika iza dubokog učenja dosta dobro shvaćena, idalje postoje zanimljiva pitanja koja treba istražiti. Na primer: Zašto arhitekture sa više slojeva rade bolje, uzevši u obzir da možemo da aproksimiramo funkciju pomoću 2 sloja? Zašto konvolucione neuronske mreže rade dobro sa prirodnim podacima kao što su govor, slike i tekst? Kako uspevamo da toliko dobro optimizujemo nekonveksne funkcije? Zašto arhitekture sa previše parametara rade? -Feature extraction consists of expanding the representational dimension such that the expanded features are more likely to be linearly separable; data points in higher dimensional space are more likely to be linearly separable due to the increase in the number of possible separating planes. +Izdvajanje odlika sastoji se od proširivanja dimenzije reprezentacije tako da proširena obeležja verovatnije budu linearno separabilna, tačke u prostoru više dimenzije su verovatnije linearno separabilne zbog povećanja broja potencijalnih separacionih ravni. -Earlier machine learning practitioners relied on high quality, hand crafted, and task specific features to build artificial intelligence models, but with the advent of Deep Learning, the models are able to extract the generic features automatically. Some common approaches used in feature extraction algorithms are highlighted below: +Ranije se u primenama mašinskog učenja oslanjalo na kvalitetne, ručno odabrane odlike, specifične za zadatak. Zbog napretka dubokog učenja, modeli su u mogućnosti da automatski izdvoje obeležja. Neki od pristupa korišćenih u izdvajanju odlika: -- Space tiling -- Random Projections -- Polynomial Classifier (feature cross-products) -- Radial basis functions -- Kernel Machines +- Popločavanje prostora +- Nasumične projekcije +- Polinomijalni klasifikator (unakrsni proizvodi obeležja) +- Funkcije radijalne baze +- Kernel mašine -Because of the compositional nature of data, learned features have a hierarchy of representations with increasing level of abstractions. For example: +Zbog kompozitne prirode podataka, naučena obeležja imaju hijerarhiju reprezentacija sa rastućim nivoem apstrakcije. Na primer: -- Images - At the most granular level, images can be thought of as pixels. Combination of pixels constitute edges which when combined forms textons (multi-edge shapes). Textons form motifs and motifs form parts of the image. By combining these parts together we get the final image. -- Text - Similarly, there is an inherent hierarchy in textual data. Characters form words, when we combine words together we get word-groups, then clauses, then by combining clauses we get sentences. Sentences finally tell us what story is being conveyed. -- Speech - In speech, samples compose bands, which compose sounds, which compose phones, then phonemes, then whole words, then sentences, thus showing a clear hierarchy in representation. +- Slike - Na najmanjem nivou, slike su pikseli. Kombinacija piksela čini ivice, dok kombinacija ivica čini tekstone (oblike sa više ivica). Tekstoni čine motive, a motivi čine delove slike. Kombinacijom delova slike dobijamo celu sliku. +- Tekst - Slično, postoji inherentna hijerarhija u tekstualnim podacima. Karakteri formiraju reči, reči formiraju grupe reči, zatim klauzule, a kombinacijom klauzula dobijamo rečenice. Rečenice čine priču koja je zapisana. +- Govor - U govoru, od zamisli, preko aparata za govor, do glasova i fonema, zatim celih reči i na kraju rečenica, takođe vidimo jasnu hijerarhiju. -## [Learning representations](https://www.youtube.com/watch?v=0bMe_vCZo30&t=4767s) +## [Učenje reprezentacija](https://www.youtube.com/watch?v=0bMe_vCZo30&t=4767s) -There are those who dismiss Deep Learning: if we can approximate any function with 2 layers, why have more? +Ne žele svi da prihvate duboko učenje: ako možemo da aproksimiramo bilo koju funkciju pomoću 2 sloja, zašto koristiti više? -For example: SVMs find a separating hyperplane "in the span of the data", meaning predictions are based on comparisons to training examples. SVMs are essentially a very simplistic 2 layer neural net, where the first layer defines "templates" and the second layer is a linear classifier. The problem with 2 layer fallacy is that the complexity and size of the middle layer is exponential in $N$ (to do well with a difficult task, need LOTS of templates). But if you expand the number of layers to $\log(N)$, the layers become linear in $N$. There is a trade-off between time and space. +Na primer: SVM nalazi separacionu hiperpovrš "preko podataka", tj. predikcije su bazirane na poređenjima sa podacima iz obučavajućeg skupa. SVM je u suštini veoma jednostavna dvoslojna neuronska mreža, gde prvi sloj definiše "šablone", a drugi sloj je linearni klasifikator. Problem sa dvoslojnom mrežom je to što je kompleksnost i veličina srednjeg sloja eksponencijalna po $N$ (da bi dobro radila na teškom zadatku, potrebno je PUNO šablona). Međutim, ako proširimo broj slojeva na $\log(N)$, slojevi postaju linearni po $N$. Postoji kompromis između vremena i prostora. -An analogy is designing a circuit to compute a boolean function with no more than two layers of gates -- we can compute **any boolean function** this way! But, the complexity and resources of the first layer (number of gates) quickly becomes infeasible for complex functions. +Analogija je dizajniranje kola koje računa bulovu funkciju sa ne više od dva sloja kapija -- možemo da sračunamo **bilo koju bulovu funkciju** na ovaj način! Međutim, kompleksnost i resursi prvog sloja (broj kapija) brzo postaju nepraktične za kompleksne funkcije. -What is "deep"? +Šta je "duboko"? -- An SVM isn't deep because it only has two layers -- A classification tree isn't deep because every layer analyses the same (raw) features -- A deep network has several layers and uses them to build a **hierarchy of features of increasing complexity** +- SVM nije dubok jer ima samo 2 sloja +- Klasifikaciono stablo nije duboko jer svaki sloj analizira ista obeležja +- Duboka neuronska mreža ima više slojeva i koristi ih da napravi **hijerarhiju obeležja rastuće kompleksnosti** -How can models learn representations (good features)? +Kako modeli uče reprezentacije (dobra obeležja)? -Manifold hypothesis: natural data lives in a low-dimensional manifold. Set of possible images is essentially infinite, set of "natural" images is a tiny subset. For example: for an image of a person, the set of possible images is on the order of magnitude of the number of face muscles they can move (degrees of freedom) ~ 50. An ideal (and unrealistic) feature extractor represents all the factors of variation (each of the muscles, lighting, *etc.*). +Manifold hipoteza: prirodni podaci su u nisko-dimenzionom prostoru. Skup mogućih slika je u suštini beskonačan, ali je skup "prirodnih" slika mali podskup. Na primer: Za sliku osobe, skup mogućih slika je reda veličine broja mišića lica koji mogu da se pomere (stepeni slobode) ~ 50. Idealan (i nerealističan) izdvajač obečežja reprezentuje sve faktore (svaki mišić, svetlost, itd.) -Q&A from the end of lecture: +Pitanja i odgovori sa kraja lekcije: -- For the face example, could some other dimensionality reduction technique (*i.e.* PCA) extract these features? - - Answer: would only work if the manifold surface is a hyperplane, which it is not +- Za primer lica, da li bi neka druga tehnika redukcija dimenzija (npr. PCA) uspela da izvuče ta obeležja? + - Odgovor: to bi radilo samo ako je površina manifolda hiperravan, što nije. From 4f5c58f69f2c733a10f1a51ab399eb19b5d7697c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 13 Dec 2020 21:03:46 +0100 Subject: [PATCH 24/48] title fix 01-2 --- docs/sr/week01/01-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md index 6910740bd..7d8f8786d 100644 --- a/docs/sr/week01/01-2.md +++ b/docs/sr/week01/01-2.md @@ -2,7 +2,7 @@ lang: Serbian lang-ref: ch.01-2 lecturer: Yann LeCun -title: Evolution and Uses of CNNs and Why Deep Learning? +title: Evolucija i primene konvolucionih neuronskih mreža i zašto duboko učenje? authors: Marina Zavalina, Peeyush Jain, Adrian Pearl, Davida Kollmar date: 27 Jan 2020 translation-date: 13 Dec 2020 From 218547b32681a5548f2ddf89450b73e7afc9cb6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 14 Dec 2020 00:40:29 +0100 Subject: [PATCH 25/48] translated 01-3 --- docs/sr/week01/01-3.md | 88 ++++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 41 deletions(-) diff --git a/docs/sr/week01/01-3.md b/docs/sr/week01/01-3.md index c713810e9..23295b913 100644 --- a/docs/sr/week01/01-3.md +++ b/docs/sr/week01/01-3.md @@ -1,122 +1,128 @@ --- +lang: Serbian lang-ref: ch.01-3 title: Problem Motivation, Linear Algebra, and Visualization lecturer: Alfredo Canziani authors: Derek Yen, Tony Xu, Ben Stadnick, Prasanthi Gurumurthy date: 28 Jan 2020 +translation-date: 14 Dec 2020 +translator: Ema Pajić --- -## Resources +## Materijali -Please follow Alfredo Canziani [on Twitter @alfcnz](https://twitter.com/alfcnz). Videos and textbooks with relevant details on linear algebra and singular value decomposition (SVD) can be found by searching Alfredo's Twitter, for example type `linear algebra (from:alfcnz)` in the search box. +Zapratite Alfredo Canziani [na Twitter nalogu @alfcnz](https://twitter.com/alfcnz). Videi i beleške sa relevantnim detaljima o linearnoj algebri i SVD dekompozicija se mogu naći na Alfredovom tviteru, na primer pretragom `linear algebra (from:alfcnz)`. -## [Transformations and motivation](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=233s) +## [Transformacije i motivacija](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=233s) -As a motivating example, let us consider image classification. Suppose we take a picture with a 1 megapixel camera. This image will have about 1,000 pixels vertically and 1,000 pixels horizontally, and each pixel will have three colour dimensions for red, green, and blue (RGB). Each particular image can then be considered as one point in a 3 million-dimensional space. With such massive dimensionality, many interesting images we might want to classify -- such as a dog *vs.* a cat -- will essentially be in the same region of the space. +Kao motivišući primer, posmatrajmo klasifikaciju slika. Zamislite da smo napravili fotografiju kamerom sa rezolucijom 1 megapiksel. Ta slika će imati oko 1,000 piksela vertikalno i 1,000 piksela horizontalno i svaki piksel će imati 3 dimenzije za boje (RGB, crvena, zelena, plava). Svaka slika se može posmatrati kao jedna tačka u prostoru sa 3 miliona dimenzija. Sa tako velikom dimenzionalnošću, mnogo interesantnih slika koje želimo da klasifikujemo -- na primer pas *vs.* mačka -- će u suštini biti u istom regionu prostora. -In order to effectively separate these images, we consider ways of transforming the data in order to move the points. Recall that in 2-D space, a linear transformation is the same as matrix multiplication. For example, the following are linear transformations: +Da bismo razdvojili te slike, razmatramo načine transformacije podataka. Prisetimo se da u 2D prostoru, linearna transformacija je isto što i množenje matrica. Na primer, sledeće transformacije su linearne: -- Rotation (when the matrix is orthonormal). -- Scaling (when the matrix is diagonal). -- Reflection (when the determinant is negative). -- Shearing. +- Rotacija (kada je matrica ortonormalna). +- Skaliranje (kada je matrica dijagonalna). +- Refleksija (kada je determinanta negativna). +- Odsecanje. -Note that translation alone is not linear since 0 will not always be mapped to 0, but it is an affine transformation. Returning to our image example, we can transform the data points by translating such that the points are clustered around 0 and scaling with a diagonal matrix such that we "zoom in" to that region. Finally, we can do classification by finding lines across the space which separate the different points into their respective classes. In other words, the idea is to use linear and nonlinear transformations to map the points into a space such that they are linearly separable. This idea will be made more concrete in the following sections. +Treba uzeti u obzir da sama translacija nije linearna jer se 0 neće uvek mapirati u 0, ali jeste afina transformacija. Vratimo se na primer slike - možemo da transliramo tačke tako da su centrirane oko 0 i skaliramo dijagonalnom matricom tako da "uvećamo" taj region. Na kraju, možemo da uradimo klasifikaciju traženjem linija u prostoru koje razdvajaju različite tačke u njihove klase. Drugim rečima, ideja je da koristimo linearne i nelinearne trensformacije da mapiramo tačke u prostor u kome su linearno separabilne. Ova ideja će biti konkretnije opisane u narednim sekcijama. -## [Data visualization - separating points by colour using a network](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=798s) -In our visualization, we have five branches of a spiral, with each branch corresponding to a different colour. The points live in a two dimensional plane and can be represented as a tuple; the colour represents a third dimension which can be thought of as the different classes for each of the points. We then use the network to separate each of the points by colour. +## [Vizualizacija podataka - razdvajanje tačaka bojom koristeći neuronsku mrežu](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=798s) + +U našim vizualizacijama, imamo 5 grana spirale i svaka grana je druge boje. Tačke su u dvodimenzionalnom prostoru i mogu da se reprezentuju kao tuple. Boja predstavlja treću dimenziju - klasu kojoj tačke pripadaju. Upotrebićemo neuronsku mrežu da razdvojimo tačke po boji. |
|
| -| (a) Input points, pre-network | (b) Output points, post-network | +| (a) Ulazne tačke, pre mreže | (b) Izlazne tačke, nakon mreže | -
Figure 1: Five colour spiral
-The network \"stretches\" the space fabric in order to separate each of the points into different subspaces. At convergence, the network separates each of the colours into different subspaces of the final manifold. In other words, each of the colours in this new space will be linearly separable using a one *vs.* all regression. The vectors in the diagram can be represented by a five by two matrix; this matrix can be multiplied to each point to return scores for each of the five colours. Each of the points can then be classified by colour using their respective scores. Here, the output dimension is five, one for each of the colours, and the input dimension is two, one for the x and y coordinates of each of the points. To recap, this network basically takes the space fabric and performs a space transformation parametrised by several matrices and then by non-linearities. +
Figure 1: Spirala sa 5 boja
+Mreža \"rasteže\" prostor u cilju da razdvoji tačke koje pripadaju različitim potprostorima. Kada iskonvergira, mreža razdvaja svaku od boja u različit potprostor konačnog prostora. Drugim rečima, svaka od boja u novom prostoru će biti linearno separabilna koristeći "1 protiv svih" regresiju. Vektori na dijagramu mogu da se predstave 5x2 matricom. Ta matrica se može pomnožiti svakom od tačaka i vratiće rezultate za svaku od 5 boja. Svaka od tačaka onda može biti klasifikovana po boji pomoću tih rezultata. Ovde je dimenzija izlaza 5, po jedna za svaku boju, a dimenzija ulaza je 2, po jedna za x i y koordinate tačaka. Da rezimiramo, ova mreža u suštini kreće od nekog prostora i vrši transformacije njega, parametrizovano sa nekoliko matrica a zatim nelinearnostima. -### Network architecture +### Arhitektura neuronske mreže

-Figure 2: Network Architecture +Figure 2: Arhitektura neuronske mreže
-The first matrix maps the two dimensional input to a 100 dimensional intermediate hidden layer. We then have a non-linear layer, `ReLU` or Rectified Linear Unit, which is simply *positive part* $(\cdot)^+$ function. Next, to display our image in a graphical representation, we include an embedding layer that maps the 100 dimensional hidden layer input to a two-dimensional output. Lastly, the embedding layer is projected to the final, five-dimensional layer of the network, representing a score for each colour. +Prva matrica mapira dvodimenzionalni ulaz u 100-dimenzioni pomoćni skriveni sloj. Zatim imamo nelinearan sloj, `ReLU` (Rectified Linear Unit), koja je jednostavno *pozitivan deo* $(\cdot)^+$. Dalje, da bismo prikazali sliku, imamo embedding sloj koji mapira 100-dimenzioni skriveni sloj u dvodimenzioni izlaz. Na kraju, embedding sloj se projektuje na finalni, petodimenzioni sloj mreže koji predstavlja rezultat za svaku od boja. -## [Random projections - Jupyter Notebook](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=1693s) +## [Nasumične projekcije - Jupyter Notebook](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=1693s) -The Jupyter Notebook can be found [here](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/02-space_stretching.ipynb). In order to run the notebook, make sure you have the `pDL` environment installed as specified in [`README.md`](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/README.md). +Jupyter Notebook se može naći [ovde](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/02-space_stretching.ipynb). Da bi se sveska pokrenula, proveriti da li je `pDL` okruženje instalirano kao što je specificirano u [`README.md`](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md). ### PyTorch `device` -PyTorch can run on both the CPU and GPU of a computer. The CPU is useful for sequential tasks, while the GPU is useful for parallel tasks. Before executing on our desired device, we first have to make sure our tensors and models are transferred to the device's memory. This can be done with the following two lines of code: +PyTorch može da pokreće kod i na CPU i GPU računara. CPU je koristan za sekvencijalne zadatke, dok je GPU koristan za paralelne zadatke. Pre pokretanja na željenom uređaju, prvo moramo da budemo sigurni da su se tenzori i modeli prebacili na memoriju uređaja. To se može uraditi sledećim linijama koda: ```python device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") X = torch.randn(n_points, 2).to(device) ``` -The first line creates a variable, called `device`, that is assigned to the GPU if one is available; otherwise, it defaults to the CPU. In the next line, a tensor is created and sent to the device's memory by calling `.to(device)`. +Prva linija kreira promenljivu `device`, kojoj se dodeljuje GPU ako je dostupan, a u suprotnom CPU. U sledećoj liniji se kreira tenzor i šalje na memoriju uređaja pozivom `.to(device)`. + +### Jupyter Notebook savet -### Jupyter Notebook tip +Za gledanje dokumentacije za funkciju u ćeliji sveske, kliknuti `Shift + Tab.` -To see the documentation for a function in a notebook cell, use `Shift + Tab.` +### Vizualizacija linearnih transformacija -### Visualizing linear transformations +Prisetimo se da se linearna transformacija može predstaviti matricom. Korišćenjem SVD dekompozicije, možemo da rastavimo tu matricu na 3 komponente matrice, tako da svaka predstavlja različitu linearnu transformaciju. -Recall that a linear transformation can be represented as a matrix. Using singular value decomposition, we can decompose this matrix into three component matrices, each representing a different linear transformation. $$ W = U\begin{bmatrix}s_1 & 0 \\ 0 & s_2 \end{bmatrix} V^\top $$ -In eq. (1), matrices $U$ and $V^\top$ are orthogonal and represent rotation and reflection transformations. The middle matrix is diagonal and represents a scaling transformation. +U jednačini (1), matrice $U$ i $V^\top$ su ortogonalne i predstavljaju transformacije rotacije i refleksije. Srednja matrica je dijagonalna i predstavlja transformaciju skaliranja. -We visualize the linear transformations of several random matrices in Fig. 3. Note the effect of the singular values on the resulting transformations. +Vizualizujemo linearne transformacije nekoliko nasumičnih matrica na Fig. 3. Obratiti pažnju na efekte singularnih vrednosti na rezultujuću transformaciju. -The matrices used were generated with Numpy; however, we can also use PyTorch's `nn.Linear` class with `bias = False` to create linear transformations. +Matrice su generisane koristeći Numpy, ali takođe možemo da koristimo i PyTorch `nn.Linear` klasu sa `bias = False` opcijom da kreiramo linearne transformacije. | ![]({{site.baseurl}}/images/week01/01-3/initial_scatter_lab1.png) | ![]({{site.baseurl}}/images/week01/01-3/matrix_multiplication_lab1.png) | ![]({{site.baseurl}}/images/week01/01-3/matrix_multiplication_lab1_2.png) | -| (a) Original points | (b) $s_1$ = 1.540, $s_2$ = 0.304 | (c) $s_1$ = 0.464, $s_2$ = 0.017 | +| (a) Originalne tačke | (b) $s_1$ = 1.540, $s_2$ = 0.304 | (c) $s_1$ = 0.464, $s_2$ = 0.017 | -
Figure 3: Linear transformations from random matrices
+
Figure 3: Linearne transformacije nasumičnih matrica
-### Non-linear transformations +### Nelinearne transformacije -Next, we visualize the following transformation: +Dalje vizualizujemo sledeću transformaciju: $$ f(x) = \tanh\bigg(\begin{bmatrix} s & 0 \\ 0 & s \end{bmatrix} \bigg) $$ -Recall, the graph of $\tanh(\cdot)$ in Fig. 4. +Prisetimo se, grafik $\tanh(\cdot)$ sa Fig. 4.

-Figure 4: hyperbolic tangent non-linearity +Figure 4: Hiperbolički tangens
-The effect of this non-linearity is to bound points between $-1$ and $+1$, creating a square. As the value of $s$ in eq. (2) increases, more and more points are pushed to the edge of the square. This is shown in Fig. 5. By forcing more points to the edge, we spread them out more and can then attempt to classify them. +Efekat ove nelinearnosti je da ograniči tačke između $-1$ and $+1$, kreirajući kvadrat. Kako se vrednost $s$ u jednačini (2) povećava, sve više tačakau bivaju odgurnute na ivice kvadrata. To je pokazano na Fig. 5. Gurajući što više tačaka na ivice, povećava se rastojanje između njih i možemo da pokušamo da ih klasifikujemo. | | | -| (a) Non-linearity with $s=1$ | (b) Nonlinearity with $s=5$ | +| (a) Nelinearnost sa $s=1$ | (b) Nelinearnost sa $s=5$ | + +
Figure 5: Nelinearne transformacije
-
Figure 5: Non-linear Transformations
+### Nasumična neuronska mreža -### Random neural net +Na kraju, vizualizujemo transformaciju dobijenu jednostavnom, neobučenom neuronskom mrežom. Ova mreža ima linearni sloj, koji izvršava afinu transformaciju, iza kog sledi hiperbolički tangens nelinearnost i na kraju još jedan linearni sloj. Proučavanjem transformacije sa Fig. 6, vidimo da je različita od linearnih i nelinearnih transformacija koje smo videli ranije. U nastavku ćemo videti kako da napravimo transformacije koje vrši neuronska mreža korisne za naš krajnji cilj klasifikacije. -Lastly, we visualize the transformation performed by a simple, untrained neural network. The network consists of a linear layer, which performs an affine transformation, followed by a hyperbolic tangent non-linearity, and finally another linear layer. Examining the transformation in Fig. 6, we see that it is unlike the linear and non-linear transformations seen earlier. Going forward, we will see how to make these transformations performed by neural networks useful for our end goal of classification.

-Figure 6: Transformation from an untrained neural network +Figure 6: Transformacija dobijena neobučenom neuronskom mrežom
From b6e58db5df92a95ab11edecdd4be07b859bee962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 14 Dec 2020 00:43:11 +0100 Subject: [PATCH 26/48] add serbian week01 --- docs/_config.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index afc5bd769..92d197e66 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -708,7 +708,13 @@ vi: ################################### Serbian #################################### sr: title: 'Duboko Učenje' - + chapters: + - path: sr/week01/01.md + sections: + - path: sr/week01/01-1.md + - path: sr/week01/01-2.md + - path: sr/week01/01-3.md + ################################### Bengali #################################### bn: title: 'ডীপ লার্নিং' From d78fd6ba34d5143c34729043e6ac90b5d8048916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 14 Dec 2020 00:48:18 +0100 Subject: [PATCH 27/48] change en to sr in links --- docs/sr/index.md | 109 ++++++++++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/docs/sr/index.md b/docs/sr/index.md index d77300643..c57cbc65c 100644 --- a/docs/sr/index.md +++ b/docs/sr/index.md @@ -34,20 +34,21 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F + - + Lekcije - Istorija i motivacija + Istorija i motivacija 🖥️ 🎥 - Evolucija i duboko učenje + Evolucija i duboko učenje Praktikum - Neuronske mreže (NN) + Neuronske mreže (NN) 📓 📓 @@ -56,18 +57,18 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - Stohastički gradijentni spust (SGD) i propagacija unazad + Stohastički gradijentni spust (SGD) i propagacija unazad 🖥️ 🎥 - Propagacija unazad u praksi + Propagacija unazad u praksi Praktikum - Obučavanje neuronskih mreža + Obučavanje neuronskih mreža 🖥 📓 @@ -77,18 +78,18 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - Transformacija parametara + Transformacija parametara 🖥️ 🎥 - Konvolucione neuronske mreže (CNN) + Konvolucione neuronske mreže (CNN) Praktikum - Svojstva prirodnih signala + Svojstva prirodnih signala 🖥 📓 @@ -97,9 +98,9 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Praktikum - 1D konvolucija + 1D konvolucija 📓 🎥 @@ -107,18 +108,18 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - Optimizacija I + Optimizacija I 🖥️ 🎥 - Optimizacija II + Optimizacija II Praktikum - Konvolucione neuronske mreže (CNN), autograd + Konvolucione neuronske mreže (CNN), autograd 📓 📓 @@ -127,19 +128,19 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - CNN primene + CNN primene 🖥️ 🖥️ 🎥 - Rekurentne neuronske mreže (RNN) i mehanizam pažnje (attention) + Rekurentne neuronske mreže (RNN) i mehanizam pažnje (attention) Praktikum - Obučavanje RNN + Obučavanje RNN 📓 📓 @@ -149,18 +150,18 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - Modeli zasnovani na energiji (EBM) + Modeli zasnovani na energiji (EBM) 🖥️ 🎥 - Samonadgledano učenje (SSL), EBM + Samonadgledano učenje (SSL), EBM Praktikum - Autoenkoderi + Autoenkoderi 🖥️ 📓 @@ -169,18 +170,18 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - Kontrastivne metode + Kontrastivne metode 🖥️ 🎥 - Regularizovani latentni modeli energije + Regularizovani latentni modeli energije Praktikum - Obučavanje varijacionih autoenkodera (VAE) + Obučavanje varijacionih autoenkodera (VAE) 🖥️ 📓 @@ -189,18 +190,18 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - Proređenost + Proređenost 🖥️ 🎥 - Model reči, GAN + Model reči, GAN Praktikum - Treniranje GAN-ova + Treniranje GAN-ova 🖥️ 📓 @@ -209,18 +210,18 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - Računarska vizija (CV) SSL I + Računarska vizija (CV) SSL I 🖥️ 🎥 - Računarska vizija (CV) SSL II + Računarska vizija (CV) SSL II Praktikum - Prediktivno upravljanje + Prediktivno upravljanje 🖥️ 📓 @@ -229,9 +230,9 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - Aktivacije + Aktivacije 🖥️ 🖥️ @@ -239,10 +240,10 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F 🎥 - Funkcije gubitka + Funkcije gubitka Praktikum - PPUU + PPUU 🖥️ 📓 @@ -251,18 +252,18 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - Duboko učenje za obradu prirodnih jezika (NLP) I + Duboko učenje za obradu prirodnih jezika (NLP) I 🖥️ 🎥 - Duboko učenje za obradu prirodnih jezika (NLP) II + Duboko učenje za obradu prirodnih jezika (NLP) II Praktikum - Mehanizmi pažnje (attention) i Transformeri + Mehanizmi pažnje (attention) i Transformeri 🖥️ 📓 @@ -271,18 +272,18 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - Grafovske konvolucione mreže (GCN) I + Grafovske konvolucione mreže (GCN) I 🖥️ 🎥 - Grafovske konvolucione mreže (GCN) II + Grafovske konvolucione mreže (GCN) II Praktikum - Grafovske konvolucione mreže (GCN) III + Grafovske konvolucione mreže (GCN) III 🖥️ 📓 @@ -291,18 +292,18 @@ Ovaj kurs prati najskorije tehnike u dubokom učenju i učenju reprezentacija. F - + Lekcije - Struktuirane predikcije + Struktuirane predikcije 🖥️ 🎥 - Grafičke metode + Grafičke metode Praktikum - Regularizacija i Bajesovske neuronske mreže + Regularizacija i Bajesovske neuronske mreže 🖥️ 📓 From 0c28410aba53a1479f8ccb78ea55a8ea5d5a0931 Mon Sep 17 00:00:00 2001 From: Alfredo Canziani Date: Mon, 14 Dec 2020 11:22:34 -0500 Subject: [PATCH 28/48] Update 01-1.md --- docs/sr/week01/01-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01-1.md b/docs/sr/week01/01-1.md index cb4a13253..f024c48db 100644 --- a/docs/sr/week01/01-1.md +++ b/docs/sr/week01/01-1.md @@ -1,5 +1,5 @@ --- -lang: Serbian +lang: sr lang-ref: ch.01-1 lecturer: Yann LeCun title: Motivacija iza dubokog učenja, istorija i inspiracija From daebe4aa1faeedea8322a7896ac2d23969566704 Mon Sep 17 00:00:00 2001 From: Alfredo Canziani Date: Mon, 14 Dec 2020 11:22:56 -0500 Subject: [PATCH 29/48] Update 01-2.md --- docs/sr/week01/01-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md index 7d8f8786d..b69d27057 100644 --- a/docs/sr/week01/01-2.md +++ b/docs/sr/week01/01-2.md @@ -1,5 +1,5 @@ --- -lang: Serbian +lang: sr lang-ref: ch.01-2 lecturer: Yann LeCun title: Evolucija i primene konvolucionih neuronskih mreža i zašto duboko učenje? From 70652c9f45f1fa76159a71c62b59e41eddc4704e Mon Sep 17 00:00:00 2001 From: Alfredo Canziani Date: Mon, 14 Dec 2020 11:23:15 -0500 Subject: [PATCH 30/48] Update 01.md --- docs/sr/week01/01.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01.md b/docs/sr/week01/01.md index d90dcf5fb..dd40c727f 100644 --- a/docs/sr/week01/01.md +++ b/docs/sr/week01/01.md @@ -1,5 +1,5 @@ --- -lang: Serbian +lang: sr lang-ref: ch.01 title: 1. Nedelja translation-date: 13 Dec 2020 From 1442ce4086b255d5ca44f363d7f2f40c4600850c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 14 Dec 2020 17:35:25 +0100 Subject: [PATCH 31/48] add comments with original text --- docs/sr/week01/01-1.md | 67 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/docs/sr/week01/01-1.md b/docs/sr/week01/01-1.md index f024c48db..fa441f9f2 100644 --- a/docs/sr/week01/01-1.md +++ b/docs/sr/week01/01-1.md @@ -9,9 +9,19 @@ translation-date: 13 Dec 2020 translator: Ema Pajić --- - + ## [Plan kursa](https://www.youtube.com/watch?v=0bMe_vCZo30&t=217s) + - Osnove nadgledanog učenja, Neuronske mreže, Duboko učenje - Propagacija unazad i komponente arhitekture - Konvolucione neuronske mreže i njihove primene @@ -21,47 +31,90 @@ translator: Ema Pajić - Samonadgledano učenje i više + ## Inspiracija za duboko učenje i njegova istorija + Na konceptualnom nivou, duboko učenje je inspirisano mozgom, ali su neki detalji zanemareni. Kao poređenje, avioni su inspirisani pticama - princip letenja je isti, ali su detalji veoma različiti. + Istorija dubokog učenja počinje sa oblašću nauke koja se trenutno zove kibernetika 1940-ih sa McCulloch-om i Pitts-om. Oni su došli na ideju da su neuroni jedinice koje mogu da budu u uključenm ili isključenom stanju i da postoji neki prag kada menjaju stanje. Moglo je da se napravi Bulovo kolo (matematički model za kombinatorna digitalna logička kola) povezivanjem neurona i da se donose neki zaključci preko njih. Mozak je predstavljen kao mašina koja donosi zaključke preko neurona koji su binarni. Neuroni računaju težinsku sumu ulaza i porede je sa svojim pragom. Uključuju se ako je suma veća od praga, a isključuju ako je manja, što je uprošćen pogled na to kako mozak radi. + 1947., Donald Hebb je došao na ideju da mozak uči promenama jačine veza između neurona. To je nazvano hiper učenje: ako dva neurona ispale impuls zajedno, veza između njih se pojačava, u suprotnom slabi. + Kasnije u toku 1948., Norbert Wiener je predložio kibernetiku, što je ideja da postoje sistemi koji imaju senzore i aktuatore, povratnu spregu i samoregulišući sistem. Pravila povratnog mehanizma automobila dolaze iz ovog rada. + 1957., Frank Rosenblatt je smislio perceptron, algoritam koji modifikuje težine veoma jednostavnih neuronskih mreža. + Ideja da se naprave inteligentne mašine simulacijom velikog broja neurona nastala je 1940-ih, razvijala se tokom 1950-ih, i komplentno je napuštena krajem 1960-ih. Glavni razlozi za napuštanje ove ideje 1960-ih su: + - Naučnici su koristili neurone koji su binarni. Međutim, da bi propagacija unazad radila, aktivacione funkcije su morale da budu kontinualne. U to vreme, naučnici nisu došli do ideje da upotrebe kontinualne neurone i nisu mislili da je moguće da se obučava preko gradijenata jer binarni neuroni nisu diferencijabilni. - Kod kontinualnih neurona, aktivaciju neurona treba pomnožiti težinom da bi se dobio doprinos težinskoj sumi. Međutim, pre 1980-te, množenje dva broja, pogotovu decimalnih brojeva je bilo veoma sporo. To je bio još jedan razlog da se izbegne upotreba kontinualnih neurona. + Duboko učenje je nastavilo da se razvija 1985. sa pojavom propagacije unazad. 1995., oblast je ponovo pala u zaborav i napuštena je ideja neuronskih mreža. Početkom 2010-ih, neuronske mreže su upotrebljene u prepoznavanju govora i postigle veliko poboljšanje performansi, a zatim se upotreba veoma reširila. 2013-te, računarska vizija je počela da većinski koristi neuronske mreže. 2016-te, isto se desilo i sa obradom prirodnih jezika. Uskoro će se slične revolucije desiti i u robotici, automatskom upravljanju i mnogim drugim oblastima. + ### Nadgledano učenje + $90\%$ primena dubokog učenja koriste nadgledano učenje. Nadgledano učenje je proces gde se mreži da veliki broj parova ulaza i izlaza iz kojih treba da nauči kako da za novi dati ulaz predvidi tačan izlaz. U procesu obučavanja, kada je izlaz tačan, ne radi se ništa. Ako je izlaz netačan, malo se promene parametri mreže i ispravi izlaz ka onome koji želimo. Trik je znati u kom smeru i koliko promeniti parametre - i to nas dovodi do računanja gradijenata i propagacije unazad. + Nadgledano učenje potiče od perceptrona i Adaline. Adaline mreža je bazirana na istoj arhitekturi sa težinskim ulazima - iznad praga se uključuje, a ispod isključuje. Perceptron je neuronska mreža sa 2 sloja. Drugi sloj se obučava, a prvi sloj je fiksiran. Većinu vremena, prvi sloj je određen nasumično i zove se asocijativni sloj. + ## [Istorija prepoznavanja oblika i uvod u gradijentni spust](https://www.youtube.com/watch?v=0bMe_vCZo30&t=1461s) + U nastavku su opisane konceptualne osnove prepoznavanja oblika pre razvoja dubokog učenja. Standardan model za prepoznavanje oblika ima deo koji izvlači obeležja i klasifikator koji se obučava. Ulazni podaci prvo idu na izvlačenje obeležja, gde se izvlače relevantne korisne karakteristike ulaza kao na primer detektovanje oka ako je cilj prepoznati lice. Nakon toga, vektor obeležja se prosleđuje klasifikatoru koji računa težinske sume i poredi sa pragom. Klasifikator koji obučavamo može da bude perceptron ili neuronska mreža. Problem je što je odluku koja obeležja izvlačimo mora da napravi čovek. To znači da se prepoznavanje oblika / računarska vizija fokusira na izvlačenje odlika i njegov dizajn za specifičan problem, a klasifikatoru se nije posvećivalo puno vremena. + Nakon pojave i razvoja dubokog učenja, umesto ova 2 dela počela je da se koristi sekvenca modula. Svaki modul ima podesive parametre i nelinearnost. Tako naređani moduli čine više slojeva i zato se ova oblast i zove duboko učenje. Razlog za korišćenje nelinearnosti umesto linearnosti je to što dva linearna sloja mogu da budu jedan linearan sloj jer je kompozicija dva linearna sloja linearna. + Najjednostavnija višeslojna arhitektura sa podesivim parametrima i nelinearnošću može da bude: ulaz (recimo slika ili audio) je predstavljen kao vektor. Ulaz se pomnoži sa matricom težina čiji koeficijenti su podesivi. Zatim, svaka komponenta vektora rezultata se prosledi nelinearnoj funkciji kao što je ReLU. Ponavljajući taj proces, dobijamo običnu neuronsku mrežu. Razlog zašto se zove neuronska mreža je to što ova arhitektura računa težinsku sumu komponenti ulaza sa odgovarajućim redovima matrice. + Da se vratimo na poentu nadgledanog učena, poredimo izlaz koji vraća neuronska mreža sa ciljanim izlazima i optimizujemo funkciju gubitka, koja računa rastojanje / kaznu / divergenciju između dobijenog i ciljanog rezultata. Zatim, usrednjujemo ovu funkciju cene po obučavajućem skupu podataka. To je vrednost koju želimo da minimizujemo. Drugim rečima, želimo da nađemo vrednosti parametara koje minimizuju prosečnu grešku na obučavajućem skupu. + Način kako da nađemo željene parametre je računanjem gradijenata. Na primer, ako zamislimo da smo se izgubili na planini u maglovitoj noći i želimo da se spustimo do sela koje se nalazi u uvali, jedan način bi bio da se okrenemo oko sebe i pronađemo najstrmiji put dole i zakoračimo u tom smeru. Taj smer je (negativni) gradijent. Sa pretpostavkom da je uvala konveksna, mogli bismo da stignemo do sela. + Efikasniji način se zove stohastički gradijentni spust (SGD). Pošto želimo da minimizujemo prosečni gubitak na obučavajućem skupu, uzmemo jedan odbirak ili malu grupu odbiraka i izračunamo grešku, zatim primenimo gradijentni spust. Zatim uzmemo novi odbirak i dobijemo novu vrednost za grešku, zatim gradijent koji je obično u drugom smeru. Dva glavna razloga za korišćenje stohastičkog gradijentnog spusta su to što pomaže modelu da brže konvergra empirijski ako je obučavajući skup veoma veliki i omogućava bolju generalizaciju, što znači dobijanje sličnih performansi na različitim skupovima podataka. + ### [Računanje gradijenata propagacijom unazad](https://www.youtube.com/watch?v=0bMe_vCZo30&t=2336s) + Računanje gradijenata propagacijom unazad je praktična primena lančanog pravila. Jednačina propagacije unazad za ulazne gradijente je: $$ @@ -71,6 +124,8 @@ $$ \end{aligned} $$ + Jednačina propagacije unazad za težinske gradijente je: $$ @@ -80,14 +135,24 @@ $$ \end{aligned} $$ + Napomena: umesto skalarnih ulaza, ulazi će biti vektori - uopštenije, multidimenzionalni ulazi. Propagacija unazad omogućava računanje izvoda razlike izlaza koji želimo i koji smo dobili (funkcije gubitka) po bilo kojoj vrednosti u mreži. Na kraju, propagacija unazad je neophodna jer se primenjuje na više slojeva. + Bitno je razmotriti kako da se interpretiraju ulazi. Na primer, slika 256$$\times$$256 bi zahtevala matricu sa 200,000 vrednosti. To bi bile ogromne matrice koje bi mreža morala da koristi i bilo bi nepraktično koristiti ih. Iz tog razloga, bitno je pretpostaviti strukturu matrice. + ## Hijerarhijska reprezentacija vizuelnog korteksa + Eksperimenti koje je radio Fukušima doveli su do razumevanja kako mozak interpretira ono što oči vide. Ukratko, otkriveno je da neuroni na početku retine kompresuju ulaz (ovo je poznato kao normalizacija kontrasta) i signal putuje od naših očiju do mozga. Zatim, slika se procesira u fazama i određeni neuroni se aktiviraju za određene kategorije. Dakle, vizuelni korteks radi prepoznavanje oblika hijerarhijski. + Eksperimenti u kojima su naučnici postavljali elektrode u specifične regije vizuelnog korteksa, specifično V1 regija, doveli su do zaključka da određeni neuroni reaguju na motive koji se pojavljuju u veoma maloj površini vidnog polja i da susedni neuroni vide bliske delove vidnog polja. Dodatno, neuroni koji reaguju na isti deo vidnog polja, reaguju na različite tipove ivica (na primer, vertikalne ili horizontalne ivice). Takođe, u nauci je većinom prihvaćena ideja da je vizuelni proces direktan, unapred propagiran proces. Dakle, donekle brzo prepoznavanje se može uraditi bez rekurentnih konekcija. From 1e4e8f91d31ec050c2bb8d70caa820e61b7f89ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 14 Dec 2020 17:44:54 +0100 Subject: [PATCH 32/48] add comments with original text 01-2 --- docs/sr/week01/01-2.md | 77 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md index b69d27057..7d75e6c79 100644 --- a/docs/sr/week01/01-2.md +++ b/docs/sr/week01/01-2.md @@ -9,79 +9,150 @@ translation-date: 13 Dec 2020 translator: Ema Pajić --- - + ## [Evolucija konvolucionih neuronskih mreža (CNN)](https://www.youtube.com/watch?v=0bMe_vCZo30&t=2965s) + U mozgu životinja, neuroni reaguju na ivice koje su specifične orijentacije. Grupe neurona koje reaguju na istu orijentaciju nalaze se svuda po vidnom polju. + Fukušima je 1982. godine napravio neuronsku mrežu koja je radila na isti način kao i mozak, bazirano na 2 koncepta. Prvo, neuroni su postavljeni po celom vidnom polju. Drugo, postoje kompleksne ćelije koje agregiraju informacije iz jednostavnih ćelija (jedinica koje reaguju na orijentaciju). Kao rezultat, pomeraj slike će uticati na aktivacije jednostavnih ćelija, ali neće uticati na agregiranu aktivaciju komplikovane ćelije (agregiranje konvolucijom). + LeCun je 1990. godine iskoristio propagaciju unazad da obuči konvolucionu neuronsku mrežu da prepozna rukom pisane cifre. Postoji video iz 1992. gde algoritam prepoznaje cifre napisane različitim stilovima. Prepoznavanje karaktera / oblika koristeći model koji rešava problem od početka do kraja je bilo novo u to vreme. Ranije je bilo neophodno izvlačenje obeležja pre modela nadgledanog učenja. + Ovi novi CNN sistemi su mogli da prepoznaju više karaktera na slici istovremeno. To se radilo tako što je postojao mali prozor koji se pomerao po celoj slici i on je prosleđivan na ulaz modela. Ako se aktivira, to znači da je prisutan određeni karakter. + Kasnije je ova ideja primenjena na detekciju lica / ljudi i semantičku segmentaciju (klasifikaciju piksela na slici). Primeri za to su Hadsel (2009) i Farabet (2012). Vremenom je ovo postalo popularno u industriji i koristi se, na primer, za praćenje trake na putu u autonomnoj vožnji. + Specijalan hardver za obučavanje konvolucionih neuronskih mreža je bila popularna tema 1980-ih, zatim je interesovanje opalo, ali se ponovo vratilo u skorije vreme. + Revolucija dubokog učenja (doduše, ovaj termin se nije koristio u to vreme) je počela 2010.-2013. Naučnici su se fokusirali na smišljanje algoritama koji bi mogli da ubrzaju treniranje velikih konvolucionih neuronskih mreža. Križevski je 2012. smislio AlexNet, mnogo veću konvolucionu neuronsku mrežu nego što su ranije koriščene, i obučio je na ImageNet-u (skupu podataka sa oko 1.3 miliona odbiraka) koristeći GPU (Grafičku procesorsku jedinicu). Nakon obučavanja nekoliko nedelja, AlexNet je imao značajno bolje rezultate od najboljih rivalskih sistema -- 25.8% *vs.* 16.4% top-5 procenat greške. + Nakon uspeha AlexNet-a, naučnici iz oblasti računarske vizije su bili ubeđeni da konvolucione neuronske mreže rade. Dok su svi radovi iz 2011.-2012. koji su pominjali CNN bili odbijeni, nakon 2016. najveći broj objavljenih radova koristi CNN. + Vremenom se broj slojeva povećavao: LeNet -- 7, AlexNet -- 12, VGG -- 19, ResNet -- 50. Međutim, postoji kompromis između broja operacija potrebnog da se sračuna izlaz modela, veličine modela i njegove tačnosti. Iz tog razloga, trenutno popularna tema je kako kompresovati mreže da bi bile brže. - + ## [Duboko učenje i izvlačenje obeležja](https://www.youtube.com/watch?v=0bMe_vCZo30&t=3955s) + Višeslojne mreže su uspešne jer koriste kompozitnu strukturu podataka. U kompozitnoj hijerarhiji, kombinacije objekata na jednom sloju hijerarhije kreiraju objekte na sledećem sloju. Ako imitiramo tu hijerarhiju pomoću više slojeva i pustimo mrežu da uči odgovarajuću kombinaciju obeležja, dobijemo arhitekturu duboke neuronske mreže. Dakle, duboke neuronske mreže su prirodno hijerarhijske. + Arhitekture dubokog učenja dovele su do neverovatnog napretka u računarskoj viziji, na raznim problemima, počevši od identifikacije i generacije tačnih "maski" objekata do identifikacije prostornih odlika objekta. Mask-RCNN i RetinaNet arhitekture su većinom dovele do ovog napretka. + Mask-RCNN mreže su pronašle primenu u segmentaciji pojedinačnih objekata, na primer kreiranju maske svakog objekta na slici. Ulaz i izlaz iz mreže su oba slike. Arhitektura takođe može da se primeni na segmentaciju instanci, tj identifikaciju različitih objekata istog tipa na slici. Detectron, softverski sistem Facebook AI Research (FAIR) centra, implementira sve najbolje algoritme detekcije objekata i open source-uje ih. + Neke od primena konvolucionih neuronskih mreža su i omogućavanje autonomne vožnje i analiza medicinskih slika. + Iako je nauka i matematika iza dubokog učenja dosta dobro shvaćena, idalje postoje zanimljiva pitanja koja treba istražiti. Na primer: Zašto arhitekture sa više slojeva rade bolje, uzevši u obzir da možemo da aproksimiramo funkciju pomoću 2 sloja? Zašto konvolucione neuronske mreže rade dobro sa prirodnim podacima kao što su govor, slike i tekst? Kako uspevamo da toliko dobro optimizujemo nekonveksne funkcije? Zašto arhitekture sa previše parametara rade? + Izdvajanje odlika sastoji se od proširivanja dimenzije reprezentacije tako da proširena obeležja verovatnije budu linearno separabilna, tačke u prostoru više dimenzije su verovatnije linearno separabilne zbog povećanja broja potencijalnih separacionih ravni. + Ranije se u primenama mašinskog učenja oslanjalo na kvalitetne, ručno odabrane odlike, specifične za zadatak. Zbog napretka dubokog učenja, modeli su u mogućnosti da automatski izdvoje obeležja. Neki od pristupa korišćenih u izdvajanju odlika: + + + + + + - Popločavanje prostora - Nasumične projekcije - Polinomijalni klasifikator (unakrsni proizvodi obeležja) - Funkcije radijalne baze - Kernel mašine + Zbog kompozitne prirode podataka, naučena obeležja imaju hijerarhiju reprezentacija sa rastućim nivoem apstrakcije. Na primer: + - Slike - Na najmanjem nivou, slike su pikseli. Kombinacija piksela čini ivice, dok kombinacija ivica čini tekstone (oblike sa više ivica). Tekstoni čine motive, a motivi čine delove slike. Kombinacijom delova slike dobijamo celu sliku. + - Tekst - Slično, postoji inherentna hijerarhija u tekstualnim podacima. Karakteri formiraju reči, reči formiraju grupe reči, zatim klauzule, a kombinacijom klauzula dobijamo rečenice. Rečenice čine priču koja je zapisana. + - Govor - U govoru, od zamisli, preko aparata za govor, do glasova i fonema, zatim celih reči i na kraju rečenica, takođe vidimo jasnu hijerarhiju. - + ## [Učenje reprezentacija](https://www.youtube.com/watch?v=0bMe_vCZo30&t=4767s) + Ne žele svi da prihvate duboko učenje: ako možemo da aproksimiramo bilo koju funkciju pomoću 2 sloja, zašto koristiti više? + Na primer: SVM nalazi separacionu hiperpovrš "preko podataka", tj. predikcije su bazirane na poređenjima sa podacima iz obučavajućeg skupa. SVM je u suštini veoma jednostavna dvoslojna neuronska mreža, gde prvi sloj definiše "šablone", a drugi sloj je linearni klasifikator. Problem sa dvoslojnom mrežom je to što je kompleksnost i veličina srednjeg sloja eksponencijalna po $N$ (da bi dobro radila na teškom zadatku, potrebno je PUNO šablona). Međutim, ako proširimo broj slojeva na $\log(N)$, slojevi postaju linearni po $N$. Postoji kompromis između vremena i prostora. + Analogija je dizajniranje kola koje računa bulovu funkciju sa ne više od dva sloja kapija -- možemo da sračunamo **bilo koju bulovu funkciju** na ovaj način! Međutim, kompleksnost i resursi prvog sloja (broj kapija) brzo postaju nepraktične za kompleksne funkcije. + Šta je "duboko"? + - SVM nije dubok jer ima samo 2 sloja - Klasifikaciono stablo nije duboko jer svaki sloj analizira ista obeležja - Duboka neuronska mreža ima više slojeva i koristi ih da napravi **hijerarhiju obeležja rastuće kompleksnosti** + Kako modeli uče reprezentacije (dobra obeležja)? + Manifold hipoteza: prirodni podaci su u nisko-dimenzionom prostoru. Skup mogućih slika je u suštini beskonačan, ali je skup "prirodnih" slika mali podskup. Na primer: Za sliku osobe, skup mogućih slika je reda veličine broja mišića lica koji mogu da se pomere (stepeni slobode) ~ 50. Idealan (i nerealističan) izdvajač obečežja reprezentuje sve faktore (svaki mišić, svetlost, itd.) + Pitanja i odgovori sa kraja lekcije: + + - Za primer lica, da li bi neka druga tehnika redukcija dimenzija (npr. PCA) uspela da izvuče ta obeležja? - Odgovor: to bi radilo samo ako je površina manifolda hiperravan, što nije. From dbbaf261760d027e08e810b1c58fe136cd0e8ccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 14 Dec 2020 17:58:56 +0100 Subject: [PATCH 33/48] add comments with original text 01-3 --- docs/sr/week01/01-3.md | 100 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 90 insertions(+), 10 deletions(-) diff --git a/docs/sr/week01/01-3.md b/docs/sr/week01/01-3.md index 23295b913..a46a777e2 100644 --- a/docs/sr/week01/01-3.md +++ b/docs/sr/week01/01-3.md @@ -9,16 +9,29 @@ translation-date: 14 Dec 2020 translator: Ema Pajić --- - + ## Materijali + Zapratite Alfredo Canziani [na Twitter nalogu @alfcnz](https://twitter.com/alfcnz). Videi i beleške sa relevantnim detaljima o linearnoj algebri i SVD dekompozicija se mogu naći na Alfredovom tviteru, na primer pretragom `linear algebra (from:alfcnz)`. - + ## [Transformacije i motivacija](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=233s) + Kao motivišući primer, posmatrajmo klasifikaciju slika. Zamislite da smo napravili fotografiju kamerom sa rezolucijom 1 megapiksel. Ta slika će imati oko 1,000 piksela vertikalno i 1,000 piksela horizontalno i svaki piksel će imati 3 dimenzije za boje (RGB, crvena, zelena, plava). Svaka slika se može posmatrati kao jedna tačka u prostoru sa 3 miliona dimenzija. Sa tako velikom dimenzionalnošću, mnogo interesantnih slika koje želimo da klasifikujemo -- na primer pas *vs.* mačka -- će u suštini biti u istom regionu prostora. + Da bismo razdvojili te slike, razmatramo načine transformacije podataka. Prisetimo se da u 2D prostoru, linearna transformacija je isto što i množenje matrica. Na primer, sledeće transformacije su linearne: - Rotacija (kada je matrica ortonormalna). @@ -26,38 +39,63 @@ Da bismo razdvojili te slike, razmatramo načine transformacije podataka. Priset - Refleksija (kada je determinanta negativna). - Odsecanje. + Treba uzeti u obzir da sama translacija nije linearna jer se 0 neće uvek mapirati u 0, ali jeste afina transformacija. Vratimo se na primer slike - možemo da transliramo tačke tako da su centrirane oko 0 i skaliramo dijagonalnom matricom tako da "uvećamo" taj region. Na kraju, možemo da uradimo klasifikaciju traženjem linija u prostoru koje razdvajaju različite tačke u njihove klase. Drugim rečima, ideja je da koristimo linearne i nelinearne trensformacije da mapiramo tačke u prostor u kome su linearno separabilne. Ova ideja će biti konkretnije opisane u narednim sekcijama. - + ## [Vizualizacija podataka - razdvajanje tačaka bojom koristeći neuronsku mrežu](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=798s) + U našim vizualizacijama, imamo 5 grana spirale i svaka grana je druge boje. Tačke su u dvodimenzionalnom prostoru i mogu da se reprezentuju kao tuple. Boja predstavlja treću dimenziju - klasu kojoj tačke pripadaju. Upotrebićemo neuronsku mrežu da razdvojimo tačke po boji. + |
|
| | (a) Ulazne tačke, pre mreže | (b) Izlazne tačke, nakon mreže | +
Figure 1: Spirala sa 5 boja
+ Mreža \"rasteže\" prostor u cilju da razdvoji tačke koje pripadaju različitim potprostorima. Kada iskonvergira, mreža razdvaja svaku od boja u različit potprostor konačnog prostora. Drugim rečima, svaka od boja u novom prostoru će biti linearno separabilna koristeći "1 protiv svih" regresiju. Vektori na dijagramu mogu da se predstave 5x2 matricom. Ta matrica se može pomnožiti svakom od tačaka i vratiće rezultate za svaku od 5 boja. Svaka od tačaka onda može biti klasifikovana po boji pomoću tih rezultata. Ovde je dimenzija izlaza 5, po jedna za svaku boju, a dimenzija ulaza je 2, po jedna za x i y koordinate tačaka. Da rezimiramo, ova mreža u suštini kreće od nekog prostora i vrši transformacije njega, parametrizovano sa nekoliko matrica a zatim nelinearnostima. - + ### Arhitektura neuronske mreže +

Figure 2: Arhitektura neuronske mreže
+ Prva matrica mapira dvodimenzionalni ulaz u 100-dimenzioni pomoćni skriveni sloj. Zatim imamo nelinearan sloj, `ReLU` (Rectified Linear Unit), koja je jednostavno *pozitivan deo* $(\cdot)^+$. Dalje, da bismo prikazali sliku, imamo embedding sloj koji mapira 100-dimenzioni skriveni sloj u dvodimenzioni izlaz. Na kraju, embedding sloj se projektuje na finalni, petodimenzioni sloj mreže koji predstavlja rezultat za svaku od boja. - + ## [Nasumične projekcije - Jupyter Notebook](https://www.youtube.com/watch?v=5_qrxVq1kvc&t=1693s) + Jupyter Notebook se može naći [ovde](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/02-space_stretching.ipynb). Da bi se sveska pokrenula, proveriti da li je `pDL` okruženje instalirano kao što je specificirano u [`README.md`](https://github.com/Atcold/pytorch-Deep-Learning/blob/master/docs/sr/README-SR.md). ### PyTorch `device` + PyTorch može da pokreće kod i na CPU i GPU računara. CPU je koristan za sekvencijalne zadatke, dok je GPU koristan za paralelne zadatke. Pre pokretanja na željenom uređaju, prvo moramo da budemo sigurni da su se tenzori i modeli prebacili na memoriju uređaja. To se može uraditi sledećim linijama koda: ```python @@ -65,16 +103,24 @@ device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") X = torch.randn(n_points, 2).to(device) ``` + Prva linija kreira promenljivu `device`, kojoj se dodeljuje GPU ako je dostupan, a u suprotnom CPU. U sledećoj liniji se kreira tenzor i šalje na memoriju uređaja pozivom `.to(device)`. - + ### Jupyter Notebook savet + Za gledanje dokumentacije za funkciju u ćeliji sveske, kliknuti `Shift + Tab.` - + ### Vizualizacija linearnih transformacija + Prisetimo se da se linearna transformacija može predstaviti matricom. Korišćenjem SVD dekompozicije, možemo da rastavimo tu matricu na 3 komponente matrice, tako da svaka predstavlja različitu linearnu transformaciju. @@ -82,46 +128,80 @@ $$ W = U\begin{bmatrix}s_1 & 0 \\ 0 & s_2 \end{bmatrix} V^\top $$ + U jednačini (1), matrice $U$ i $V^\top$ su ortogonalne i predstavljaju transformacije rotacije i refleksije. Srednja matrica je dijagonalna i predstavlja transformaciju skaliranja. + Vizualizujemo linearne transformacije nekoliko nasumičnih matrica na Fig. 3. Obratiti pažnju na efekte singularnih vrednosti na rezultujuću transformaciju. + Matrice su generisane koristeći Numpy, ali takođe možemo da koristimo i PyTorch `nn.Linear` klasu sa `bias = False` opcijom da kreiramo linearne transformacije. + | ![]({{site.baseurl}}/images/week01/01-3/initial_scatter_lab1.png) | ![]({{site.baseurl}}/images/week01/01-3/matrix_multiplication_lab1.png) | ![]({{site.baseurl}}/images/week01/01-3/matrix_multiplication_lab1_2.png) | | (a) Originalne tačke | (b) $s_1$ = 1.540, $s_2$ = 0.304 | (c) $s_1$ = 0.464, $s_2$ = 0.017 | +
Figure 3: Linearne transformacije nasumičnih matrica
- + ### Nelinearne transformacije + Dalje vizualizujemo sledeću transformaciju: $$ f(x) = \tanh\bigg(\begin{bmatrix} s & 0 \\ 0 & s \end{bmatrix} \bigg) $$ + Prisetimo se, grafik $\tanh(\cdot)$ sa Fig. 4. +

Figure 4: Hiperbolički tangens
+ Efekat ove nelinearnosti je da ograniči tačke između $-1$ and $+1$, kreirajući kvadrat. Kako se vrednost $s$ u jednačini (2) povećava, sve više tačakau bivaju odgurnute na ivice kvadrata. To je pokazano na Fig. 5. Gurajući što više tačaka na ivice, povećava se rastojanje između njih i možemo da pokušamo da ih klasifikujemo. + | | | | (a) Nelinearnost sa $s=1$ | (b) Nelinearnost sa $s=5$ |
Figure 5: Nelinearne transformacije
- + ### Nasumična neuronska mreža + Na kraju, vizualizujemo transformaciju dobijenu jednostavnom, neobučenom neuronskom mrežom. Ova mreža ima linearni sloj, koji izvršava afinu transformaciju, iza kog sledi hiperbolički tangens nelinearnost i na kraju još jedan linearni sloj. Proučavanjem transformacije sa Fig. 6, vidimo da je različita od linearnih i nelinearnih transformacija koje smo videli ranije. U nastavku ćemo videti kako da napravimo transformacije koje vrši neuronska mreža korisne za naš krajnji cilj klasifikacije. - +

Figure 6: Transformacija dobijena neobučenom neuronskom mrežom From 32085a2174f6b3a2b7abd0f64a5b7083c9e9cc6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 14 Dec 2020 18:00:15 +0100 Subject: [PATCH 34/48] add comments with original text 01 --- docs/sr/week01/01.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/sr/week01/01.md b/docs/sr/week01/01.md index dd40c727f..8ca3e542c 100644 --- a/docs/sr/week01/01.md +++ b/docs/sr/week01/01.md @@ -9,14 +9,20 @@ translator: Ema Pajić ## Lekcija, deo A + Objašnjavamo motivaciju za nastajanak dubokog učenja. Počinjemo sa istorijom i inspiracijom za nastanak dubokog učenja. Zatim diskutujemo istoriju prepoznavanja oblika i uvodimo gradijentni spust i njegovo računanje propagacijom unazad. Na kraju, diskutujemo hijerarhijsku reprezentaciju vizuelnog korteksa. ## Lekcija, deo B + Prvo ćemo diskutovati evoluciju konvolucionih neuronskih mreža (CNN), od Fukušime do LeCun-a, do AlexNet-a. Zatim ćemo videti neke primene konvolucionih neuronskih mreža kao što je segmentacija slike, autonomna vozila i analiza medicinskih slika. Na kraju diskutujemo hijerarhijsku prirodu dubokih neuronskih mreža i svojstva koja ih čine povoljnim. Završavamo pričom o generaciji i učenju obeležja / reprezentacija. ## Praktikum + Prvo ćemo pričati o motivaciji za primenu transformacija na podatke vizualizovane u prostoru, zatim o linearnoj algebri i primeni linearnih i nelinearnih transformacija. Razmatramo upotrebu vizualizacije za razumevanje funkcije i efekte ovih transformacija. Prolazimo kroz primere u Jupyter Notebook-u i zaključujemo sa diskusijom o funkciji koju reprezentuje neuronska mreža. From 2d46760d62bb51bed9e33b6bfd053f01bfcb4865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Mon, 14 Dec 2020 18:01:07 +0100 Subject: [PATCH 35/48] change to sr --- docs/sr/week01/01-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01-3.md b/docs/sr/week01/01-3.md index a46a777e2..22a5ccd98 100644 --- a/docs/sr/week01/01-3.md +++ b/docs/sr/week01/01-3.md @@ -1,5 +1,5 @@ --- -lang: Serbian +lang: sr lang-ref: ch.01-3 title: Problem Motivation, Linear Algebra, and Visualization lecturer: Alfredo Canziani From 0a1ce2add74e4e09c5f5b4ad948bff13862199aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 17 Dec 2020 00:36:56 +0100 Subject: [PATCH 36/48] Update README-SR.md --- docs/sr/README-SR.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/sr/README-SR.md b/docs/sr/README-SR.md index 3d0b42e44..f44df2cd3 100644 --- a/docs/sr/README-SR.md +++ b/docs/sr/README-SR.md @@ -43,9 +43,9 @@ source activate pDL ``` -## Startovati Jupyter Notebook ili JupyterLab +## Pokrenuti Jupyter Notebook ili JupyterLab -Startovati iz terminala: +Pokrenuti iz terminala: ```bash jupyter lab From cd4fc56e6d67c888a94a275c92d537821184ab79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 17 Dec 2020 00:38:12 +0100 Subject: [PATCH 37/48] Update 01-2.md --- docs/sr/week01/01-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md index 7d75e6c79..64530357e 100644 --- a/docs/sr/week01/01-2.md +++ b/docs/sr/week01/01-2.md @@ -2,7 +2,7 @@ lang: sr lang-ref: ch.01-2 lecturer: Yann LeCun -title: Evolucija i primene konvolucionih neuronskih mreža i zašto duboko učenje? +title: Evolucija, primene konvolucionih neuronskih mreža i zašto duboko učenje? authors: Marina Zavalina, Peeyush Jain, Adrian Pearl, Davida Kollmar date: 27 Jan 2020 translation-date: 13 Dec 2020 From d3539b75b442e4a1d14da4bb0250744189f230e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 17 Dec 2020 00:39:07 +0100 Subject: [PATCH 38/48] Update 01-3.md --- docs/sr/week01/01-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01-3.md b/docs/sr/week01/01-3.md index 22a5ccd98..f4067d6fc 100644 --- a/docs/sr/week01/01-3.md +++ b/docs/sr/week01/01-3.md @@ -1,7 +1,7 @@ --- lang: sr lang-ref: ch.01-3 -title: Problem Motivation, Linear Algebra, and Visualization +title: Motivacija, Linearna algebra i vizualizacija lecturer: Alfredo Canziani authors: Derek Yen, Tony Xu, Ben Stadnick, Prasanthi Gurumurthy date: 28 Jan 2020 From eeb83c0dc031a7d74bc966a027fc629b3b673b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 17 Dec 2020 13:01:28 +0100 Subject: [PATCH 39/48] Update docs/sr/week01/01-2.md Co-authored-by: Dusan Svilarkovic --- docs/sr/week01/01-2.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md index 64530357e..74744a33c 100644 --- a/docs/sr/week01/01-2.md +++ b/docs/sr/week01/01-2.md @@ -72,7 +72,7 @@ Neke od primena konvolucionih neuronskih mreža su i omogućavanje autonomne vo -Iako je nauka i matematika iza dubokog učenja dosta dobro shvaćena, idalje postoje zanimljiva pitanja koja treba istražiti. Na primer: Zašto arhitekture sa više slojeva rade bolje, uzevši u obzir da možemo da aproksimiramo funkciju pomoću 2 sloja? Zašto konvolucione neuronske mreže rade dobro sa prirodnim podacima kao što su govor, slike i tekst? Kako uspevamo da toliko dobro optimizujemo nekonveksne funkcije? Zašto arhitekture sa previše parametara rade? +Iako je nauka i matematika iza dubokog učenja dosta dobro shvaćena, i dalje postoje zanimljiva pitanja koja treba istražiti. Na primer: Zašto arhitekture sa više slojeva rade bolje, uzevši u obzir da možemo da aproksimiramo funkciju pomoću 2 sloja? Zašto konvolucione neuronske mreže rade dobro sa prirodnim podacima kao što su govor, slike i tekst? Kako uspevamo da toliko dobro optimizujemo nekonveksne funkcije? Zašto arhitekture sa previše parametara rade? @@ -155,4 +155,3 @@ Pitanja i odgovori sa kraja lekcije: --> - Za primer lica, da li bi neka druga tehnika redukcija dimenzija (npr. PCA) uspela da izvuče ta obeležja? - Odgovor: to bi radilo samo ako je površina manifolda hiperravan, što nije. - From 96d27007b20cad4785e24ac7b72a0677211b4725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 17 Dec 2020 13:02:34 +0100 Subject: [PATCH 40/48] Update docs/sr/week01/01-3.md Co-authored-by: Dusan Svilarkovic --- docs/sr/week01/01-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01-3.md b/docs/sr/week01/01-3.md index f4067d6fc..d86971ceb 100644 --- a/docs/sr/week01/01-3.md +++ b/docs/sr/week01/01-3.md @@ -50,7 +50,7 @@ Treba uzeti u obzir da sama translacija nije linearna jer se 0 neće uvek mapira -U našim vizualizacijama, imamo 5 grana spirale i svaka grana je druge boje. Tačke su u dvodimenzionalnom prostoru i mogu da se reprezentuju kao tuple. Boja predstavlja treću dimenziju - klasu kojoj tačke pripadaju. Upotrebićemo neuronsku mrežu da razdvojimo tačke po boji. +U našim vizualizacijama, imamo 5 grana spirale i svaka grana je druge boje. Tačke su u dvodimenzionalnom prostoru i mogu da se reprezentuju kao (x,y) parovi. Boja predstavlja treću dimenziju - klasu kojoj tačke pripadaju. Upotrebićemo neuronsku mrežu da razdvojimo tačke po boji. -Manifold hipoteza: prirodni podaci su u nisko-dimenzionom prostoru. Skup mogućih slika je u suštini beskonačan, ali je skup "prirodnih" slika mali podskup. Na primer: Za sliku osobe, skup mogućih slika je reda veličine broja mišića lica koji mogu da se pomere (stepeni slobode) ~ 50. Idealan (i nerealističan) izdvajač obečežja reprezentuje sve faktore (svaki mišić, svetlost, itd.) +Manifold hipoteza: prirodni podaci su u nisko-dimenzionom prostoru. Skup mogućih slika je u suštini beskonačan, ali je skup "prirodnih" slika mali podskup. Na primer: Za sliku osobe, skup mogućih slika je reda veličine broja mišića lica koji mogu da se pomere (stepeni slobode) ~ 50. Idealan (i nerealističan) izdvajač obeležja reprezentuje sve faktore (svaki mišić, svetlost, itd.) From 99f2d888cb998658fd12d1188d0974bb0b80d842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 17 Dec 2020 13:03:11 +0100 Subject: [PATCH 42/48] Update docs/sr/week01/01-2.md Co-authored-by: Dusan Svilarkovic --- docs/sr/week01/01-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md index e7d49cd38..97b834a94 100644 --- a/docs/sr/week01/01-2.md +++ b/docs/sr/week01/01-2.md @@ -123,7 +123,7 @@ Na primer: SVM nalazi separacionu hiperpovrš "preko podataka", tj. predikcije s -Analogija je dizajniranje kola koje računa bulovu funkciju sa ne više od dva sloja kapija -- možemo da sračunamo **bilo koju bulovu funkciju** na ovaj način! Međutim, kompleksnost i resursi prvog sloja (broj kapija) brzo postaju nepraktične za kompleksne funkcije. +Analogija je dizajniranje kola koje računa bulovu funkciju sa ne više od dva sloja kapija -- možemo da sračunamo **bilo koju bulovu funkciju** na ovaj način! Međutim, kompleksnost i resursi prvog sloja (broj kapija) brzo postaju nepraktični za kompleksne funkcije. From 78efae42034b06890beaf1d118fa8dd32d91c6f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 17 Dec 2020 13:04:03 +0100 Subject: [PATCH 43/48] Update docs/sr/week01/01-2.md Co-authored-by: Dusan Svilarkovic --- docs/sr/week01/01-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md index 97b834a94..e85338298 100644 --- a/docs/sr/week01/01-2.md +++ b/docs/sr/week01/01-2.md @@ -119,7 +119,7 @@ Ne žele svi da prihvate duboko učenje: ako možemo da aproksimiramo bilo koju -Na primer: SVM nalazi separacionu hiperpovrš "preko podataka", tj. predikcije su bazirane na poređenjima sa podacima iz obučavajućeg skupa. SVM je u suštini veoma jednostavna dvoslojna neuronska mreža, gde prvi sloj definiše "šablone", a drugi sloj je linearni klasifikator. Problem sa dvoslojnom mrežom je to što je kompleksnost i veličina srednjeg sloja eksponencijalna po $N$ (da bi dobro radila na teškom zadatku, potrebno je PUNO šablona). Međutim, ako proširimo broj slojeva na $\log(N)$, slojevi postaju linearni po $N$. Postoji kompromis između vremena i prostora. +Na primer: SVM nalazi separacionu hiperravan "preko podataka", tj. predikcije su bazirane na poređenjima sa podacima iz obučavajućeg skupa. SVM je u suštini veoma jednostavna dvoslojna neuronska mreža, gde prvi sloj definiše "šablone", a drugi sloj je linearni klasifikator. Problem sa dvoslojnom mrežom je to što je kompleksnost i veličina srednjeg sloja eksponencijalna po $N$ (da bi dobro radila na teškom zadatku, potrebno je PUNO šablona). Međutim, ako proširimo broj slojeva na $\log(N)$, slojevi postaju linearni po $N$. Postoji kompromis između vremena i prostora. From 6ca6b44b12c6e66a5320644086259c8874cc13ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Thu, 17 Dec 2020 13:04:41 +0100 Subject: [PATCH 44/48] Update docs/sr/week01/01-2.md Co-authored-by: Dusan Svilarkovic --- docs/sr/week01/01-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md index e85338298..7630a0472 100644 --- a/docs/sr/week01/01-2.md +++ b/docs/sr/week01/01-2.md @@ -90,7 +90,7 @@ Ranije se u primenama mašinskog učenja oslanjalo na kvalitetne, ručno odabran - Popločavanje prostora - Nasumične projekcije -- Polinomijalni klasifikator (unakrsni proizvodi obeležja) +- Polinomijalni klasifikator (vektorski proizvodi obeležja) - Funkcije radijalne baze - Kernel mašine From 2d93d2e5286d1dae7e51f39e13839760d0d5e534 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 20 Dec 2020 00:10:42 +0100 Subject: [PATCH 45/48] Update 01-1.md --- docs/sr/week01/01-1.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/sr/week01/01-1.md b/docs/sr/week01/01-1.md index fa441f9f2..81ceb93e4 100644 --- a/docs/sr/week01/01-1.md +++ b/docs/sr/week01/01-1.md @@ -25,10 +25,10 @@ translator: Ema Pajić - Osnove nadgledanog učenja, Neuronske mreže, Duboko učenje - Propagacija unazad i komponente arhitekture - Konvolucione neuronske mreže i njihove primene -- Više o arhitekturama dubokih neuronskih mreža -- Trikovi regularizacije / trikovi optimizacije / Razumevanje kako radi duboko učenje +- Arhitekture dubokih neuronskih mreža +- Regularizacijski i optimizacijski trikovi / Razumevanje kako radi duboko učenje - Modeli zasnovani na energiji -- Samonadgledano učenje i više +- Samonadgledano učenje -Istorija dubokog učenja počinje sa oblašću nauke koja se trenutno zove kibernetika 1940-ih sa McCulloch-om i Pitts-om. Oni su došli na ideju da su neuroni jedinice koje mogu da budu u uključenm ili isključenom stanju i da postoji neki prag kada menjaju stanje. Moglo je da se napravi Bulovo kolo (matematički model za kombinatorna digitalna logička kola) povezivanjem neurona i da se donose neki zaključci preko njih. Mozak je predstavljen kao mašina koja donosi zaključke preko neurona koji su binarni. Neuroni računaju težinsku sumu ulaza i porede je sa svojim pragom. Uključuju se ako je suma veća od praga, a isključuju ako je manja, što je uprošćen pogled na to kako mozak radi. +Istorija dubokog učenja počinje sa oblašću nauke koja se trenutno zove kibernetika 1940-ih sa McCulloch-om i Pitts-om. Oni su došli na ideju da su neuroni jedinice koje mogu da budu u uključenom ili isključenom stanju i da postoji neki prag kada menjaju stanje. Moguće je napraviti Bulovo kolo (matematički model za kombinatorna digitalna logička kola) povezivanjem neurona i da se donose zaključci preko njih. Mozak je predstavljen kao mašina koja donosi zaključke preko neurona koji su binarni. Neuroni računaju težinsku sumu ulaza i porede je sa svojim pragom. Uključuju se ako je suma veća od praga, a isključuju ako je manja, što je uprošćen pogled na to kako mozak radi. -1947., Donald Hebb je došao na ideju da mozak uči promenama jačine veza između neurona. To je nazvano hiper učenje: ako dva neurona ispale impuls zajedno, veza između njih se pojačava, u suprotnom slabi. +1947., Donald Hebb je došao na ideju da mozak uči promenama jačine veza između neurona. To je nazvano hiperučenje: ako dva neurona ispale impuls zajedno, veza između njih se pojačava, u suprotnom slabi. @@ -53,21 +53,21 @@ Kasnije u toku 1948., Norbert Wiener je predložio kibernetiku, što je ideja da -1957., Frank Rosenblatt je smislio perceptron, algoritam koji modifikuje težine veoma jednostavnih neuronskih mreža. +1957., Frank Rosenblatt je osmislio perceptron, algoritam koji modifikuje težine veoma jednostavnih neuronskih mreža. -Ideja da se naprave inteligentne mašine simulacijom velikog broja neurona nastala je 1940-ih, razvijala se tokom 1950-ih, i komplentno je napuštena krajem 1960-ih. Glavni razlozi za napuštanje ove ideje 1960-ih su: +Ideja da se naprave inteligentne mašine simulacijom velikog broja neurona nastala je 1940-ih, razvijala se tokom 1950-ih, i kompletno je napuštena krajem 1960-ih. Glavni razlozi za napuštanje ove ideje 1960-ih su: -- Naučnici su koristili neurone koji su binarni. Međutim, da bi propagacija unazad radila, aktivacione funkcije su morale da budu kontinualne. U to vreme, naučnici nisu došli do ideje da upotrebe kontinualne neurone i nisu mislili da je moguće da se obučava preko gradijenata jer binarni neuroni nisu diferencijabilni. -- Kod kontinualnih neurona, aktivaciju neurona treba pomnožiti težinom da bi se dobio doprinos težinskoj sumi. Međutim, pre 1980-te, množenje dva broja, pogotovu decimalnih brojeva je bilo veoma sporo. To je bio još jedan razlog da se izbegne upotreba kontinualnih neurona. +- Naučnici su koristili neurone koji su binarni. Međutim, da bi propagacija unazad radila, aktivacione funkcije su morale da budu neprekidne. U to vreme, naučnici nisu došli do ideje da upotrebe neprekidne neurone i nisu mislili da je moguće da se obučava preko gradijenata jer binarni neuroni nisu diferencijabilni. +- Kod neprekidnih neurona, aktivaciju neurona treba pomnožiti težinom da bi se dobio doprinos težinskoj sumi. Međutim, pre 1980-te, množenje dva broja, pogotovu decimalnih brojeva je bilo veoma sporo. To je bio još jedan razlog da se izbegne upotreba neprekidnih neurona. -Duboko učenje je nastavilo da se razvija 1985. sa pojavom propagacije unazad. 1995., oblast je ponovo pala u zaborav i napuštena je ideja neuronskih mreža. Početkom 2010-ih, neuronske mreže su upotrebljene u prepoznavanju govora i postigle veliko poboljšanje performansi, a zatim se upotreba veoma reširila. 2013-te, računarska vizija je počela da većinski koristi neuronske mreže. 2016-te, isto se desilo i sa obradom prirodnih jezika. Uskoro će se slične revolucije desiti i u robotici, automatskom upravljanju i mnogim drugim oblastima. +Duboko učenje je nastavilo da se razvija 1985. sa pojavom propagacije unazad. 1995., oblast je ponovo pala u zaborav i napuštena je ideja neuronskih mreža. Početkom 2010-ih, neuronske mreže su upotrebljene u prepoznavanju govora i postigle veliko poboljšanje performansi, a zatim se upotreba veoma raširila. 2013-te, računarska vizija je počela da većinski koristi neuronske mreže. 2016-te, isto se desilo i sa obradom prirodnih jezika. Uskoro će se slične revolucije desiti i u robotici, automatskom upravljanju i mnogim drugim oblastima. @@ -79,7 +79,7 @@ $90\%$ primena dubokog učenja koriste nadgledano učenje. Nadgledano učenje je -Nadgledano učenje potiče od perceptrona i Adaline. Adaline mreža je bazirana na istoj arhitekturi sa težinskim ulazima - iznad praga se uključuje, a ispod isključuje. Perceptron je neuronska mreža sa 2 sloja. Drugi sloj se obučava, a prvi sloj je fiksiran. Većinu vremena, prvi sloj je određen nasumično i zove se asocijativni sloj. +Nadgledano učenje potiče od perceptrona i Adaline. Adaline mreža je bazirana na istoj arhitekturi sa težinskim ulazima - iznad praga se uključuje, a ispod isključuje. Perceptron je neuronska mreža sa 2 sloja. Drugi sloj se obučava, a prvi sloj je fiksiran. Uglavnom, prvi sloj je određen nasumično i zove se asocijativni sloj. From 329384819f0ace7343f2a8b57edf21db4e8200a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 20 Dec 2020 00:21:24 +0100 Subject: [PATCH 46/48] Update 01-1.md --- docs/sr/week01/01-1.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/sr/week01/01-1.md b/docs/sr/week01/01-1.md index 81ceb93e4..17b1df6d3 100644 --- a/docs/sr/week01/01-1.md +++ b/docs/sr/week01/01-1.md @@ -87,19 +87,19 @@ Nadgledano učenje potiče od perceptrona i Adaline. Adaline mreža je bazirana -U nastavku su opisane konceptualne osnove prepoznavanja oblika pre razvoja dubokog učenja. Standardan model za prepoznavanje oblika ima deo koji izvlači obeležja i klasifikator koji se obučava. Ulazni podaci prvo idu na izvlačenje obeležja, gde se izvlače relevantne korisne karakteristike ulaza kao na primer detektovanje oka ako je cilj prepoznati lice. Nakon toga, vektor obeležja se prosleđuje klasifikatoru koji računa težinske sume i poredi sa pragom. Klasifikator koji obučavamo može da bude perceptron ili neuronska mreža. Problem je što je odluku koja obeležja izvlačimo mora da napravi čovek. To znači da se prepoznavanje oblika / računarska vizija fokusira na izvlačenje odlika i njegov dizajn za specifičan problem, a klasifikatoru se nije posvećivalo puno vremena. +U nastavku su opisane konceptualne osnove prepoznavanja oblika pre razvoja dubokog učenja. Standardan model za prepoznavanje oblika ima deo koji izvlači obeležja i klasifikator koji se obučava. Ulaznim podacima se prvo izvlače obeležja - relevantne korisne karakteristike ulaza, kao na primer detektovano oko ako je cilj prepoznati lice. Nakon toga, vektor obeležja se prosleđuje klasifikatoru koji računa težinske sume i poredi sa pragom. Klasifikator koji obučavamo može da bude perceptron ili neuronska mreža. Problem je što odluku koja obeležja izvlačimo mora da napravi čovek. To znači da se prepoznavanje oblika / računarska vizija fokusirala na izvlačenje odlika i njihov dizajn za specifičan problem, a klasifikatoru se nije posvećivalo puno vremena. -Nakon pojave i razvoja dubokog učenja, umesto ova 2 dela počela je da se koristi sekvenca modula. Svaki modul ima podesive parametre i nelinearnost. Tako naređani moduli čine više slojeva i zato se ova oblast i zove duboko učenje. Razlog za korišćenje nelinearnosti umesto linearnosti je to što dva linearna sloja mogu da budu jedan linearan sloj jer je kompozicija dva linearna sloja linearna. +Nakon pojave i razvoja dubokog učenja, umesto ova 2 dela počela je da se koristi sekvenca modula. Svaki modul ima podesive parametre i nelinearnost. Takva sekvenca modula čini više slojeva i zato se ova oblast i zove duboko učenje. Razlog za korišćenje nelinearnosti umesto linearnosti je to što dva linearna sloja mogu da budu jedan linearan sloj jer je kompozicija dva linearna sloja linearna. -Najjednostavnija višeslojna arhitektura sa podesivim parametrima i nelinearnošću može da bude: ulaz (recimo slika ili audio) je predstavljen kao vektor. Ulaz se pomnoži sa matricom težina čiji koeficijenti su podesivi. Zatim, svaka komponenta vektora rezultata se prosledi nelinearnoj funkciji kao što je ReLU. Ponavljajući taj proces, dobijamo običnu neuronsku mrežu. Razlog zašto se zove neuronska mreža je to što ova arhitektura računa težinsku sumu komponenti ulaza sa odgovarajućim redovima matrice. +Najjednostavnija višeslojna arhitektura sa podesivim parametrima i nelinearnošću može da bude: ulaz (recimo slika ili audio) je predstavljen kao vektor. Ulaz se pomnoži matricom težina čiji koeficijenti su podesivi. Zatim, svaka komponenta vektora rezultata se prosledi nelinearnoj funkciji kao što je ReLU. Ponavljajući taj proces, dobijamo običnu neuronsku mrežu. Razlog zašto se zove neuronska mreža je to što ova arhitektura računa težinsku sumu komponenti ulaza sa odgovarajućim redovima matrice. -Da se vratimo na poentu nadgledanog učena, poredimo izlaz koji vraća neuronska mreža sa ciljanim izlazima i optimizujemo funkciju gubitka, koja računa rastojanje / kaznu / divergenciju između dobijenog i ciljanog rezultata. Zatim, usrednjujemo ovu funkciju cene po obučavajućem skupu podataka. To je vrednost koju želimo da minimizujemo. Drugim rečima, želimo da nađemo vrednosti parametara koje minimizuju prosečnu grešku na obučavajućem skupu. +Da se vratimo na smisao nadgledanog učena, poredimo izlaz koji vraća neuronska mreža sa ciljanim izlazima i optimizujemo funkciju gubitka, koja računa rastojanje / kaznu / divergenciju između dobijenog i ciljanog rezultata. Zatim, usrednjujemo ovu funkciju cene po obučavajućem skupu podataka. To je vrednost koju želimo da minimizujemo. Drugim rečima, želimo da nađemo vrednosti parametara koje minimizuju prosečnu grešku na obučavajućem skupu. From b117712b60787d4abcbc585c5bd01f98566475a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 20 Dec 2020 00:28:16 +0100 Subject: [PATCH 47/48] Update 01.md --- docs/sr/week01/01.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sr/week01/01.md b/docs/sr/week01/01.md index 8ca3e542c..efb335244 100644 --- a/docs/sr/week01/01.md +++ b/docs/sr/week01/01.md @@ -11,18 +11,18 @@ translator: Ema Pajić -Objašnjavamo motivaciju za nastajanak dubokog učenja. Počinjemo sa istorijom i inspiracijom za nastanak dubokog učenja. Zatim diskutujemo istoriju prepoznavanja oblika i uvodimo gradijentni spust i njegovo računanje propagacijom unazad. Na kraju, diskutujemo hijerarhijsku reprezentaciju vizuelnog korteksa. +Objašnjavamo motivaciju iza dubokog učenja. Počinjemo sa istorijom i inspiracijom za nastanak dubokog učenja. Zatim diskutujemo istoriju prepoznavanja oblika i uvodimo gradijentni spust i njegovo računanje propagacijom unazad. Na kraju, diskutujemo hijerarhijsku reprezentaciju vizualnog korteksa. ## Lekcija, deo B -Prvo ćemo diskutovati evoluciju konvolucionih neuronskih mreža (CNN), od Fukušime do LeCun-a, do AlexNet-a. Zatim ćemo videti neke primene konvolucionih neuronskih mreža kao što je segmentacija slike, autonomna vozila i analiza medicinskih slika. Na kraju diskutujemo hijerarhijsku prirodu dubokih neuronskih mreža i svojstva koja ih čine povoljnim. Završavamo pričom o generaciji i učenju obeležja / reprezentacija. +Prvo ćemo pričati o evoluciji konvolucionih neuronskih mreža (CNN), od Fukušime i LeCun-a do AlexNet-a. Zatim ćemo videti neke primene konvolucionih neuronskih mreža kao što je segmentacija slike, autonomna vozila i analiza medicinskih slika. Na kraju objašnjavamo hijerarhijsku prirodu dubokih neuronskih mreža i svojstva koja ih čine povoljnim. Završavamo pričom o generisanju i učenju obeležja / reprezentacija. ## Praktikum -Prvo ćemo pričati o motivaciji za primenu transformacija na podatke vizualizovane u prostoru, zatim o linearnoj algebri i primeni linearnih i nelinearnih transformacija. Razmatramo upotrebu vizualizacije za razumevanje funkcije i efekte ovih transformacija. Prolazimo kroz primere u Jupyter Notebook-u i zaključujemo sa diskusijom o funkciji koju reprezentuje neuronska mreža. +Prvo ćemo pričati o motivaciji za primenu transformacija na podatke vizualizovane u prostoru, zatim o linearnoj algebri i primeni linearnih i nelinearnih transformacija. Razmatramo upotrebu vizualizacije za razumevanje funkcije i efekte ovih transformacija. Prolazimo kroz primere u Jupyter Notebook-u i zaključujemo diskusijom o funkciji koju reprezentuje neuronska mreža. From 127f107457d15916428920316a55d1da7c46daec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ema=20Paji=C4=87?= Date: Sun, 20 Dec 2020 00:43:06 +0100 Subject: [PATCH 48/48] Update 01-2.md --- docs/sr/week01/01-2.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/sr/week01/01-2.md b/docs/sr/week01/01-2.md index 7630a0472..3dd4e960a 100644 --- a/docs/sr/week01/01-2.md +++ b/docs/sr/week01/01-2.md @@ -27,7 +27,7 @@ LeCun je 1990. godine iskoristio propagaciju unazad da obuči konvolucionu neuro -Ovi novi CNN sistemi su mogli da prepoznaju više karaktera na slici istovremeno. To se radilo tako što je postojao mali prozor koji se pomerao po celoj slici i on je prosleđivan na ulaz modela. Ako se aktivira, to znači da je prisutan određeni karakter. +Novi CNN sistemi mogli su da prepoznaju više karaktera na slici istovremeno. To se radilo tako što je postojao mali prozor koji se pomerao po celoj slici i on je prosleđivan na ulaz modela. Ako se aktivira, to znači da je prisutan određeni karakter. @@ -39,11 +39,11 @@ Specijalan hardver za obučavanje konvolucionih neuronskih mreža je bila popula -Revolucija dubokog učenja (doduše, ovaj termin se nije koristio u to vreme) je počela 2010.-2013. Naučnici su se fokusirali na smišljanje algoritama koji bi mogli da ubrzaju treniranje velikih konvolucionih neuronskih mreža. Križevski je 2012. smislio AlexNet, mnogo veću konvolucionu neuronsku mrežu nego što su ranije koriščene, i obučio je na ImageNet-u (skupu podataka sa oko 1.3 miliona odbiraka) koristeći GPU (Grafičku procesorsku jedinicu). Nakon obučavanja nekoliko nedelja, AlexNet je imao značajno bolje rezultate od najboljih rivalskih sistema -- 25.8% *vs.* 16.4% top-5 procenat greške. +Revolucija dubokog učenja (doduše, ovaj termin se nije koristio u to vreme) je počela 2010.-2013. Naučnici su se fokusirali na smišljanje algoritama koji bi mogli da ubrzaju treniranje velikih konvolucionih neuronskih mreža. Križevski je 2012. osmislio AlexNet, mnogo veću konvolucionu neuronsku mrežu nego što su ranije koriščene, i obučio je na ImageNet-u (skupu podataka sa oko 1.3 miliona odbiraka) koristeći GPU (Grafičku procesorsku jedinicu). Nakon obučavanja nekoliko nedelja, AlexNet je imao značajno bolje rezultate od najboljih rivalskih sistema -- 25.8% *vs.* 16.4% top-5 procenat greške. -Nakon uspeha AlexNet-a, naučnici iz oblasti računarske vizije su bili ubeđeni da konvolucione neuronske mreže rade. Dok su svi radovi iz 2011.-2012. koji su pominjali CNN bili odbijeni, nakon 2016. najveći broj objavljenih radova koristi CNN. +Nakon uspeha AlexNet-a, naučnici iz oblasti računarske vizije bili su ubeđeni da konvolucione neuronske mreže rade. Dok su svi radovi iz 2011.-2012. koji su pominjali CNN bili odbijeni, nakon 2016. najveći broj objavljenih radova koristi CNN. @@ -56,7 +56,7 @@ Vremenom se broj slojeva povećavao: LeNet -- 7, AlexNet -- 12, VGG -- 19, ResNe -Višeslojne mreže su uspešne jer koriste kompozitnu strukturu podataka. U kompozitnoj hijerarhiji, kombinacije objekata na jednom sloju hijerarhije kreiraju objekte na sledećem sloju. Ako imitiramo tu hijerarhiju pomoću više slojeva i pustimo mrežu da uči odgovarajuću kombinaciju obeležja, dobijemo arhitekturu duboke neuronske mreže. Dakle, duboke neuronske mreže su prirodno hijerarhijske. +Višeslojne mreže su uspešne jer koriste kompozicionu strukturu podataka. U kompozicionoj hijerarhiji, kombinacije objekata na jednom sloju hijerarhije kreiraju objekte na sledećem sloju. Ako imitiramo tu hijerarhiju pomoću više slojeva i pustimo mrežu da uči odgovarajuću kombinaciju obeležja, dobijemo arhitekturu duboke neuronske mreže. Dakle, duboke neuronske mreže su prirodno hijerarhijske.