Napisz rekurencyjną sieć neuronową w najprostszej możliwej wersji zgadującą kolejne znaki w tekście Pana Tadeusza
Adama Mickiewicza używając bibliotek autograd/numpy.
Opis architektury można znaleźć tutaj.
Scalony tekst 10 ksiąg jest naszym zbiorem treningowym,
11 księga to zbiór walidacyjny,
a 12 księga to zbiór testowy.
Wymagane perplexity
(małe wyjaśnienie ode mnie poniżej ...) na zbiorze testowym to co najwyżej 10,00.
Po każdej epoce powinien zostać wygenerowany tekst (próbka ~200 znaków) na podstawie rozkładu prawdopodobieństw modelu dla prefiksu:
Jam jest Jacek
Proszę również zwizualizować działanie modelu przedstawiając grafiki/statystyki podobne do tych w blogpoście powyżej.
Termin: 27 listopada za 0,50 punktu
Termin: 4 grudnia za 0,25 punktu
Oto parę sugerowanych rozwiązań implementacyjnych:
-
wszystkie zmienne inicjalizuję szumem z przedziału (-0.1, 0.1);
-
learning_rate = 1.0
-
wielkość wektora stanu/pamięci: hidden_size = 200;
pamięć inicjalizujemy zerami.
-
Cały tekst (w przypadku zbioru treningowego ciąg długości > 380k) dzielony jest na batche równej długości.
U mnie batch_size = 20. (ale dla degu proponuję zacząć z inną wartością!)
W jednym kroku model karmiony jest pakietem batch_size kawałków tekstu.
Każdy tekst jest długości num_steps (u mnie także =20; ale dla debugu proponuję zacząć z inną wartością!).
Model próbuje zgadywać kolejne litery równolegle dla tej liczby batch_size wątków.
A więc w efekcie pamięć instancji modelu to tablica rozmiarów: batch_size x hidden_size.
-
W konsekwencji model aktualizuje wagi po kroku w którym zgaduje num_steps liter w każdym z wątków batcha.
-
perplexity modelu na zbiorze danych czyli exp(cost(zbior)) można interpretować jako liczbę równoprawdopodobnych możliwości
do prawdziwej odpowiedzi jakie średnio model widzi;
a więc dla zupełnie losowych wag perplexity powinno być wielkością alfabetu
-
proszę sprawdzić jak wiele pomagają tzw. embeddings; chodzi tu o to aby zamiast one-hot-wektora literki na wejściu podawać jej reprezentację tej literki jako wektor powiedzmy długości hidden_size;
efektywnie przemnażamy one-hot-wektor przez macierz wielkości vocab_size x hidden_size
-
gradient clipping: spróbuj obcinać gradient do jakiejś stałej, np. 6? sprawdź czy to pomaga i jak często clipping jest odpalany
Uwagi:
-
Pamiętaj o oświadczeniu o samodzielności wykonania rozwiązania.
Proszę je uzupełniać o źrodła wszystkich pomysłów co do architektury bądź rozwiązań implmentacyjnych, które Państwo zastosowali.
-
Zachęcam do zadawania pytań poprzez email lub forum.