Zadanie 3

Podúloha: Klasifikácia časových radov

Úloha:

Stiahnite si z odkazu zdrojový kód. Tento kód obsahuje základné triedy a dáta, s ktorými budete ďalej pracovať. Dáta sú časové rady cien niektorých crypto symbolov a predikcie o vývoji ich ceny. Ceny aj predikcie sú vždy pre každý deň od cca 1.10.2023 po 31.10.2025.

Zadanie:

Vašou úlohou je natrénovať agenta (model založený na neurónovej sieti), ktorý bude riešiť klasifikačnú úlohu, či nasledujúci deň po vstupnej časovej sekvencii (napr. 7 dní) pôjde cena daného crypto symbolu hore alebo dole. Na riešenie úlohy použite akýkoľvek model - doprednú sieť, doprednú sieť s reziduálnymi spojeniami, 1d konvolučnú sieť, LSTM alebo GRU, transformer, atď. Siete nemusia byť extra veľké a mali by sa dať pohodlne natrénovať aj na CPU. Kto má možnosť a chce, môže otestovať tréning aj na GPU.

Pokyny:

  1. V triede Agent budete implementovať funkcie traintest, ktoré budú obsahovať základný algoritmus pre tréning a validáciu modelu.
  2. Do balíka models treba vložiť svoju triedu obsahujúcu model a ten potom pridať Agentovi.
  3. Ak chcete pracovať so sekvenčnými dátami, máte pripravený DatasetSequential prípadne DatasetSequentialAugmented (ktorý robí augmentácie na pôvodnom datasete a hodí sa na trénovanie). Ak chcete pracovať s dátami ako s jednorozmerným vstupom, je možné použiť triedu DatasetFlat a jej augmentovanú verziu. Na prípravu datasetu je už napísaná funkcia prepare_dataset v triede Agent.
  4. Dátová množina je rozdelená časovými intervalmi na trénovaciu (AGENT_TRAIN_INTERVAL) a testovaciu (AGENT_TEST_INTERVAL) časť, to nemeňte.
  5. Nemeňte funkciu Agenta (__get_model_state), ktorá vytvára vstupný vektor pre každý deň.
  6. V repozitári máte aj súbor requirements.txt, ktorý obsahuje knižnice, ktoré je nutné nainštalovať k rozbehnutiu zdrojového kódu.
  7. Navrhnite architektúru a hyperparametre modelu – počet vrstiev a ich veľkosti, zvoľte si vhodné aktivačné funkcie, nastavte rýchlosť učenia a veľkosť dávky (batch) pre optimalizačný algoritmus.
  8. Vyhodnoťte model pomocou merania presnosti jeho predikcií na testovacom intervale. Pokúste sa dosiahnuť čo najlepší výsledok, ideálne nad 60%.

Dokumentácia:

Dokumentácia má obsahovať popis architektúry a tabuľku hyperparametrov (experiment popíšte tak, aby ho bolo na základe textu možné opakovať), grafy z priebehu tréningu (trénovacia a testovacia chyba a presnosť). Na záver napíšte stručné zhodnotenie, ako úspešné boli architektúry, ktoré ste vyskúšali.


Podúloha: Backpropagation algoritmus

Úloha:

V tejto úlohe budete implementovať plne funkčný algoritmus backpropagation, ktorý je kľúčovým komponentom tréningu neurónovej siete. Umožňuje jej učiť sa pomocou minimalizácie zadanej chybovej funkcie. Treba implementovať doprednú aj spätnú časť pre jednotlivé operátory a funkcie, ako aj aktualizácie parametrov siete. Algoritmus overíte natrénovaním jednoduchej doprednej neurónovej siete (viacvrstvového perceptrónu).

Zadanie:

Na riešenie úlohy použite knižnicu NumPy pre maticové a vektorové operácie. Použitie knižníc ako PyTorchTensorFlow, ktoré obsahujú autograd je zakázané. Implementujte modulárnu architektúru, v ktorej bude možné jednotlivé moduly reťaziť. Implementácia bude obsahovať lineárnu vrstvu, aktivačnú funkciu sigmoid, tanh, relu a chybovú funkciu MSE (mean squared error).

Pokyny:

  1. Pre validáciu algoritmu použite XOR problém, použite dvojvrstvovú sieť, ktorá bude mať na skrytej vrstve 4 neuróny, na výstupnej vrstve 1 neurón a trénovať sa bude pomocou MSE chybovej funkcie. Rýchlosť učenia môže byť 0.1 až 0.01 a počet epoch by mal stačiť okolo 500.
  2. Najskôr implementujte dopredný smer pre jednotlivé moduly a spojte ich do jedného modelu (zoznam modulov), ktorý vám zo vstupných údajov vráti výstup.
  3. Začnite od MSE funkcie a pre každý modul spočítajte jeho deriváciu a implementujte spätný smer. Dajte si pozor, lebo pri počítaní derivácie je potrebné udržiavať aj niektoré výsledky z dopredného smeru. Moduly môžu mať svoj stav, alebo môžu byť aj bezstavové a výsledky môžu byť odložené niekde inde. To ponechávame na vašej voľbe.
  4. Implementujte pravidlo pre aktualizáciu váh bez momentu a potom aj s momentom.
  5. Volanie modelu by malo byť jednoduché, pre dopredný smer model.forward(vstup) a pre spätný smer model.backward(chyba) a následne volanie aktualizácie parametrov (či už to bude implementovať model, alebo iná samostatná trieda je opäť na vás).

Dokumentácia:

Dokumentácia má obsahovať jednoduchý popis vašej implementácie algoritmu backpropagation. Vyskúšajte sieť s 1 a 2 skrytými vrstvami pre problémy AND, OR a XOR, k dokumentácii priložte grafy z priebehu tréningu (trénovacia chyba). Vyskúšajte rôzne nastavenia tréningu s momentom a bez momentu a aspoň 2 hodnoty rýchlosti učenia pre problém XOR.