Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00045 003418 18773019 na godz. na dobę w sumie
Deep Learning. Uczenie głębokie z językiem Python. Sztuczna inteligencja i sieci neuronowe - książka
Deep Learning. Uczenie głębokie z językiem Python. Sztuczna inteligencja i sieci neuronowe - książka
Autor: , , , Liczba stron: 360
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-4173-9 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> python - programowanie
Porównaj ceny (książka, ebook, audiobook).

Na naszych oczach dokonuje się przełom: technologie wykorzystujące rozmaite formy sztucznej inteligencji zaczynają się pojawiać w różnych branżach. Niektórzy nawet nie zdają sobie sprawy, jak często i jak powszechnie stosuje się algorytmy uczenia głębokiego. Możliwości w tym zakresie stale rosną. Wzrasta też zapotrzebowanie na inżynierów, którzy swobodnie operują wiedzą o uczeniu głębokim i są w stanie zaimplementować potrzebne algorytmy w konkretnym oprogramowaniu. Uczenie głębokie jest jednak dość złożonym zagadnieniem, a przyswojenie sobie potrzebnych umiejętności wymaga wysiłku.

Ta książka stanowi doskonałe wprowadzenie w temat uczenia głębokiego. Wyjaśniono tu najważniejsze pojęcia uczenia maszynowego. Pokazano, do czego mogą się przydać takie narzędzia jak pakiet scikit-learn, biblioteki Theano, Keras czy TensorFlow. Ten praktyczny przewodnik znakomicie ułatwi zrozumienie zagadnień rozpoznawania wzorców, dokładnego skalowania danych, pozwoli też na rzetelne zapoznanie się z algorytmami i technikami uczenia głębokiego. Autorzy zaproponowali wykorzystanie w powyższych celach języka Python - ulubionego narzędzia wielu badaczy i pasjonatów nauki.

W książce między innymi:

Uczenie głębokie: zajrzyj w przyszłość programowania!


Dr Valentino Zokka opracował wiele algorytmów matematycznych i modeli prognostycznych dla firmy Boeing. Obecnie jest konsultantem w branży finansowej.

Gianmario Spacagna pracuje w firmie Pirelli, gdzie buduje systemy maszynowego uczenia się i kompletne rozwiązania do produktów informacyjnych.

Daniel Slater tworzył oprogramowanie do oceny ryzyka dla branży finansowej. Obecnie zajmuje się systemami do przetwarzania dużych ilości danych i analizy zachowań użytkowników.

Peter Roelants specjalizuje się w stosowaniu technik uczenia głębokiego do badań spektralnych obrazów, rozpoznawania mowy czy ekstrakcji danych z dokumentów.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Python Deep Learning Tłumaczenie: Radosław Meryk ISBN: 978-83-283-4173-9 Copyright © Packt Publishing 2017. First published in the English language under the title ‘Python Deep Learning - (9781786464453)’ Polish edition copyright © 2018 by Helion SA All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/deelea.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/deelea Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treści O autorach O recenzencie Przedmowa Co zawiera książka? Co jest potrzebne podczas lektury tej książki? Dla kogo jest ta książka? Konwencje Pobieranie przykładowego kodu Pobieranie kolorowych ilustracji do tej książki Rozdział 1. Uczenie maszynowe — wprowadzenie Czym jest uczenie maszynowe? Różne podejścia do uczenia maszynowego Uczenie nadzorowane Uczenie nienadzorowane Uczenie przez wzmacnianie Fazy systemów uczenia maszynowego Krótki opis popularnych technik (algorytmów) Zastosowania praktyczne Popularny pakiet open source Podsumowanie Rozdział 2. Sieci neuronowe Dlaczego sieci neuronowe? Podstawy Neurony i warstwy Różne rodzaje funkcji aktywacji Algorytm propagacji wstecznej Zastosowania praktyczne Przykład kodu sieci neuronowej dla funkcji XOR Podsumowanie 9 11 13 13 14 15 15 16 16 17 18 19 19 22 23 24 28 40 42 48 49 50 51 52 56 61 68 70 75 Poleć książkęKup książkę Spis treści Rozdział 3. Podstawy uczenia głębokiego Czym jest uczenie głębokie? Podstawowe pojęcia Uczenie się cech Algorytmy uczenia głębokiego Zastosowania uczenia głębokiego Rozpoznawanie mowy Rozpoznawanie i klasyfikacja obiektów GPU kontra CPU Popularne biblioteki open source — wprowadzenie Theano TensorFlow Keras Przykład implementacji głębokiej sieci neuronowej za pomocą biblioteki Keras Podsumowanie Rozdział 4. Nienadzorowane uczenie cech Autoenkodery Projekt sieci Metody regularyzacji dla autoenkoderów Autoenkodery — podsumowanie Ograniczone maszyny Boltzmanna Sieci Hopfielda a maszyny Boltzmanna Maszyna Boltzmanna Ograniczona maszyna Boltzmanna Implementacja za pomocą biblioteki TensorFlow Sieci DBN Podsumowanie Rozdział 5. Rozpoznawanie obrazów Podobieństwa pomiędzy modelami sztucznymi a biologicznymi Intuicja i uzasadnianie Warstwy konwolucyjne Parametry krok i wypełnienie w warstwach konwolucyjnych 77 78 80 81 88 89 90 91 94 96 96 97 97 98 102 105 107 110 113 117 119 121 123 125 126 130 132 135 136 137 138 144 145 147 147 148 150 153 155 156 Warstwy pooling Dropout Warstwy konwolucyjne w uczeniu głębokim Warstwy konwolucyjne w bibliotece Theano Przykład zastosowania warstwy konwolucyjnej do rozpoznawania cyfr za pomocą biblioteki Keras Przykład zastosowania warstwy konwolucyjnej za pomocą biblioteki Keras dla zbioru danych CIFAR10 Szkolenie wstępne Podsumowanie 4 Poleć książkęKup książkę Spis treści Rozdział 6. Rekurencyjne sieci neuronowe i modele języka Rekurencyjne sieci neuronowe RNN — jak implementować i trenować? Długa pamięć krótkotrwała Modelowanie języka Modele na bazie słów Modele bazujące na znakach Rozpoznawanie mowy Potok rozpoznawania mowy Mowa jako dane wejściowe Przetwarzanie wstępne Model akustyczny Dekodowanie Modele od końca do końca Podsumowanie Bibliografia Rozdział 7. Uczenie głębokie w grach planszowych Pierwsze systemy AI grające w gry Wykorzystanie algorytmu min-max do oceny stanów gry Implementacja gry w kółko i krzyżyk w Pythonie Uczenie funkcji wartości Trenowanie systemu AI do uzyskania mistrzostwa w grze w Go Zastosowanie górnych granic zaufania do drzew Uczenie głębokie w algorytmie przeszukiwania drzewa Monte Carlo Krótkie przypomnienie technik uczenia przez wzmacnianie Metoda policy gradients w funkcjach strategii uczenia Metoda policy gradients w AlphaGo Podsumowanie Rozdział 8. Uczenie głębokie w grach komputerowych Techniki uczenia nadzorowanego w odniesieniu do gier Zastosowanie algorytmów genetycznych do grania w gry komputerowe Q-learning Funkcja Q Q-learning w akcji Gry dynamiczne Odtwarzanie doświadczeń Epsilon zachłanny Breakout na Atari Losowy test gry w Breakout na Atari Wstępne przetwarzanie ekranu Tworzenie głębokiej sieci konwolucyjnej Problemy zbieżności w technikach Q-learning Technika policy gradients kontra Q-learning 159 160 162 168 171 171 176 183 183 184 185 186 189 190 190 190 195 197 198 201 209 210 213 220 222 222 230 232 235 235 237 238 240 241 246 250 253 254 255 257 259 263 265 5 Poleć książkęKup książkę Spis treści Metody aktor-krytyk Metoda baseline do redukcji wariancji Uogólniony estymator korzyści Metody asynchroniczne Podejścia bazujące na modelach Podsumowanie Rozdział 9. Wykrywanie anomalii Co to jest wykrywanie anomalii i wykrywanie elementów odstających? Rzeczywiste zastosowania mechanizmów wykrywania anomalii Popularne płytkie techniki uczenia maszynowego Modelowanie danych Modelowanie wykrywania Wykrywanie anomalii z wykorzystaniem głębokich autoenkoderów H2O Wprowadzenie do pracy z H2O Przykłady Rozpoznawanie anomalii wykrywania cyfr z wykorzystaniem zestawu danych MNIST Podsumowanie Rozdział 10. Budowanie gotowego do produkcji systemu wykrywania włamań Czym jest produkt danych? Trening Inicjalizacja wag Współbieżny algorytm SGD z wykorzystaniem techniki HOGWILD! Uczenie adaptacyjne Uczenie rozproszone z wykorzystaniem mechanizmu MapReduce Sparkling Water Testowanie Walidacja modelu Dostrajanie hiperparametrów Ocena od końca do końca Podsumowanie zagadnień związanych z testowaniem Wdrażanie Eksport modelu do formatu POJO Interfejsy API oceny anomalii Podsumowanie wdrażania Podsumowanie Skorowidz 266 267 267 268 269 272 273 274 277 278 279 279 281 283 285 285 286 298 301 302 304 304 306 308 314 317 320 326 335 338 342 343 344 347 349 350 351 6 Poleć książkęKup książkę 2 Sieci neuronowe W poprzednim rozdziale opisaliśmy kilka algorytmów uczenia maszynowego i zaprezentowali- śmy różne techniki analizy danych stosowane w celu dokonywania prognoz. Pokazaliśmy na przy- kład, w jaki sposób maszyny mogą skorzystać z informacji o cenach sprzedaży domów w celu prognozowania cen nowych nieruchomości. Opisaliśmy, w jaki sposób techniki uczenia ma- szynowego są stosowane w dużych firmach, takich jak Netflix, w celu sugerowania użytkowni- kom nowych filmów na podstawie tych, które podobały im się wcześniej. Użyto do tego metody powszechnie stosowanej w branży e-commerce przez takich gigantów jak Amazon czy Walmart. Jednak większość z tych metod do prognozowania nowych danych wymagała danych oznako- wanych etykietami, a żeby zwiększyć ich skuteczność, ludzie musieli opisać dane za pomocą sensownych cech. Ludzie są zdolni do szybkiej ekstrapolacji trendów i wnioskowania reguł bez konieczności spe- cjalnego oczyszczania i przygotowania dla nich danych. Byłoby dobrze, gdyby maszyny mogły nauczyć się postępować w taki sam sposób. Jak wspominaliśmy, Frank Rosenblatt wynalazł perceptron w 1957 roku, czyli ponad sześćdziesiąt lat temu. W porównaniu z nowoczesnymi głębokimi sieciami neuronowymi perceptron przypomina organizm jednokomórkowy w ze- stawieniu ze złożonymi wielokomórkowymi formami życia. Pomimo tego zrozumienie sposobu działania sztucznego neuronu i zapoznanie się z nim jest bardzo ważne. Jest także niezbędne dla lepszego zrozumienia i docenienia złożoności, jaką można uzyskać przez pogrupowanie wielu neuronów w wielu warstwach w celu stworzenia głębokich sieci neuronowych. Sieci neuronowe to próba zasymulowania pracy ludzkiego mózgu i jego zdolności do wniosko- wania nowych reguł w wyniku prostych obserwacji. Choć jesteśmy jeszcze daleko od zrozumie- nia sposobu, w jaki ludzki mózg porządkuje i przetwarza informacje, to dość dobrze rozumiemy już, jak działają pojedyncze ludzkie neurony. Sztuczne sieci neuronowe starają się naśladować tę samą funkcjonalność, choć zastąpiono w nich komunikaty chemiczne i elektryczne wartościami i funkcjami liczbowymi. Znaczny postęp osiągnięto w ostatnim dziesięcioleciu, po tym, jak co najmniej dwadzieścia lat wcześniej sieci Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python neuronowe zyskały bardzo dużą popularność, a następnie o nich zapomniano. Ponowne zain- teresowanie wynika po części z dostępności komputerów, które stają się coraz szybsze, korzy- stania z procesorów graficznych (Graphical Processing Unit — GPU) zamiast bardziej tradycyj- nych układów CPU (Computing Processing Unit), lepszych algorytmów i doskonalszego projektu sieci neuronowych, a także coraz bardziej obszernych zbiorów danych. O tym wszystkim opo- wiemy w niniejszej książce. Ten rozdział będzie formalnym wprowadzeniem w tematykę sieci neuronowych. Dokładnie opiszemy, jak działa neuron, i zaprezentujemy sposób zestawienia wielu warstw w celu utwo- rzenia i wykorzystania głębokich sieci neuronowych bez sprzężenia zwrotnego. Dlaczego sieci neuronowe? Sieci neuronowe są znane od wielu lat. W ich historii można wyróżnić kilka okresów, podczas których popadały w niełaskę i na nowo się odradzały. Jednak w ostatnich latach stopniowo zy- skiwały coraz większe znaczenie i przewagę nad wieloma konkurencyjnymi algorytmami uczenia maszynowego. Powodem tego stanu jest to, że architektura zaawansowanych sieci neurono- wych udowodniła przydatność do wielu zadań oraz znacznie lepszą dokładność w porównaniu z innymi algorytmami. Na przykład w dziedzinie rozpoznawania obrazów dokładność może być mierzona na pod- stawie porównania z bazą danych szesnastu milionów zdjęć, znaną pod nazwą ImageNet. Przed wprowadzeniem głębokich sieci neuronowych dokładność poprawiała się powoli, a po ich wprowadzeniu stopa błędu spadła z 40 w 2010 roku do mniej niż 7 w roku 2014 i nadal spada. Stopa błędu przy rozpoznawaniu obrazów przez człowieka jest nadal niższa, ale tylko o mniej więcej 5 . Ze względu na sukces głębokich sieci neuronowych wszyscy uczestnicy współzawodnictwa ImageNet w 2013 roku zastosowali jakąś formę głębokiej sieci neuronowej. Ponadto głębokie sieci neuronowe „uczą się” reprezentacji danych — tzn. nie tylko uczą się rozpoznawania obiektów, ale także tego, jakie są istotne cechy, które w unikatowy sposób de- finiują zidentyfikowany obiekt. Dzięki nauczeniu się automatycznego identyfikowania cech, głębokie sieci neuronowe mogą być z powodzeniem wykorzystywane do uczenia nienadzoro- wanego. Za ich pomocą można w naturalny sposób klasyfikować obiekty o podobnych cechach bez konieczności żmudnego znakowania przez ludzi. Podobny postęp osiągnięto również w in- nych dziedzinach, takich jak przetwarzanie sygnałów. Uczenie głębokie i głębokie sieci neu- ronowe są obecnie używane powszechnie, na przykład w systemie Siri firmy Apple. Kiedy firma Google wprowadziła algorytm uczenia głębokiego w swoim systemie operacyjnym Android, osiągnięto 25-procentowy spadek błędów rozpoznawania słów. Do rozpoznawania obrazów jest wykorzystywany również zbiór danych MNIST, składający się z próbek cyfr pisanych różnymi charakterami pisma ręcznego. Korzystanie z głębokich sieci neuronowych do rozpoznawania cyfr pozwala obecnie osiągnąć dokładność 99,79 , która jest porównywalna z dokładnością człowieka. Ponadto algorytmy bazujące na głębokich sieciach neuronowych są najlepszym 50 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe przykładem imitacji działania ludzkiego mózgu przez sztuczną inteligencję. Mimo że jak dotychczas sieci neuronowe są bardzo elementarnym i uproszczonym modelem naszego mózgu, to oferują więcej niż jakikolwiek inny algorytm — namiastkę ludzkiego intelektu. Pozostałą część tej książki poświęcono różnym sieciom neuronowym oraz kilku ich zastosowaniom. Podstawy W pierwszym rozdziale mówiliśmy o trzech różnych podejściach do uczenia maszynowego: uczeniu nadzorowanym, uczeniu nienadzorowanym oraz uczeniu przez wzmacnianie. Kla- syczne sieci neuronowe są rodzajem uczenia maszynowego nadzorowanego, choć — jak przeko- namy się później — popularność uczenia głębokiego wynika z faktu, że nowoczesne głębokie sieci neuronowe mogą być stosowane również w zadaniach uczenia nienadzorowanego. W na- stępnym rozdziale zaprezentujemy podstawowe różnice pomiędzy klasycznymi płytkimi sieciami neuronowymi a sieciami głębokimi. Na razie jednak skupimy się głównie na klasycznych sie- ciach bez sprzężenia zwrotnego, które działają na zasadach algorytmu nadzorowanego. Nasze pierwsze pytanie brzmi: czym dokładnie jest sieć neuronowa? Prawdopodobnie najlepszym sposobem interpretacji sieci neuronowej jest opisanie jej jako matematycznego modelu przetwarzania informacji. Takie określeniemoże wydawać się dość niejasne, stanie się jednak znacznie bardziej czytelne w kolejnych rozdziałach. Sieć neurono- wa nie jest stałym programem. Jest to raczej model bądź system, który przetwarza informacje lub dane wejściowe podobnie, jak robią to jednostki biologiczne. Możemy wyróżnić trzy główne cechy sieci neuronowych:  Architektura sieci neuronowej: Opisuje sposób połączeń (ze sprzężeniem zwrotnym, bez sprzężenia zwrotnego, wielo- lub jednowarstwowe i tak dalej) pomiędzy neuronami, liczbę warstw i neuronów w każdej warstwie.  Uczenie: Opisuje proces, który jest powszechnie definiowany jako trening. Może być przeprowadzany z wykorzystaniem różnych technik, takich jak propagacja wsteczna lub trening poziomów energetycznych. Identyfikuje sposób, w jaki określamy wagi pomiędzy neuronami.  Funkcja aktywacji: Określa funkcję określoną na wartości aktywacji, która jest przekazywana do każdego neuronu, i wewnętrzny stan neuronu. Opisuje, jak neuron działa (stochastycznie, liniowo itp.) oraz w jakich warunkach zostanie uaktywniony (wyzwoli się), a także dane wyjściowe, jakie przekaże do sąsiednich neuronów. Należy zwrócić uwagę, że niektórzy badacze uznają funkcję aktywacji za część architektury. Na początku łatwiej będzie jednak rozdzielić te dwa aspekty. Należy podkreślić, że sztuczne sieci neuronowe tylko w przybliżony sposób reprezentują działanie biologicznego mózgu. Biolo- giczna sieć neuronowa to model o wiele bardziej skomplikowany. Nie należy jednak się na tym 51 Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python koncentrować. Sztuczne sieci neuronowe są zdolne do wykonywania wielu przydatnych zadań (o czym przekonamy się wkrótce) — mogą na przykład aproksymować na dowolnym poziomie każdą funkcję przekształcającą dane wejściowe na wyjściowe. Rozwój sieci neuronowych bazuje na następujących założeniach:  Przetwarzanie informacji odbywa się, w swojej najprostszej formie, za pośrednictwem prostych elementów zwanych neuronami.  Neurony są połączone i wymieniają pomiędzy sobą sygnały za pośrednictwem łączy.  Połączenia pomiędzy neuronami mogą być silniejsze lub słabsze i to decyduje o tym, w jaki sposób są przetwarzane informacje.  Każdy neuron ma wewnętrzny stan, który jest określony przez wszystkie połączenia przychodzące od innych neuronów.  Każdy neuron ma inną funkcję aktywacji, która jest obliczana na wewnętrznym stanie neuronu i określa jego sygnał wyjściowy. W następnym punkcie zdefiniujemy szczegółowo sposób, w jaki działa neuron, oraz to, jak współdziała z innymi neuronami. Neurony i warstwy Co to jest neuron? Neuron reprezentuje jednostkę przetwarzania, która przyjmuje wartość wej- ściową i, zgodnie z określonymi regułami, przekazuje inną wartość na wyjściu. W 1943 roku Warren McCulloch i Walter Pitts opublikowali artykuł [W.S. McCulloch i W. Pitts, A Logical Calculus of the Ideas Immanent in Nervous Activity, „The Bulletin of Mathematical Biophysics”, 5 (4), s. 115–133, 1943], w którym opisali sposób działania pojedynczego biolo- gicznego neuronu. Składnikami biologicznego neuronu są dendryty, soma (ciało komórki), ak- sony i szczelina synaptyczna. Pod innymi nazwami części te wchodzą również w skład sztucznego neuronu. 52 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe Dendryty doprowadzają sygnał wejściowy z innych neuronów do somy — ciała neuronu. So- ma to miejsce, w którym dane wejściowe są przetwarzane i sumowane. Jeśli sygnał wejściowy jest powyżej określonego progu, neuron „wyzwala się” i przekazuje pojedynczą daną wyjściową za pomocą sygnałów elektrycznych przez aksony. Pomiędzy aksonami neuronu nadawczego a dendrytami neuronów odbierających znajduje się szczelina synaptyczna, która dopasowuje chemicznie impulsy, dostosowując ich częstotliwości. W sztucznej sieci neuronowej częstotli- wość modeluje się za pomocą liczbowej wagi: im wyższa częstotliwość, tym silniejszy impuls, a tym samym wyższa waga. Możemy zatem utworzyć tabele równoważności pomiędzy neuro- nami biologicznymi i sztucznymi (jest to bardzo uproszczony opis, ale wystarczający do naszych celów): Schemat porównawczy neuronu biologicznego i sztucznego Dlatego możemy schematycznie opisać sztuczny neuron w następujący sposób (pierwszy ry- sunek na kolejnej stronie). Prostą wartość aktywacji neuronu można wyrazić wzorem α(x) = Σi wixi, gdzie xi oznacza wartość każdego neuronu wejściowego, natomiast wi to wartość połączenia pomiędzy neuronem i a wyj- ściem. W pierwszym rozdziale, we wprowadzeniu do sieci neuronowych, zaprezentowaliśmy pojęcie przesunięcia (ang. bias). Jeśli uwzględnimy przesunięcie i chcemy, aby jego obecność była jawna, możemy przepisać poprzednie równanie do postaci α(x) = Σiwixi+b. Efektem przesunięcia jest przekształcenie hiperpłaszczyzny zdefiniowanej przez wagi. Dzięki temu nie musi ona przechodzić przez początek układu współrzędnych. Wartość aktywacji należy interpretować jako wartość wewnętrznego stanu neuronu. 53 Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python Na środku tej ilustracji pokazano neuron, czyli somę. Otrzymuje ona wejście (aktywację) i ustawia wewnętrzny stan neuronu, który wyzwala wyjście (funkcja aktywacji). Sygnał wejściowy jest przekazywany od innych neuro- nów, a jego intensywność jest dopasowywana za pomocą wag (szczelina synaptyczna) Jak wspomniano w poprzednim rozdziale, zdefiniowaną wcześniej wartość aktywacji można zinterpretować jako iloczyn skalarny pomiędzy wektorem w a wektorem x. Wektor x jest pro- stopadły do wektora wagi w, jeśli w,x = 0, dlatego wszystkie wektory x takie, że w,x = 0 definiują hiperpłaszczyznę w Rn (gdzie n oznacza wymiar wektora x). Stąd każdy wektor x spełniający warunek w,x 0 jest wektorem po prawej stronie hiper- płaszczyzny zdefiniowanej przez w. Zatem neuron jest liniowym klasyfikatorem, który zgodnie z tą zasadą uaktywni się, gdy sygnał wejściowy osiągnie wartość powyżej określonego progu lub — geometrycznie — jeśli wejście znajduje się z jednej strony hiperpłaszczyzny zdefiniowanej przez wektor wag. Pojedynczy neuron jest liniowym klasyfikatorem Sieć neuronowa może zawierać nieskończoną liczbę neuronów, ale niezależnie od tego w kla- sycznej sieci wszystkie neurony są ułożone w warstwy. Warstwa wejściowa reprezentuje zbiór danych — warunki początkowe. Na przykład, jeśli wejściem jest obraz w skali szarości, to war- stwa wejściowa jest reprezentowana dla każdego piksela przez neuron wejściowy z wewnętrzną 54 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe wartością określającą intensywność piksela. Należy jednak zwrócić uwagę, że neurony w war- stwie wejściowej nie są takie same jak inne, ponieważ ich wyjście jest stałe i równe wartości ich stanu wewnętrznego. Z tego powodu warstwa wejściowa, ogólnie rzecz biorąc, nie jest brana pod uwagę. Zatem jednowarstwowa sieć neuronowa jest prostą siecią złożoną z tylko jednej (oprócz wejściowej) warstwy — wyjścia. Od każdego neuronu wejściowego rysujemy linię łą- czącą go ze wszystkimi neuronami wyjściowymi. Wartość neuronu jest dostosowywana przez sztuczną szczelinę synaptyczną, czyli wagę wi,j łączącą wejściowy neuron xi z neuronem wyj- ściowym yj. Zwykle każdy neuron wyjściowy reprezentuje klasę, na przykład w przypadku zbioru danych MNIST każdy neuron reprezentuje cyfrę. Dlatego jednowarstwową sieć neuronową można wykorzystać do dokonywania takich pro- gnoz, jak rozpoznawanie, jaką cyfrę przedstawia obraz wejściowy. W istocie zbiór wartości wyjściowych może być traktowany jako miara prawdopodobieństwa tego, że obraz reprezen- tuje określoną klasę, i dlatego neuron wyjściowy z największą wartością reprezentuje prognozę sieci neuronowej. Należy zauważyć, że neurony w tej samej warstwie nigdy nie są ze sobą połączone (patrz ry- sunek poniżej). Wszystkie neurony z jednej warstwy są połączone z neuronami w warstwie następnej i tak dalej: Przykład jednowarstwowej sieci neuronowej: neurony po lewej stronie reprezentują wejście z przesunięciem b, środkowa kolumna przedstawia wagi dla każdego połą- czenia, natomiast neurony po prawej reprezentują wyjście z uwzględnieniem wag w 55 Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python Jest to jeden z podstawowych i głównych warunków dla klasycznych sieci neuronowych. Nie ma połączeń wewnątrz warstw, natomiast każdy neuron połączony jest z każdym neuronem warstw sąsiednich. Na poprzednim rysunku jawnie pokazaliśmy wagi dla każdego połączenia pomiędzy neuronami, ale zazwyczaj krawędzie łączące neurony pośrednio reprezentują wagi. 1 reprezentuje blok przesunięcia, czyli neuron o wartości 1 z wagą połączenia równą przesunięciu, które wprowadziliśmy wcześniej. Jak już wspomniano wiele razy, jednowarstwowe sieci neuronowe są zdolne do klasyfikowania tylko tych klas, które dają się rozdzielić liniowo. Nic jednak nie stoi na przeszkodzie, aby po- między wejściem a wyjściem wprowadzić więcej warstw. Te dodatkowe warstwy są nazywane warstwami ukrytymi. Trójwarstwowa sieć neuronowa z dwoma warstwami ukrytymi. Warstwa wejściowa ma k neuronów wejściowych, pierwsza warstwa ukryta ma n ukrytych neuronów, natomiast druga zawiera m ukrytych neuronów. W zasadzie nie ma ograniczeń co do liczby ukrytych warstw. Wyjście w tym przykładzie to dwie klasy, y1 i y2. Na górze jest zawsze włączony neuron przesunięcia 1. Każde połączenie ma własną wagę w (nie pokazano jej dla uproszczenia) Różne rodzaje funkcji aktywacji Naukowcy zajmujący się neuronami biologicznymi odkryli setki, a może nawet ponad tysiąc różnych ich typów (patrz książka Gary’ego Marcusa i Jeremy’ego Freemana The Future of the Brain), dlatego musimy umieć zamodelować co najmniej kilka różnych typów sztucznych neu- ronów. Można to zrobić poprzez wykorzystanie różnych typów funkcji aktywacji, czyli funkcji określonych na wewnętrznym stanie neuronu reprezentowanym przez aktywację α(x) = Σiwixi obliczoną na podstawie wejść wszystkich neuronów wejściowych. Funkcja aktywacji to funkcja określona jako a(x), która definiuje wyjście neuronu. Najczęściej używane funkcje aktywacji to:  f(a) = a: Funkcja ta przekazuje wartość aktywacji. Jest nazywana funkcją tożsamości. 56 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe    af  aif 1   aif 0    0 0 : Ta funkcja aktywuje neuron, jeśli wartość aktywacji jest większa od podanej wartości. Określa się ją jako progową funkcję aktywacji.    af  1 exp 1    a : Ta funkcja jest jedną z najczęściej używanych. Przekazuje wartość w przedziale od 0 do 1 i można ją interpretować stochastycznie jako prawdopodobieństwo uaktywnienia neuronu. Jest powszechnie nazywana funkcją logistyczną lub logistycznym sigmoidem.    af  2 exp 1    a  11  1   exp exp      a a : Tę funkcję aktywacji określa się jako sigmoid bipolarny. Jest to po prostu przeskalowany sigmoid logistyczny o wartościach w przedziale (–1, 1).   a exp    a exp  : Tę funkcję aktywacji określa się jako tangens   a 2 exp  a  exp 2    af   1 1     exp exp   a    a  hiperboliczny. 0  0  aifa aif 0   af     : Ta funkcja aktywacji najbardziej przypomina odpowiednik dla neuronu biologicznego. Jest to połączenie funkcji tożsamości z funkcją progową. Określa się ją rektyfikatorem albo funkcją ReLU (Rectified Linear Unit). Jakie są podstawowe różnice między tymi funkcjami aktywacji? Często różne funkcje aktywa- cji sprawdzają się lepiej dla różnych problemów. Ogólnie rzecz biorąc, tożsamościowa funkcja aktywacji lub funkcja progowa, choć jest powszechnie używana do tworzenia sieci neurono- wych z takimi implementacjami, jak perceptron lub Adaline (Adaptive Linear Neuron — dosł. adaptacyjny neuron liniowy), niedawno straciła popularność na rzecz sigmoida logistycznego, tangensa hiperbolicznego lub funkcji ReLU. O ile funkcja tożsamości i funkcja progowa są znacznie prostsze i dlatego były preferowane w czasach, kiedy komputery nie miały wystarcza- jącej mocy obliczeniowej, o tyle często lepiej używać funkcji nieliniowych, takich jak funkcje sigmoidalne albo ReLU. Należy również zauważyć, że gdybyśmy używali tylko liniowych funkcji aktywacji, to wpro- wadzanie dodatkowych ukrytych warstw nie miałoby sensu, ponieważ złożenie funkcji liniowych nadal jest funkcją liniową. Ostatnie trzy funkcje aktywności różnią się następująco:  Mają inną przeciwdziedzinę.  Wraz ze wzrostem x ich pochodna maleje do zera. Fakt, że pochodna funkcji aktywacji zmniejsza się do zera wraz ze wzrostem x oraz dlaczego to jest ważne, wyjaśnimy później. Na razie wystarczy, jeśli zaznaczymy, że gradient (np. pochod- na) funkcji ma zasadnicze znaczenie dla trenowania sieci neuronowych. Mechanizm jest podob- ny do tego, który omawialiśmy na przykładzie regresji liniowej w pierwszym rozdziale, gdy sta- raliśmy się minimalizować funkcję, podążając w kierunku przeciwnym do kierunku wskazywanego przez jej gradient. 57 Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python Zakres wartości przyjmowanych przez funkcję logistyczną to (0, 1), co jest jednym z powo- dów, dla których jest to preferowana opcja dla sieci stochastycznych, czyli sieci z neuronami, które mogą się uaktywnić na podstawie funkcji probabilistycznej. Funkcja hiperboliczna jest bardzo podobna do logistycznej, ale jej zakres wynosi (–1, 1). Dla odróżnienia funkcja ReLU ma zakres (0, ∞), zatem może zwracać bardzo dużą wartość. Ważniejsza jest jednak pochodna każdej z tych trzech funkcji. Dla funkcji logistycznej f po- chodna ma postać f* (1–f), a jeśli f jest funkcją tangens hiperboliczny, to jej pochodna to (1+f)*(1–f). Dla funkcji ReLU pochodna jest znacznie prostsza — jej wartość to po prostu 1   0  aif aif   0 0 . Zobaczmy, jak szybko można obliczyć pochodną logistycznej funkcji sigmoidalnej. Zauważmy, że po- chodną względem a z funkcji 1 można wyrazić wzorem:  a 1  exp  1  exp   a exp      a 1   exp     a   1  1 exp     a   1   1  a exp   exp       a 1  1  1 exp     a  1  1   exp exp         a a     1 exp   1    1   f f     a Gdy będziemy mówić o propagacji wstecznej, zobaczymy, że jednym z problemów sieci głę- bokich jest znikający gradient (jak wspomniano wcześniej), a zaleta funkcji aktywacji ReLU polega na tym, że jej pochodna jest stała i nie dąży do 0 w miarę wzrostu wartości funkcji. Zwykle wszystkie neurony należące do tej samej warstwy mają taką samą funkcję aktywacji, natomiast w różnych warstwach funkcje aktywacji mogą być różne. Dlaczego jednak sieci neuronowe o głębokości przekraczającej jedną warstwę (złożone z dwóch lub większej liczby warstw) są tak ważne? Jak widzieliśmy, siła sieci neuronowych polega na ich zdolności do prognozowania — tzn. zdolności do aproksymacji funkcji zdefiniowanej na wejściu dla wymaga- nego wyjścia. Istnieje twierdzenie, zwane twierdzeniem o uniwersalnej aproksymacji, które głosi, że dowolną ciągłą funkcję na ograniczonych podzbiorach Rn można aproksymować za pomocą sieci neuronowej z co najmniej jedną warstwą ukrytą. Ponieważ formalny dowód tego twierdzenia jest zbyt złożony, aby go tutaj zaprezentować, podejmiemy próbę podania intuicyj- nego wyjaśnienia, stosując kilka podstawowych reguł matematycznych. W tym celu w roli funkcji aktywacji użyjemy logistycznej funkcji sigmoidalnej. 58 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe Logistyczną funkcję sigmoidalną można zdefiniować jako Załóżmy, że mamy tylko jeden neuron x = xi: 1  exp 1  a , gdzie α(x) = Σiwixi+b. Na wykresie z lewej strony zamieszczono standardową funkcję sigmoidalną z wagą 1 i przesunięciem 0. W środku jest wykres funkcji sigmoidalnej z wagą 10, natomiast po prawej przedstawiono funkcję sigmoidalną z wagą 10 i przesunięciem 50 W tym przypadku możemy łatwo wykazać, że jeśli w będzie bardzo duże, to funkcja logistyczna będzie bliska funkcji schodkowej (ang. step function). Im większa wartość w, tym funkcja bar- dziej przypomina funkcję schodkową, która w punkcie 0 ma wysokość 1. Z drugiej strony wartość b przesuwa wykres funkcji, a przesunięcie jest równe ujemnej wartości współczynnika b/w. Oznaczmy tę wartość t = –b/w. Przyjmując te założenia, rozważmy prostą sieć neuronową z jednym neuronem wejściowym i jedną warstwą ukrytą złożoną z dwóch neuronów i jednego neuronu wyjściowego w warstwie wyjściowej: X jest odwzorowywany na dwa ukryte neurony z takimi wagami i przesunięciem, że na górnym ukrytym neuro- nie współczynnik –b/w wynosi t1, natomiast na ukrytym neuronie dolnym ten współczynnik wynosi t2. Oba ukryte neurony korzystają z sigmoidalnej logistycznej funkcji aktywacji Sygnał wejściowy x jest mapowany na dwa neurony — jeden z taką wagą i przesunięciem, że ich współczynnik wynosi t1, i drugi, dla którego ten współczynnik wynosi t2. Następnie dwa ukryte neurony mogą być zmapowane na neuron wyjściowy odpowiednio z wagami w i –w. Jeśli zastosujemy logistyczną, sigmoidalną funkcję aktywacji dla każdego ukrytego neuronu oraz funkcję tożsamościową dla neuronu wyjściowego (bez przesunięcia), to otrzymamy funk- cję schodkową od t1 do t2 z wysokością w podobną do pokazanej na poniższym rysunku. Ponieważ za pomocą ciągu funkcji schodkowych, takich jak ta, którą pokazano na rysunku, można zaproksymować dowolną funkcję ciągłą na kompaktowym podzbiorze R, możemy uzyskać obraz pokazujący, dlaczego twierdzenie o uniwersalnej aproksymacji jest prawdziwe (w uproszczonej formie jest to treść tzw. twierdzenia o aproksymacji funkcjami prostymi). 59 Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python Nieznacznie większym wysiłkiem można uogólnić to twierdzenie dla Rn. Oto kod, który generuje wykres zamieszczony na poniższym rysunku: #Użytkownik może zmieniać wartości wagi w, #a także biasValue1 i biasValue2, aby obserwować, #jak zmienia się wykres dla różnych funkcji schodkowych import numpy import matplotlib.pyplot as plt weightValue = 1000 #do modyfikacji w celu zmiany początku funkcji schodkowej biasValue1 = 5000 #do modyfikacji w celu zmiany końca funkcji schodkowej biasValue2 = -5000 plt.axis([-10, 10, -1, 10]) print ( Funkcja schodkowa rozpoczyna się w punkcie {0} i kończy w punkcie {1} .format(-biasValue1/weightValue, -biasValue2/weightValue)) y1 = 1.0/(1.0 + numpy.exp(-weightValue*x - biasValue1)) y2 = 1.0/(1.0 + numpy.exp(-weightValue*x - biasValue2)) #do modyfikacji w celu zmiany wysokości funkcji schodkowej w = 7 y = y1*w-y2*w plt.plot(x, y, lw=2, color= black ) plt.show() 60 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe Algorytm propagacji wstecznej Wcześniej pokazaliśmy, że za pomocą sieci neuronowych można zmapować wejścia na zde- terminowane wyjścia w zależności od stałych wag. Po zdefiniowaniu architektury sieci neu- ronowych (typ bez sprzężenia zwrotnego, liczba ukrytych warstw, liczba neuronów w war- stwie) i po wybraniu funkcji aktywacji dla każdego neuronu należy ustawić wagi, które z kolei zdefiniują wewnętrzne stany wszystkich neuronów w sieci. Zobaczymy, jak to zrobić dla sieci jednowarstwowej, a następnie, w jaki sposób rozszerzyć to pojęcie dla głębokiej sieci bez sprzężenia zwrotnego. W przypadku głębokiej sieci neurono- wej algorytm ustawiania wag określa się jako algorytm odwróconej dystrybucji. Na opisanie i objaśnienia dla tego algorytmu poświęcimy większą część niniejszego podrozdziału, ponieważ jest to jedno z najważniejszych pojęć wielowarstwowych sieci neuronowych bez sprzężenia zwrotnego. Najpierw jednak pokrótce omówimy ten algorytm dla jednowarstwowych sieci neuronowych. Ogólne pojęcie, które należy zrozumieć, jest następujące: każda sieć neuronowa jest przybli- żeniem funkcji, dlatego każda sieć neuronowa nie jest równa żądanej funkcji, ale różni się od niej o pewną wartość. Ta wartość to błąd, a naszym celem powinno być dążenie do zminimali- zowania go. Ponieważ w sieci neuronowej błąd jest funkcją wag, to chcemy minimalizować błędy w stosunku do wag. Funkcja błędu jest funkcją wielu wag. Jest to zatem funkcja wielu zmiennych. W ujęciu ma- tematycznym zbiór punktów, w których ta funkcja ma wartość 0, reprezentuje hiperpłaszczy- znę, a żeby znaleźć minimum dla tej powierzchni, należy wybrać punkt, a następnie podążać po krzywej w kierunku minimum. Regresja liniowa Regresję liniową wprowadziliśmy już w pierwszym rozdziale, ale ponieważ teraz mamy do czynienia z wieloma zmiennymi, to w celu uproszczenia zastosujemy notację macierzową. Niech x będzie sygnałem wejściowym. Możemy interpretować x jako wektor. W przypadku re- gresji liniowej będziemy rozważać pojedynczy, wyjściowy neuron y. W związku z tym zbiór wag w jest wektorem o takim samym rozmiarze, co wektor x. Załóżmy, że dla każdej wartości wejściowej x chcemy mieć na wyjściu docelową wartość t, natomiast dla każdego x sieć neuronowa zwraca wartość y zdefiniowaną przez wybraną funk- cję aktywacji. W tym przypadku wartość bezwzględna różnicy (y-t) stanowi różnicę pomiędzy wartością prognozowaną a wartością rzeczywistą dla konkretnej wejściowej próbki x. Jeśli mamy m wartości wejściowych xi, to każdej z nich odpowiada wartość docelowa ti. W tym przypadku obliczamy błąd średniokwadratowy Σi(yi-ti)2, gdzie każda wartość yi jest funkcją wagi w. 61 Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python Zatem błąd jest funkcją wagi w i zwykle jest oznaczany jako J(w). Jak wspomniano wcześniej, błąd reprezentuje hiperpłaszczyznę o wymiarze równym wymia- rowi w (niejawnie bierzemy pod uwagę także przesunięcie). Dla każdej wartości wj trzeba znaleźć krzywą, która prowadzi do wartości minimalnej na tej płaszczyźnie. Kierunek, w którym krzywa wzrasta, jest określony przez jej pochodną. Można ją określić wzorem:     d 2  i  y i w  i  t j Aby poruszać się w kierunku minimum, trzeba dla każdej wartości wj podążać w przeciwnym kierunku niż ten określonyprzez d . Obliczamy następujące wyrażenie:   d   i i  y w   i t 2  j     i i y  w  j 2  i t 2   i i y  w  j  i y  i t  Jeśli yi = xi, w , to i y  w  j  x i j i dlatego:    d  2  i  t i  y i w  j 2   i  i yx j i  i  t Notacja czasami może być myląca, zwłaszcza gdy widzi się ją po raz pierwszy. Wejścia są oznaczane za pomocą wektorów xi, przy czym indeks górny oznacza i-tą próbkę. Ponieważ x i w są wektorami, to in- deks dolny wskazuje na j-tą współrzędną wektora. Oznaczenie yi reprezentuje wyjście sieci neuronowej w odpowiedzi na wejście xi, natomiast ti reprezentuje cel — tzn. pożądaną wartość odpowiadającą wejściu xi. Aby podążać w kierunku minimum, trzeba zmieniać każdą wagę zgodnie z kierunkiem jej po- chodnej o niewielką wartość l. Jest to tzw. szybkość uczenia się (ang. learning rate), która za- zwyczaj jest znacznie mniejsza niż 1 (zwykle 0,1 lub mniej). Możemy zatem zmodyfikować wzór, uwzględniając szybkość uczenia się. Otrzymujemy: w j  w j  i x i j  y i i  t  Możemy też, bardziej ogólnie, zapisać zaktualizowany wzór w postaci macierzowej w nastę- pujący sposób: w  w  i     y i i  t 2     w     wJ 62 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe W powyższym wzorze  (tzw. nabla) reprezentuje wektor pochodnych cząstkowych. Proces opi- sany powyższym wzorem nazywany jest metodą gradientu prostego (ang. gradient descent).      w  i , ,  w  n    to wektor pochodnych cząstkowych. Zamiast zapisywania reguły aktualizacji wektora w oddzielnie dla każdego z jego składników wj możemy to zrobić w postaci macierzowej, gdzie zamiast ozna- czania cząstkowej pochodnej dla każdego j używamy  , co oznacza pochodne cząstkowe dla każdego j. Należy dodatkowo zwrócić uwagę, że aktualizację można przeprowadzić po obliczeniu wszyst- kich wektorów wejściowych, jednak w niektórych przypadkach wagi mogą być aktualizowane po każdej próbce lub po pewnej ustalonej liczbie próbek. Regresja logistyczna W regresji logistycznej wyjście nie jest ciągłe. Jest raczej zdefiniowane jako zbiór klas. W tym przypadku funkcja aktywacji nie będzie, tak jak wcześniej, funkcją tożsamości. Zamiast niej użyjemy logistycznej funkcji sigmoidalnej. Logistyczna funkcja sigmoidalna, zgodnie z tym, co powiedzieliśmy wcześniej, ma wartość rzeczywistą z przedziału (0, 1) i dlatego może być interpretowana jako funkcja prawdopodobieństwa. Z tego względu dobrze się nadaje do roz- wiązywania problemów polegających na rozdzieleniu dwóch klas. W tym przypadku celem jest wskazanie jednej z dwch klas, tej do której należy dany obiekt, a wyjście reprezentuje prawdo- podobieństwo, że dany obiekt należy do jednej z tych dwóch klas (na przykład t = 1). Notacja znów może być myląca. Cel jest oznaczony przez t. Może on mieć w tym przykładzie dwie war- tości. Są one często określane jako klasa 0 i klasa 1. Nie należy mylić tych wartości 0 i 1 z wartościami logistycznej funkcji sigmoidalnej, która jest funkcją ciągłą o wartościach rzeczywistych z przedziału od 0 do 1. Wartość rzeczywista funkcji sigmoidalnej reprezentuje prawdopodobieństwo, że wyjście będzie klasy 0 lub 1. Jeśli a jest wartością aktywacji neuronu — tak, jak zdefiniowano wcześniej — to σ(a) oznacza logistyczną funkcję sigmoidalną. Dlatego dla każdej próbki x prawdopodobieństwo, że wyj- ście będzie klasy y, z uwzględnieniem wag w, wynosi:  wxtP ,     a if    ifa    1  t t   1 0 Powyższe równanie możemy zapisać krócej w następujący sposób:  wxtP ,     t a  1     1 a  t A ponieważ dla każdej próbki xi prawdopodobieństwa P(ti|xi, w) są niezależne, to globalne prawdopodobieństwo można opisać w następujący sposób:  wxtP ,   wxtP   , i i i    i i  a  ti  1  i 1  t  a i   63 Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python Jeśli obliczymy logarytm naturalny z poprzedniego równania (aby zamienić iloczyny w sumy), otrzymamy następujące wyrażenie:     ,   wxtP log   log     t i i log   i  a  i  1  i   t a  log  1  1 t i  1  l t    a  a i       Celem jest teraz maksymalizacja tego logarytmu w celu uzyskania największego prawdopo- dobieństwa prognozowania prawidłowego wyniku. Zazwyczaj można to osiągnąć tak, jak w po- przednim przypadku, za pomocą metody gradientów prostych w celu minimalizacji funkcji kosztów J(w) zdefiniowanej za pomocą wzoru J(w) = -log(P(y│x,w)). Tak jak poprzednio, obliczamy pochodną funkcji kosztów względem wag wj. Otrzymujemy: j  w   i  t i  i t   a     a i i log  log  w  j i    1  i t   1    i t i  a     a i  1  log  1  w  log j i     1 t i      i i log t i   a  log  1  a  i    i i t     1  w   i    i xa 1  t i j j    i xa i j  Aby zrozumieć ostatnie równanie, przypomnijmy następujące fakty: i i  a     a  i a   a  a  j   a w  0   i j i   1  a  i  i xw kk k w  j  b  x i j W konsekwencji, zgodnie z regułą łańcuchową:   i i    a  log  w  j   i 1  a  i   a i   1     i xa i j  1     i xa i j  Podobnie:  log  i  a i    1  w  j   i xa i j  64 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe Ogólnie rzecz biorąc, w przypadku wieloklasowego wyjścia t, gdzie t jest wektorem (t1, …, tn), możemy uogólnić to równanie, korzystając ze wzoru J(w) = −log(P(y|x,w)) =Σijti jlog(σ(ai)). W ten sposób otrzymujemy równanie aktualizacji wag:    a i  w j  w j  i x i j i  t  Przypomina ono regułę aktualizacji, z którą zetknęliśmy się podczas omawiania regresji li- niowej. Propagacja wsteczna W przypadku sieci jednowarstwowej dostrajanie wag jest łatwe, ponieważ można skorzystać z regresji liniowej lub regresji logistycznej i równocześnie dostosować wagi tak, aby uzyskać mniejszy błąd (minimalizując funkcję kosztów). Dla wielowarstwowych sieci neuronowych mo- żemy użyć podobnego rozumowania w przypadku wag, które są używane do połączenia ostatniej warstwy ukrytej z warstwą wyjścia, ponieważ wiemy, jaką postać ma mieć warstwa wyjściowa. Nie możemy jednak postąpić tak samo dla warstw ukrytych, ponieważ nie wiemy wcześniej, jakie powinny być w nich wartości neuronów. Zamiast tego obliczamy błąd w ostatniej ukrytej warstwie i szacujemy, jaki mógłby on być w warstwie poprzedniej. Błąd jest propagowany z ostatniej do pierwszej warstwy, stąd nazwa propagacja wsteczna. Propagacja wsteczna jest jednym z najbardziej skomplikowanych algorytmów. Aby jednak go zrozumieć, wystarczy znać podstawy rachunku różniczkowego, w tym zasadę różniczkowania funkcji złożonej. Najpierw wprowadzimy niektóre oznaczenia. Literą J oznaczamy koszt (błąd) dla funkcji aktywacji y zdefiniowanej na wartości aktywacji a (y może być na przykład logi- styczną funkcją sigmoidalną), która jest funkcją wag w i wejścia x. Zdefiniujemy także wi,j — wagę pomiędzy i-tą wartością wejściową a j-tym wyjściem. Wejście i wyjście w opisie propa- gacji wstecznej rozumiemy bardziej ogólnie niż dla sieci jednowarstwowej: jeśli wi,j łączy pa- rę sąsiednich warstw, to jako wejściowe oznaczamy neurony w pierwszej z dwóch kolejnych warstw, a jako wyjściowe neurony w drugiej z nich. Aby zbytnio nie rozbudowywać notacji, a jednocześnie uwzględnić konieczność oznaczenia warstwy, w której jest każdy neuron, zakładamy, że i-te wejście yi jest zawsze w warstwie po- przedzającej j-te wyjście yj. Należy zwrócić uwagę, że litera y jest używana zarówno do oznaczenia wejścia, jak i wyjścia funkcji ak- tywacji. yj jest wyjściem z funkcji aktywacji, ale jest również wejściem do warstwy następnej. Z tego względu możemy interpretować wartości yj jako funkcje wartości yj. Używamy również indeksów dolnych i oraz j wszędzie, gdzie mamy element z indeksem dol- nym i należącym do warstwy poprzedzającej warstwę zawierającą element oznaczony indek- sem dolnym j. 65 Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python W tym przykładzie warstwa 1 reprezentuje wejście, a warstwa 2 wyjście, zatem wi,j to liczba łącząca wartość yj w pierwszej warstwie z wartością yj w następnej warstwie Używając tej notacji oraz reguły różniczkowania funkcji złożonej, możemy zapisać dla ostat- niej warstwy naszej sieci neuronowej następujący wzór: J  w  ji ,  J  y  j y  a  j j a  w  i j , j Ponieważ wiemy, że j a  w  ji ,  y j , to otrzymujemy: J  w  ji ,  J  y  j y  a  j j y i Jeśli y jest logistyczną funkcją sigmoidalną zdefiniowaną wcześniej, to otrzymamy taki sam wynik jak na końcu poprzedniego punktu, ponieważ znamy funkcję kosztów i możemy obliczyć wszystkie pochodne. Dla wcześniejszych warstw zachodzi taka sama reguła: J  w  ji ,  J  y  j y  a  j j a  w  i j , j W rzeczywistości aj jest funkcją aktywacji, która — jak wiadomo — jest funkcją wag. Wartość yj jest funkcją aktywacji neuronu w drugiej warstwie, a funkcja kosztów zależy od wybranej funkcji aktywacji. Choć sieć składa się z kilku warstw, to zawsze koncentrujemy się na parach warstw sąsiednich i dlatego, być może nadużywając nieco notacji, zawsze mamy warstwę pierwszą i drugą, tak jak pokazano na ry- sunku 10. Są to odpowiednio warstwa wejścia i warstwa wyjścia. 66 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe Ponieważ wiemy, że j a  w  ji ,  y i oraz że y  a  j j jest pochodną funkcji aktywacji, którą możemy obliczyć, to musimy tylko obliczyć pochodną J  jy  . Zwróćmy uwagę, że jest to pochodna błędu w odniesieniu do funkcji aktywacji drugiej war- stwy. Jeśli możemy obliczyć tę pochodną dla ostatniej warstwy i mamy wzór, który pozwala obliczyć pochodną dla jednej warstwy przy założeniu, że możemy obliczyć pochodną dla war- stwy następnej, to możemy obliczyć wszystkie pochodne, począwszy od ostatniej warstwy w kierunku pierwszej. Należy pamiętać, że zgodnie z definicją wartości yj są to wartości aktywacji dla neuronów drugiej warstwy, ale są one również funkcjami aktywacji, a zatem wartościami aktywacji warstwy pierwszej. Dlatego stosując regułę różniczkowania funkcji złożonej, otrzymujemy: J   y   i J  y  j j y  y  j i   j J  y  j y  a  j j a  y  j i Tak jak wcześniej, możemy obliczyć zarówno y  a  j j to możemy obliczyć J  , a ponieważ możemy obliczyć iy  , jak i a  y  J  jy  j w  ji , i , zatem kiedy znamy J  jy  , dla ostatniej warstwy, to możemy poruszać się wstecz i obliczyć dla dowolnej warstwy J  iy  , a tym samym J  iw , j . Podsumowując, jeśli mamy sekwencję warstw, gdzie: yi → yj → yk to prawdziwe są poniższe dwa podstawowe równania, gdzie sumę w drugim równaniu należy czytać jako sumę po wszystkich wychodzących połączeniach od yj do dowolnego neuronu yk w kolejnej warstwie. a y   w a   ji j , y J     y y  k J  w  ji , J  y  j J  y  i j j k j   k Korzystając z tych dwóch równań, można obliczyć pochodne kosztów w odniesieniu do każdej warstwy. 67 Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python Jeśli podstawimy  j J  y  j y  a  j j , to δj reprezentuje odchylenie kosztu względem wartości ak- tywacji. Wartość δj możemy interpretować jako błąd na poziomie neuronu yj. Możemy zatem przepisać powyższe równanie:     w ji ,    j j j j j j j J  y  j y  y  i J  y  i J  y  j y  a  j a  y  i Z tego wynika, że   , w ji  i j j       y  i a  i . Powyższe dwa równania pozwalają patrzeć na propa- gację wsteczną w inny sposób — jako odchylenie kosztu w stosunku do wartości aktywacji — i dostarczają wzoru do obliczenia tego odchylenia dla każdej warstwy, jeśli dysponujemy wartością odchylenia dla warstwy następnej:  j J  y  j y  a  j j   , w ji  i j j       y  i a  i Możemy również połączyć te równania i wykazać, że: J  w  ji ,  j j a  w  ji ,  y i j Algorytm propagacji wstecznej dla aktualizacji wag można określić dla każdej warstwy nastę- pującym wzorem: w  , i w ji ,  y i j j W ostatnim punkcie tego podrozdziału zaprezentujemy przykładowy kod, który pomoże zro- zumieć i zastosować przedstawione pojęcia i wzory. Zastosowania praktyczne Kilka przykładów zastosowań uczenia maszynowego zaprezentowaliśmy w poprzednim roz- dziale. Sieci neuronowe mają wiele podobnych zastosowań. W tym punkcie dokonamy przeglądu wybranych zastosowań, w których użyto sieci neurono- wych w czasie, gdy stały się one popularne w końcu lat osiemdziesiątych i na początku lat dziewięćdziesiątych. Wtedy to odkryto propagację wsteczną i powstały możliwości trenowa- nia sieci neuronowych o większej głębokości. 68 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe Przetwarzanie sygnałów Jest wiele zastosowań sieci neuronowych w dziedzinie przetwarzania sygnałów. Jednym z pierw- szych było tłumienie echa na liniach telefonicznych, zwłaszcza dla połączeń międzykonty- nentalnych. Bernard Widrow i Marcian Hoff rozpoczęli pracę nad ich rozwojem w 1957 roku. W systemie Adaline do trenowania wykorzystano w roli funkcji aktywacji funkcję tożsamo- ściową. Dążono do minimalizacji średniokwadratowego błędu pomiędzy wartością aktywacji a wartością docelową. System Adaline był trenowany pod kątem usunięcia echa z sygnału na linii telefonicznej poprzez podanie sygnału wejściowego zarówno na układ Adaline, jak i na linię telefoniczną. Różnica pomiędzy wyjściem z linii telefonicznej a wyjściem z systemu Ad- aline to błąd, który jest używany do uczenia sieci i usuwania zakłóceń (echa) z sygnału. Medycyna System Instant physician (dosł. błyskawiczny lekarz) został zaprojektowany przez Jamesa Andersona w 1986 roku. Głównym założeniem systemu było przechowywanie dużej ilości dokumentacji medycznej zawierającej informacje na temat objawów, diagnostyki i leczenia dla każdego przypadku. Uczenie sieci było ukierunkowane na dokonywanie jak najlepszych dia- gnoz i leczenia dla podanych różnych objawów. Znacznie później, wykorzystując głębokie sieci neuronowe, firma IBM opracowała sieć neu- ronową zdolną do przewidywania na podstawie notatek lekarzy — podobnie jak robią to do- świadczeni kardiolodzy — możliwych schorzeń serca. Autonomiczne samochody Derrick Nguyen i Bernard Widrow w 1989 roku oraz Thomas Miller, Richard Sutton i Paul Werbos w roku 1990 opracowali sieć neuronową zdolną do dostarczania wskazówek dotyczących sterowania dużym samochodem ciężarowym z przyczepą cofającym do strefy załadunku. Sieć neuronowa w tym zastosowaniu składa się z dwóch modułów: pierwszy potrafi obliczać nowe po- zycje za pomocą sieci neuronowej złożonej z wielu warstw, przez naukę reakcji pojazdu na różne sygnały i jest nazywany emulatorem. Drugi moduł zwany kontrolerem uczy się wydawać od- powiednie polecenia za pomocą emulatora, aby poznać pozycję pojazdu. W ostatnich latach autonomiczne samochody odniosły ogromny sukces i stały się rzeczywistością, choć zastosowa- no w nich znacznie bardziej skomplikowane głębokie sieci neuronowe w połączeniu z sygna- łami wejściowymi z kamer, odbiorników GPS, lidarów i sonarów. Biznes W 1988 roku Edward Collins, Sushmito Ghosh i Christopher Scofield opracowali sieć neuro- nową, którą można wykorzystać do oszacowania, czy należy udzielić kredytu hipotecznego. Wykorzystując dane pochodzące od rzeczoznawców kredytów hipotecznych, szkolono sieci neu- ronowe pod kątem ustalania, czy wnioskodawcom może być przyznany kredyt. Wejściem było kilka cech takich, jak liczba lat zatrudnienia wnioskodawcy, poziom dochodów, liczba osób na utrzymaniu, szacowana wartość nieruchomości i tak dalej. 69 Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python Rozpoznawanie wzorców Ten problem omawialiśmy wiele razy. Jednym z obszarów, w których zastosowano sieci neuro- nowe, jest rozpoznawanie znaków. Mechanizm ten może na przykład być stosowany do rozpo- znawania cyfr, a także pisanych ręcznie kodów pocztowych. Generowanie mowy W 1986 roku Terrence Sejnowski i Charles Rosenberg opracowali powszechnie znany przy- kład biblioteki NETtalk, która generuje wypowiadane słowa przez czytanie tekstu pisanego. Wymaga ona do działania zbioru próbek napisanych słów wraz z wymową. Wejście zawiera zarówno wymawianą literę, jak i litery przed nią i za nią (zazwyczaj trzy), a trening odbywa się z wykorzystaniem najczęściej wypowiadanych słów wraz z ich transkrypcją fonetyczną. W im- plementacji biblioteki sieć neuronowa najpierw uczy się rozróżniania samogłosek od spółgłosek, a następnie rozpoznawania początków i zakończeń słów. Zanim wypowiadane słowa staną się zrozumiałe, zwykle potrzeba kilku przebiegów, a postępy uczenia się czasami przypominają nauczanie dzieci sposobu wymawiania słów. Przykład kodu sieci neuronowej dla funkcji XOR Powszechnie wiadomo — wspominaliśmy o tym już wcześniej — że jednowarstwowe sieci neuronowe nie potrafią przewidzieć wyniku funkcji XOR. Potrafią klasyfikować tylko zbiory dające się rozdzielić liniowo. Jednak, jak widzieliśmy, zgodnie z twierdzeniem o uniwersalnej aproksymacji, każdą funkcję można aproksymować za pomocą sieci dwuwarstwowej o odpo- wiednio złożonej architekturze. W prezentowanym przykładzie stworzymy sieć neuronową z dwoma neuronami w ukrytej warstwie i pokażemy, że za jej pomocą można zamodelować funkcję XOR. Kod napiszemy jednak w taki sposób, aby Czytelnik mógł go zmodyfikować dla dowolnej liczby warstw i neuronów w każdej warstwie. Dzięki temu możliwe jest zasymulowanie różnych scena- riuszy. Jako funkcję aktywacji dla tej sieci wykorzystamy funkcję tangensa hiperbolicznego. Na potrzeby trenowania sieci zaimplementujemy opisany wcześniej algorytm propagacji wstecznej. Będziemy musieli zaimportować tylko jedną bibliotekę — numpy, chociaż jeśli Czytelnik chce zwizualizować wyniki, polecamy również zaimportowanie biblioteki matplotlib. Dlatego pierw- sze linijki kodu mają następującą postać: import numpy from matplotlib.colors import ListedColormap import matplotlib.pyplot as plt Następnie definiujemy naszą funkcję aktywacji i jej pochodne (w tym przykładzie używamy funkcji tanh(x)): 70 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe def tanh(x): return (1.0 - numpy.exp(-2*x))/(1.0 + numpy.exp(-2*x)) def tanh_derivative(x): return (1 + tanh(x))*(1 - tanh(x)) Następnie zdefiniujemy klasę NeuralNetwork: class NeuralNetwork: Zgodnie z regułami składni Pythona dla całego kodu wewnątrz klasy NeuralNetwork trzeba zastosować wcięcie. Definiujemy konstruktor klasy NeuralNetwork, tzn. jej zmienne, które w tym przypadku będą tworzyć architekturę sieci neuronowej, czyli ile ma warstw i ile neuronów w każdej warstwie. Zainicjujemy również losowo wagi tak, by ich wartości mieściły się w zakresie pomiędzy –1 a 1. net_arch jest jednowymiarową tablicą zawierającą liczby neuronów w każdej warstwie: na przykład [2,4,1] oznacza warstwę wejścia z dwoma neuronami, ukrytą warstwę z czterema neuronami i warstwę wyjścia z jednym neuronem. Ponieważ badamy funkcję XOR, to w warstwie wejścia musimy mieć dwa neurony, natomiast w warstwie wyjścia tylko jeden: #net_arch składa się z listy liczb całkowitych, które oznaczają #liczbę neuronów w każdej warstwie, # tzn. architekturę sieci def init (self, net_arch): self.activity = tanh self.activity_derivative = tanh_derivative self.layers = len(net_arch) self.steps_per_epoch = 1000 self.arch = net_arch self.weights = [] #zakres wartości wag (–1,1) for layer in range(self.layers - 1): w = 2*numpy.random.rand(net_arch[layer] + 1, net_arch[layer+1]) - 1 self.weights.append(w) W tym kodzie określiliśmy funkcję aktywacji jako tangens hiperboliczny i zdefiniowaliśmy jej pochodną. Określiliśmy także liczbę kroków treningowych przypadających na epokę. Na ko- niec zainicjowaliśmy wagi, dbając o to, aby zrobić to także dla przesunięć, które dodamy później. Dalej musimy zdefiniować funkcję fit, która będzie trenować naszą sieć. W ostatnim wierszu nn reprezentuje klasę NeuralNetwork, natomiast predict to metoda tej klasy, którą zdefiniuje- my później: #data to zbiór wszystkich możliwych par wartości logicznych #True lub False określonych przez liczby 1 lub 0 #labels zawiera wynik logicznej operacji xor #na każdej z tych par wejściowych 71 Poleć książkęKup książkę Deep Learning. Uczenie głębokie z językiem Python def fit(self, data, labels, learning_rate=0.1, epochs=100): #Dodanie przesunięć do warstwy wejścia ones = numpy.ones((1, data.shape[0])) Z = numpy.concatenate((ones.T, data), axis=1) training = epochs*self.steps_per_epoch for k in range(training): if k self.steps_per_epoch == 0: print( epochs: {} .format(k/self.steps_per_epoch)) for s in data: print(s, nn.predict(s)) Działanie powyższego kodu sprowadza się do dodania 1 do danych wejściowych (zawsze włączony neuron przesunięcia) i skonfigurowania go w taki sposób, aby w celu śledzenia po- stępów wyświetlać wynik na koniec każdej epoki. Teraz wykonamy kolejny krok — skonfigu- rujemy propagację w przód: sample = numpy.random.randint(data.shape[0]) y = [Z[sample]] for i in range(len(self.weights)-1): activation = numpy.dot(y[i], self.weights[i]) activity = self.activity(activation) #dodaj przesunięcie do następnej warstwy activity = numpy.concatenate((numpy.ones(1), numpy.array(activity))) y.append(activity) #ostatnia warstwa activation = numpy.dot(y[-1], self.weights[-1]) activity = self.activity(activation) y.append(activity) Po każdym kroku chcemy aktualizować wagi, zatem losowo wybieramy jeden z wejściowych punktów danych, następnie konfigurujemy propagację w przód poprzez ustawienie aktywacji dla każdego neuronu, a potem stosujemy funkcję tanh(x) w odniesieniu do wartości aktywa- cji. Ponieważ mamy przesunięcie, dodajemy je do naszej macierzy y, która zawiera wartości wyjściowe dla każdego neuronu. Następnie, w celu korekty wag, wykonujemy algorytm propagacji wstecznej dla błędu: #błąd dla warstwy wyjścia error = labels[sample] - y[-1] delta_vec = [error * self.activity_derivative(y[-1])] #należy zacząć od tyłu #od przedostatniej warstwy for i in range(self.layers-2, 0, -1): error = delta_vec[- 1].dot(self.weights[i][1:].T) error = error*self.activity_derivative(y[i][1:]) delta_vec.append(error) #Teraz trzeba ustawić wartości od tyłu do przodu delta_vec.reverse() 72 Poleć książkęKup książkę Rozdział 2. • Sieci neuronowe #Na koniec korygujemy wagi, #używając reguł propagacji wstecznej for i in range(len(self.weights)): layer = y[i].reshape(1, nn.arch[i]+1) delta = delta_vec[i].reshape(1, nn.arch[i+1]) self.weights[i] +=learning_rate*layer.T.dot(delta) Na tym kończymy implementację algorytmu propagacji wstecznej. Pozostało napisanie funkcji predict, która sprawdza wyniki: def predict(self, x): val = numpy.concatenate((numpy.ones(1).T, numpy.array(x))) for i in range(0, len(self.weights)): val = self.activity(numpy.dot(val, self.weights[i])) val = numpy.concatenate((numpy.ones(1).T, numpy.array(val))) return val[1] W tym momencie trzeba jeszcze napisać funkcję main, która ma następującą postać: if __name__ == __main__ : numpy.random.seed(0) #Zainicjowanie obiektu klasy NeuralNetwork z #2 neuronami wejściowymi #2 neuronami ukrytymi #1 neuronem wyjściowym nn = NeuralNetwork([2,2,1]) X = numpy.array([[0, 0], [0, 1], [1, 0], [1, 1]]) #Ustawienie etykiet — prawidłowych wyników operacji XOR
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Deep Learning. Uczenie głębokie z językiem Python. Sztuczna inteligencja i sieci neuronowe
Autor:
, , ,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: