Wdrożyłem Q-Learning zgodnie z opisem w
http://web.cs.swarthmore.edu/~meeden/cs81/s12/papers/MarkStevePaper.pdf
W celu ok. Q (S, A) Używam struktury sieci neuronowej, jak poniżej,
- Aktywacja Sigmoid
- Wejścia, liczba wejść + 1 dla neuronów akcji (wszystkie wejścia skalowane 0-1)
- Wyjścia, pojedyncze wyjście. Wartość Q
- N liczba M ukrytych warstw.
- Metoda eksploracji losowa 0 <rand () <propExplore
Przy każdej iteracji uczenia się przy użyciu następującego wzoru:
Obliczam wartość Q-Target, a następnie obliczam błąd za pomocą,
error = QTarget - LastQValueReturnedFromNN
i z powrotem propagują błąd przez sieć neuronową.
P1: Czy jestem na dobrej drodze? Widziałem kilka dokumentów, które implementują NN z jednym neuronem wyjściowym dla każdego działania.
Q2, Moja funkcja nagrody zwraca liczbę z zakresu od -1 do 1. Czy w porządku jest zwracanie liczby z zakresu od -1 do 1, gdy funkcja aktywacji jest sigmoidalna (0 1)
P3: Z mojego zrozumienia tej metody, biorąc pod uwagę wystarczającą liczbę przypadków szkoleniowych, należy poddać kwarantannie, aby znaleźć optymalną strategię? Podczas treningu dla XOR czasami uczy się go po iteracjach 2k, czasem nie uczy się nawet po iteracjach 40k 50k.
źródło
Odpowiedzi:
Pytanie 1 Jesteś zdecydowanie na dobrej drodze, ale kilka zmian może ogromnie pomóc. Niektóre osoby używają jednej jednostki wyjściowej na akcję, tak aby musiały uruchomić swoją sieć tylko raz, aby wybrać akcję (musisz uruchomić sieć raz dla każdej możliwej akcji). Ale to nie powinno mieć znaczenia w kwestii uczenia się i jest warte wdrożenia, jeśli planujesz znaczne zwiększenie skali modelu.
Q2 Zasadniczo ludzie używają liniowej funkcji aktywacyjnej dla ostatniej warstwy swojej sieci neuronowej, szczególnie do uczenia wzmacniającego. Przyczyny tego są różne, ale najistotniejsze jest to, że liniowa funkcja aktywacji pozwala przedstawić pełny zakres liczb rzeczywistych jako wynik. Dlatego nawet jeśli nie znasz granic nagród za swoje zadanie, nadal masz gwarancję reprezentacji tego zakresu.
Pytanie 3 Niestety teoretyczne gwarancje łączenia sieci neuronowych (i ogólnie aproksymacji funkcji nieliniowych) z uczeniem się zbrojenia prawie nie istnieją. Istnieje kilka bardziej wymyślnych wersji uczenia wzmacniającego (głównie poza laboratorium Sutton), które mogą zawierać twierdzenia o zbieżności, o których wspomniałeś, ale tak naprawdę nigdy nie widziałem, aby te algorytmy były stosowane „na wolności”. Powodem tego jest to, że chociaż nie można obiecać doskonałej wydajności, zwykle uzyskuje się ją w praktyce, z należytą uwagą na hiperparametry i warunki początkowe.
Ostatnia ostatnia uwaga, o której należy wspomnieć ogólnie dla sieci neuronowych: nie używaj funkcji aktywacji sigmoidalnej dla sieci z dużą ilością ukrytych warstw! Przeklęci są problemem „znikających gradientów”; sygnał błędu prawie nie dociera do wcześniejszych warstw (patrząc na pochodną funkcji powinno wyjaśnić, dlaczego tak jest). Zamiast tego spróbuj zastosować rektyfikowane jednostki liniowe (RELU) lub jednostki „soft plus”, ponieważ ogólnie wykazują one znacznie lepszą wydajność w głębokich sieciach.
Zobacz ten artykuł, aby zapoznać się ze świetną implementacją sieci neuronowych przeszkolonych w uczeniu się przez wzmocnienie:
Mnih, Volodymyr i in. „Granie w Atari z nauką głębokiego wzmacniania”. nadruk arXiv arXiv: 1312.5602 (2013).
źródło
W przypadku funkcji aktywacji maxout również działa dobrze. Używanie odpowiedniego trenera jest kluczowe dla głębokich sieci, próbowałem różnych trenerów, ale zdecydowałem się trzymać RMSprop i wygląda świetnie!
źródło