# R-Transformer - dokumentacja wstępna
## Skład zespołu
* Kamil Przybyła (300254)
* Urszula Tworzydło (295809)
## Opis zadania
Celem zadania jest implementacja i porównanie działania trzech różnych modeli realizujących zadanie modelowania języka. Modelami tymi są: R-Transformer oraz dwie rekurencyjne sieci składające się z komórek typu GRU oraz LSTM.
## Zbiór danych
Każdy z modeli wytrenowany zostanie na zadanym zbiorze danych *Penn Treebank*, składającym się z 49208 zdań i 1173766 tokenów, z których 10 000 to unikalne słowa.
Zbiór danych podzielony został na dane treningowe (ok. 85%), walidacyjne (ok. 7%) oraz testowe (ok. 8%). Składa się ze znormalizowanych zdań (nie posiadających znaków interpunkcyjnych oraz wielkich liter), oddzielonych znakiem nowej linii. Każdy z tokenów oddzielony jest spacją. Wszystkie liczby zostałe zamienione na znak "N", a tokeny nienależące do słownika (OOV) oznaczone są za pomocą "\<unk\>".
## Opis architektur
Każda z sieci składać się będzie z warstwy embeddingu, przypisującej wybranemu słowu wektor o określonym rozmiarze. Pozostała część architektury zależna jest od przyjętego modelu.
### RNN (GRU/LSTM)
Zaimplementowane zostaną dwie sieci rekurencyjne, w których skład będą wchodzić sieci zawierające komórki typu GRU lub LSTM.
Sieć rekurencyjna zostanie zastosowana jako model, który umożliwia dokonywanie predykcji także na podstawie predykcji uzyskanej dla danych przetworzonych w poprzedniej iteracji, a co za tym idzie jest odpowiednią architekturą dla przetwarzania sekwencyjnych danych (takich jak np. zapisane zdania).
Po warstwie embeddingu sieć zawierać będzie określoną liczbę warstw (ich liczba zostanie uwzględniona w przeprowadzanych eksperymentach) komórek LSTM lub GRU. Po tychże warstwach będą warstwy jednokierunkowej sieci neuronowej: warstwa dropout, liniowa oraz sigmoidalna funkcja aktywacji.
W odróżnieniu od neuronów występujących w podstawowej wersji sieci rekurencyjnej, komórki GRU oraz LSTM, składają się z tak zwanych bramek, pełniących określone funkcję i wykonują bardziej złożone obliczenia. Dzięki bardziej złożonej konstrukcji są bardziej odporne na problem zanikającego gradientu.
### R-Transformer
R-Transformer jest modelem łączącym cechy rekurencyjnej sieci neuronowej oraz Transformera. Składa się on z sieci rekurencyjnej działającej na małym oknie, której zadaniem jest modelowania lokalnych zależności danych w sekwencji. Zastępuje ona kodowanie pozycyjne, występujące w Transformerach. Dalsza część tej architektury wykorzystuje mechanizm atencji oraz warstwę liniową. Między każdą z warstw występują połączenia rezydualne oraz normalizacja.

*źródło: R-Transformer: Recurrent Neural Network Enhanced Transformer (Wang et al.)*
## Założenia projektowe
Projekt zrealizowany zostanie przy użyciu języka Python 3.8 oraz biblioteki PyTorch (która udostępnia między innymi moduł LSTM, GRU, a także Multi Head Attention). Język modelowany będzie na poziomie pojedynczych słów (tokenów) -- trenowane modele będą miały za zadanie przewidzieć słowo następujące po wejściowej sekwencji słów o stałej długości.
Jako funkcję błędu zostanie przyjęta entropia krzyżowa.
## Planowane eksperymenty
W celu zbadania działania implementowanych architektur, planowane jest przeprowadzenie następujących eksperymentów:
* zbadanie wpływu szerokości okna, w modelu R-Transformer, na skuteczność działania sieci,
* sprawdzenie różnych wymiarów wektora reprezentującego słowo (embedding) na działanie modeli,
* porównanie sprawności działania architektur dla różnej liczby warstw (w szczególności: liczby warstw komórek GRU oraz LSTM),
* zbadanie wpływu długości sekwencji słów na jakość przewidywań modelu,
* porównanie wyników osiąganych przez zaimplementowane modele.