Python Deep Learning - Szybki przewodnik
Głębokie uczenie ustrukturyzowane lub uczenie hierarchiczne lub w skrócie głębokie uczenie się jest częścią rodziny metod uczenia maszynowego, które same stanowią podzbiór szerszej dziedziny sztucznej inteligencji.
Uczenie głębokie to klasa algorytmów uczenia maszynowego, które wykorzystują kilka warstw nieliniowych jednostek przetwarzania do wyodrębniania i przekształcania cech. Każda kolejna warstwa wykorzystuje dane wyjściowe z poprzedniej warstwy jako dane wejściowe.
Głębokie sieci neuronowe, sieci głębokich przekonań i powtarzające się sieci neuronowe zostały zastosowane w takich dziedzinach, jak widzenie komputerowe, rozpoznawanie mowy, przetwarzanie języka naturalnego, rozpoznawanie dźwięku, filtrowanie sieci społecznościowych, tłumaczenie maszynowe i bioinformatyka, gdzie dały wyniki porównywalne, aw niektórych przypadkach lepiej niż ludzcy eksperci.
Algorytmy i sieci uczenia głębokiego -
są oparte na uczeniu się bez nadzoru wielu poziomów cech lub reprezentacji danych. Elementy wyższego poziomu są wyprowadzane z elementów niższego poziomu w celu utworzenia hierarchicznej reprezentacji.
użyj do treningu jakiejś formy zejścia gradientowego.
W tym rozdziale poznamy środowisko skonfigurowane pod kątem głębokiego uczenia się w języku Python. Musimy zainstalować następujące oprogramowanie do tworzenia algorytmów uczenia głębokiego.
- Python 2.7+
- Scipy with Numpy
- Matplotlib
- Theano
- Keras
- TensorFlow
Zdecydowanie zaleca się, aby Python, NumPy, SciPy i Matplotlib były instalowane za pośrednictwem dystrybucji Anaconda. Zawiera wszystkie te pakiety.
Musimy upewnić się, że różne typy oprogramowania są poprawnie instalowane.
Przejdźmy do naszego programu wiersza poleceń i wpisz następujące polecenie -
$ python
Python 3.6.3 |Anaconda custom (32-bit)| (default, Oct 13 2017, 14:21:34)
[GCC 7.2.0] on linux
Następnie możemy zaimportować wymagane biblioteki i wydrukować ich wersje -
import numpy
print numpy.__version__
Wynik
1.14.2
Instalacja Theano, TensorFlow i Keras
Zanim zaczniemy od instalacji pakietów - Theano, TensorFlow i Keras, musimy potwierdzić, czy pipjest zainstalowane. System zarządzania pakietami w Anaconda nosi nazwę pip.
Aby potwierdzić instalację pip, wpisz następujące polecenie w wierszu poleceń -
$ pip
Po potwierdzeniu instalacji pip możemy zainstalować TensorFlow i Keras wykonując następujące polecenie -
$pip install theano $pip install tensorflow
$pip install keras
Potwierdź instalację Theano, wykonując następujący wiersz kodu -
$python –c “import theano: print (theano.__version__)”
Wynik
1.0.1
Potwierdź instalację Tensorflow, wykonując następujący wiersz kodu -
$python –c “import tensorflow: print tensorflow.__version__”
Wynik
1.7.0
Potwierdź instalację Keras, wykonując następujący wiersz kodu -
$python –c “import keras: print keras.__version__”
Using TensorFlow backend
Wynik
2.1.5
Sztuczna inteligencja (AI) to dowolny kod, algorytm lub technika, która umożliwia komputerowi naśladowanie ludzkich zachowań poznawczych lub inteligencji. Uczenie maszynowe (ML) to podzbiór sztucznej inteligencji, który wykorzystuje metody statystyczne, aby umożliwić maszynom naukę i doskonalenie się wraz z doświadczeniem. Deep Learning to podzbiór uczenia maszynowego, który umożliwia obliczanie wielowarstwowych sieci neuronowych. Uczenie maszynowe jest postrzegane jako płytkie uczenie się, podczas gdy uczenie głębokie jest postrzegane jako uczenie hierarchiczne z abstrakcją.
Uczenie maszynowe obejmuje szeroki zakres koncepcji. Pojęcia są wymienione poniżej -
- supervised
- unsupervised
- uczenie się przez wzmocnienie
- regresja liniowa
- funkcje kosztów
- overfitting
- under-fitting
- hiperparametr itp.
W uczeniu się nadzorowanym uczymy się przewidywać wartości na podstawie oznaczonych danych. Jedną z technik ML, która tutaj pomaga, jest klasyfikacja, w której wartości docelowe są wartościami dyskretnymi; na przykład koty i psy. Inną techniką uczenia maszynowego, która może pomóc, jest regresja. Regresja działa na wartości docelowe. Wartości docelowe są wartościami ciągłymi; na przykład dane giełdowe można analizować za pomocą regresji.
W uczeniu się bez nadzoru wyciągamy wnioski z danych wejściowych, które nie są oznaczone ani uporządkowane. Jeśli mamy milion dokumentacji medycznej i musimy to zrozumieć, znaleźć podstawową strukturę, wartości odstające lub wykryć anomalie, używamy techniki klastrowania, aby podzielić dane na szerokie skupienia.
Zestawy danych są podzielone na zestawy uczące, testowe, walidacyjne i tak dalej.
Przełom w 2012 roku wyeksponował koncepcję Deep Learning. Algorytm sklasyfikował 1 milion zdjęć w 1000 kategorii, z powodzeniem przy użyciu 2 procesorów graficznych i najnowszych technologii, takich jak Big Data.
Powiązanie uczenia głębokiego i tradycyjnego uczenia maszynowego
Jednym z głównych wyzwań napotykanych w tradycyjnych modelach uczenia maszynowego jest proces zwany wyodrębnianiem cech. Programista musi być konkretny i powiedzieć komputerowi, na jakie funkcje należy zwrócić uwagę. Te cechy pomogą w podejmowaniu decyzji.
Wprowadzanie surowych danych do algorytmu rzadko działa, więc wyodrębnianie funkcji jest krytyczną częścią tradycyjnego przepływu pracy uczenia maszynowego.
To nakłada ogromną odpowiedzialność na programistę, a wydajność algorytmu w dużej mierze zależy od tego, jak pomysłowy jest programista. W przypadku złożonych problemów, takich jak rozpoznawanie obiektów lub rozpoznawanie pisma ręcznego, jest to ogromny problem.
Głębokie uczenie, z możliwością uczenia się wielu warstw reprezentacji, jest jedną z nielicznych metod, które pomogły nam w automatycznym wyodrębnianiu cech. Można założyć, że niższe warstwy wykonują automatyczne wyodrębnianie cech, wymagając niewielkich lub żadnych wskazówek od programisty.
Sztuczna sieć neuronowa lub w skrócie sieć neuronowa nie jest nowym pomysłem. Istnieje od około 80 lat.
Dopiero w 2011 r. Deep Neural Networks zyskały popularność dzięki zastosowaniu nowych technik, ogromnej dostępności zbiorów danych i potężnych komputerów.
Sieć neuronowa naśladuje neuron, który ma dendryty, jądro, akson i końcowy akson.
W przypadku sieci potrzebujemy dwóch neuronów. Te neurony przekazują informacje poprzez synapsę między dendrytami jednego i końcowego aksonu drugiego.
Prawdopodobny model sztucznego neuronu wygląda następująco -
Sieć neuronowa będzie wyglądać tak, jak pokazano poniżej -
Okręgi są neuronami lub węzłami, a ich funkcje w danych i łączące je linie / krawędzie to wagi / informacje, które są przekazywane.
Każda kolumna to warstwa. Pierwsza warstwa danych to warstwa wejściowa. Następnie wszystkie warstwy między warstwą wejściową a warstwą wyjściową są warstwami ukrytymi.
Jeśli masz jedną lub kilka ukrytych warstw, masz płytką sieć neuronową. Jeśli masz wiele ukrytych warstw, masz głęboką sieć neuronową.
W tym modelu masz dane wejściowe, ważisz je i przekazujesz przez funkcję w neuronie, która jest nazywana funkcją progową lub funkcją aktywacji.
Zasadniczo jest to suma wszystkich wartości po porównaniu z określoną wartością. Jeśli wystrzelisz sygnał, wynik jest (1) wyłączony lub nic nie jest wystrzelone, a następnie (0). To jest następnie ważone i przekazywane do następnego neuronu i uruchamiany jest ten sam rodzaj funkcji.
Możemy mieć funkcję sigmoidalną (kształt litery S) jako funkcję aktywacji.
Jeśli chodzi o wagi, są one uruchamiane losowo i są unikalne dla każdego wejścia do węzła / neuronu.
W typowym „sprzężeniu naprzód”, najbardziej podstawowym typie sieci neuronowej, informacje przechodzą bezpośrednio przez utworzoną sieć i porównujesz wynik z tym, co, jak miałeś nadzieję, przy użyciu danych przykładowych.
W tym miejscu musisz dostosować wagi, aby uzyskać wynik zgodny z żądanym wyjściem.
Czynność polegająca na wysyłaniu danych bezpośrednio przez sieć neuronową nazywa się a feed forward neural network.
Nasze dane przechodzą od wejścia do kolejnych warstw, a następnie do wyjścia.
Kiedy cofamy się i zaczynamy dostosowywać wagi, aby zminimalizować straty / koszty, nazywa się to back propagation.
To jest optimization problem. W przypadku sieci neuronowej w praktyce mamy do czynienia z setkami tysięcy zmiennych, milionami lub więcej.
Pierwszym rozwiązaniem było zastosowanie stochastycznego zejścia gradientowego jako metody optymalizacji. Teraz są opcje takie jak AdaGrad, Adam Optimizer i tak dalej. Tak czy inaczej, jest to ogromna operacja obliczeniowa. Dlatego sieci neuronowe były w większości pozostawione na półce przez ponad pół wieku. Dopiero niedawno mieliśmy moc i architekturę w naszych maszynach, aby nawet rozważyć wykonanie tych operacji, a także odpowiednio dopasowane zestawy danych.
W przypadku prostych zadań klasyfikacyjnych sieć neuronowa ma względnie zbliżoną wydajność do innych prostych algorytmów, takich jak K Nearest Neighbors. Prawdziwa użyteczność sieci neuronowych jest realizowana, gdy mamy znacznie większe dane i znacznie bardziej złożone pytania, z których oba przewyższają inne modele uczenia maszynowego.
Głęboka sieć neuronowa (DNN) to sieć SSN z wieloma ukrytymi warstwami między warstwą wejściową i wyjściową. Podobnie jak płytkie SSN, DNN mogą modelować złożone zależności nieliniowe.
Głównym celem sieci neuronowej jest otrzymywanie zestawu danych wejściowych, wykonywanie na nich coraz bardziej złożonych obliczeń i przekazywanie danych wyjściowych do rozwiązywania rzeczywistych problemów, takich jak klasyfikacja. Ograniczamy się do przekazywania naprzód sieci neuronowych.
Mamy wejście, wyjście i przepływ danych sekwencyjnych w głębokiej sieci.
Sieci neuronowe są szeroko stosowane w nadzorowanym uczeniu się i problemach uczenia się ze wzmocnieniem. Sieci te są oparte na zestawie warstw połączonych ze sobą.
W uczeniu głębokim liczba ukrytych warstw, głównie nieliniowych, może być duża; powiedzmy około 1000 warstw.
Modele DL dają znacznie lepsze wyniki niż zwykłe sieci ML.
Najczęściej stosujemy metodę gradientu do optymalizacji sieci i minimalizacji funkcji strat.
Możemy użyć Imagenet, repozytorium milionów obrazów cyfrowych do klasyfikowania zbioru danych w kategorie, takie jak koty i psy. Sieci DL są coraz częściej wykorzystywane do dynamicznych obrazów oprócz statycznych oraz do analizy szeregów czasowych i tekstu.
Szkolenie zbiorów danych stanowi ważną część modeli uczenia głębokiego. Ponadto Backpropagation jest głównym algorytmem w uczeniu modeli DL.
DL zajmuje się uczeniem dużych sieci neuronowych ze złożonymi transformacjami wejściowymi i wyjściowymi.
Jednym z przykładów DL jest mapowanie zdjęcia na nazwisko osoby (osób) na zdjęciu, tak jak to robią w sieciach społecznościowych, i opisywanie zdjęcia frazą to kolejne niedawne zastosowanie DL.
Sieci neuronowe to funkcje, które mają dane wejściowe, takie jak x1, x2, x3…, które są przekształcane na wyjścia, takie jak z1, z2, z3 itd. W dwóch (płytkich sieciach) lub w kilku operacjach pośrednich, zwanych również warstwami (sieci głębokie).
Wagi i odchylenia zmieniają się z warstwy na warstwę. „w” i „v” to wagi lub synapsy warstw sieci neuronowych.
Najlepszym przykładem zastosowania uczenia głębokiego jest problem uczenia nadzorowanego, w którym mamy duży zestaw danych wejściowych z pożądanym zestawem wyników.
Tutaj stosujemy algorytm wstecznej propagacji, aby uzyskać prawidłowe przewidywanie wyjściowe.
Najbardziej podstawowym zestawem danych uczenia głębokiego jest MNIST, zbiór danych składający się z odręcznych cyfr.
Możemy głęboko wyszkolić konwolucyjną sieć neuronową za pomocą Keras, aby klasyfikować obrazy odręcznych cyfr z tego zestawu danych.
Odpalenie lub aktywacja klasyfikatora sieci neuronowej daje wynik. Na przykład, aby sklasyfikować pacjentów jako chorych i zdrowych, bierzemy pod uwagę takie parametry, jak wzrost, waga i temperatura ciała, ciśnienie krwi itp.
Wysoki wynik oznacza, że pacjent jest chory, a niski wynik oznacza, że jest zdrowy.
Każdy węzeł w warstwie wyjściowej i warstwie ukrytej ma własne klasyfikatory. Warstwa wejściowa pobiera dane wejściowe i przekazuje swoje wyniki do następnej ukrytej warstwy w celu dalszej aktywacji, a ta trwa do momentu osiągnięcia wyniku.
Nazywa się to postępem od wejścia do wyjścia od lewej do prawej w kierunku do przodu forward propagation.
Ścieżka przypisania kredytu (CAP) w sieci neuronowej to seria transformacji, począwszy od wejścia do wyjścia. CAP opracowują prawdopodobne związki przyczynowe między wejściem a wyjściem.
Głębokość CAP dla danej sieci neuronowej ze sprzężeniem zwrotnym lub głębokość CAP to liczba warstw ukrytych plus jedna, gdy uwzględniona jest warstwa wyjściowa. W przypadku powtarzających się sieci neuronowych, w których sygnał może przechodzić przez warstwę kilka razy, głębokość CAP może być potencjalnie nieograniczona.
Sieci głębokie i płytkie
Nie ma wyraźnego progu głębokości, który oddziela płytkie uczenie się od uczenia głębokiego; ale większość z nich jest zgodna, że w przypadku uczenia głębokiego, które ma wiele warstw nieliniowych, CAP musi być większe niż dwa.
Podstawowy węzeł w sieci neuronowej to percepcja naśladująca neuron w biologicznej sieci neuronowej. Następnie mamy wielowarstwową Percepcję lub MLP. Każdy zestaw danych wejściowych jest modyfikowany przez zestaw wag i odchyleń; każda krawędź ma unikalną wagę, a każdy węzeł ma unikalne odchylenie.
Przepowiednia accuracy sieci neuronowej zależy od jej weights and biases.
Proces poprawiania dokładności sieci neuronowej to tzw training. Wynik z przedniej sieci podpór jest porównywany z wartością, o której wiadomo, że jest poprawna.
Plik cost function or the loss function jest różnicą między wygenerowaną wartością wyjściową a rzeczywistą wydajnością.
Celem szkolenia jest maksymalne zmniejszenie kosztu szkolenia w milionach przykładów szkoleniowych. Aby to zrobić, sieć dostosowuje wagi i odchylenia, aż prognoza pasuje do właściwych wyników.
Po odpowiednim przeszkoleniu sieć neuronowa może za każdym razem dokonywać dokładnych prognoz.
Kiedy wzorzec staje się skomplikowany i chcesz, aby Twój komputer je rozpoznał, musisz sięgnąć po sieci neuronowe. W tak złożonych scenariuszach wzorców sieć neuronowa przewyższa wszystkie inne konkurencyjne algorytmy.
Istnieją teraz procesory graficzne, które mogą trenować je szybciej niż kiedykolwiek wcześniej. Głębokie sieci neuronowe już teraz rewolucjonizują dziedzinę sztucznej inteligencji
Komputery okazały się dobre w wykonywaniu powtarzalnych obliczeń i wykonywaniu szczegółowych instrukcji, ale nie były tak dobre w rozpoznawaniu złożonych wzorców.
Jeśli istnieje problem z rozpoznawaniem prostych wzorców, maszyna wektorów nośnych (svm) lub klasyfikator regresji logistycznej mogą wykonać zadanie dobrze, ale wraz ze wzrostem złożoności wzorców nie ma innego wyjścia, jak tylko sięgnąć po głębokie sieci neuronowe.
Dlatego w przypadku złożonych wzorów, takich jak ludzka twarz, płytkie sieci neuronowe zawodzą i nie mają innego wyjścia, jak tylko sięgnąć po głębokie sieci neuronowe z większą liczbą warstw. Sieci głębokie są w stanie wykonać swoją pracę, rozkładając złożone wzory na prostsze. Na przykład ludzka twarz; Sieć adeep użyłaby krawędzi do wykrycia części takich jak usta, nos, oczy, uszy i tak dalej, a następnie ponownie połączyłaby je razem, tworząc ludzką twarz
Dokładność prawidłowego przewidywania stała się tak dokładna, że niedawno podczas konkursu Google Pattern Recognition Challenge głęboka sieć uderzyła człowieka.
Ten pomysł sieci warstwowych perceptronów istnieje już od jakiegoś czasu; na tym obszarze głębokie sieci naśladują ludzki mózg. Ale jedną wadą jest to, że trenowanie ich zajmuje dużo czasu, co jest ograniczeniem sprzętowym
Jednak niedawne wysokowydajne układy GPU były w stanie trenować tak głębokie sieci w czasie krótszym niż tydzień; podczas gdy szybkie procesory cpus mogłyby zająć tygodnie lub miesiące, aby zrobić to samo.
Wybór głębokiej sieci
Jak wybrać głęboką siatkę? Musimy zdecydować, czy budujemy klasyfikator, czy też próbujemy znaleźć wzorce w danych i czy będziemy korzystać z uczenia się bez nadzoru. Aby wyodrębnić wzorce z zestawu nieoznakowanych danych, używamy ograniczonej maszyny Boltzman lub kodera automatycznego.
Wybierając głęboką siatkę, weź pod uwagę następujące punkty -
Do przetwarzania tekstu, analizy nastrojów, analizowania i rozpoznawania jednostek nazw używamy sieci rekurencyjnej lub rekurencyjnej sieci tensorów neuronowych lub RNTN;
W przypadku każdego modelu językowego, który działa na poziomie znaków, używamy sieci rekurencyjnej.
Do rozpoznawania obrazu używamy sieci głębokich przekonań DBN lub sieci konwolucyjnej.
Do rozpoznawania obiektów używamy RNTN lub sieci konwolucyjnej.
Do rozpoznawania mowy używamy sieci cyklicznej.
Ogólnie rzecz biorąc, sieci głębokich przekonań i wielowarstwowe perceptrony z rektyfikowanymi jednostkami liniowymi lub RELU są dobrym wyborem do klasyfikacji.
W przypadku analizy szeregów czasowych zawsze zaleca się używanie sieci okresowej.
Sieci neuronowe istnieją od ponad 50 lat; ale dopiero teraz zyskały na znaczeniu. Powodem jest to, że są trudne do wyszkolenia; kiedy próbujemy je wytrenować metodą zwaną propagacją wsteczną, napotykamy na problem zwany zanikaniem lub eksplodującymi gradientami. Kiedy to się dzieje, trening zajmuje więcej czasu, a dokładność zajmuje mało miejsca. Podczas uczenia zestawu danych stale obliczamy funkcję kosztu, która jest różnicą między przewidywanymi wynikami a rzeczywistymi wynikami z zestawu oznaczonych danych treningowych. Funkcja kosztu jest następnie minimalizowana poprzez dostosowywanie wag i wartości odchyleń aż do najniższej wartości jest uzyskiwane. W procesie uczenia stosuje się gradient, czyli szybkość, z jaką zmienia się koszt w odniesieniu do zmiany wagi lub wartości odchylenia.
Restricted Boltzman Networks or Autoencoders - RBNs
W 2006 roku dokonano przełomu w rozwiązaniu problemu zanikających gradientów. Geoff Hinton opracował nowatorską strategię, która doprowadziła do rozwojuRestricted Boltzman Machine - RBM, płytka dwuwarstwowa siatka.
Pierwsza warstwa to visible warstwa, a druga warstwa to hiddenwarstwa. Każdy węzeł w warstwie widocznej jest połączony z każdym węzłem w warstwie ukrytej. Sieć jest znana jako ograniczona, ponieważ żadne dwie warstwy w tej samej warstwie nie mogą współużytkować połączenia.
Autokodery to sieci, które kodują dane wejściowe jako wektory. Tworzą ukrytą lub skompresowaną reprezentację surowych danych. Wektory są przydatne w redukcji wymiarowości; wektor kompresuje surowe dane do mniejszej liczby niezbędnych wymiarów. Autoenkodery są sparowane z dekoderami, co umożliwia rekonstrukcję danych wejściowych na podstawie ich ukrytej reprezentacji.
RBM to matematyczny odpowiednik tłumacza dwukierunkowego. Przejście do przodu pobiera dane wejściowe i przekształca je na zestaw liczb, który koduje dane wejściowe. W międzyczasie przejście do tyłu przyjmuje ten zestaw liczb i przekłada je z powrotem na zrekonstruowane dane wejściowe. Dobrze wyszkolona siatka zapewnia tylną podpórkę z dużą dokładnością.
W każdym z etapów wagi i uprzedzenia odgrywają kluczową rolę; pomagają RBM w dekodowaniu współzależności między danymi wejściowymi oraz w decydowaniu, które dane wejściowe są niezbędne do wykrywania wzorców. Poprzez przejścia do przodu i do tyłu RBM jest uczony, aby ponownie konstruować dane wejściowe z różnymi wagami i odchyleniami, aż dane wejściowe i konstrukcja tam są jak najbliższe. Interesującym aspektem RBM jest to, że dane nie muszą być etykietowane. Okazuje się, że jest to bardzo ważne w przypadku zestawów danych ze świata rzeczywistego, takich jak zdjęcia, filmy, głosy i dane z czujników, z których wszystkie są zwykle nieoznaczone. Zamiast ręcznie oznaczać dane przez ludzi, RBM automatycznie sortuje dane; poprzez odpowiednie dostosowanie wag i odchyleń, KMS jest w stanie wyodrębnić ważne cechy i zrekonstruować dane wejściowe. RBM jest częścią rodziny sieci neuronowych z ekstrakcją cech, które są przeznaczone do rozpoznawania nieodłącznych wzorców w danych. Są one również nazywane auto-koderami, ponieważ muszą kodować własną strukturę.
Sieci głębokich przekonań - DBN
Sieci głębokich przekonań (DBN) powstają poprzez połączenie KMS i wprowadzenie sprytnej metody szkolenia. Mamy nowy model, który ostatecznie rozwiązuje problem znikającego gradientu. Geoff Hinton wynalazł KMS, a także sieci głębokiego przekonania jako alternatywę dla propagacji wstecznej.
DBN ma podobną strukturę do MLP (wielowarstwowy perceptron), ale bardzo różni się pod względem treningu. to właśnie szkolenie umożliwia DBN osiąganie lepszych wyników niż ich płytkie odpowiedniki
DBN można wizualizować jako stos KMS, gdzie ukryta warstwa jednego KMS jest widoczną warstwą KMS nad nią. Pierwszy KMS jest przeszkolony, aby jak najdokładniej odtworzyć jego dane wejściowe.
Ukryta warstwa pierwszego KMS jest traktowana jako widoczna warstwa drugiego KMS, a druga KMS jest trenowana przy użyciu danych wyjściowych z pierwszego KMS. Ten proces jest powtarzany, aż każda warstwa w sieci zostanie przeszkolona.
W DBN każdy RBM uczy się całego wejścia. DBN działa globalnie, precyzyjnie dostrajając kolejno cały sygnał wejściowy, ponieważ model powoli poprawia się, tak jak obiektyw aparatu powoli skupia obraz. Stos RBM przewyższa pojedynczy RBM, ponieważ wielowarstwowy perceptron MLP przewyższa pojedynczy perceptron.
Na tym etapie systemy KMS wykryły nieodłączne wzorce w danych, ale bez nazw ani etykiet. Aby zakończyć szkolenie DBN, musimy wprowadzić etykiety do wzorów i dostroić sieć z uczeniem nadzorowanym.
Potrzebujemy bardzo małego zestawu oznaczonych próbek, aby cechy i wzory można było skojarzyć z nazwą. Ten niewielki zestaw danych jest używany do uczenia. Ten zestaw oznaczonych danych może być bardzo mały w porównaniu z oryginalnym zestawem danych.
Wagi i odchylenia są nieznacznie zmienione, co powoduje niewielką zmianę w postrzeganiu wzorców przez sieć i często niewielki wzrost całkowitej dokładności.
Szkolenie można również ukończyć w rozsądnym czasie, używając GPU, które dają bardzo dokładne wyniki w porównaniu z płytkimi sieciami, a także widzimy rozwiązanie problemu znikającego gradientu.
Generative Adversarial Networks - GAN
Generatywne sieci przeciwstawne to głębokie sieci neuronowe składające się z dwóch sieci, ustawionych jedna przeciwko drugiej, stąd nazwa „kontradyktoryjność”.
GAN zostały przedstawione w artykule opublikowanym przez naukowców z Uniwersytetu w Montrealu w 2014 roku. Yann LeCun, ekspert AI Facebooka, odnosząc się do GAN, nazwał szkolenie adwersarzy „najciekawszym pomysłem ostatnich 10 lat w ML”.
Potencjał sieci GAN jest ogromny, ponieważ skanowanie sieci uczy się naśladować dowolną dystrybucję danych. GAN można nauczyć tworzenia równoległych światów uderzająco podobnych do naszych w dowolnej dziedzinie: obrazów, muzyki, mowy, prozy. W pewnym sensie są artystami-robotami, a ich twórczość jest imponująca.
W GAN jedna sieć neuronowa, zwana generatorem, generuje nowe instancje danych, podczas gdy druga, dyskryminator, ocenia je pod kątem autentyczności.
Powiedzmy, że próbujemy wygenerować odręczne liczby, takie jak te, które znajdują się w zbiorze danych MNIST, który pochodzi ze świata rzeczywistego. Praca dyskryminatora, gdy zostanie pokazana instancja z prawdziwego zbioru danych MNIST, polega na rozpoznaniu ich jako autentycznych.
Rozważ teraz następujące kroki GAN -
Sieć generatora pobiera dane wejściowe w postaci liczb losowych i zwraca obraz.
Ten wygenerowany obraz jest podawany jako dane wejściowe do sieci dyskryminatora wraz ze strumieniem obrazów pobranych z rzeczywistego zbioru danych.
Dyskryminator przyjmuje zarówno rzeczywiste, jak i fałszywe obrazy i zwraca prawdopodobieństwa, liczbę od 0 do 1, przy czym 1 oznacza prognozę autentyczności, a 0 oznacza fałszywy.
Masz więc podwójną pętlę sprzężenia zwrotnego -
Dyskryminator jest w pętli sprzężenia zwrotnego z podstawową prawdą obrazów, które znamy.
Generator jest w pętli sprzężenia zwrotnego z dyskryminatorem.
Powtarzające się sieci neuronowe - RNN
RNNSare sieci neuronowe, w których dane mogą przepływać w dowolnym kierunku. Sieci te są używane do zastosowań takich jak modelowanie języka lub przetwarzanie języka naturalnego (NLP).
Podstawową koncepcją leżącą u podstaw sieci RNN jest wykorzystanie informacji sekwencyjnej. W normalnej sieci neuronowej zakłada się, że wszystkie wejścia i wyjścia są od siebie niezależne. Jeśli chcemy przewidzieć następne słowo w zdaniu, musimy wiedzieć, jakie słowa pojawiły się przed nim.
RNN nazywane są cyklicznymi, ponieważ powtarzają to samo zadanie dla każdego elementu sekwencji, a dane wyjściowe są oparte na poprzednich obliczeniach. Można zatem powiedzieć, że RNN mają „pamięć”, która przechwytuje informacje o tym, co zostało wcześniej obliczone. Teoretycznie RNN mogą wykorzystywać informacje w bardzo długich sekwencjach, ale w rzeczywistości mogą spojrzeć wstecz tylko na kilka kroków.
Sieci pamięci długoterminowej (LSTM) są najczęściej używanymi sieciami RNN.
Razem z konwolucyjnymi sieciami neuronowymi, RNN zostały wykorzystane jako część modelu do generowania opisów obrazów bez etykiet. To niesamowite, jak dobrze to działa.
Konwolucyjne głębokie sieci neuronowe - CNN
Jeśli zwiększymy liczbę warstw w sieci neuronowej, aby ją pogłębić, zwiększy to złożoność sieci i pozwoli nam modelować funkcje, które są bardziej skomplikowane. Jednak liczba wag i odchyleń będzie rosła wykładniczo. W rzeczywistości poznanie tak trudnych problemów może stać się niemożliwe dla normalnych sieci neuronowych. Prowadzi to do rozwiązania, konwolucyjnych sieci neuronowych.
CNN są szeroko stosowane w wizji komputerowej; znalazły również zastosowanie w modelowaniu akustycznym do automatycznego rozpoznawania mowy.
Ideą konwolucyjnych sieci neuronowych jest idea „ruchomego filtra”, który przechodzi przez obraz. Ten ruchomy filtr lub splot dotyczy pewnego sąsiedztwa węzłów, które na przykład mogą być pikselami, gdzie zastosowany filtr to 0,5 x wartość węzła -
Znany badacz Yann LeCun był pionierem konwolucyjnych sieci neuronowych. Facebook jako oprogramowanie do rozpoznawania twarzy korzysta z tych sieci. CNN to rozwiązanie dla projektów wizyjnych. Sieć konwolucyjna składa się z wielu warstw. W wyzwaniu Imagenet maszyna była w stanie pokonać człowieka w rozpoznawaniu obiektów w 2015 roku.
Krótko mówiąc, konwolucyjne sieci neuronowe (CNN) to wielowarstwowe sieci neuronowe. Warstwy mają czasem do 17 lub więcej i zakładają, że danymi wejściowymi są obrazy.
CNN drastycznie zmniejszają liczbę parametrów, które należy dostroić. Tak więc sieci CNN wydajnie radzą sobie z wysoką wymiarowością surowych obrazów.
W tym rozdziale przyjrzymy się podstawom głębokiego uczenia się w Pythonie.
Modele / algorytmy uczenia głębokiego
Poznajmy teraz różne modele / algorytmy głębokiego uczenia się.
Oto niektóre z popularnych modeli w ramach uczenia głębokiego:
- Konwolucyjne sieci neuronowe
- Powtarzające się sieci neuronowe
- Sieci głębokich przekonań
- Generatywne sieci przeciwstawne
- Automatyczne kodery i tak dalej
Wejścia i wyjścia są reprezentowane jako wektory lub tensory. Na przykład sieć neuronowa może mieć wejścia, w których poszczególne wartości RGB pikseli w obrazie są reprezentowane jako wektory.
Warstwy neuronów, które znajdują się między warstwą wejściową a warstwą wyjściową, nazywane są warstwami ukrytymi. To tutaj większość pracy odbywa się, gdy sieć neuronowa próbuje rozwiązać problemy. Bliższe przyjrzenie się ukrytym warstwom może ujawnić wiele funkcji, które sieć nauczyła się wyodrębniać z danych.
Różne architektury sieci neuronowych są tworzone przez wybór neuronów, które mają połączyć się z innymi neuronami w następnej warstwie.
Pseudokod do obliczania wyników
Poniżej znajduje się pseudokod do obliczania wyniku Forward-propagating Neural Network -
- # węzeł []: = tablica węzłów posortowanych topologicznie
- # Krawędź od a do b oznacza, że a znajduje się na lewo od b
- # Jeśli sieć neuronowa ma wejścia R i wyjścia S,
- # następnie pierwsze R węzły są węzłami wejściowymi, a ostatnie S węzłami są węzłami wyjściowymi.
- # przychodzące [x]: = węzły połączone z węzłem x
- # waga [x]: = wagi przychodzących krawędzi do x
Dla każdego neuronu x, od lewej do prawej -
- if x <= R: nic nie rób # jest to węzeł wejściowy
- wejścia [x] = [wyjście [i] for i in przychodzące [x]]
- Weighted_sum = dot_product (wagi [x], dane wejściowe [x])
- wyjście [x] = funkcja_aktywacji (suma_ważona)
Dowiemy się teraz, jak trenować sieć neuronową. Nauczymy się również algorytmu propagacji wstecznej i przejścia wstecz w Deep Learning w Pythonie.
Musimy znaleźć optymalne wartości wag sieci neuronowej, aby uzyskać pożądany wynik. Aby wytrenować sieć neuronową, używamy iteracyjnej metody gradientu. Zaczynamy początkowo od losowej inicjalizacji wag. Po losowej inicjalizacji wykonujemy prognozy dla pewnego podzbioru danych z procesem propagacji do przodu, obliczamy odpowiednią funkcję kosztu C i aktualizujemy każdą wagę w o kwotę proporcjonalną do dC / dw, tj. Pochodną funkcji kosztu względem waga. Stała proporcjonalności nazywana jest stopniem uczenia się.
Gradienty można skutecznie obliczyć za pomocą algorytmu propagacji wstecznej. Kluczową obserwacją propagacji wstecznej lub rekwizytu wstecznego jest to, że ze względu na łańcuchową zasadę różnicowania gradient na każdym neuronie w sieci neuronowej można obliczyć za pomocą gradientu w neuronach, do których ma wychodzące krawędzie. W związku z tym obliczamy gradienty wstecz, tj. Najpierw obliczamy gradienty warstwy wyjściowej, następnie warstwy najbardziej ukrytej, po której następuje poprzednia warstwa ukryta i tak dalej, kończąc na warstwie wejściowej.
Algorytm propagacji wstecznej jest realizowany głównie w oparciu o ideę grafu obliczeniowego, w którym każdy neuron jest rozszerzany do wielu węzłów na grafie obliczeniowym i wykonuje prostą operację matematyczną, taką jak dodawanie, mnożenie. Wykres obliczeniowy nie ma wag na krawędziach; wszystkie wagi są przypisane do węzłów, więc wagi stają się ich własnymi węzłami. Algorytm propagacji wstecznej jest następnie uruchamiany na grafie obliczeniowym. Po zakończeniu obliczeń do aktualizacji wymagane są tylko gradienty węzłów wagi. Resztę gradientów można odrzucić.
Technika optymalizacji zejścia gradientu
Jedna z powszechnie używanych funkcji optymalizacji, która dostosowuje wagi w zależności od spowodowanego przez nie błędu, nazywa się „gradientem malejącym”.
Gradient to inna nazwa nachylenia, a nachylenie na wykresie xy przedstawia, w jaki sposób dwie zmienne są ze sobą powiązane: wzrost w czasie, zmiana odległości w czasie itd. W tym przypadku nachylenie jest stosunek błędu sieci do pojedynczej wagi; tj. jak zmienia się błąd wraz ze zmianą wagi.
Mówiąc dokładniej, chcemy dowiedzieć się, która waga powoduje najmniejszy błąd. Chcemy znaleźć wagę, która poprawnie reprezentuje sygnały zawarte w danych wejściowych i przekłada je na poprawną klasyfikację.
Gdy sieć neuronowa uczy się, powoli dostosowuje wiele wag, aby mogły poprawnie odwzorować sygnał na znaczenie. Stosunek błędu sieci do każdej z tych wag jest pochodną dE / dw, która oblicza stopień, w jakim niewielka zmiana wagi powoduje niewielką zmianę błędu.
Każda waga jest tylko jednym czynnikiem w głębokiej sieci, która obejmuje wiele przekształceń; sygnał wagi przechodzi przez aktywacje i sumy na kilku warstwach, więc używamy reguły łańcuchowej rachunku różniczkowego, aby przeanalizować aktywacje i wyjścia sieci, co prowadzi nas do danej wagi i jej związku z ogólnym błędem.
Biorąc pod uwagę dwie zmienne, błąd i wagę, pośredniczy trzecia zmienna, activation, przez który przechodzi ciężar. Możemy obliczyć, jak zmiana wagi wpływa na zmianę błędu, najpierw obliczając, jak zmiana aktywacji wpływa na zmianę błędu i jak zmiana wagi wpływa na zmianę aktywacji.
Podstawowa idea uczenia głębokiego to nic innego: dostosowywanie wag modelu w odpowiedzi na błąd, który generuje, do momentu, gdy nie będzie już można zredukować błędu.
Głęboka siatka trenuje powoli, jeśli wartość gradientu jest mała i szybko, jeśli wartość jest wysoka. Wszelkie niedokładności w szkoleniu prowadzą do niedokładnych wyników. Proces uczenia sieci z wyjścia z powrotem do wejścia nazywa się propagacją wsteczną lub propozycją wsteczną. Wiemy, że propagacja do przodu zaczyna się od wejścia i działa do przodu. Back prop wykonuje odwrotność / odwrotność obliczania gradientu od prawej do lewej.
Za każdym razem, gdy obliczamy gradient, używamy wszystkich poprzednich gradientów do tego momentu.
Zacznijmy od węzła w warstwie wyjściowej. Krawędź używa gradientu w tym węźle. W miarę jak wracamy do ukrytych warstw, sprawa staje się bardziej złożona. Iloczyn dwóch liczb od 0 do 1 daje mniejszą liczbę. Wartość gradientu jest coraz mniejsza, w wyniku czego ćwiczenie tylnego rekwizytu zajmuje dużo czasu i cierpi na tym celność.
Wyzwania w algorytmach głębokiego uczenia się
Istnieją pewne wyzwania zarówno dla płytkich sieci neuronowych, jak i głębokich sieci neuronowych, takie jak nadmierne dopasowanie i czas obliczeniowy. Na DNN wpływa nadmierne dopasowanie, ponieważ użycie dodatkowych warstw abstrakcji, które pozwalają im modelować rzadkie zależności w danych uczących.
Regularizationmetody takie jak odpadanie, wczesne zatrzymywanie, powiększanie danych, uczenie transferowe są stosowane podczas treningu w celu zwalczania nadmiernego dopasowania. Porzucenie regularyzacji losowo pomija jednostki z ukrytych warstw podczas treningu, co pomaga uniknąć rzadkich zależności. DNN biorą pod uwagę kilka parametrów szkoleniowych, takich jak rozmiar, tj. Liczba warstw i liczba jednostek na warstwę, szybkość uczenia się i wagi początkowe. Znalezienie optymalnych parametrów nie zawsze jest praktyczne ze względu na wysoki koszt czasu i zasobów obliczeniowych. Kilka sztuczek, takich jak przetwarzanie wsadowe, może przyspieszyć obliczenia. Duża moc obliczeniowa procesorów graficznych znacznie pomogła w procesie uczenia, ponieważ wymagane obliczenia macierzy i wektorów są dobrze wykonywane na procesorach GPU.
Spadkowicz
Dropout to popularna technika regularyzacji w sieciach neuronowych. Głębokie sieci neuronowe są szczególnie podatne na nadmierne dopasowanie.
Zobaczmy teraz, czym jest rezygnacja i jak to działa.
Według słów Geoffreya Hintona, jednego z pionierów głębokiego uczenia się: „Jeśli masz głęboką sieć neuronową i nie jest ona nadmiernie dopasowana, prawdopodobnie powinieneś użyć większej i zrezygnować”.
Dropout to technika, w której podczas każdej iteracji gradientu opadania upuszczamy zestaw losowo wybranych węzłów. Oznacza to, że losowo ignorujemy niektóre węzły, tak jakby nie istniały.
Każdy neuron jest utrzymywany z prawdopodobieństwem q i upuszczany losowo z prawdopodobieństwem 1-q. Wartość q może być różna dla każdej warstwy w sieci neuronowej. Wartość 0,5 dla warstw ukrytych i 0 dla warstwy wejściowej działa dobrze w szerokim zakresie zadań.
Podczas oceny i prognozowania nie stosuje się rezygnacji. Sygnał wyjściowy każdego neuronu jest mnożony przez q, dzięki czemu dane wejściowe do następnej warstwy mają tę samą oczekiwaną wartość.
Idea Dropout jest następująca - w sieci neuronowej bez regularyzacji zaniku neurony rozwijają współzależność między sobą, co prowadzi do nadmiernego dopasowania.
Sztuczka wdrożeniowa
Dropout jest implementowany w bibliotekach, takich jak TensorFlow i Pytorch, poprzez utrzymywanie wyniku losowo wybranych neuronów jako 0. Oznacza to, że chociaż neuron istnieje, jego wynik jest nadpisywany jako 0.
Wczesne zatrzymanie
Szkolimy sieci neuronowe za pomocą iteracyjnego algorytmu zwanego gradientem zstępującym.
Idea wczesnego zatrzymania jest intuicyjna; przestajemy trenować, gdy błąd zaczyna narastać. Tutaj przez błąd rozumiemy błąd mierzony na danych walidacyjnych, które są częścią danych treningowych wykorzystywanych do strojenia hiperparametrów. W tym przypadku kryterium zatrzymania jest hiperparametr.
Rozszerzanie danych
Proces, w którym zwiększamy ilość danych, które posiadamy lub rozszerzamy je, wykorzystując istniejące dane i stosując do nich pewne przekształcenia. Dokładne zastosowane transformacje zależą od zadania, które zamierzamy osiągnąć. Co więcej, transformacje, które pomagają sieci neuronowej, zależą od jej architektury.
Na przykład w wielu zadaniach widzenia komputerowego, takich jak klasyfikacja obiektów, skuteczną techniką rozszerzania danych jest dodawanie nowych punktów danych, które są przyciętymi lub przetłumaczonymi wersjami oryginalnych danych.
Gdy komputer akceptuje obraz jako dane wejściowe, przyjmuje tablicę wartości pikseli. Powiedzmy, że cały obraz jest przesunięty w lewo o 15 pikseli. Stosujemy wiele różnych przesunięć w różnych kierunkach, w wyniku czego rozszerzony zbiór danych jest wielokrotnie większy niż oryginalny zbiór danych.
Przenieś naukę
Proces przyjmowania wstępnie wytrenowanego modelu i „dostrajania” modelu za pomocą naszego własnego zbioru danych nazywa się uczeniem transferowym. Można to zrobić na kilka sposobów. Poniżej opisano kilka z nich:
Szkolimy wstępnie wytrenowany model na dużym zbiorze danych. Następnie usuwamy ostatnią warstwę sieci i zastępujemy ją nową warstwą o losowych wagach.
Następnie zamrażamy wagi wszystkich pozostałych warstw i normalnie trenujemy sieć. Tutaj zamrażanie warstw nie powoduje zmiany wag podczas opadania lub optymalizacji gradientu.
Koncepcja stojąca za tym polega na tym, że wstępnie wytrenowany model będzie działał jako ekstraktor cech i tylko ostatnia warstwa zostanie przeszkolona w bieżącym zadaniu.
Propagacja wsteczna jest zaimplementowana w strukturach głębokiego uczenia, takich jak Tensorflow, Torch, Theano itp., Przy użyciu wykresów obliczeniowych. Co ważniejsze, zrozumienie propagacji wstecznej na grafach obliczeniowych łączy kilka różnych algorytmów i ich wariacji, takich jak wsteczna prop w czasie i wsteczna ze wspólnymi wagami. Gdy wszystko zostanie przekształcone w wykres obliczeniowy, nadal są one tym samym algorytmem - po prostu cofają propagację na grafach obliczeniowych.
Co to jest wykres obliczeniowy
Graf obliczeniowy jest definiowany jako skierowany graf, w którym węzły odpowiadają operacjom matematycznym. Wykresy obliczeniowe są sposobem wyrażania i oceniania wyrażeń matematycznych.
Na przykład tutaj jest proste równanie matematyczne -
$$p = x+y$$
Możemy narysować wykres obliczeniowy powyższego równania w następujący sposób.
Powyższy wykres obliczeniowy ma węzeł dodawania (węzeł ze znakiem „+”) z dwiema zmiennymi wejściowymi xiy oraz jednym wyjściem q.
Weźmy inny przykład, nieco bardziej złożony. Mamy następujące równanie.
$$g = \left (x+y \right ) \ast z $$
Powyższe równanie przedstawia poniższy wykres obliczeniowy.
Grafy obliczeniowe i wsteczna propagacja
Grafy obliczeniowe i wsteczna propagacja są ważnymi podstawowymi koncepcjami w uczeniu głębokim do uczenia sieci neuronowych.
Podanie do przodu
Przebieg w przód to procedura oceny wartości wyrażenia matematycznego reprezentowanego przez wykresy obliczeniowe. Wykonanie przejścia do przodu oznacza, że przekazujemy wartość ze zmiennych w kierunku do przodu z lewej strony (wejście) do prawej, gdzie znajduje się dane wyjściowe.
Rozważmy przykład, nadając wartość wszystkim wejściom. Załóżmy, że wszystkim wejściom podano następujące wartości.
$$x=1, y=3, z=−3$$
Podając te wartości wejściom, możemy wykonać przejście do przodu i uzyskać następujące wartości dla wyjść w każdym węźle.
Najpierw używamy wartości x = 1 iy = 3, aby otrzymać p = 4.
Następnie używamy p = 4 iz = -3, aby otrzymać g = -12. Przechodzimy od lewej do prawej, do przodu.
Cele przejścia wstecz
W przejściu wstecz, naszym zamiarem jest obliczenie gradientów dla każdego wejścia w odniesieniu do końcowego wyniku. Te gradienty są niezbędne do uczenia sieci neuronowej przy użyciu gradientu.
Na przykład pragniemy następujących gradientów.
Pożądane gradienty
$$\frac{\partial x}{\partial f}, \frac{\partial y}{\partial f}, \frac{\partial z}{\partial f}$$
Przejście wstecz (propagacja wsteczna)
Rozpoczynamy przejście wstecz od znalezienia pochodnej wyniku końcowego w odniesieniu do wyniku końcowego (siebie!). W ten sposób spowoduje to wyprowadzenie tożsamości, a wartość będzie równa jeden.
$$\frac{\partial g}{\partial g} = 1$$
Nasz wykres obliczeniowy wygląda teraz tak, jak pokazano poniżej -
Następnie wykonamy przejście wstecz przez operację „*”. Obliczymy gradienty przy p i z. Ponieważ g = p * z, wiemy, że -
$$\frac{\partial g}{\partial z} = p$$
$$\frac{\partial g}{\partial p} = z$$
Znamy już wartości zi p z przejścia do przodu. Stąd otrzymujemy -
$$\frac{\partial g}{\partial z} = p = 4$$
i
$$\frac{\partial g}{\partial p} = z = -3$$
Chcemy obliczyć gradienty przy x i y -
$$\frac{\partial g}{\partial x}, \frac{\partial g}{\partial y}$$
Chcemy to jednak zrobić efektywnie (chociaż na tym wykresie xig są oddalone tylko o dwa przeskoki, wyobraź sobie, że są bardzo daleko od siebie). Aby skutecznie obliczyć te wartości, użyjemy łańcuchowej reguły różniczkowania. Z reguły łańcucha mamy -
$$\frac{\partial g}{\partial x}=\frac{\partial g}{\partial p}\ast \frac{\partial p}{\partial x}$$
$$\frac{\partial g}{\partial y}=\frac{\partial g}{\partial p}\ast \frac{\partial p}{\partial y}$$
Ale wiemy już, że dg / dp = -3, dp / dx i dp / dy są łatwe, ponieważ p zależy bezpośrednio od x i y. Mamy -
$$p=x+y\Rightarrow \frac{\partial x}{\partial p} = 1, \frac{\partial y}{\partial p} = 1$$
Stąd otrzymujemy -
$$\frac{\partial g} {\partial f} = \frac{\partial g} {\partial p}\ast \frac{\partial p} {\partial x} = \left ( -3 \right ).1 = -3$$
Dodatkowo dla wejścia y -
$$\frac{\partial g} {\partial y} = \frac{\partial g} {\partial p}\ast \frac{\partial p} {\partial y} = \left ( -3 \right ).1 = -3$$
Głównym powodem robienia tego wstecz jest to, że kiedy musieliśmy obliczyć gradient przy x, używaliśmy tylko już obliczonych wartości i dq / dx (pochodna wyjścia węzła w odniesieniu do wejścia tego samego węzła). Wykorzystaliśmy informacje lokalne do obliczenia wartości globalnej.
Kroki do uczenia sieci neuronowej
Wykonaj następujące kroki, aby wytrenować sieć neuronową -
Dla punktu danych x w zbiorze danych, wykonujemy przejście do przodu z x jako danymi wejściowymi i obliczamy koszt c jako dane wyjściowe.
Wykonujemy przejście wstecz zaczynając od c i obliczamy gradienty dla wszystkich węzłów na wykresie. Obejmuje to węzły, które reprezentują wagi sieci neuronowych.
Następnie aktualizujemy wagi, wykonując W = W - tempo uczenia się * gradienty.
Powtarzamy ten proces, dopóki nie zostaną spełnione kryteria zatrzymania.
Głębokie uczenie przyniosło dobre wyniki w przypadku kilku zastosowań, takich jak widzenie komputerowe, tłumaczenie języków, podpisywanie obrazów, transkrypcja audio, biologia molekularna, rozpoznawanie mowy, przetwarzanie języka naturalnego, samojezdne samochody, wykrywanie guza mózgu, tłumaczenie mowy w czasie rzeczywistym, muzyka kompozycja, automatyczna gra i tak dalej.
Deep learning to kolejny duży krok po uczeniu maszynowym z bardziej zaawansowaną implementacją. Obecnie zmierza w kierunku stania się standardem branżowym, przynosząc mocną obietnicę bycia przełomem w dziedzinie przetwarzania surowych danych nieustrukturyzowanych.
Głębokie uczenie jest obecnie jednym z najlepszych dostawców rozwiązań dla szerokiego zakresu rzeczywistych problemów. Programiści budują programy AI, które zamiast korzystać z wcześniej podanych reguł, uczą się na przykładach, aby rozwiązywać skomplikowane zadania. Dzięki głębokiemu uczeniu się używanemu przez wielu analityków danych, głębsze sieci neuronowe dostarczają coraz dokładniejszych wyników.
Pomysł polega na opracowaniu głębokich sieci neuronowych poprzez zwiększenie liczby warstw szkoleniowych dla każdej sieci; maszyna uczy się więcej o danych, aż staną się tak dokładne, jak to tylko możliwe. Programiści mogą wykorzystywać techniki głębokiego uczenia do wdrażania złożonych zadań uczenia maszynowego i szkolić sieci sztucznej inteligencji, aby miały wysoki poziom rozpoznawania percepcyjnego.
Uczenie głębokie znajduje swoją popularność w wizji komputerowej. Tutaj jednym z osiągniętych zadań jest klasyfikacja obrazu, w której dane wejściowe są klasyfikowane jako kot, pies itp. Lub jako klasa lub etykieta najlepiej opisująca obraz. My, ludzie, uczymy się, jak wykonywać to zadanie na bardzo wczesnym etapie życia i posiadamy umiejętności szybkiego rozpoznawania wzorców, generalizowania na podstawie wcześniejszej wiedzy i dostosowywania się do różnych środowisk obrazu.
W tym rozdziale będziemy odnosić głębokie uczenie się do różnych bibliotek i frameworków.
Uczenie głębokie i Theano
Jeśli chcemy zacząć kodować głęboką sieć neuronową, lepiej mieć pojęcie, jak działają różne frameworki, takie jak Theano, TensorFlow, Keras, PyTorch itp.
Theano to biblioteka Pythona, która zapewnia zestaw funkcji do budowania głębokich sieci, które szybko trenują na naszej maszynie.
Theano zostało opracowane na Uniwersytecie w Montrealu w Kanadzie pod kierownictwem Yoshua Bengio, pioniera głębokiej sieci.
Theano pozwala nam definiować i oceniać wyrażenia matematyczne za pomocą wektorów i macierzy, które są prostokątnymi tablicami liczb.
Z technicznego punktu widzenia zarówno sieci neuronowe, jak i dane wejściowe można przedstawić jako macierze, a wszystkie standardowe operacje sieciowe można przedefiniować jako operacje na macierzach. Jest to ważne, ponieważ komputery mogą bardzo szybko wykonywać operacje na macierzach.
Możemy równolegle przetwarzać wiele wartości macierzy, a jeśli zbudujemy sieć neuronową z tą podstawową strukturą, możemy użyć jednej maszyny z procesorem graficznym do trenowania ogromnych sieci w rozsądnym oknie czasowym.
Jeśli jednak używamy Theano, musimy zbudować głęboką sieć od podstaw. Biblioteka nie zapewnia pełnej funkcjonalności do tworzenia określonego typu głębokiej sieci.
Zamiast tego musimy zakodować każdy aspekt głębokiej sieci, taki jak model, warstwy, aktywacja, metoda szkolenia i wszelkie specjalne metody, aby zatrzymać nadmierne dopasowanie.
Dobra wiadomość jest jednak taka, że Theano pozwala na budowanie naszej implementacji na podstawie wektoryzowanych funkcji, co zapewnia nam wysoce zoptymalizowane rozwiązanie.
Istnieje wiele innych bibliotek, które rozszerzają funkcjonalność Theano. TensorFlow i Keras mogą być używane z Theano jako zapleczem.
Deep Learning z TensorFlow
Googles TensorFlow to biblioteka Pythona. Ta biblioteka to doskonały wybór do tworzenia komercyjnych aplikacji do głębokiego uczenia się.
TensorFlow wyrósł z innej biblioteki DistBelief V2, która była częścią Google Brain Project. Ta biblioteka ma na celu rozszerzenie przenośności uczenia maszynowego, tak aby modele badawcze mogły być stosowane do zastosowań komercyjnych.
Podobnie jak biblioteka Theano, TensorFlow opiera się na wykresach obliczeniowych, w których węzeł reprezentuje trwałe dane lub operacje matematyczne, a krawędzie reprezentują przepływ danych między węzłami, co jest wielowymiarową tablicą lub tensorem; stąd nazwa TensorFlow
Dane wyjściowe z operacji lub zestawu operacji są przekazywane jako dane wejściowe do następnej.
Mimo że TensorFlow został zaprojektowany dla sieci neuronowych, działa dobrze w innych sieciach, w których obliczenia można modelować jako wykres przepływu danych.
TensorFlow korzysta również z kilku funkcji firmy Theano, takich jak eliminacja wspólnych i podwyrażeń, automatyczne różnicowanie, zmienne współdzielone i symboliczne.
Za pomocą TensorFlow można budować różne typy sieci głębokich, takie jak sieci konwolucyjne, Autoenkodery, RNTN, RNN, RBM, DBM / MLP i tak dalej.
Jednak w TensorFlow nie ma wsparcia dla konfiguracji hiperparametrów, w tym celu możemy użyć Keras.
Deep Learning i Keras
Keras to potężna, łatwa w użyciu biblioteka Pythona do tworzenia i oceny modeli uczenia głębokiego.
Ma minimalistyczny design, który pozwala nam budować siatkę warstwa po warstwie; wytrenuj go i uruchom.
Obejmuje wydajne biblioteki obliczeń numerycznych Theano i TensorFlow i pozwala nam definiować i trenować modele sieci neuronowych w kilku krótkich liniach kodu.
Jest to interfejs API sieci neuronowej wysokiego poziomu, pomagający w szerokim wykorzystaniu głębokiego uczenia się i sztucznej inteligencji. Działa na wielu bibliotekach niższego poziomu, w tym TensorFlow, Theano i tak dalej. Kod Keras jest przenośny; możemy zaimplementować sieć neuronową w Kerasie używając Theano lub TensorFlow jako back-end bez żadnych zmian w kodzie.
W tej implementacji uczenia głębokiego naszym celem jest przewidywanie utraty klientów lub utraty danych dla określonego banku - którzy klienci prawdopodobnie opuszczą tę usługę bankową. Używany zestaw danych jest stosunkowo mały i zawiera 10000 wierszy z 14 kolumnami. Używamy dystrybucji Anaconda i frameworków, takich jak Theano, TensorFlow i Keras. Keras jest zbudowany na bazie Tensorflow i Theano, które działają jako jego zaplecze.
# Artificial Neural Network
# Installing Theano
pip install --upgrade theano
# Installing Tensorflow
pip install –upgrade tensorflow
# Installing Keras
pip install --upgrade keras
Krok 1: Wstępne przetwarzanie danych
In[]:
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the database
dataset = pd.read_csv('Churn_Modelling.csv')
Krok 2
Tworzymy macierze cech zbioru danych i zmiennej docelowej, jaką jest kolumna 14, oznaczona jako „Wyjście”.
Początkowy wygląd danych jest taki, jak pokazano poniżej -
In[]:
X = dataset.iloc[:, 3:13].values
Y = dataset.iloc[:, 13].values
X
Wynik
Krok 3
Y
Wynik
array([1, 0, 1, ..., 1, 1, 0], dtype = int64)
Krok 4
Upraszczamy analizę, kodując zmienne typu string. Używamy funkcji ScikitLearn „LabelEncoder” do automatycznego kodowania różnych etykiet w kolumnach z wartościami od 0 do n_classes-1.
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_1 = LabelEncoder()
X[:,1] = labelencoder_X_1.fit_transform(X[:,1])
labelencoder_X_2 = LabelEncoder()
X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])
X
Wynik
W powyższym wyniku nazwy krajów są zastąpione przez 0, 1 i 2; podczas gdy mężczyzna i kobieta są zastąpieni przez 0 i 1.
Krok 5
Labelling Encoded Data
Używamy tego samego ScikitLearn biblioteka i inna funkcja o nazwie OneHotEncoder po prostu przekazać numer kolumny, tworząc zmienną fikcyjną.
onehotencoder = OneHotEncoder(categorical features = [1])
X = onehotencoder.fit_transform(X).toarray()
X = X[:, 1:]
X
Teraz dwie pierwsze kolumny reprezentują kraj, a czwarta kolumna - płeć.
Wynik
Nasze dane zawsze dzielimy na część szkoleniową i testową; trenujemy nasz model na danych uczących, a następnie sprawdzamy dokładność modelu na danych testowych, co pomaga w ocenie efektywności modelu.
Krok 6
Używamy ScikitLearn's train_test_splitfunkcji, aby podzielić nasze dane na zbiór uczący i zbiór testowy. Utrzymujemy stosunek podziału pociągu do testu na poziomie 80:20.
#Splitting the dataset into the Training set and the Test Set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
Niektóre zmienne mają wartości w tysiącach, a inne w dziesiątkach lub jednościach. Skalujemy dane, aby były bardziej reprezentatywne.
Krok 7
W tym kodzie dopasowujemy i przekształcamy dane szkoleniowe przy użyciu StandardScalerfunkcjonować. Standaryzujemy nasze skalowanie, abyśmy używali tej samej dopasowanej metody do przekształcania / skalowania danych testowych.
# Feature Scaling
fromsklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
Wynik
Dane są teraz poprawnie skalowane. Wreszcie mamy już za sobą wstępne przetwarzanie danych. Teraz zaczniemy od naszego modelu.
Krok 8
Tutaj importujemy wymagane moduły. Potrzebujemy modułu Sequential do inicjalizacji sieci neuronowej i modułu gęstego, aby dodać ukryte warstwy.
# Importing the Keras libraries and packages
import keras
from keras.models import Sequential
from keras.layers import Dense
Krok 9
Nazwiemy model jako Klasyfikator, ponieważ naszym celem jest sklasyfikowanie odpływu klientów. Następnie do inicjalizacji używamy modułu Sequential.
#Initializing Neural Network
classifier = Sequential()
Krok 10
Dodajemy ukryte warstwy pojedynczo za pomocą funkcji gęstej. W poniższym kodzie zobaczymy wiele argumentów.
Nasz pierwszy parametr to output_dim. Jest to liczba węzłów, które dodajemy do tej warstwy.initjest inicjalizacją Stochastic Gradient Decent. W sieci neuronowej przypisujemy wagi do każdego węzła. Podczas inicjalizacji wagi powinny być bliskie zeru, a my losowo inicjalizujemy wagi za pomocą funkcji uniform. Plikinput_dimparametr jest potrzebny tylko dla pierwszej warstwy, ponieważ model nie zna liczby naszych zmiennych wejściowych. Tutaj całkowita liczba zmiennych wejściowych wynosi 11. W drugiej warstwie model automatycznie zna liczbę zmiennych wejściowych z pierwszej warstwy ukrytej.
Wykonaj następujący wiersz kodu, aby dodać warstwę wejściową i pierwszą ukrytą warstwę -
classifier.add(Dense(units = 6, kernel_initializer = 'uniform',
activation = 'relu', input_dim = 11))
Wykonaj następujący wiersz kodu, aby dodać drugą ukrytą warstwę -
classifier.add(Dense(units = 6, kernel_initializer = 'uniform',
activation = 'relu'))
Wykonaj następujący wiersz kodu, aby dodać warstwę wyjściową -
classifier.add(Dense(units = 1, kernel_initializer = 'uniform',
activation = 'sigmoid'))
Krok 11
Compiling the ANN
Do tej pory dodaliśmy wiele warstw do naszego klasyfikatora. Teraz skompilujemy je przy użyciucompilemetoda. Argumenty dodane w końcowej kontroli kompilacji uzupełniają sieć neuronową, dlatego na tym etapie musimy być ostrożni.
Oto krótkie wyjaśnienie argumentów.
Pierwszy argument to OptimizerJest to algorytm używany do znajdowania optymalnego zestawu wag. Ten algorytm nazywa sięStochastic Gradient Descent (SGD). Tutaj używamy jednego z kilku typów, zwanego „optymalizatorem Adama”. SGD zależy od straty, więc naszym drugim parametrem jest strata. Jeśli nasza zmienna zależna jest binarna, używamy logarytmicznej funkcji straty o nazwie‘binary_crossentropy’, a jeśli nasza zmienna zależna ma więcej niż dwie kategorie w danych wyjściowych, używamy ‘categorical_crossentropy’. Chcemy poprawić wydajność naszej sieci neuronowej w oparciu oaccuracywięc dodajemy metrics jako dokładność.
# Compiling Neural Network
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
Krok 12
Na tym etapie należy wykonać kilka kodów.
Dopasowywanie ANN do zestawu treningowego
Teraz trenujemy nasz model na danych szkoleniowych. UżywamyfitMetoda pasująca do naszego modelu. Optymalizujemy również wagi, aby poprawić wydajność modelu. W tym celu musimy zaktualizować wagi.Batch size to liczba obserwacji, po których aktualizujemy wagi. Epochto całkowita liczba iteracji. Wartości wielkości partii i epoki wybiera się metodą prób i błędów.
classifier.fit(X_train, y_train, batch_size = 10, epochs = 50)
Prognozowanie i ocena modelu
# Predicting the Test set results
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)
Przewidywanie pojedynczej nowej obserwacji
# Predicting a single new observation
"""Our goal is to predict if the customer with the following data will leave the bank:
Geography: Spain
Credit Score: 500
Gender: Female
Age: 40
Tenure: 3
Balance: 50000
Number of Products: 2
Has Credit Card: Yes
Is Active Member: Yes
Krok 13
Predicting the test set result
Wynik prognozy da Ci prawdopodobieństwo odejścia klienta z firmy. Przekonwertujemy to prawdopodobieństwo na binarne 0 i 1.
# Predicting the Test set results
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)
new_prediction = classifier.predict(sc.transform
(np.array([[0.0, 0, 500, 1, 40, 3, 50000, 2, 1, 1, 40000]])))
new_prediction = (new_prediction > 0.5)
Krok 14
To ostatni krok, w którym oceniamy wydajność naszego modelu. Mamy już oryginalne wyniki, dzięki czemu możemy zbudować macierz pomyłki, aby sprawdzić dokładność naszego modelu.
Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print (cm)
Wynik
loss: 0.3384 acc: 0.8605
[ [1541 54]
[230 175] ]
Z macierzy pomyłki dokładność naszego modelu można obliczyć jako -
Accuracy = 1541+175/2000=0.858
We achieved 85.8% accuracy, co jest dobre.
Algorytm propagacji do przodu
W tej sekcji nauczymy się, jak napisać kod wykonujący propagację do przodu (przewidywanie) dla prostej sieci neuronowej -
Każdy punkt danych jest klientem. Pierwsza informacja dotyczy liczby posiadanych kont, a druga - liczby dzieci. Model będzie przewidywał, ile transakcji użytkownik dokona w przyszłym roku.
Dane wejściowe są wstępnie ładowane jako dane wejściowe, a wagi znajdują się w słowniku zwanym wagami. Tablica wag dla pierwszego węzła w warstwie ukrytej jest podana odpowiednio w wagach [„node_0”], a dla drugiego węzła w warstwie ukrytej w wagach [„node_1”].
Wagi zasilające węzeł wyjściowy są dostępne w wagach.
Funkcja rektyfikowanej aktywacji liniowej
„Funkcja aktywacji” to funkcja działająca w każdym węźle. Przekształca dane wejściowe węzła w jakieś wyjście.
Prostowana funkcja aktywacji liniowej (zwana ReLU ) jest szeroko stosowana w sieciach o bardzo wysokiej wydajności. Ta funkcja przyjmuje pojedynczą liczbę jako wartość wejściową, zwracając 0, jeśli wartość wejściowa jest ujemna, i wartość wejściową jako wartość wyjściową, jeśli wartość wejściowa jest dodatnia.
Oto kilka przykładów -
- relu (4) = 4
- relu (-2) = 0
Wypełniamy definicję funkcji relu () -
- Używamy funkcji max () do obliczania wartości wyjściowej funkcji relu ().
- Stosujemy funkcję relu () do node_0_input, aby obliczyć node_0_output.
- Stosujemy funkcję relu () do node_1_input, aby obliczyć wartość node_1_output.
import numpy as np
input_data = np.array([-1, 2])
weights = {
'node_0': np.array([3, 3]),
'node_1': np.array([1, 5]),
'output': np.array([2, -1])
}
node_0_input = (input_data * weights['node_0']).sum()
node_0_output = np.tanh(node_0_input)
node_1_input = (input_data * weights['node_1']).sum()
node_1_output = np.tanh(node_1_input)
hidden_layer_output = np.array(node_0_output, node_1_output)
output =(hidden_layer_output * weights['output']).sum()
print(output)
def relu(input):
'''Define your relu activation function here'''
# Calculate the value for the output of the relu function: output
output = max(input,0)
# Return the value just calculated
return(output)
# Calculate node 0 value: node_0_output
node_0_input = (input_data * weights['node_0']).sum()
node_0_output = relu(node_0_input)
# Calculate node 1 value: node_1_output
node_1_input = (input_data * weights['node_1']).sum()
node_1_output = relu(node_1_input)
# Put node values into array: hidden_layer_outputs
hidden_layer_outputs = np.array([node_0_output, node_1_output])
# Calculate model output (do not apply relu)
odel_output = (hidden_layer_outputs * weights['output']).sum()
print(model_output)# Print model output
Wynik
0.9950547536867305
-3
Stosowanie sieci do wielu obserwacji / wierszy danych
W tej sekcji dowiemy się, jak zdefiniować funkcję o nazwie Predict_with_network (). Ta funkcja wygeneruje prognozy dla wielu obserwacji danych, pobranych z sieci powyżej, przyjmowanych jako dane wejściowe. Używane są wagi podane w powyższej sieci. Używana jest również definicja funkcji relu ().
Zdefiniujmy funkcję o nazwie Predict_with_network (), która przyjmuje dwa argumenty - input_data_row i wagi - i zwraca prognozę z sieci jako wyjście.
Obliczamy wartości wejściowe i wyjściowe dla każdego węzła, przechowując je jako: node_0_input, node_0_output, node_1_input i node_1_output.
Aby obliczyć wartość wejściową węzła, mnożymy razem odpowiednie tablice i obliczamy ich sumę.
Aby obliczyć wartość wyjściową węzła, stosujemy funkcję relu () do wartości wejściowej węzła. Używamy pętli for do iteracji po danych wejściowych -
Używamy również naszej Predict_with_network () do generowania predykcji dla każdego wiersza input_data - input_data_row. Do wyników dołączamy również każdą prognozę.
# Define predict_with_network()
def predict_with_network(input_data_row, weights):
# Calculate node 0 value
node_0_input = (input_data_row * weights['node_0']).sum()
node_0_output = relu(node_0_input)
# Calculate node 1 value
node_1_input = (input_data_row * weights['node_1']).sum()
node_1_output = relu(node_1_input)
# Put node values into array: hidden_layer_outputs
hidden_layer_outputs = np.array([node_0_output, node_1_output])
# Calculate model output
input_to_final_layer = (hidden_layer_outputs*weights['output']).sum()
model_output = relu(input_to_final_layer)
# Return model output
return(model_output)
# Create empty list to store prediction results
results = []
for input_data_row in input_data:
# Append prediction to results
results.append(predict_with_network(input_data_row, weights))
print(results)# Print results
Wynik
[0, 12]
Tutaj użyliśmy funkcji relu, gdzie relu (26) = 26 i relu (-13) = 0 i tak dalej.
Głębokie, wielowarstwowe sieci neuronowe
Tutaj piszemy kod, aby przeprowadzić propagację w przód dla sieci neuronowej z dwiema ukrytymi warstwami. Każda ukryta warstwa ma dwa węzły. Dane wejściowe zostały wstępnie załadowane jakoinput_data. Węzły w pierwszej ukrytej warstwie nazywane są node_0_0 i node_0_1.
Ich wagi są wstępnie ładowane odpowiednio jako wagi ['node_0_0'] i wagi ['node_0_1'].
Nazywa się węzły w drugiej ukrytej warstwie node_1_0 and node_1_1. Ich wagi są wstępnie załadowane jakoweights['node_1_0'] i weights['node_1_1'] odpowiednio.
Następnie tworzymy wynik modelu z ukrytych węzłów przy użyciu wag wstępnie załadowanych jako weights['output'].
Obliczamy node_0_0_input używając jego wag ['node_0_0'] i podanych input_data. Następnie zastosuj funkcję relu (), aby uzyskać node_0_0_output.
Robimy to samo co powyżej dla node_0_1_input, aby otrzymać node_0_1_output.
Obliczamy node_1_0_input na podstawie jego wag ['node_1_0'] i danych wyjściowych z pierwszej ukrytej warstwy - hidden_0_outputs. Następnie stosujemy funkcję relu (), aby uzyskać plik node_1_0_output.
Robimy to samo, co powyżej dla node_1_1_input, aby uzyskać node_1_1_output.
Obliczamy model_output za pomocą wag ['wyjście'] i danych wyjściowych z drugiej tablicy ukrytej warstwy ukrytej_1_outputs. Nie stosujemy funkcji relu () do tego wyjścia.
import numpy as np
input_data = np.array([3, 5])
weights = {
'node_0_0': np.array([2, 4]),
'node_0_1': np.array([4, -5]),
'node_1_0': np.array([-1, 1]),
'node_1_1': np.array([2, 2]),
'output': np.array([2, 7])
}
def predict_with_network(input_data):
# Calculate node 0 in the first hidden layer
node_0_0_input = (input_data * weights['node_0_0']).sum()
node_0_0_output = relu(node_0_0_input)
# Calculate node 1 in the first hidden layer
node_0_1_input = (input_data*weights['node_0_1']).sum()
node_0_1_output = relu(node_0_1_input)
# Put node values into array: hidden_0_outputs
hidden_0_outputs = np.array([node_0_0_output, node_0_1_output])
# Calculate node 0 in the second hidden layer
node_1_0_input = (hidden_0_outputs*weights['node_1_0']).sum()
node_1_0_output = relu(node_1_0_input)
# Calculate node 1 in the second hidden layer
node_1_1_input = (hidden_0_outputs*weights['node_1_1']).sum()
node_1_1_output = relu(node_1_1_input)
# Put node values into array: hidden_1_outputs
hidden_1_outputs = np.array([node_1_0_output, node_1_1_output])
# Calculate model output: model_output
model_output = (hidden_1_outputs*weights['output']).sum()
# Return model_output
return(model_output)
output = predict_with_network(input_data)
print(output)
Wynik
364