Jak przekształcać dane wejściowe i uzyskiwać przydatne dane wyjściowe w sieci neuronowej?


9

Próbowałem więc zrozumieć sieci neuronowe, odkąd natknąłem się na blog Adama Geitgeya na temat uczenia maszynowego. Przeczytałem jak najwięcej na ten temat (który mogę zrozumieć) i wierzę, że rozumiem wszystkie ogólne pojęcia i niektóre działania (pomimo tego, że jestem bardzo słaby w matematyce), neurony, synapsy, wagi, funkcje kosztów, propagacja wsteczna itp. Jednak nie byłem w stanie dowiedzieć się, jak przełożyć problemy świata rzeczywistego na rozwiązanie sieci neuronowej.

W tym przypadku Adam Geitgey podaje jako przykład zastosowania system prognozowania ceny domu, w którym podano zestaw danych zawierający liczbę sypialni , Sq. stopy , sąsiedztwo i cena sprzedaży możesz wytrenować sieć neuronową, aby móc przewidzieć cenę domu. Jednak zatrzymuje się przed faktycznym wdrożeniem możliwego rozwiązania w kodzie. Najbliżej, na przykład, jest podstawowa funkcja pokazująca, jak zaimplementować wagi:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0

  # a little pinch of this
  price += num_of_bedrooms * 1.0

  # and a big pinch of that
  price += sqft * 1.0

  # maybe a handful of this
  price += neighborhood * 1.0

  # and finally, just a little extra salt for good measure
  price += 1.0

  return price 

Wydaje się, że inne zasoby koncentrują się w większym stopniu na matematyce, a jedyny podstawowy przykład kodu, jaki mogłem znaleźć, który rozumiem (tj. To nie wszystko śpiewanie, cała baza kodów klasyfikacji tańczących obrazów) to implementacja, która trenuje sieć neuronową do bycia XOR bramka, która zajmuje się tylko 1 i 0.

Więc w mojej wiedzy jest luka, której po prostu nie mogę zlikwidować. Jeśli wrócimy do problemu prognozowania ceny domu , jak sprawić, by dane były odpowiednie do wprowadzenia do sieci neuronowej? Na przykład:

  • Liczba sypialni: 3
  • Plac stopy: 2000
  • Okolica: Normaltown
  • Cena sprzedaży: 250 000 $

Czy możesz po prostu wprowadzić 3 i 2000 bezpośrednio do sieci neuronowej, ponieważ są to liczby? A może musisz je przekształcić w coś innego? Podobnie co z wartością Normaltown , czyli ciągiem, jak przejść do tłumaczenia jej na wartość, którą sieć neuronowa może zrozumieć? Czy możesz po prostu wybrać liczbę, taką jak indeks, o ile jest ona spójna w danych?

Większość przykładów sieci neuronowych, które widziałem, liczby przechodzące między warstwami wynoszą od 0 do 1 lub od -1 do 1. Więc pod koniec przetwarzania, w jaki sposób przekształcasz wartość wyjściową na coś użytecznego, takiego jak 185 000 $ ?

Wiem, że przykład prognozy ceny domu prawdopodobnie nie jest szczególnie przydatnym problemem, ponieważ został znacznie uproszczony do zaledwie trzech punktów danych. Ale po prostu czuję, że jeśli uda mi się pokonać tę przeszkodę i napisać niezwykle podstawową aplikację, która ćwiczy przy użyciu pseudo-rzeczywistych danych i wyrzuca pseudo-rzeczywistą odpowiedź, nie zerwę tego i będę w stanie kopnąć i zagłębiać się w uczenie maszynowe.

Odpowiedzi:


10

To dobre pytanie, które zmagałem się ze sobą, kiedy po raz pierwszy próbowałem zakodować ANN.

Poniżej znajduje się dobre rozwiązanie ogólnego zastosowania i to jest to, które zaimplementowałem w moim kodzie, aby spróbować przewidzieć dobrze zachowane dane liczbowe. Jeśli twoje dane nie są dobrze zachowane (tj. Pełne wartości odstających), być może będziesz musiał wykonać więcej pracy normalizując dane wejściowe i wyjściowe. Niektóre bardziej zaawansowane metody opisano tutaj .

Uwaga: Zakładam, że używasz f (x) = tanh (x) jako funkcji aktywacyjnej. Jeśli tak nie jest, po przeczytaniu tego nadal powinieneś być w stanie zastanowić się, w jaki sposób normalizować swoje dane.

Jak przygotować dane wejściowe:

Podstawową ideą jest to, że chcesz, aby znacząca zmiana w każdym parametrze wejściowym była odzwierciedlona przez znaczną zmianę w aktywacji neuronu, do którego zasilane są te dane wejściowe. Patrząc na wykres pochodnej funkcji aktywacji tanh (x), zobaczysz, że obszar znacznego nachylenia znajduje się w odległości jednego lub dwóch od początku. Oznacza to, że niezależnie od tego, czy wejście do funkcji aktywacji wynosi 2000, czy 3000 (wartości x, dla których pochodna jest nieznacznie mała), wynik aktywacji będzie prawie identyczny ... więc stan twojego neuronu będzie niezależny od różnicy między 2000 i 3000, a twoja sieć nigdy nie wytworzy mocy predykcyjnej z wartości z tego zakresu.

Więc jeśli chcesz wprowadzić materiał kwadratowy domu do neuronu, musisz znormalizować materiał kwadratowy, aby sieć mogła rozpoznać różnicę między 2000 a 3000. Jednym ze sposobów, aby to zrobić, aby wszystkie znaczące zmiany w twoim dane są „zauważane” przez neuron, aby z-wynik-normalizować dane wejściowe .

  • Zbierz wszystkie wartości materiału kwadratowego (z zestawu treningowego) i oblicz średnią i odchylenie standardowe. Przechowuj średnią i odchylenie standardowe - będziesz potrzebować tych informacji, aby znormalizować nowe wartości kwadratowe podczas testowania.

  • Znormalizuj wektor wartości kwadratowych, odejmując średnią, a następnie dzieląc wynik przez odchylenie standardowe (wszystkie operacje oczywiście pod względem elementu). Odejmowanie średniej powoduje wyśrodkowanie danych na początku, a dzielenie przez odchylenie standardowe zapewnia, że ​​większość z nich mieści się w przedziale od -1 do 1, gdzie wyjście neuronu jest najbardziej wrażliwe na jego wejście. To się nazywa wynik_z normalizacja ponieważ każda wartość wejściowa jest zastąpiona przez jego z-score .

  • Wykonaj powyższe czynności dla każdej zmiennej wejściowej.

Teraz, kiedy wkładasz każdą wartość wejściową przez neuron, wyjście neuronu jest aktywacją między -1 a 1 (spójrz na obraz tanh (x)). Ponieważ znajduje się już w „czułym” zakresie funkcji aktywacji, nie musisz się martwić o zmianę wyjścia neuronów warstwy wejściowej przed wysłaniem ich do pierwszej ukrytej warstwy. Po prostu przekaż neuronom ukrytej warstwy bezpośrednio wyniki poprzedniej warstwy - będą w stanie sobie z nimi poradzić.

Kiedy osiągniesz ostatnią warstwę (neuron wyjściowy), ponownie otrzymujesz kolejną aktywację między -1 a 1. Musisz przekonwertować to z powrotem na wartość dla danego domu , czy ta wartość zostanie wykorzystana jako prognoza w zestawie testowym lub w celu obliczenia błędu podczas treningu. Jakkolwiek to zrobisz, musisz być konsekwentny i stosować tę samą procedurę deznormalizacji w szkoleniach i testach. Jednym ze sposobów myślenia o tym jest: kiedy neuron wyjściowy zwraca 1, oznacza to, że sieć zwraca maksymalną możliwą wartość domu jako swoją prognozę. Jaka powinna być najwyższa wartość, jaką sieć może oszacować? Właściwe podejście tutaj zależy po prostu od twojej aplikacji. Oto co zrobiłem:

  • Oblicz średnią z [wyjściowej / każdej] zmiennej wyjściowej i zapisz ją.
  • Obliczyć maksymalne odchylenie zmiennej wyjściowej od średniej. Pyton:MaxDev = max([abs(DataPoint-numpy.mean(TrainingData)) for DataPoint in TrainingData])
  • Gdy sieć zwraca wyniki między -1 a 1, pomnóż wynik przez MaxDevi dodaj go do średniej.

Dwie podstawowe szybkie kontrole, które możesz zrobić, aby sprawdzić, czy twój schemat normalizacji-renormalizacji jest odpowiedni (są to konieczne, ale być może niewystarczające warunki):

  1. Jeżeli wszystkie wartości wejściowe są średnie (np. Średnia liczba sypialni, średnia stopa kwadratowa itp.), To czy wydajność sieci jest równa średniej zmiennej wyjściowej (np. Wartości domu)? (Powinno być.)
  2. Jeśli wszystkie wartości wejściowe są wyjątkowo wysokie / niskie, to czy wyjście sieci jest również wyjątkowo wysokie / niskie? (Działa to tylko wtedy, gdy wszystkie wejścia są pozytywnie powiązane z wyjściem ... jeśli niektóre z nich są powiązane odwrotnie, będziesz musiał pomyśleć trochę więcej).

Zauważ, że przedstawiony tutaj schemat spełnia te dwa warunki.

Zauważ, że ten schemat pozwoliłby twojej sieci przewidywać tylko wartości domu w zakresie wartości domu w zbiorze danych treningowych. W zależności od zastosowania takie zachowanie może być pożądane lub niepożądane.

Na przykład: możesz uniemożliwić sieci przewidywanie ujemnych wartości domu. Zastanów się, jak byś to zrobił. Odnormalizuj dane wyjściowe, aby -1 zostało zamapowane na 0.

Jeśli nie chcesz ustawiać limitu wartości, które może przewidzieć twoja sieć, możesz uruchomić dane wyjściowe sieci za pomocą funkcji, która odwzorowuje zakres [-1,1] na wszystkie liczby rzeczywiste ... jak arctanh (x)! Dopóki robisz to podczas treningu, twoja sieć dostosuje swoje wagi, aby to uwzględnić.

Mam nadzieję, że to było pomocne. Daj mi znać, jeśli masz dodatkowe pytania. Nawiasem mówiąc, mój moduł ANN jest w Pythonie, więc mogę uzyskać porady dotyczące konkretnego języka.


To było bardzo przydatne! Każdy blog / tutorial, na jaki natrafiam, wydaje się unikać (prawie umyślnie) opisywania tego procesu, ale tak, to wszystko ma sens. Zajmie mi to trochę czasu, aby właściwie się przetrawić, ale wrócę, jeśli będę mieć dalsze pytania. Bardzo zobowiązany!
David

Kilka pytań. Jeśli mój Sq. Dane treningu stóp wyniosły {2000, 800, 850, 550, 2000}, a następnie moje dane wejściowe z-score dla {1900, 1500, 600} byłyby (jeśli poprawnie oblicziłem) {1.0496, 0.4134, -1.0177}. Więc jedna z tych wartości to> 1, a jedna to <-1, co bym z nimi zrobił? Wprowadzić je do węzłów warstwy wejściowej niezależnie czy zaokrąglić je do 1 i -1? Dlaczego 1900 i 600 generują te wartości, gdy mieszczą się w zakresie 550 - 2000? Czy to tylko sztuczka z danymi, ponieważ istnieje tak mały zestaw danych?
David

Jeśli chodzi o renormalizację warstwy wyjściowej, czy mam poprawnie, aby wydrukować dane wyjściowe do wartości minimalnej i maksymalnej? Więc jeśli minimalna wartość była0andthemaximum100, a wynik wyniósł zero (przy założeniu od -1 do 1), co oznaczałoby 50 dolarów?
David

Pamiętaj, że dane wejściowe nie muszą znajdować się w przedziale od 1 do -1. Wszystko, czego potrzebujesz do danych wejściowych, to to, że większość danych znajduje się w tym zakresie. Wartość większa lub mniejsza niż jeden oznacza, że ​​punkt znajduje się o więcej niż jedno odchylenie standardowe od średniej, więc punkt jest bliżej wyższego końca danych. Twoje dane powinny wykraczać poza [-1, 1], a jeszcze rzadziej wykraczać poza [-2, 2], a niezwykle rzadko wykraczać poza [-3, 3]. Spójrz na tanh (x), a zobaczysz, że zakres czułości jest nie tylko ściśle pomiędzy -1 a 1, ale idzie nieco dalej.
Marko Bakić

Jeśli chodzi o denormalizację danych wyjściowych, to denormalizacja min-max jest tym, co zrobiłem w mojej implementacji, i twoja interpretacja jest poprawna, ale niekoniecznie musisz to zrobić. Możesz ustawić go tak, aby 1 odpowiadał dwukrotności maksymalnej wartości domu - w ten sposób Twoja sieć byłaby w stanie przewidzieć wartości domu powyżej tego, na czym go trenowałeś.
Marko Bakić
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.