diff --git a/pages/students/2016/darius_lindvai/README.md b/pages/students/2016/darius_lindvai/README.md new file mode 100755 index 00000000..33ba5791 --- /dev/null +++ b/pages/students/2016/darius_lindvai/README.md @@ -0,0 +1,8 @@ + +# Dárius Lindvai + +## Tímový projekt 2019 + +Úlohy na vypracovanie: +- [rešerš](./timovy_projekt/resers) tak na 3 strany - čo najnovšie sa píše na tému "puctuation restoration" +- krátky program a [tutoriál](./timovy_projekt/tutorial) (program s rozsiahlym komentárom ) v Pythone na využitie LSTM diff --git a/pages/students/2016/darius_lindvai/timovy_projekt/resers/README.md b/pages/students/2016/darius_lindvai/timovy_projekt/resers/README.md new file mode 100644 index 00000000..25831059 --- /dev/null +++ b/pages/students/2016/darius_lindvai/timovy_projekt/resers/README.md @@ -0,0 +1,37 @@ + +# Novinky v oblasti “Punctuation Restoration”, resp. v oblasti dopĺňania interpunkcie + +Keďže interpunkcia a veľké písmená v slovách nemajú vplyv na výslovnosť slov, sú z výstupu **ASR** (*automatic speech recognition = automatické rozpoznávanie reči*) odstraňované, výsledkom čoho sú iba sekvencie slov alebo písmen. Systémy vykonávajúce doplňovanie **interpunkčných znamienok** a veľkých písmen sú potrebné najmä preto, lebo tieto výstupy bez interpunkcie a veľkých písmen väčšinou pre ľudí nie sú zrozumiteľné (v textovej forme). Interpunkcia a veľké písmená sú taktiež dôležité prvky aj pri **NLP** (*natural language processing = spracovanie prirodzeného jazyka*). + +V súčasnosti existuje mnoho metód/spôsobov, akými je možné pristupovať k problematike doplňovania interpunkcie a obnovy veľkých písmen. V niektorých metódach je použitý princíp strojového prekladu, kde do modelu vstupoval text bez interpunkcie a model tento text následne “preložil” na text s interpunkciu. V iných metódach sú zasa použité CRF (*conditional random field = podmienené náhodné polia*). Avšak väčšina existujúcich metód/systémov rieši iba interpunkciu, čo však nestačí napr. pri NER (*named-entity recognition*) alebo POS (*part-of-speech*), kde je potrebné poznať hlavne to, kde sa nachádzajú veľké písmená. + +V tomto článku predstavím dve metódy z roku 2019, v ktorých sú predstavené dva rôzne spôsoby, ako je možné pristupovať k problematike doplňovania interpunkcie. Prvá z nich je zameraná na tzv. transformátory a druhá z nich funguje na princípe tzv. „self-attention“. + +### 1. FAST AND ACCURATE CAPITALIZATION AND PUNCTUATION FOR AUTOMATIC SPEECH RECOGNITION USING TRANSFORMER AND CHUNK MERGING +#### Rýchle a presné doplňovanie interpunkčných znamienok a obnovovanie veľkých písmen pre Automatické rozpoznávanie textu použitím transformátora a “zlučovania blokov textu” (chunk merging) + +Metóda vytvorená kolektívom autorov okolo Binh Nguyena z Vietnamu predstavuje spôsob doplňovania interpunkcie a obnovy veľkých písmen pre ASR. Využíva princíp transformačných modelov (*transformer models*) a zlučovania blokov (*chunk-merging*) textu so schopnosťou doplňovať interpunkciu a obnovovať veľké písmená v jednom kroku. + +Skladá sa z 3 komponentov, z ktorých prvý slúži na rozdeľovanie veľkých textových segmentov na menšie časti (*chunk-splitting*), ktoré sa však prekrývajú. To znamená, že takmer všetky vety (alebo slová/časti viet, to závisí aké kritérium bolo zvolené pri rozdeľovaní textu) sa po rozdelení objavia vo viacerých častiach (vysvetlené na príklade nižšie). Tieto časti textu sú po rozdelení dostatočne dlhé na to, aby mal druhý komponent k dispozícii dostatok kontextu zľava aj sprava a mohol tak vykonať čo najpresnejšiu predikciu. Posledný komponent rozhoduje, ktoré časti textu (prekrývajúce sa) budú odstránené a ktoré budú zachované a zlúčené naspäť do jedného celku (*chunk-merging*). +> Príklad na "chunk splitting": Máme určitý text -skupinu viet: +> - "... . Futbalisti FC Liverpool sa stretnú v osemfinále Ligy majstrov s Atleticom Madrid. Rozhodol o tom pondelňajší žreb v sídle UEFA vo švajčiarskom Nyone. ..." +> +> Ak na tieto vety aplikujeme algoritmus "chunk-splitting"-u, dostaneme podobný výstup: +> 1. veta: Futbalisti FC Liverpool sa stretnú v osemfinále Ligy majstrov s Atleticom Madrid. +> 2. veta: v osemfinále Ligy majstrov s Atleticom Madrid. Rozhodol o tom pondelňajší žreb +> 3. veta: Rozhodol o tom pondelňajší žreb v sídle UEFA vo švajčiarskom Nyone. +> +> Samozrejme, toto je len príklad na pochopenie "chunk-splittingu". Reálne môžu byť vety rozdeľované rôznymi spôsobmi. + +Motiváciou autorov k navrhnutie tejto metódy sa stal fakt, že pokiaľ ide o kratšie rečové segmenty, štúdie v oblasti ASR dosahujú výborné výsledky (v poslednej dobe). Avšak pokiaľ ide o dlhšie rečové segmenty, stále existujú nedostatky v štandardizácii výsledného textového výstupu ASR, napríklad doplňovanie interpunkcie a obnova kapitalizácie (veľkých písmen). Tieto nedostatky bránia čitateľovi porozumieť výstup ASR a taktiež spôsobujú problémy pri modeloch pre spracovanie prirodzeného jazyka, napríklad NER, POS “tagging” alebo sémantické parsovanie (*semantic parsing*). + +Experimenty, ktoré autori vykonali na Britskom národnom korpuse (*British national corpus*), preukázali, že predstavený model svojou presnosťou a rýchlosťou značne prevyšuje existujúce metódy a modely. + +### 2. SELF-ATTENTION BASED MODEL FOR PUNCTUATION PREDICTION USING WORD AND SPEECH EMBEDDINGS +#### Model založený na “self-attention” zameraný na predikciu interpunkcie použitím slovných a rečových embeddingov + +Ďalšia metóda, ktorej autormi sú Jiangyan Yi a Jianhua Tao z Číny používa na predikciu interpunkčných znamienok model založený na “*self-attention*”. V modeli sú použité “word and speech embeddings”, ktoré sú pred-trénované vo frameworku Word2Vec a Speech2Vec. Použitie tohto prístupu umožňuje modelu využívať akýkoľvek druh lexikálnych a akustických dát. Vysoká úspešnosť predošlých “self-attention” modelov v oblasti predikcie a doplňovania interpunkčných znamienok autorov inšpirovala k vytvoreniu tohto modelu. + +Predošlé modely používali k činnosti akustické príznaky, lexikálne príznaky, alebo ich kombináciu. Využitie akustických príznakov textu sa javí ako efektívnejšie ako využitie samotných lexikálnych príznakov. Avšak v mnohých prípadoch ich nie je možné použiť v ASR, nakoľko ľudia pri hovorení zvyknú používať pauzy medzi slovami na miestach, kde by ich používať nemali. Kombinovanie týchto dvoch typov príznakov (akustické a lexikálne) čiastočne vyrieši tento problém. Veľa štúdií používa lexikálne dáta, ktoré však musia mať pridelené rečové údaje (bodky, čiarky, pauzy medzi slovami, a podobne), čo však spôsobuje komplikácie a limituje používanie čisto lexikálnych dát. + +Výsledky experimentov, ktoré bolo vykonané na korpuse “English IWSLT2011”, ukazujú, že model založený na “self-attention”, ktorý používa “word and speech embeddings” dosahuje oveľa lepšie výsledky a väčšiu rýchlosť ako viacero modelov slúžiacich na doplňovanie interpunkcie. diff --git a/pages/students/2016/darius_lindvai/timovy_projekt/tutorial/README.md b/pages/students/2016/darius_lindvai/timovy_projekt/tutorial/README.md new file mode 100755 index 00000000..b52fdaf1 --- /dev/null +++ b/pages/students/2016/darius_lindvai/timovy_projekt/tutorial/README.md @@ -0,0 +1,145 @@ + +# PYTORCH - LSTM TUTORIÁL + +### Čo je to Pytorch? + +[Pytorch](https://pytorch.org/) je open-source knižnica založená na knižnici Torch a určená primárne na účely strojového učenia (*machine learning*) a hĺbkového učenia (*deep learning*). Táto knižnica sa najčastejšie používa v kombinácii s jazykom **Python**, avšak je možné ju použiť aj s jazykom C++. Jej najväčšie využitie je v oblasti Spracovania prirodzeného jazyka (NLP). Je vyvíjaná hlavne výskumným tímom Facebooku pre umelú inteligenciu (FAIR = Facebook's AI Research lab). + +Vlastnosti Pytorchu: +- je jednoduchý na naučenie a používanie, +- obsahuje rozsiahlu dokumentáciu a rôzne tutoriály, ktoré môžu začiatočníci vhodne využiť pri učení, +- poskytuje možnosť rýchleho počítania tzv. **tensorov** (forma výstupu v knižnici Pytorch podobná matici) použitím GPU. + +### Čo je to LSTM? + +Problematikou LSTM (Long Short-Term Memory networks) som sa zaoberal v mojej [Bakalárskej práci](http://opac.crzp.sk/?fn=detailBiblioForm&sid=2D0B46080A5AC858AA11B21AE978&seo=CRZP-detail-kniha). LSTM sú špeciálny typ **Rekurentných neurónových sietí** (RNN), schopné naučiť sa využívať dlhodobé kontextové súvislosti (napr. pri dopĺňaní chýbajúcej interpunkcie alebo veľkých písmen). Najväčšie využitie LSTM je v oblasti strojového učenia a hĺbkového učenia. + +Vlastnosti LSTM: +- dokážu spracovávať nielen jednoduché dáta (napr. obrázky), ale aj celé sekvencie dát (napr. reč alebo video), +- sú vhodné na klasifikáciu, spracovanie a vytváranie predikcií na základe časových údajov (v Bakalárskej práci som sa venoval **Interpunkčným znamienkam**), +- LSTM boli navrhnuté tak, aby si na rozdiel od RNN vedeli poradiť s problémom, ktorý sa nazýva “[Exploding and vanishing gradient problems](https://medium.com/learn-love-ai/the-curious-case-of-the-vanishing-exploding-gradient-bf58ec6822eb)”. + +|![LSTM](https://i1.wp.com/www.jessicayung.com/wp-content/uploads/2018/09/short_term_memory_by_toxicpaprika.png?w=630)| +|:--:| +|*Obr.1 Problém "krátkej" pamäte RNN*| + +Tento tutoriál sa delí na 2. časti. V prvej časti ukážem návod ako si nainštalovať Pytorch a v druhej predvediem vzorový kód pomocou knižnice Pytorch na vyžitie LSTM. + +## 1. Inštalácia knižnice Pytorch +Na inštaláciu Pytorchu existuje viacero možných spôsobov. Pracovať s ním je možné či už vo Windowse alebo aj v Linuxovom prostredí. Taktiež je možné vybrať si, či bude inštalácia vykonaná pomocou **Anacondy** alebo PIP. Ja som sa rozhodol pracovať v prostredí Ubuntu (keďže v tomto prostredí som pracoval aj na Bakalárskej práci. Preto teraz predstavím spôsob ako nainštalovať Pytorch v tomto prostredí pomocou Anacondy. + +Pred inštaláciou Anacondy a Pytorchu je potrebné nainštalovať prostredie **Ubuntu 16.04 LTS**. Môžete si ho stiahnuť napr. z Microsoft Store. + +### a. Inštalácia Anacondy +Pred samotnou inštaláciou Anacondy je potrebné overiť, či sú všetky balíčky (*packages*) aktualizované. Je to možné vykonať pomocou príkazu `apt-get`: +```bash +dl874wn@Darius-PC:~$ apt-get update -y +``` +Následne je treba stiahnuť inštalačný súbor Anacondy. Jedným zo spôsobov ako to urobiť, je stiahnutie tohto súboru priamo cez terminál. Avšak pri tomto spôsobe je potrebné uistiť sa o bezpečnosti stránky, ktorá poskytuje inštalačný skript. Na stiahnutie súboru pomocou terminálu je možné použiť príkaz `curl`: +```bash +dl874wn@Darius-PC:~$ curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh +``` +Zadanie tohto príkazu vám zabezpečí stiahnutie najnovšej verzie Anacondy. Po stiahnutí súboru je možné spustiť inštalačný skript použitím príkazu `bash`: +```bash +dl874wn@Darius-PC:~$ bash Miniconda3-latest-Linux-x86_64.sh +``` +Vrámci inštalácie Anacondy sa nainštaluje aj Python 3.7.4. Počas inštalácie je potrebné potvrdiť licenčné podmienky a umiestnenie, kam sa Python nainštaluje. + +Po stiahnutí a nainštalovaní Anacondy ju už stačí iba spustiť. Pre spustenie bude stačiť refresh terminálu, čo je možné vykonať príkazom `source`: +```bash +dl874wn@Darius-PC:~$ source ~/.bashrc +``` + +### b. Inštalácia Pytorchu +Ďalším krokom je nainštalovanie Pytorchu. Inštalácia je veľmi jednoduchá a rýchla. Stačí zadať jednoduchý príkaz: +```bash +dl874wn@Darius-PC:~$ conda install pytorch torchvision cpuonly -c pytorch +``` +Taktiež je potrebné zadať “**y**” po výzve terminálu. Po nainštalovaní bude treba odpovedať „**yes**“ na otázku, či chceme, aby bola Anaconda hneď incializovaná. + +Na záver je ešte potrebné overiť, že Pytorch bol skutočne nainštalovaný. Toto overenie je možné vykonať sériou príkazov. Na začiatok je potrebné dostať sa do módu “Python REPL (a read-eval-print loop)”, čo je možné vykonať veľmi jednoducho - zadaním príkazu `python3` do terminálu: +```bash +(base) dl874wn@Darius-PC:~$ python3 +Python 3.7.4 (default, Aug 13 2019, 20:35:49) +[GCC 7.3.0] :: Anaconda, Inc. on linux +Type “help”, “copyright”, “credits” or “license” for more information. +>>> +``` +> Python REPL je jednoduché interaktívne prostredie, ktoré spracováva jednoduché užívateľské vstupy po jednom riadku a vracia výsledok (výstup). Užívateľ teda zadáva príkazy po jednom a program ich spracováva a vyhodnocuje postupne. + +Keď sa už nachádzame v móde Python REPL, môžeme spustiť napr. tento jednoduchý skript, ktorý vygeneruje maticu 3x5 náhodných čísel (tensor) v intervale (0,1). Prvé číslo v zátvorke udáva počet riadkov a druhé počet stĺpcov. +```bash +>>> import torch +>>> x = torch.rand(3,5) +>>> print(x) +``` +Výstup skriptu by mal vyzerať nasledovne: +```bash +tensor([[0.8490, 0.5107, 0.2124, 0.8478, 0.6296], + [0.9270, 0.8925, 0.0260, 0.3883, 0.4998], + [0.7393, 0.9261, 0.7133, 0.6712, 0.4431]]) +>>> +``` +Týmto skriptom sme overili funkčnosť Pytorchu a teda môžeme Python REPL opustiť stlačením klávesovej skratky **CTRL + D**. V prípade potreby môžete Anacondu deaktivovať príkazom `conda deactivate`, avšak ak budete chcieť znova pracovať s Pytorchom, je potrebné ju znova aktivovať. +```bash +(base) dl874wn@Darius-PC:~$ conda deactivate +dl874wn@Darius-PC:~$ +``` +## 2. Vzorový kód na využitie LSTM v Pytorchu + +Vstup a výstup v LSTM v knižnici Pytorch je tvorený 3D tensormi. V tomto tutoriáli predvediem, ako tento vstup a výstup funguje. + +Na začiatok je potrebné importovať pár relevantných knižníc. +Budeme pridávať základnú knižnicu **torch** a knižnicu **nn**, ktorá obsahuje základný balík Neurónových sietí (NN). +```python +import torch +import torch.nn as nn +``` +Následne sa presunieme k vytváraniu LSTM vrstvy, ktoré funguje rovnako ako pri ostatných typoch vrstiev. LSTM vrste totiž budeme priradzovať argumenty. V tomto príklade budú použité 3 argumenty: +- vstupná dimenzia (*input dimension*): definuje veľkosť vstupu v každom časovom kroku, napr. ak má vstupná dimenzia veľkosť 5, vstup bude vyzerať podobne - `[5, 3, 8, 6, 2]` +- skrytá dimenzia (*hidden dimension*): predstavuje veľkosť "cell state" a "hidden state" v každom časovom kroku +- počet vrstiev: počet LSTM vrstiev "naskladaných" na seba +```python +input_dim = 5 #velkost vstupnej dimenzie +hidden_dim = 10 #velkosť skrytej dimenzie +n_layers = 1 #pocet vrstiev +``` +Tieto parametre potom uložíme do LSTM vrstvy nasledovne: +```python +lstm_layer = nn.LSTM(input_dim, hidden_dim, n_layers) +``` +V ďalšom kroku si vytvoríme fiktívne dáta aby sme videli, ako funguje vstup na vrstve. Keďže sme veľkosť dimenzie definovali ako 5, potrebujeme vytvoriť tensor vo tvare `(1, 1, 5)`. Hodnoty v tensore reprezentujú `(veľkosť vzorky, dĺžka sekvencie, veľkosť vstupnej dimenzie)`. +Taktiež potrebujeme inicializovať "cell state" a "hidden state" jednotky LSTM. Tieto 2 parametre sú uložené vo "zväzku" vo formáte `(hidden state, cell state)`. +```python +batch_size = 1 #velkost vzorky +seq_len = 1 #dlzka sekvencie + +inp = torch.randn(seq_len, batch_size, input_dim) +hidden_state = torch.randn(n_layers, batch_size, hidden_dim) +cell_state = torch.randn(n_layers, batch_size, hidden_dim) +hidden = (hidden_state, cell_state) +``` +> Ak máme vstupnú sekvenciu (*seq_len*) napr. 100, veľkosť vzorky (*batch_size*) udáva, v akých dávkach sa bude sekvencia spracovaná a vyhodnotená. Ak máme napr. veľkosť vzorky 20, sekvencia bude spracovaná v 5 dávkach po 20. + +Ak si chceme skontrolovať v akom tvare bude vyzerať tvar vstupnej vrstvy a skrytej vrstvy, môžeme to urobiť pomocou príkazov `print` a `shape`: +```python +print("Input shape:", inp.shape) +print("Hidden shape:", hidden_state.shape, ",", cell_state.shape) +``` +Výstup bude vyzerať nasledovne: +```bash +(base) dl874wn@Darius-PC:~$ python test.py +Input shape: torch.Size([1, 1, 5]) +Hidden shape: torch.Size([1, 1, 10]) , torch.Size([1, 1, 10]) +``` +Na záver pridáme vstupy a skryté stavy (*hidden states*): +```python +out, hidden = lstm_layer(inp, hidden) +print("Output shape:", out.shape) +print("Hidden:", hidden) +``` +Na výstupe by sa mal objaviť tvar výstupných tensorov a taktiež samotné tensory pre "cell state" a "hidden state": +```bash +Output shape: torch.Size([1, 1, 10]) +Hidden: (tensor([[[-0.3184, 0.0795, -0.2122, -0.0699, -0.1824, -0.1231, -0.1314, 0.3096, -0.0371, 0.0488]]], grad_fn=), tensor([[[-0.5415, 0.2349, -0.4794, -0.1918, -0.2433, -0.2443, -0.2989, 0.5557, -0.0896, 0.1062]]], grad_fn=)) +```