Powiedzmy, że mam strzałkę z góry na dół i chcę przewidzieć kąt, pod jakim ta strzała się tworzy. Będzie to od do stopni lub od do . Problem polega na tym, że ten cel jest okrągły, i stopni są dokładnie takie same, co jest niezmiennością, którą chciałbym włączyć do mojego celu, co powinno znacznie pomóc w uogólnieniu (to moje założenie). Problem polega na tym, że nie widzę czystego sposobu rozwiązania tego problemu. Czy są jakieś dokumenty, które próbują rozwiązać ten problem (lub podobne)? Mam kilka pomysłów na temat ich potencjalnych wad:
Użyj aktywacji sigmoidalnej lub tanh, przeskaluj ją do zakresu ( i włącz właściwość kołową do funkcji straty. Myślę, że to zawiedzie dość mocno, ponieważ jeśli jest na granicy (najgorsza prognoza), tylko niewielki hałas popchnie ciężary, aby przejść w jedną lub drugą stronę. Również wartości bliższe granicy i będą trudniejsze do osiągnięcia, ponieważ bezwzględna wartość przed aktywacją będzie musiała być bliska nieskończoności.
Regres do dwóch wartości, i i oblicza stratę na podstawie kąta te dwie wartości wprowadzone. Myślę, że ten ma większy potencjał, ale norma tego wektora jest nieograniczona, co może prowadzić do niestabilności numerycznej i może prowadzić do wysadzenia lub do 0 podczas treningu. Można to potencjalnie rozwiązać za pomocą dziwnego regulizatora, aby zapobiec zbyt dużej oddaleniu tej normy od 1.y
Innymi opcjami byłyby robienie czegoś z funkcjami sinus i cosinus, ale wydaje mi się, że fakt, że wiele wstępnych aktywacji odwzorowuje na to samo wyjście, również utrudni optymalizację i uogólnienia.
źródło
Odpowiedzi:
Drugi sposób przewidywania i strony Y = s I n ( alfa ) jest zupełnie dobrze.x = c o s ( α ) y= s i n ( α )
Tak, nie można zagwarantować , że norma przewidywanego wektora będzie bliska 1 . Ale raczej nie wybuchnie, szczególnie jeśli użyjesz funkcji aktywacji sigmoidów (które są ograniczone przez ich naturę) i / lub dobrze uregulujesz swój model. Dlaczego model powinien przewidzieć dużą wartość, jeżeli wszystkie próbki szkoleniowe były w [ - 1 , 1 ] ?( x , y) 1 [ - 1 , 1 ]
Drugą stroną jest wektor zbyt blisko ( 0 , 0 ) . Może się to czasem zdarzyć i rzeczywiście może skutkować przewidywaniem niewłaściwych kątów. Ale może to być postrzegane jako korzyść twojego modelu - możesz rozważyć normę ( x , y ) jako miarę pewności swojego modelu. Rzeczywiście, norma bliska 0 oznacza, że twój model nie jest pewien, gdzie jest właściwy kierunek.( x , y) ( 0 , 0 ) ( x , y)
Oto mały przykład w Pythonie, który pokazuje, że lepiej przewidzieć grzech i cos, niż bezpośrednio przewidzieć kąt:
Możesz kontynuować i wykreślić prognozy, aby zobaczyć, że prognozy modelu sinus-cosinus są prawie prawidłowe, chociaż może wymagać dalszej kalibracji:
arctan2
źródło
Praca ze współrzędnymi kartezjańskimi działa dobrze, jak wspomniano powyżej. Jednak moim zdaniem konwersja danych biegunowych na kartezjański tworzy zależności między współrzędnymi X i Y, które nie były pierwotnie obecne w danych. Na przykład model decyzyjny ścieżki robota jest bardziej intuicyjny we współrzędnych biegunowych niż kartezjański. Zależność wektora prędkości robota od współrzędnych biegunowych między kątem a wielkością może nawet nie istnieć lub być inna niż zależność od współrzędnych kartezjańskich.
Obejście, które znalazłem, aby kontynuować pracę ze współrzędnymi biegunowymi, polega na utworzeniu niestandardowej funkcji błędu w celu obliczenia różnicy kątów za pomocą funkcji angdiff () w MATLAB i różnicy wielkości jak zwykle.
Ta funkcja zwraca „0” dla różnicy między -pi i pi. Oto link do strony wsparcia funkcji na stronie Mathworks.
https://www.mathworks.com/help/robotics/ref/angdiff.html
Jeśli używasz aktywacji Sigmoid, a dane dotyczące kątów są znormalizowane między [0,1], powróć do zakresu [-pi, pi] przed użyciem funkcji angdiff (), a następnie normalizuj błąd z powrotem do [0,1 ] zakres dla procesu propagacji wstecznej.
Ponadto równoważną funkcją w Pythonie byłoby:
Zwraca podobne wyniki jak funkcja MATLAB i działa również z tablicami:
Mam nadzieję, że to pomaga.
źródło