Próbuję zaprogramować własny system do uruchamiania sieci neuronowej. Aby zmniejszyć liczbę potrzebnych węzłów, zasugerowano, aby traktować obroty wejścia jednakowo.
Moja sieć stara się uczyć i przewidywać grę życia Conwaya, patrząc na każdy kwadrat i otaczające go kwadraty w siatce, i dając wynik dla tego kwadratu. Jego dane wejściowe to ciąg 9 bitów:
Powyższe jest reprezentowane jako 010 001 111.
Istnieją jednak trzy inne obroty tego kształtu i wszystkie wytwarzają tę samą moc wyjściową:
Moja topologia sieci to 9 węzłów wejściowych i 1 węzeł wyjściowy dla następnego stanu środkowego kwadratu na wejściu. Jak mogę zbudować ukryte warstwy, aby brały te same obroty tak samo, zmniejszając liczbę możliwych danych wejściowych do jednej czwartej oryginału?
Edytować:
Istnieje również odwrócenie każdego obrotu, co daje identyczny wynik. Włączenie ich spowoduje zmniejszenie moich nakładów o 1/8. W przypadku szybowca moim celem jest, aby wszystkie te dane wejściowe były traktowane dokładnie tak samo. Czy będzie to wymagało wstępnego przetwarzania, czy też mogę włączyć to do sieci?
źródło
Odpowiedzi:
Jeśli dobrze rozumiem, twój pojedynczy węzeł wyjściowy będzie następnym statusem kwadratu pośrodku. Nie musisz martwić się o liczbę węzłów w ukrytych warstwach, gdy masz wystarczające zasoby, aby trenować model. Problem ten jest bardzo łatwy do opanowania dla sieci neuronowej, więc nie ma obaw o rozmiar.
Musisz wykonać nadzorowane szkolenie, co oznacza, że musisz wprowadzić dane wejściowe i dopasować oczekiwany wynik. Musisz mieć pewność, że w danych treningowych wszystkie 4 rotacje są przypisane do tego samego wyniku. W ten sposób Twoja sieć powinna nauczyć się traktować je wszystkie w ten sam sposób.
Zainspirowałeś mnie, więc spróbowałem siebie. Moje rozwiązanie może nauczyć się 100% poprawności w około 20 epokach uruchomionych w ciągu kilku sekund na moim starym laptopie. Ja tylko nieznacznie zmieniłem wynik, aby był kategoryczny [0,1] lub [1,0], ale daje to ten sam rezultat, którego szukasz. Dla odniesienia tutaj jest kod napisany w pythonie:
źródło
Zidentyfikowałeś optymalizację w swojej przestrzeni problemowej i pragniesz upiec to w swojej sieci neuronowej. Sugeruję wstępne przetwarzanie: skomponuj swoją optymalizację za pomocą sieci neuronowej, która wykonuje podzbiór tego, co chcesz.
Innymi słowy, znormalizuj dane wejściowe, ręcznie kodując algorytm rotacji, który obraca dane wejściowe, aby uchwycić równoważność wyróżnioną w poście. Następnie przekaż wynik tej transformacji do swojej sieci neuronowej, na trening i wszystkie inne zastosowania. Oznacza to, że trenujesz sieć neuronową, aby rozwiązać zidentyfikowany pod-problem - rotacje są zbędne.
Przetestuj swój normalizator, generując losowe dane wejściowe, obracając je do wszystkich czterech potencjalnych transformacji, uruchom normalizator na każdym z nich, a następnie sprawdź, czy wszystkie są równoważne.
źródło
Aby być purystą, zacznij od innego rozważenia danych wejściowych, jako okrągłej tablicy o rozmiarze cztery, z których każda zawiera parę bitów, a dodatkowo bit środkowy:
W całym projekcie sieci kontynuuj paradygmat struktury kołowej i punktu środkowego.
źródło