# WB1 KM2
## Projekt 2
W ramach drugiego projektu naszym zadaniem była reprodukacja artykułu Adversarial Attacks Against Medical Deep Learning Systems. Artykuł ten opisuje różnego rodzaju obecnie dostępne metody zaburzania działania modeli uczenia maszynowego. Autorzy skupili się na przypadkach medycznych, jako że te mogą być najbardziej groźnie ze względu na swoje konsekwencje. Dokładnie został opisany proces detekcji 3 typów chorób: retinopatii cukrzycowej, zmian płucnych, a także czerniaka. Cała idea artykułu polega na ukazaniu możliwości kompletnego odwracana wyników modelu poprzez zmiany niewidzialnie dla ludzkiego oka. Przez takie ataki można wpływać na całe systemy procesowania obrazu i kompletnie zmieniać ich działanie. Do artykułu został załączony kod, dzięki któremu można całkowicie zreprodukować wyniki, a więc i sprawdzić prawdziwość stawianych przez nich tez. Artykuł był cytowany w 90 innych pracach, więc śmiało możemy wysnuć wniosek, iż jest on na wysokim poziomie. Warto również wspomnieć, iż w samym artykule jest blisko 60 referencji do innych prac.
Kod napisany przez autorów jest napisany w języku Python. Całość kodu związana z przetwarzaniem obrazów jest napisana we frameworku Tensorflow 1. Samego kodu jest stosunkowo niewiele jak na tak duży projekt i jest on napisany dobrze. Dużym problemem przy reprodukcji jest rozmiar danych, gdyż same dane testowe ważą około 100GB.
Na szczęście jak do tej pory kod z którego korzystaliśmy jest pozbawiony błędów. Drobnym problemem jest praca z Tensorflowem w wersji 1, która nie jest już wspierana i zdarza się jej działać nie do końca poprawnie. Jednakże, autorzy zapewniają przetrenowane modele, przez co możemy uniknąć probelemów z nauką modeli, która mogłaby być niemożliwa na naszych stosunkowo mało wydajnych komputerach. Drugą problematyczną kwestią jest samo załadowanie danych do pamięci komputera. Poszczególne pliki ważą w okolicach 10 GB, co sprawia pewne problemy. Jeśli konieczne okaże się wytrenowanie modeli od zera, wówczas jest to możliwe dzięki skryptowi zamieszczonemu przez autorów, który umożliwia zreprodukowanie i tego kroku. Wówczas jednak najpewniej będziemy zmuszeni do skorzystania z Google Colab w celu pracy na GPU.
## Projekt 1
Pierwszym problem na jaki sie natknęliśmy to że link do danych zbiorów WOS zawarty w kodzie paczki RMDL się przedawnił, nie ma do niego dostepu. Szukając w dostępnych nam źródłach znaleźliśmy ten link: https://data.mendeley.com/datasets/9rw3vkcfy4/6 na którym znajduje się ten zbiór danych. Później okazało się również że ten sam link podany jest na githubie artykułu. Wydaje się to być tym samym zbiorem, jednak nie ma 100% pewności że tak jest. Dodatkowo osobami udostępniającymi ten zbiór zdają się być autorzy artykułu, co dodaje pewności że możemy zastępnie korzystać z tego zbioru. Potrzebne było troche zmian w kodzie do odpakowania i otwierania plików ściągniętych z tej strony, zamiast wersji automatycznej w pakiecie RMDL. Następne problemy dotyczyły środowiska obliczeniowego (korzystaliśmy tu z Google Collab). Sesja ma określony czas działania a dodatkowo istnieje ograniczenie na czas użycia GPU do przyspieszenia obliczeń. Dodatkowo w niektórych przypadkach brakowało ramu do przypisania dla wag sieci neuronowych (WOS-46985), lub wczytania danych (eg. 20newsgroup). Niestety dodatkowym problemem było że domyślne parametry dla RMDL w niektórych przypadkach nie wspierają użycia CuDNN, do przyspieszenia obliczeń. Te wszystkie faktory powodowały że każda próba reprodukcji jednego z wyników trwała conajmniej jeden dzień.
<style type="text/css">
.tg {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-c3ow{border-color:inherit;text-align:center;vertical-align:top}
.tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top}
</style>
<table class="tg">
<thead>
<tr>
<th class="tg-0pky" colspan="2" rowspan="2"></th>
<th class="tg-c3ow" colspan="8">Dataset</th>
</tr>
<tr>
<td class="tg-c3ow" colspan="2">WOS-5736</td>
<td class="tg-c3ow" colspan="2">WOS-11967</td>
<td class="tg-c3ow" colspan="2">WOS-46985</td>
<td class="tg-c3ow" colspan="2">Reuters-21578</td>
</tr>
</thead>
<tbody>
<tr>
<td class="tg-c3ow" colspan="2">Score Source<br></td>
<td class="tg-c3ow">Paper</td>
<td class="tg-c3ow">Repr.</td>
<td class="tg-c3ow">Paper</td>
<td class="tg-c3ow">Repr.</td>
<td class="tg-c3ow">Paper</td>
<td class="tg-c3ow">Repr.</td>
<td class="tg-c3ow">Paper</td>
<td class="tg-c3ow">Repr.</td>
</tr>
<tr>
<td class="tg-c3ow" rowspan="4">RMDL</td>
<td class="tg-0pky">3 RDLs<br></td>
<td class="tg-0pky">90.86</td>
<td class="tg-0pky">89.37</td>
<td class="tg-0pky">87.39</td>
<td class="tg-0pky">84.25</td>
<td class="tg-0pky">78.39</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">89.10</td>
<td class="tg-0pky">87.64</td>
</tr>
<tr>
<td class="tg-0pky">9 RDLs</td>
<td class="tg-0pky">92.60</td>
<td class="tg-0pky">89.28</td>
<td class="tg-0pky">90.65</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">81.92</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">90.36</td>
<td class="tg-0pky">89.83</td>
</tr>
<tr>
<td class="tg-0pky">15 RDLs</td>
<td class="tg-0pky">92.66</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">91.01</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">81.86</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">89.91</td>
<td class="tg-0pky">---</td>
</tr>
<tr>
<td class="tg-0pky">30 RDLs</td>
<td class="tg-0pky">93.57</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">91.59</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">82.42</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">90.69</td>
<td class="tg-0pky">---</td>
</tr>
</tbody>
</table>
## Reuters-21578
Architekture danego modelu zapisujemy w postaci [D, R, C], gdzie D-liczba użytych sieci DNN, R-liczba użytych sieci RNN, C-liczba użytych sieci CNN. Oczywiście najbardziej optymalnym byłoby wykorzystanie porówno tych sieci, jednak nie było to możliwe z powodów ograniczenia czasowego i długiego trwania obliczeń dla danych sieci.
Próba 1*-[1,0,2]: Accuracy: 0.876449155349453
Próba 2-[2,0,1]: Accuracy: 0.8691619741636304
Próba 3-[3,0,3]: Accuracy: 0.8840675720437231
Próba 4-[3,0,3]: Accuracy: 0.8906922822126532
Próba 5*-[5,0,4]: Accuracy: 0.8983106989069228
*-próba umieszczona w tabeli
Porównanie wykresu twórców oraz naszych dla RMDL o 9 losowych architekturach. Zakładamy tu że kod który autorzy umieścili na githubie jest tym użytym do generowania ich przykładów. Nie mamy co do tego pewności, z pewnością funkcja generująca wykresy ine jest dokładnie tą samą. Drugą rzeczą którą się różni kod autorów i ich wykres to ilość epok dla tych sieci. (W kodzie 120, tu na wykresie 100.)
Paper's Plots | Our Reproduction
--- | ---
<img src="https://i.imgur.com/x79FakJ.png" width="425"/> | <img src="https://i.imgur.com/Q7tCGMt.png" width="425"/>
<img src="https://i.imgur.com/OBtIcfz.png" width="425"/> | <img src="https://i.imgur.com/iR3jZEx.png" width="425"/>
## WOS-5736
Funkcja train_test_split z pakietu sklearn znajduje się w innym module niż jest to w kodzie, zmieniliśmy na poprawna wersję.
Próba 1*-[1,1,1]: Accuracy: 0.8937282229965157
Próba 2-[4, 0, 3]: Accuracy: 0.8972125435540069
Próba 3*-[5, 0, 4]: Accuracy: 0.8928571428571429
*-próba umieszczona w tabeli
Porównanie wykresu twórców oraz naszych dla RMDL o 9 losowych architekturach.
Paper's Plots | Our Reproduction
--- | ---
<img src="https://i.imgur.com/I929Zrd.png" width="425"/> | <img src="https://i.imgur.com/CHshcxz.png" width="425"/>
<img src="https://i.imgur.com/XOxDKmK.png" width="425"/> | <img src="https://i.imgur.com/sipTwkg.png" width="425"/>
## WOS-11967
Próba 1*-[2, 0, 1]: Accuracy: 0.8425229741019215
## WOS-46985
Nie udało sie osiagnac wyników. Spowodowane jest to brakiem ramu w środowisku, nawet dla 3 losowych sieci. Dodatkowo obliczenia trwają najkrócej kilka godzin na jedną architekture, przed skończeniem bazowych 3'ch modelów skończył się dostępny czas w środowisku Google Collab.
<style type="text/css">
.tg {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-9wq8{border-color:inherit;text-align:center;vertical-align:middle}
.tg .tg-c3ow{border-color:inherit;text-align:center;vertical-align:top}
.tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top}
</style>
<table class="tg">
<thead>
<tr>
<th class="tg-0pky" colspan="2" rowspan="2"></th>
<th class="tg-c3ow" colspan="4">Dataset</th>
</tr>
<tr>
<td class="tg-c3ow" colspan="2">IMDB</td>
<td class="tg-c3ow" colspan="2">20NewsGroup<br></td>
</tr>
</thead>
<tbody>
<tr>
<td class="tg-c3ow" colspan="2">Score Source<br></td>
<td class="tg-c3ow">Paper</td>
<td class="tg-c3ow">Repr.</td>
<td class="tg-c3ow">Paper</td>
<td class="tg-c3ow">Repr.</td>
</tr>
<tr>
<td class="tg-9wq8" rowspan="3">RMDL</td>
<td class="tg-0pky">3 RDLs</td>
<td class="tg-0pky">89.91</td>
<td class="tg-0pky">88.49</td>
<td class="tg-0pky">86.73</td>
<td class="tg-0pky">---</td>
</tr>
<tr>
<td class="tg-0pky">9 RDLs</td>
<td class="tg-0pky">90.13</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">87.62</td>
<td class="tg-0pky">---</td>
</tr>
<tr>
<td class="tg-0pky">15 RDLs</td>
<td class="tg-0pky">90.79</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">87.91</td>
<td class="tg-0pky">---</td>
</tr>
</tbody>
</table>
## IMDB
Dzięki zmianom parametru modelu oraz zmniejszeniu maksymalnej liczby unikalnych słów byliśmy w stanie wytrenować model z 3 RDL'ami. Głównymi problemami przy tym zbiorze był brak RAM'u oraz niesamowicie długi czas uczenia RNN.
Próba 1*-[1,1,1]: Accuracy: 0.88488
Zmienione parametry modelu (domyślne wartości podzielone przez 2):
max_hidden_layer_dnn=4,max_nodes_dnn=512,
max_hidden_layer_rnn=3, max_nodes_rnn=64,
max_hidden_layer_cnn=5,max_nodes_cnn=256
## 20NewsGroup
Mimo wielu prób niestety nie udało nam się odpalić RMDL na tym zbiorze. Głównym powodem był chroniczny problem z brakiem RAM'u zarówna na Google Colab, jak i na Kaggle. Staraliśmy się ograniczyć liczbę słów czy też rozmiar architektur sieci (ilość ukrytych warstw oraz maksymalną liczbę neuronów w warstwach), ale niestety nie znaleźliśmy skutecznego rozwiązania.
<style type="text/css">
.tg {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-9wq8{border-color:inherit;text-align:center;vertical-align:middle}
.tg .tg-c3ow{border-color:inherit;text-align:center;vertical-align:top}
.tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top}
</style>
<table class="tg">
<thead>
<tr>
<th class="tg-0pky" colspan="2" rowspan="2"></th>
<th class="tg-c3ow" colspan="4">Dataset</th>
</tr>
<tr>
<td class="tg-c3ow" colspan="2">MNIST</td>
<td class="tg-c3ow" colspan="2">CIFAR-10<br></td>
</tr>
</thead>
<tbody>
<tr>
<td class="tg-c3ow" colspan="2">Score Source<br></td>
<td class="tg-c3ow">Paper (Loss)</td>
<td class="tg-c3ow">Repr. (Acc)</td>
<td class="tg-c3ow">Paper (Loss)</td>
<td class="tg-c3ow">Repr. (Acc)</td>
</tr>
<tr>
<td class="tg-9wq8" rowspan="4">RMDL</td>
<td class="tg-0pky">3 RDLs<br></td>
<td class="tg-0pky">0.51<br></td>
<td class="tg-0pky">99.45<br></td>
<td class="tg-0pky">9.89</td>
<td class="tg-0pky">61.77</td>
</tr>
<tr>
<td class="tg-0pky">9 RDLs</td>
<td class="tg-0pky">0.41</td>
<td class="tg-0pky">99.35</td>
<td class="tg-0pky">9.1</td>
<td class="tg-0pky">63.09</td>
</tr>
<tr>
<td class="tg-0pky">15 RDLs</td>
<td class="tg-0pky">0.21</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">8.74<br></td>
<td class="tg-0pky">---</td>
</tr>
<tr>
<td class="tg-0pky">30 RDLs</td>
<td class="tg-0pky">0.18</td>
<td class="tg-0pky">---</td>
<td class="tg-0pky">8.79</td>
<td class="tg-0pky">---</td>
</tr>
</tbody>
</table>
## CIFAR 10
W tym jak i następnym przypadku wyniki autorów zawierały wartość 'loss', a nie 'accuracy' tak jak przy każdym poprzednim zbiorze. Część RDL'i poradziła sobie zdecydowanie gorzej. Obserwujemy tutaj zarówno wolniejszy spadek 'loss' na zbiorze treningowym, jak również znacznie większe wartości 'loss' na zbiorze testowym. Ważną do zaznaczenia różnicą jest to, że nasz RMDL był uczony na 100 epokach, a nie 200.
Próba 1*-[1,1,1]: Accuracy: 0.6177
Próba 2*-[4,3,2]: Accuracy: 0.6309
Paper's Plots | Our Reproduction
--- | ---
<img src="https://i.imgur.com/0QiaTpB.png" width="425"/> | <img src="https://i.imgur.com/MG3a9ar.png" width="425"/>
<img src="https://i.imgur.com/VbAd40L.png" width="425"/> | <img src="https://i.imgur.com/v6bEsQ4.png" width="425"/>
## MNIST
Przy tym zbiorze danych nie napotkaliśmy na większe problemy. Wyniki, któe otrzymaliśmy pochodzą z treningu przez 100 epok, a nie tak jak u autorów 120. Na wykresach możemy zaobserwować, że jeden z modeli prawdopodbnie się przeuczył co powoduje wzrost wartości 'loss' na zbiorze testowym, co nie wystąpiły w wynikach przedstawionych przez autorów.
Paper's Plots | Our Reproduction
--- | ---
<img src="https://i.imgur.com/Xqza586.png" width="425"/> | <img src="https://i.imgur.com/fOdXXzU.png" width="425" height=250/>
<img src="https://i.imgur.com/34rxsNX.png" width="435" height=300/> | <img src="https://i.imgur.com/2jU55R2.png" width="425" height=300/>