SZI2019SmieciarzWmi/Raports/SI_Raport_VowpalWabbit.md

5.7 KiB

Sztuczna inteligencja 2019 - Vowpal Wabbit

Czas trwania opisywanych prac: 22.05.2019 - 13.06.2019

Osoby odpowiedzialne za implementajcę: Anna Nowak, Magdalena Wilczyńska

Implementowana technika: Vowpal Wabbit

Link do repozytorium projektu: https://git.wmi.amu.edu.pl/s440556/SZI2019SmieciarzWmi

Techniki uczenia - Vowpal Wabbit

Implementacja

Cała implementacja dla VW znajduje się na osobnym branchu /VowpalWabbit

Środowisko i łączenie z Python3

W związku z informacjami o błędach w implementacji wrappera VowpalWabbit dla Python3, został zaimplementowany własny wrapper umożliwiający komunikację między aplikacją a VW. Dodana została możliwość wywoływania skryptów shellowych (w języku bash) bezpośrednio ze środowiska Python3, dzięki czemu mogłyśmy uzyskać płynną komunikację.

Aby móc dostarczać poprawne dane wejściowe zarówno w trakcie procesu uczenia się jak i podczas szukania rozwiązania problemu, musiałyśmy dodać kilka modyfikacji do istniejących algorytmów. Domki oraz wysypiska dostają teraz dodatkowe oznaczenie jeśli zostały już odwiedzone.

Dodatkowo, podczas szukania rozwiązania istniejącymi algorytmami planowania ruchu, oprócz listy koordynatów agenta zwracamy listę komend, które wykonuje.

Komunikacja agent - VW

Dodałyśmy wiele funkcji obsługujących łącznośc między agentem oraz samą aplikacją a VW:

  1. Parsery - mapują komendy oraz obiekty na liczby.
  2. Generatory danych wejściowych:
  • Generator danych do uczenia się - konwertuje listy ruchów, koordynatów i otoczenia na wiersze w formacie VW, po czym zapisuje je do pliku.
  • Generator danych rzeczywistych - konwertuje listę obiektów w otoczeniu agenta o promieniu R = 1 na wiersz w formacie VW i zapisuje ją do pliku przeznaczonego do tymczasowego przechowywania danych.
  1. Funkcja odczytująca obiekty w otoczeniu agenta o promieniu R = 1. Funkcja ta oblicza współrzędne lewego górnego rogu pola widzenia agenta w celu poprawnego zapisania obiektów w otoczeniu. Funkcja pomija współrzędne agenta oraz współrzędne będące poza siatką mapy.

  2. Funkcja odczytująca wynik przewidywań VW. Funkcja ta odczytuje liczbę rzeczywistą zwrócona przez VW i mapuje ją do jednej z możliwych do wykonania przez agenta komend. Przewidywanie VW otrzymujemy przy użyciu komendy

    vw -i ./VowpalWabbit/VowpalModels/100k_input.model -t ./VowpalWabbit/VowpalDataCahce/constant_input.txt -p ./vowpalWabbit/VowpalDataCahce/constant_output.txt

Format danych

Przedstawione poniżej tabele pokazują mapowania użyte podczas procesu generwania danych.

Mapowanie obiektów na mapie

Obiekt Cyfra
E: empty 0
R: road 1
H: house 2
V: visited house 0
Y: yellow dump 2
B: blue dump 2
G: green dump 2

Mapowanie komend

Komenda Cyfra Waga przykładu
pick_garbage 1 5.0
right 2 1.0
left 3 1.0
up 4 1.0
down 5 1.0

Jeżeli w polu widzenia agenta znajduje się nieodwiedzony domek, a nie ma on aktualnie do niego dostępu, to następny ruch jest wykonywany z wagą 3.0.

Wyjściowa linijka dla VW:

akcja waga | F00:a F01:b F10:c F20:d F21:e

Gdzie Fxy: a to zmapowany na cyfrę obiekt a będący na koordynatach (x,y) w stosunku do prawego górnego rogu pola widzenia agenta.

Przykładowa linijka danych:

1 5.0 | F00:0.0 F01:1.0 F02:0.0 F10:2.0 F12:0.0 F20:0.0 F21:1.0 F22:1.0

Proces uczenia

Aby usprawnić proces zbierania danych dodałyśmy parametry wymagane przy starcie aplikacji. Dla projektu VowpalWabbit, zamiast

python3 ./main.py ./Resources/Maps/map_name.txt

od teraz wymagane są 2 do 3 argumentów:

  • plik mapy (ścieżka do mapy lub "auto" dla losowo generowanych map)
  • informacja, czy aplikacja ma się zamknąc po zakończeniu wykonywania jednego z wcześniej zaimplementowanych algorytmów (true / false)
  • algorytm, który automatycznie uruchamia się po starcie aplikacji (bfs / dfs / bestfs / brak wartości jeżeli nie chcemy nic automatycznie włączać)

Przykładowe wywołanie komendy: python3 ./main.py auto false dfs

W celu maksymalnego zautomatyzowania procesu uczenia się, stworzyłyśmy skrypt, które wszystkie potrzebne rzeczy robi za nas. Wymaga podania liczby uruchomień aplikacji, informacji, czy ma wyczyścić poprzednie dane, nazwę wyjściowego modelu oraz informację, czy po zakończeniu zbierania danych powinien od razu zacząć sie uczyć. Po uruchomieniu aplikacji wymaganą liczbę razy, skrypt zbiera dane z powstałych plików i tworzy z nich jeden plik .txt, który następnie przekazuje do VW za pomocą komendy

vw --oaa 5 data_set.txt -f data_model.model

Poniżej znajdują się parametry, dla których stworzyłyśmy dwa prezentowane modele:

Nazwa Liczba wykonań programu Typ mapy Przykładowy algorytm Pole widzenia
1k.model 1000 auto BestFS 2
100.model 100 auto BestFS 1

W wyniku procesu zbierania danych, otrzymałyśmy dane w liczbie około 50 000 linii oraz 5 000 linii.

Obserwacje

Pomimo dostosowania danych wejściowych i ich parametrów agent nie zawsze podejmuje racjonalne ruchy. Za każdym razem gdy trafia na skrzyżowanie nie potrafi dostosować ruchu do sytuacji. Udało nam się jednak nauczyć agenta kierowania się w stronę nieodwiedzonego domku, jeżeli ma taki w polu widzenia. Podczas obserwacji obu modeli doszłyśmy do wniosku, że agent o zwiększonym polu widzenia(model 1k.model) sprawuje się gorzej niż model o ograniczonym polu widzenia (mimo większej ilości danych).


Ze względu na to, że agent nie potrafi wyznaczyć odpowiedniego rozwiązania zadanego mu problemu ograniczyłyśmy przewidywanie do jednego ruchu.