Pytanie: czy można wytrenować NN, aby rozróżniał liczby nieparzyste od parzystych tylko przy użyciu samych danych wejściowych?
Mam następujący zestaw danych:
Number Target
1 0
2 1
3 0
4 1
5 0
6 1
... ...
99 0
100 1
Trenowałem NN z dwoma neuronami wejściowymi (jeden jest zmienną liczbą, drugi neuronem nastawnym), dziewięcioma neuronami w ukrytej warstwie i jednym neuronem wyjściowym przy użyciu bardzo prostego algorytmu genetycznego: w każdej epoce walczą dwa zestawy wag " przeciwko sobie; ten z najwyższym błędem przegrywa i zostaje zastąpiony zmodyfikowaną wersją zwycięzcy.
Skrypt z łatwością rozwiązuje proste problemy, takie jak operatory AND, OR i XOR, ale utkną podczas próby kategoryzacji liczb nieparzystych i parzystych. W tej chwili najlepiej udało się zidentyfikować 53 numery na 100 i zajęło to kilka godzin. To, czy normalizuję, czy nie, wydaje się, że nie ma znaczenia.
Gdybym chciał oszukiwać, mogłem po prostu wstępnie przetworzyć dane i podać% 2 do NN jako dane wejściowe, ale nie chcę tego robić; NN powinien być w stanie aproksymować każdą funkcję, w tym operator modulo ( uważam ). Co ja robię źle?
źródło
Odpowiedzi:
Podobnie jak w przypadku każdego zadania uczenia maszynowego, reprezentacja twojego wkładu odgrywa kluczową rolę w tym, jak dobrze się uczysz i uogólniasz.
Myślę, że problem z reprezentacją polega na tym, że funkcja (modulo) jest wysoce nieliniowa i nie jest gładka w reprezentacji wejściowej wybranej dla tego problemu.
Spróbowałbym następujących rzeczy:
Wypróbuj lepszy algorytm uczenia się (propagacja wsteczna / opadanie gradientu i jego warianty).
Spróbuj przedstawić liczby w systemie dwójkowym, używając precyzji o stałej długości.
Jeśli twoja reprezentacja wejściowa jest liczbą b-bitową, upewnię się, że twój zestaw treningowy nie jest nastawiony na małe lub duże liczby. Mają liczby, które są jednolicie i niezależnie wybierane losowo z zakresu .[ 0 , 2b- 1 ]
Jak już to zrobiłeś, użyj sieci wielowarstwowej (najpierw wypróbuj 2 warstwy: ukryty + wyjście, zanim użyjesz więcej warstw).
Użyj osobnego zestawu treningowego + testowego. Nie oceniaj swojej wydajności na zestawie treningowym.
źródło
Nauka klasyfikowania liczb nieparzystych i parzystych jest trudnym problemem. Prosty wzór powtarza się w nieskończoność. 2,4,6,8 ..... 1,3,5,7 .....
Nieliniowe funkcje aktywacyjne, takie jak sin (x) i cos (x), zachowują się podobnie. Dlatego jeśli zmienisz neurony, aby zastosować sin i cos zamiast popularnych funkcji aktywacyjnych, takich jak tanh lub relu, myślę, że możesz dość łatwo rozwiązać ten problem za pomocą pojedynczego neuronu.
Transformacje liniowe zawsze poprzedzają transformacje nieliniowe. Dlatego pojedynczy neuron zakończy naukę grzechu (ax + b), który dla właściwej kombinacji a & b będzie generował na przemian 0 i 1 na przemian z pożądaną częstotliwością, którą w tym przypadku jest 1.
Nigdy wcześniej nie próbowałem grzechu ani cos w moich sieciach neuronowych. Przepraszam, jeśli okaże się to bardzo złym pomysłem.
źródło
Pracuję teraz z sieciami neuronowymi i napotkałem ten sam problem co ty. Skończyło się na tym, że reprezentowałem liczbę wejściową jako tablicę o wartościach równych binarnej reprezentacji liczby. Ponieważ to, co robimy, to klasyfikowanie, przedstawiałem swoje dane wyjściowe jako tablicę, a nie jako pojedynczą wartość. dawny:
Mam nadzieję że to pomoże!
źródło
Dostaję się tutaj, gdzie zmagał się z podobnym problemem. Więc piszę, co udało mi się.
O ile mi wiadomo, perceptron jednej warstwy jest w stanie rozwiązać każdy problem, który na końcu można uprościć, aby podzielić obiekty o dowolnej geometrii za pomocą linii prostej. I to jest tego rodzaju problem. Jeśli narysujesz ostatni kawałek reprezentacji binarnej na papierze, możesz również narysować linię, a wszystkie liczby nieparzyste są po jednej stronie, a nawet po drugiej. Z tego samego powodu nie można rozwiązać problemu xor z siecią jednowarstwową.
Dobrze. Ten problem wygląda bardzo prosto, więc weźmy krok Heaviside jako funkcję aktywacji. Po tym, jak trochę zagrałem z moim numerem, zdałem sobie sprawę, że problem polega na uprzedzeniu. Trochę google, i znalazłem, że jeśli pozostaniesz z reprezentacją geometrii, odchylenie umożliwia zmianę miejsca aktywacji w układzie współrzędnych.
Bardzo problem edukacyjny
źródło
Powszechnie wiadomo, że bramek logicznych NIE, ORAZ, LUB wszystkich można dokonać za pomocą bardzo prostych sieci neuronowych (NN) i że można zbudować kompletny kalkulator arytmetyczny z bramkami logicznymi, używając liczb binarnych jako danych wejściowych. Dlatego powinieneś być w stanie utworzyć NN, aby obliczyć n modulo k, dla dowolnej liczby n i k wyrażonej w podstawie 2.
Jeśli chcesz obliczyć n modulo k dla ustalonej liczby k (na przykład k = 4), możesz w rzeczywistości stworzyć wyjątkowo prosty NN, który to robi: wyraż liczbę wejściową n w podstawie k i zignoruj wszystkie cyfry inne niż najniższa ranga cyfra i masz odpowiedź!
źródło
Jednym pomysłem unikającym użycia wyraźnego „mod 2” na wejściu może być kodyfikacja liczby jako sekwencji pikseli, wówczas problem polega na rozpoznaniu, czy segment można podzielić na dwa równe segmenty. Jest to problem widzenia maszynowego, którego można się nauczyć w konwencjonalnych sieciach.
Z drugiej strony, jeśli liczba jest przechowywana jako liczba zmiennoprzecinkowa, pytanie zmniejsza się (lub uogólnia), aby rozpoznać, kiedy liczba zmiennoprzecinkowa jest w przybliżeniu liczbą całkowitą.
źródło
Stworzyłem taką sieć w tutaj .
Podstawą była reprezentacja @William Gottschalk.
Używa tylko 1 neuronu w pierwszej ukrytej warstwie z 32 wejściami. Warstwa wyjściowa ma tylko 2 neurony do jednokrotnego kodowania 0 i 1.
źródło
Moje rozwiązanie
Co więcej, dzielenie przez inne liczby (powiedzmy 7) również jest dobre:
Wyjaśnienie:
Dostaję 2 różne rozwiązania. Oba są dobre:
1. sin jako aktywacja
2. floor (lub int) jako aktywacja
Niemożliwe jest znalezienie najlepszych wag przy użyciu opadania gradientu, a ja używam algorytmu genetycznego (od scikit-opt )
źródło