Sieci neuronowe tradycyjnie odnoszą się do sieci lub obwodu neuronów biologicznych. Współczesne użycie tego terminu często odnosi się do sztucznych sieci neuronowych (SSN), które składają się ze sztucznych neuronów lub węzłów – konstruktów programistycznych naśladujących właściwości neuronów biologicznych. Zestaw ważonych połączeń między neuronami umożliwia propagację informacji w sieci w celu rozwiązania problemów sztucznej inteligencji bez konieczności posiadania przez projektanta sieci modelu rzeczywistego systemu. Celem jest dobra lub ludzka zdolność przewidywania.
PYTANIA:
Wielowarstwowa propagacja wsteczna. Sieć neuronowa do klasyfikacji
Czy ktoś może mi wyjaśnić, jak sklasyfikować dane takie jak MNIST z siecią MLBP-Neural, jeśli wykonuję więcej niż jedno wyjście (np. 8), to znaczy, jeśli używam tylko jednego wyjścia, mogę łatwo klasyfikować dane, ale jeśli używam więcej niż jeden, które wyjście powinienem wybrać?
ODPOWIEDZI:
Załóżmy, że musisz sklasyfikować coś w klasach K, gdzie K > 2. W tym przypadku najczęściej używam konfiguracji jednego kodowania na gorąco. Będziesz mieć K kolumn wyjściowych, a w zbiorze uczącym ustawisz wszystkie wartości na 0, z wyjątkiem tej, która ma indeks kategorii, który może mieć wartość 1. Zatem dla każdej instancji zestawu danych uczących będziesz mieć wszystkie wyniki z wartościami 0 lub 1, wszystkie wyjścia sumują się do 1 dla każdej instancji.
To wygląda na prawdopodobieństwo, które przypomina mi technikę używaną często do łączenia niektórych wyników, które są modelowane jako prawdopodobieństwo. Nazywa się to funkcją softmax, więcej szczegółów w Wikipedii. Pozwoli to na nałożenie pewnych ograniczeń na wartości wyjściowe (jest to w zasadzie uogólnienie funkcji logistycznej), tak aby wartości wyjściowe były modelowane jako prawdopodobieństwa. Wreszcie, z lub bez softmax, możesz użyć wyjścia jako funkcji dyskryminacyjnej, aby wybrać odpowiednią kategorię. Kolejną ostatnią myślą byłoby uniknięcie kodowania zmiennych w połączony sposób. Na przykład możesz mieć binarną reprezentację indeksu kategorii. Spowodowałoby to u uczącego się sztuczne połączenie między niektórymi wynikami, które są arbitralne. Jedyne kodowanie na gorąco ma tę zaletę, że jest neutralne dla sposobu indeksowania etykiet.
Wszelkie różnice w regularyzacji w MLP między partiami i indywidualne aktualizacje?
Właśnie dowiedziałem się o regularyzacji jako podejściu do kontroli nadmiernego dopasowania i chciałbym włączyć ten pomysł do prostej implementacji wstecznej propagacji i wielowarstwowego perceptronu (MLP), które razem złożyłem. Obecnie, aby uniknąć nadmiernego dopasowania, przeprowadzam weryfikację krzyżową i utrzymuję sieć z najlepszym dotychczas wynikiem w zestawie walidacyjnym. Działa to dobrze, ale dodanie regularyzacji przyniosłoby mi korzyści, ponieważ prawidłowy wybór algorytmu regularyzacji i parametru spowodowałby, że moja sieć zbiegałaby się w sposób bardziej systematyczny do modelu nieprzekraczającego. Formuła, którą mam na termin aktualizacji (z kursu Coursera ML) jest podana jako aktualizacja partii, np. dla każdej wagi, po zsumowaniu wszystkich odpowiednich delt dla całego zbioru uczącego z propagacji błędu, dodaje się korektę lambda * current_weight, a także przed odjęciem połączonej delty na końcu partii, gdzie lambda jest parametrem regularyzacji. Moja implementacja wstecznej propagacji wykorzystuje aktualizacje wagi poszczególnych pozycji. Obawiam się, że nie mogę po prostu skopiować podejścia wsadowego, chociaż intuicyjnie wydaje mi się to OK. Czy mniejszy okres regularyzacji na element działa równie dobrze? Na przykład lambda * aktualna_waga / N, gdzie N to rozmiar zestawu treningowego – na początku na pierwszy rzut oka wygląda to rozsądnie. Nie mogłem jednak znaleźć nic na ten temat i zastanawiam się, czy to dlatego, że regularyzacja nie działa tak dobrze z aktualizacją dla poszczególnych pozycji, czy nawet ma inną nazwę lub zmienioną formułę.
Regularyzacja ma również znaczenie w uczeniu się według poszczególnych elementów. Proponuję rozpocząć od podstawowego podejścia do walidacji, aby dowiedzieć się, czy lambda jest uczeniem wsadowym, czy jednostkowym. To najłatwiejsze i najbezpieczniejsze podejście. Spróbuj ręcznie z kilkoma różnymi wartościami. na przykład 0,001. 0,003, 0,01, 0,03, 0,1 itd. I zobacz, jak zachowuje się Twój zestaw walidacyjny. Później możesz zautomatyzować ten proces, wprowadzając liniową lub lokalną metodę wyszukiwania. Na marginesie uważam, że wartość lambda należy rozpatrywać w odniesieniu do aktualizacji wektora parametrów, a nie rozmiaru zestawu uczącego. W przypadku uczenia wsadowego masz jedną aktualizację parametrów na przebieg zestawu danych, natomiast w przypadku uczenia online jedną aktualizację na próbkę (niezależnie od rozmiaru zestawu uczącego).
Regularyzacja jest używana podczas obliczania wstecznej propagacji wszystkich wag w twoim MLP. Dlatego zamiast obliczać gradient w odniesieniu do wszystkich danych wejściowych zbioru uczącego (partii), używasz tylko jednej / jednej pozycji (stochastyczna lub półstochastyczna). Ostatecznie ograniczysz wynik aktualizacji do jednego przedmiotu, a nie do wszystkich, co również jest poprawne. Ponadto, jeśli dobrze pamiętam, Andrew NG użył regularyzacji L2. / N w lambda * aktualna_waga / N nie jest obowiązkowa, po prostu pomaga przeskalować dane wejściowe. Jeśli jednak zdecydujesz się jej nie używać, będziesz musiał (w większości przypadków) wybrać inną wartość lambda. Możesz również użyć algorytmu wyszukiwania w siatce, aby wybrać najlepszą wartość dla lambda (hiperparametr => ten, który musisz wybrać).
Jak walczyć z niedopasowaniem w głębokiej sieci neuronowej
Kiedy zacząłem od sztucznych sieci neuronowych (NN), pomyślałem, że będę musiał walczyć z nadmiernym dopasowaniem jako głównym problemem. Ale w praktyce nie mogę nawet zmusić mojego NN do przekroczenia 20% bariery błędu. Nie mogę nawet pobić swojego wyniku w losowym lesie! Szukam bardzo ogólnych lub mniej ogólnych porad na temat tego, co należy zrobić, aby NN zaczął rejestrować trendy w danych. Do implementacji NN używam Theano Stacked Auto Encoder z kodem z tutoriala, który działa świetnie (mniej niż 5% współczynnik błędów) do klasyfikowania zbioru danych MNIST. Jest to wielowarstwowy perceptron, z warstwą softmax na górze, a każdy ukryty później jest wstępnie trenowany jako autoenkoder (w pełni opisany w samouczku, rozdział 8). Istnieje ~ 50 funkcji wejściowych i ~ 10 klas wyjściowych. NN ma neurony esicy i wszystkie dane są znormalizowane do [0,1]. Próbowałem wielu różnych konfiguracji: liczba ukrytych warstw i neuronów w nich (100-> 100-> 100, 60-> 60-> 60, 60-> 30-> 15 itd.), Różne uczenie się i wstępne szkolenie stawki itp. A najlepsze, co mogę uzyskać, to 20% poziom błędów w zestawie walidacyjnym i 40% poziom błędów w zestawie testowym. Z drugiej strony, gdy próbuję użyć Random Forest (od scikit-learn), łatwo uzyskuję 12% poziom błędów w zbiorze walidacyjnym i 25% (!) w zbiorze testowym. Jak to możliwe, że moje głębokie NN z przedtreningiem zachowuje się tak źle? Czego powinienem spróbować?
Problem z głębokimi sieciami polega na tym, że mają one wiele hiperparametrów do dostrojenia i bardzo małą przestrzeń na rozwiązania. Zatem znalezienie dobrych jest bardziej jak sztuka niż zadanie inżynierskie. Zacząłbym od praktycznego przykładu z samouczka i bawiłbym się jego parametrami, aby zobaczyć, jak zmieniają się wyniki – daje to dobrą intuicję (choć nie formalne wyjaśnienie) na temat zależności między parametrami a wynikami (zarówno końcowymi, jak i pośrednimi). Bardzo przydatne okazały się również następujące artykuły: Visual Debugging Restricted Boltzmann Machine Training z przykładem 3D Praktyczny przewodnik po szkoleniu Ograniczone Boltzmann Machines Oba opisują RBM, ale zawierają ogólne spostrzeżenia na temat głębokich sieci. Na przykład, jednym z kluczowych punktów jest to, że sieci muszą być debugowane na poziomie warstwy – jeśli poprzednia warstwa nie zapewnia dobrej reprezentacji funkcji, kolejne warstwy prawie nie mają szans, aby to naprawić.
Chociaż odpowiedź zawiera kilka doskonałych wskazówek, które pomogą dowiedzieć się więcej o tym, jak sieci neuronowe mogą być (niezwykle) trudne do poprawnego dostrojenia, pomyślałem, że pomocne może być wymienienie kilku konkretnych technik, które są obecnie używane w klasyfikacji o najwyższej wydajności architektury w literaturze sieci neuronowej.
Rektyfikowane aktywacje liniowe
Pierwszą rzeczą, która może pomóc w twoim przypadku, jest zmiana funkcji aktywacji modelu z logistycznej sigmoidy – f (z) = (1 + = e <sup> -z </sup>) <sup> -1 </sup> – do wyprostowanej liniowej (aka relu) – f (z) = max (0, z).
Aktywacja relu ma dwie duże zalety:
* jego wyjście to prawdziwe zero (a nie tylko mała wartość bliska zeru) dla i
* jego pochodna jest stała, 0 dla lub 1 dla.
Sieć jednostek relu zasadniczo działa jak zbiór wykładniczo wielu sieci liniowych, ponieważ jednostki, które otrzymują dane wejściowe, są zasadniczo „wyłączone” (ich wyjście wynosi 0), podczas gdy jednostki, które otrzymują dane wejściowe, zapadają się w pojedynczy model liniowy dla tego wejścia. Również stałe pochodne są ważne, ponieważ głęboka sieć z aktywacjami relu ma tendencję do unikania problemu znikającego gradientu i można ją trenować bez warstwowego wstępnego treningu.
Dropout
Wiele grup badawczych w ciągu ostatnich kilku lat opowiadało się za stosowaniem „przerywania” w sieciach klasyfikatorów, aby uniknąć przetrenowania. W przypadku rezygnacji podczas uczenia pewna stała proporcja jednostek w danej warstwie jest losowo ustawiana na 0 dla każdego wejścia przetwarzanego przez sieć. Zmusza to jednostki, które nie są ustawione na 0, do „nadrabiania” „brakujących” jednostek. Dropout wydaje się być niezwykle skutecznym regulatorem modeli sieci neuronowych w zadaniach klasyfikacyjnych.
Gdy głębsze sieci są w stanie zacząć konwergencję, ujawniono problem degradacji: wraz ze wzrostem głębokości sieci dokładność zostaje nasycona (co może nie być zaskakujące), a następnie szybko spada. Nieoczekiwanie taka degradacja nie jest spowodowana nadmiernym dopasowaniem, a dodanie większej liczby warstw do odpowiednio głębokiego modelu prowadzi do większego błędu uczenia, co zostało dokładnie zweryfikowane przez nasze eksperymenty. Aby rozwiązać ten problem, wykorzystali architekturę pomijania. Dzięki temu wyszkolili bardzo głębokie sieci (1202 warstwy) i osiągnęli najlepszy wynik w wyzwaniu ILSVRC 2015
Sieć neuronowa analizuje ciąg danych?
Więc dopiero zaczynam się uczyć, jak sieć neuronowa może działać, aby rozpoznawać wzorce i kategoryzować dane wejściowe, i widziałem, jak sztuczna sieć neuronowa może analizować dane obrazu i kategoryzować obrazy (demo z convnetjs), a klucz tam polega na zmniejszeniu rozdzielczości obrazu, a każdy piksel stymuluje jeden neuron wejściowy do sieci. Próbuję jednak zawinąć głowę, czy można to zrobić za pomocą danych wejściowych? Przykład użycia, który mam, to „mechanizm rekomendacji” dla filmów, które oglądał użytkownik. Filmy mają wiele danych tekstowych (tytuł, fabuła, tagi) i mogę sobie wyobrazić „zmniejszenie próbkowania” tekstu do kilku kluczowych słów opisujących ten film, ale nawet jeśli przeanalizuję pięć pierwszych słów opisujących ten film, myślisz, że potrzebowałbym neuronów wejściowych dla każdego angielskiego słowa, aby porównać zestaw filmów? Mógłbym ograniczyć neurony wejściowe tylko do słów użytych w zestawie, ale czy potem może się rozwijać / uczyć, dodając nowe filmy (użytkownik ogląda nowy film z nowymi słowami)? Większość bibliotek, które widziałem, nie pozwala na dodawanie nowych neuronów po przeszkoleniu systemu? Czy istnieje standardowy sposób mapowania danych ciągów / słów / znaków na dane wejściowe w sieci neuronowej? A może sieć neuronowa naprawdę nie jest odpowiednim narzędziem do analizowania danych łańcuchowych, takich jak to (jakie jest lepsze narzędzie do dopasowywania wzorców w danych łańcuchowych)?
Korzystanie z sieci neuronowej do przewidywania danych w języku naturalnym może być trudnym zadaniem, ale istnieją wypróbowane i prawdziwe metody umożliwiające to. W polu Przetwarzanie języka naturalnego (NLP) tekst jest często przedstawiany za pomocą modelu zbioru słów. Innymi słowy, masz wektor o długości n, gdzie n to liczba słów w Twoim słowniku, a każde słowo odpowiada elementowi w wektorze. Aby przekonwertować tekst na dane liczbowe, wystarczy policzyć liczbę wystąpień każdego słowa i umieścić tę wartość w indeksie wektora, który odpowiada słowu. Wikipedia doskonale opisuje ten proces konwersji. Ponieważ długość vector jest naprawiony, trudno jest poradzić sobie z nowymi słowami, które nie są mapowane do indeksu, ale istnieją sposoby na złagodzenie tego problemu (haszowanie funkcji wyszukiwania). Ta metoda reprezentacji ma wiele wad – nie zachowuje relacji między sąsiednimi słowami i skutkuje bardzo rzadkimi wektorami. Spojrzenie na ngramy pomaga rozwiązać problem zachowania relacji między wyrazami, ale na razie skupmy się na drugim problemie: rzadkość. Trudno jest bezpośrednio poradzić sobie z tymi rzadkimi wektorami (wiele bibliotek algebry liniowej słabo radzi sobie z rzadkimi danymi wejściowymi), dlatego często następnym krokiem jest redukcja wymiarowości. W tym celu możemy odwołać się do dziedziny modelowania tematycznego: Techniki takie jak ukryta alokacja Dirichleta (LDA) i ukryta analiza semantyczna (LSA) umożliwiają kompresję tych rzadkich wektorów do gęstych wektorów poprzez przedstawienie dokumentu jako kombinacji tematów. Możesz ustalić liczbę używanych tematów, a robiąc to, ustalić rozmiar wektora wyjściowego produkowanego przez LDA lub LSA. Ten proces redukcji wymiarowości drastycznie zmniejsza rozmiar wektora wejściowego, próbując jednocześnie utracić minimalną ilość informacji. Wreszcie, po wszystkich tych konwersjach, możesz wprowadzić dane wyjściowe procesu modelowania tematu do wejść sieci neuronowej.
Nie dotyczy to sieci neuronowych jako takich, ale reprezentowania danych tekstowych w uczeniu maszynowym. Możesz reprezentować filmy, obsadę i motyw jako zmienne kategorialne. Fabuła jest bardziej skomplikowana; prawdopodobnie chciałbyś mieć do tego model tematyczny, ale odejdę to się skończy, dopóki nie zrozumiesz rzeczy. Robi dokładnie ten tekstowy „downsampling”, o którym wspomniałeś. Zapoznaj się z tym samouczkiem, aby dowiedzieć się, jak kodować zmienne kategorialne dla sieci neuronowych.
Wcześniejsze odpowiedzi mogą zawierać dobre uwagi dotyczące omawianego problemu. Problem polega na tym, że reprezentujesz swój łańcuch jako wektor cech do wprowadzenia do NN. Po pierwsze, problem zależy od rozmiaru ciągu, który chcesz przetworzyć. Długie ciągi zawierające żetony majów (zwykle słowa) są często nazywane dokumentami w tym ustawieniu. Istnieją oddzielne metody postępowania z pojedynczymi żetonami / słowami. Istnieje wiele sposobów przedstawiania dokumentów. Wielu z nich przyjmuje założenie z worka słów. Najprostsze typy przedstawiają dokument jako wektor zliczeń słów lub częstotliwości terminów (tf). Aby wyeliminować wpływ długości dokumentu,
Zwykle ludzie wolą normalizować liczbę dokumentów, w których pojawia się termin, częstotliwość dokumentów (tf-idf). Innym podejściem jest modelowanie tematyczne, które uczy się ukrytych niższych wymiarów reprezentacji danych. LDA i LSI / LSA to typowe wybory, ale należy pamiętać, że nie jest to nadzorowane. Wyuczona reprezentacja niekoniecznie będzie idealna do jakiejkolwiek nadzorowanej nauki, którą prowadzisz ze swoim NN. Jeśli chcesz tworzyć modele tematyczne, możesz także wypróbować nadzorowane modele tematyczne. W przypadku pojedynczych słów możesz użyć word2vec, który wykorzystuje NN do osadzania słów w przestrzeni o dowolnej wielkości. Podobieństwo między dwoma wektorami słów w tej wyuczonej przestrzeni zwykle odpowiada podobieństwu semantycznemu. Niedawno pionierskim podejściem są wektory akapitowe, które najpierw uczą się modelu słów podobnego do word2vec, a następnie budują na tej reprezentacji rozproszoną reprezentację zestawów słów (dokumentów dowolnej wielkości). To pokazało najnowocześniejsze wyniki w wielu zastosowaniach. Podczas korzystania z sieci NN w NLP ludzie często używają różnych architektur, takich jak cykliczne sieci neuronowe (takie jak sieci pamięci długoterminowej). W niektórych przypadkach ludzie używali nawet konwolucyjnych sieci neuronowych w tekście.
W jaki sposób sieci neuronowe są powiązane z transformatami Fouriera?
To jest pytanie z wywiadu W jaki sposób sieci neuronowe są powiązane z transformatami Fouriera? Mogłem znaleźć artykuły, które mówią o metodach przetwarzania dyskretnej transformaty Fouriera (DFT) przez jednowarstwową sieć neuronową z liniową funkcją przenoszenia. Czy jest jakaś inna korelacja, której mi brakuje?
Nie są ze sobą powiązane w żadnym sensownym sensie. Oczywiście, możesz ich używać do wyodrębniania funkcji lub wykonywania dowolnej liczby rzeczy, ale to samo można powiedzieć o wielu technikach. Zapytałbym „jakiego rodzaju sieć neuronową?” aby sprawdzić, czy ankieter miał na myśli coś konkretnego.
Podobieństwo to regresja. NNs mogą być używane do regresji, a transformata Fouriera jest w swoim sercu po prostu dopasowaniem krzywej wielu funkcji sin i cos do niektórych danych.
Co to jest sprzężone zejście w gradiencie?
Co to jest sprzężone gradientowe zejście sieci neuronowej? Czym różni się od techniki Gradient Descent? Natknąłem się na zasób, ale nie byłem w stanie zrozumieć różnicy między tymi dwiema metodami. W procedurze wspomniano, że następny kierunek wyszukiwania jest określany tak, że jest sprzężony z poprzednimi kierunkami wyszukiwania. Co to zdanie oznacza? O czym jest mowa o wyszukiwaniu liniowym na stronie internetowej? Czy ktoś może to wyjaśnić za pomocą diagramu?
Co to zdanie oznacza? Oznacza to, że następny wektor powinien być prostopadły do wszystkich poprzednich względem macierzy. To tak, jak naturalne wektory bazowe są do siebie prostopadłe,
z dodatkiem skrętu matrycy:
xTAy = zamiast xTy = 0, o czym jest mowa o wyszukiwaniu liniowym na stronie internetowej? Przeszukiwanie liniowe to metoda optymalizacji polegająca na odgadywaniu, jak daleko w danym kierunku (tj. Wzdłuż linii) należy się poruszać, aby najlepiej osiągnąć lokalne minimum.
Właściwości do budowy wielowarstwowej sieci neuronowej Perceptron przy użyciu Keras?
Próbuję zbudować i wytrenować wielowarstwową sieć neuronową perceptronu, która prawidłowo przewiduje, co prezydent wygrał w jakim hrabstwie po raz pierwszy. Mam następujące informacje dotyczące danych treningowych. Ludność ogółem Mediana wieku% kawalerów Stopień bezrobocia lub więcej Stopa bezrobocia Dochód na mieszkańca Ogółem gospodarstwa domowe Średnia wielkość gospodarstwa domowego% Mieszkania zajmowane przez właścicieli% Mieszkania zajmowane przez najemców% Mieszkania puste Mediana wartości domu Wzrost liczby ludności Wzrost liczby gospodarstw domowych Wzrost dochodu na mieszkańca Zwycięzca To 14 kolumn danych szkoleniowych i 15. kolumna jest tym, jakie powinno być wyjście. Próbuję użyć Keras do zbudowania wielowarstwowej sieci neuronowej perceptronu, ale potrzebuję pomocy w zrozumieniu kilku właściwości i zalet i wad wyboru różnych opcji dla tych właściwości.
- FUNKCJA AKTYWACJI
Wiem, że moim pierwszym krokiem jest wymyślenie funkcji aktywacji. Zawsze badałem sieci neuronowe wykorzystujące sigmoidalne funkcje aktywacji. Czy funkcja aktywacji esicy jest najlepsza? Skąd wiesz, którego użyć? Keras dodatkowo daje możliwość korzystania z funkcji aktywacji softmax, softplus, relu, tanh, linear lub hard_sigmoid. Nie przeszkadza mi
używając czegokolwiek, ale chcę tylko być w stanie zrozumieć, dlaczego i wady i zalety.
- PRAWDOPODOBIEŃSTWO INICJALIZACJI
Wiem, że inicjalizacje definiują rozkład prawdopodobieństwa używany do ustawiania początkowych losowych wag warstw Keras. Opcje, które daje Keras to uniform lecun_uniform, normal, identity, orthogonal, zero, glorot_normal, glorot_uniform, he_normal i he_uniform. Jak mój wybór tutaj wpływa na mój wynik końcowy lub model? Czy nie powinno to mieć znaczenia, ponieważ „trenujemy” dowolny model losowy, od którego zaczynamy, i tak czy inaczej wymyślamy bardziej optymalne wyważenie warstw?
1) Aktywacja to wybór architektury, który sprowadza się do wyboru hiperparametru. Możesz przedstawić teoretyczny argument za używaniem dowolnej funkcji, ale najlepszym sposobem ustalenia tego jest wypróbowanie kilku i ocena w zbiorze walidacyjnym. Należy również pamiętać, że można łączyć i dopasowywać aktywacje różnych warstw.
2) Teoretycznie tak, wiele losowych inicjalizacji byłoby takich samych, gdyby dane były wyjątkowo dobrze zachowane, a sieć była idealna. Jednak w praktyce inicjalizacje mają na celu zapewnienie rozsądnego startu gradientu i prawidłowej propagacji sygnału wstecz. Prawdopodobnie w tym przypadku którakolwiek z tych inicjalizacji będzie działać podobnie, ale najlepszym podejściem jest ich wypróbowanie i przełączenie, jeśli uzyskasz niepożądane wyniki.