Myśląca maszyna. Wstęp do Sztucznej Inteligencji, cz. 2 [WIDEO]
by Petros Psyllos

W pierwszej części kursu poznaliśmy historię sztucznej inteligencji oraz problemy stojące przed tą dziedziną. Przedstawiliśmy różne metody sztucznej inteligencji skupiając się na jednej z nich, tj. sztucznych sieciach neuronowych (SSN). Teraz przyjdziemy do wielowarstwowych sieci neuronowych oraz do uczenia neuronu i prostej sieci. Tradycyjnie będę starał się wyjaśnić ideę bez użycia zaawansowanego aparatu matematycznego, albowiem ułatwi to przyswojenie materiału dla początkujących czytelników.

 
PRZYPOMNIENIE WIADOMOŚCI

W ostatnim czasie dużo słyszy się ​o uczeniu maszynowym, głębokim uczeniu, sztucznej inteligencji ​i inteligencji obliczeniowej. Postaram się wyjaśnić znaczenie owych pojęć, jednak zaznaczam, że istnieje powszechny problem ​z finalnymi formalnymi definicjami. ​W artykule odwołuję się do definicji zaproponowanych przez prof. W. Ducha.​

 



Sztuczna Inteligencja (Artificial intelligence, AI) jest częścią tzw. Inteligencji Obliczeniowej, która dąży do rozwiązania zagadnień efektywnie niealgorytmizowalnych przy pomocy obliczeń (do tych zagadnień należy np. rozpoznawanie obiektów przez samochód autonomiczny - niewielka różnica w kształcie obiektu prowadzi do całkowicie odmiennych zachowań).​ Sztuczna inteligencja zajmuje się zagadnieniami, które nie są efektywnie algorytmizowalne w oparciu ​o modelowanie wiedzy i jest skupiona na rozwiązywaniu problemów z zakresu procesów kognitywnych wysokiego poziomu, takich jak język, myślenie, rozumowanie logiczne - czyli takich, gdzie potrzebna jest inteligencja do rozwiązania problemu. ​Inteligencja obliczeniowa zajmuje się ponadto procesami kognitywnymi niskiego poziomu - podstawowym przetwarzaniem sygnałów ​z sensorów, percepcją i sterowaniem.

Znamienną cechą ​systemów opierających się na sztucznej inteligencji jest zdolność do przyswajania, analizowania oraz do wykorzystywania zaistniałych faktów i wiedzy do pozyskiwania kolejnych faktów. Można także powiedzieć, że w ramach tej dziedziny tworzymy systemy, które przejawiają zachowania podobne do ludzkich. W tym celu badamy reguły rządzące zachowaniem człowieka, tworzymy modele matematyczne tych zachowań ​i implementujemy w formie programów komputerowych.

Uczenie maszynowe (Machine learning, ML) jest częścią sztucznej inteligencji lub inteligencji obliczeniowej i zajmuje się algorytmami do analizowania danych i uczenia się na podstawie tych danych, a następnie wykorzystywania zdobytej wiedzy do np. przewidywania ceny akcji na giełdzie. Są cztery główne rodzaje uczenia maszynowego: nadzorowane, pół-nadzorowane, nienadzorowane i ze wzmocnieniem,  których istotę wyjaśnimy w dalszej części artykułu.

Głębokie uczenie (Deep learning) jest natomiast podzbiorem uczenia maszynowego i zajmuje się klasyfikowaniem, rozpoznawaniem, wykrywaniem i opisywaniem danych przy pomocy głębokich sztucznych sieci neuronowych ("na głębszym poziomie" niż tradycyjne uczenie maszynowe). ​W tym przypadku struktura modelu jest hierarchiczna ​i złożona z wielu nieliniowych warstw przetwarzania. Komputer buduje pojęcia złożone na podstawie pojęć prostszych. Pozwala to na rozwiązywanie bardziej skomplikowanych problemów, takich jak wykrywanie obiektów, rozpoznawanie mowy, klasyfikacja obrazów (przykładowo obraz osoby jest reprezentowany poprzez połączenie prostszych pojęć – ​z obrazu są wyciągane coraz bardziej abstrakcyjne cechy). Głębokie uczenie jest zainspirowane strukturą mózgu i za cel stawia sobie budowę głębokich sieci neuronowych (rekurencyjnych, konwolucyjnych, jednokierunkowych, LSTM etc.).​



Sztuczne sieci neuronowe (SSN) to jedna z metod szerokiej dziedziny, jaką jest sztuczna inteligencja. W pierwszej części kursu przedstawiliśmy tę metodę metaforycznie jako jedną z galaktyk w przestrzeni kosmicznej. Innymi galaktykami są np. systemy ekspertowe, algorytmy genetyczne, zbiory przybliżone, logika rozmyta, drzewa decyzyjne, algorytmy inteligencji roju, metody symboliczne itd.

 

 Sieci neuronowe są często wykorzystywane do:​

- przetwarzania sygnałów (np. filtracji, konwersji),​
- predykcji (np. uszkodzeń maszyn),​
- klasyfikacji danych (np. klasyfikacji obrazów), ​
- analizy danych,​
- sterowania procesami dynamicznymi (robotyka, automatyka), ​
- wnioskowania na podstawie zgromadzonych danych.

Inspiracją przy tworzeniu sztucznych sieci neuronowych są biologiczne sieci neuronowe, mieszczące się w naszej głowie. Okazało się, że opis działania rzeczywistych neuronów można mocno uprościć i przenieść do systemu komputerowego, tworząc modele matematyczne (takie uproszczenie jest korzystne, bo symulacja tylko jednego, rzeczywistego neuronu wymagałaby potężnego superkomputera!). W ten sposób powstają sztuczne neurony, z których budujemy sztuczne sieci neuronowe. Matematycznym modelem sieci neuronowych są grafy skierowane. ​



Sztuczne sieci neuronowe są zestawem połączonych ze sobą elementów, zwanych sztucznymi neuronami. Każdy neuron posiada określoną liczbę wejść i zawsze jedno wyjście. Wyjścia sztucznych neuronów są połączone z wejściami kolejnych. W zależności od sposobu połączenia (architektury) sieci, otrzymujemy różne właściwości.​

 

 

Podstawowa klasyfikacja sztucznych sieci neuronowych to:​

  • Sieć jednokierunkowa jednowarstwowa – neurony ułożone w jednej warstwie, połączone wg zasady „każdy z każdym”. Sygnał przepływa w jednym kierunku – od wejścia do wyjścia;​

 

  • Sieć jednokierunkowa wielowarstwowa MLP – ma przynajmniej jedną warstwę ukrytą. Niektóre połączenia między neuronami mogą nie wystąpić. Sygnał przepływa od wejścia do wyjścia;​

 

  • Sieć rekurencyjna – w sieci istnieją połączenia neuronów wyjściowych z wejściowymi, tzw. sprzężenie zwrotne. Popularną siecią rekurencyjną jest asocjacyjna sieć Hopfielda. Sieci rekurencyjne mają dość skomplikowaną dynamikę i są trudne do uczenia;​



  • Sieć komórkowa - sprzężenia pomiędzy neuronami dotyczą tylko najbliższego sąsiedztwa. Przykładem jest sieć Kohonena, czyli sieć samoorganizująca się, która składa się z 2 warstw - warstwy wektorów wejściowych i mapy topologicznej. To sieć jednokierunkowa, gdzie każdy neuron warstwy wejściowej łączy się ​z neuronem warstwy topologicznej, ale neurony w poszczególnych warstwach nie komunikują się ze sobą.​



 

Jak działa neuron?  Temat przedstawiłem w 1 części kursu.


UCZENIE SIECI NEURONOWYCH

Uczenie sieci polega na właściwym doborze współczynników wagowych. Celem uczenia jest ustalenie takich wartości wag, które zagwarantują poprawne rozwiązywanie problemów. Zazwyczaj odpowiada za to specjalny algorytm uczenia, który automatycznie modyfikuje ich wartości. ​

Uczenie z nauczycielem

Rodzaje uczenia sztucznych sieci neuronowych:​

- Uczenie bez nauczyciela - uczenie nienadzorowane: sieć nie otrzymuje zewnętrznego sprzężenia zwrotnego w postaci prawidłowych rozwiązań. Stara się "sama" wypracować funkcję przetwarzania danych, np. uporządkowywania, wykrywania regularności w danych, ich klasyfikacji etc. ​(Uczenie spontaniczne, dominujące w okresie niemowlęcym)​

- Uczenie z nauczycielem - uczenie nadzorowane: sieci pokazuje się zestaw sygnałów na wejściach i prawidłowe odpowiedzi, na podstawie których uczy się udzielania poprawnych odpowiedzi. ​(Podobne do sposobu, wedle którego uczymy się nowych rzeczy w szkole)​

- Uczenie z krytykiem - uczenie ze wzmocnieniem: przypadek uczenia ​z nauczycielem, gdzie system w zależności od podjętej akcji otrzymuje informację zwrotną w postaci "nagrody" lub "kary". Jeżeli  działanie podjęte przez system daje wynik pozytywny, to jest wzmacniana tendencja do podobnego - właściwego - zachowania się w podobnych sytuacjach w przyszłości.​ (Uczenie dojrzałe, optymalizacja zysków w dłuższym okresie) ​

Ucząc sztuczne sieci neuronowe, a w szczególności skomplikowane głębokie sztuczne sieci neuronowe, nie do końca wiemy, jak te sieci przetwarzają informacje w swojej strukturze. Traktujemy je często jako czarne skrzynki.​ To podejście na szczęście się zmienia. W 2018 roku na MIT powstał projekt, który pozwala nam dokładnie przeanalizować działanie sieci służącej do klasyfikacji obiektów występujących na obrazach. Dzięki temu rozwiązaniu możemy dowiedzieć się, jak sieć przetwarza informacje podane na jej wejście i w jaki sposób określa kategorię rozpoznawanego obrazu. Więcej: http://netdissect.csail.mit.edu/

 

 

DLACZEGO BUDUJEMY SZTUCZNE SIECI NEURONOWE?

Możemy wyróżnić następujące główne cele budowy sztucznych sieci neuronowych:​

- Zrozumienie, jak działa nasz mózg;​
- Budowanie i testowanie algorytmów równoległego przetwarzania informacji, inspirowanych biologicznymi neuronami;​
- Rozwiązywanie praktycznych problemów, które nie są efektywnie algorytmizowalne, czyli nie da się wymyślić prostego algorytmu rozwiązującego sany problem (np. rozpoznawania obrazu, rozumienia języka).​

 



Dzięki rozwojowi sztucznych sieci neuronowych udało się rozwiązać wiele praktycznych problemów. W pierwszej części kursu przedstawiliśmy kilka interesujących zastosowań tej metody. Poniżej porcja kolejnych przykładów użycia sztucznej inteligencji, w tym SSN.

 

Na poniższym obrazku:

[1] Wykorzystanie sztucznych sieci neuronowych w głębokiej stymulacji mózgu pozwoli minimalizować negatywne skutki choroby Parkinsona.

[2] Przetwarzanie śladów cyfrowych jest kanwą marketingu celowanego - są tam oczywiście stosowane różne metody SI, w tym SSN. Sztuczna inteligencja jest "silnikiem" tych rozwiązań, a dane - "paliwem".

[3] Roboty medyczne pomogą wykonywać operacje. Nie byłoby to możliwe gdyby nie wspierająca chirurga (w przyszłości prawdopodobnie operację będą się odbywały bez udziału człowieka) sztuczna inteligencja.

[4] Aby mieszanka betonowa miała optymalne w danym środowisku właściwości, stosowane są sieci neuronowe odpowiedzialne za dobieranie jej składu.

 

 

Na poniższym obrazku:

[1] Głębokie sieci neuronowe łatwo wykorzystać przy tworzeniu różnych manipulacji - deepfakes są plagą współczesnego Internetu.

[2] Sieci neuronowe to doskonałe narzędzie do opisywania zawartości obrazów - już nie tylko rozpoznają obiekty, ale również opisują występujące pomiędzy nimi korelacje.

[3] Pismo można łatwo podrobić - nauczona sieć neurononowa potrafi pisać stylem wybranej osoby.

[4] Czy prezenterzy telewizyjni przestaną być potrzebni? Na to wychodzi, zwłaszcza gdy spojrzymy na bardzo realistycznego chińskiego prezentera generowanego przez sztuczną inteligencję.

[5] Alexa, Siri, Google Assistant - cyfrowi asystenci zawsze służą pomocą...

[6] Konwersja prostego, odręcznego rysunku na obraz wyglądający jak zdjęcie jest bardzo prosta, wystarczy wykorzystać sieci cGAN.

 

SIECI WIELOWARSTWOWE

W pierwszej części kursu doszliśmy do wniosku, że przy pomocy jednego neuronu nie da się rozwiązać problemu XOR. Zapoznaj się z tym problemem w I części kursu.

Aby dana funkcja mogła być aproksymowana przez powyższy neuron, sygnały wejściowe dla których funkcja przyjmuje wartość 1 muszą leżeć w innej półpłaszczyźnie rozdzielonej przez prostą niż takie, dla których funkcja przyjmuje wartość -1 (lub 0 dla funkcji aktywacji unipolarnych, gdzie wartość wyjścia zawiera się między 0 a 1). Obszary takie muszą być liniowo separowalne. Podobnie jest np. w przestrzeni trójwymiarowej (sieć o 3 wejściach), w której obszar jest dzielony przez płaszczyznę. Jak widać, sieć jednowarstwowa jest bardzo ograniczona!

 




Załóżmy, że Zosia lubi tylko małe kwiatki o mało intensywnym zapachu. Takiej przestrzeni nie da się podzielić na dwa obszary przy pomocy jednej prostej – obszary mają bardziej skomplikowaną formę. Do tego potrzebujemy sieci zawierające wiele warstw.​ Do rozwiązania prezentowanego problemu XOR potrzebujemy 1 dodatkowego neuronu. Sieć służąca do rozwiązania problemu XOR została przedstawiona poniżej.

 

 

Po jego dodaniu otrzymujemy następujący wykres (każdy neuron dzieli płaszczyznę sygnałów wejściowych na 2 części):​



Neuron 1 akceptuje odpowiedzi poniżej prostej y1, a neuron 2 powyżej prostej y2. Powstaje obszar wspólnej akceptacji. Odpowiedź „LUBI” zawiera się w tym obszarze. ​

 



Zastanawiacie się pewnie, skąd wziął się 3 neuron w przedstawionej powyżej nowej sieci? Już wyjaśniam. Zajmuje się wyciąganiem wniosków z warstwy poprzedniej, czyli neuronu 1 i 2, ​i wypracowuje sygnał y, czyli sygnał wyjściowy całej sieci.​


UCZENIE NEURONU Z NAUCZYCIELEM

Załóżmy, że neuron ma dwa wejścia ?1 i ?2. Sygnał wejściowy jest mnożony przez wagi ?1 i ?2. Suma iloczynów wartości wejściowych i wag jest argumentem funkcji aktywacji, w tym przypadku sigmoidalnej. Wartość funkcji aktywacji jest odpowiedzią neuronu. Dane dostarczane do sieci neuronowym nazywamy wektorem sygnałów wejściowych. Dla sieci o 2 wejściach wektor będzie dwuwymiarowy.

 



 

Aby nauczyć neuron, musimy posiadać ciąg uczący. Dla prezentowanego neuronu o 2 wejściach będzie się składał z 4 par sygnałów wejściowych i pożądanych odpowiedzi. Przykład takiego ciągu (w tym przypadku funkcji logicznej AND) zaprezentowano powyżej. Dla każdej pary wartości wejściowych x1 i x2 (o numerze i) liczymy błąd neuronu. Wzór na błąd ma postać:​



 ​

gdzie z(i) jest oczekiwaną odpowiedzią dla wartości x1 i x2 wzorca o indeksie (i) z ciągu uczącego, a y(i) to wartość ​z wyjścia neuronu – oczywiście dla wzorca ​o numerze (i). Ponieważ przed procesem uczenia neuron generuje prawie na pewno nieprawidłowe wyniki – wartość błędu na samym początku będzie duża.​

Znając błąd sieci dla wzorca o numerze i, możemy przystąpić do zmodyfikowania wartości wag neuronu. ​Wagi neuronu zmieniamy według wzoru:​

,

gdzie wn' - nowa wartość wagi, wn - bieżąca wartość wagi, η - współczynnik uczenia, δ - wartość błędu neuronu, dn - wartość wejściowa na danym dendrycie.

Musimy jeszcze znać wartość współczynnika uczenia η, który definiuje prędkość uczenia się neuronu. Współczynnik jest stały dla każdej iteracji uczenia i najczęściej mieści się w zakresie od 0.01 do 0.6. Im większy – tym większa zmiana wag przy takiej samej wartości błędu.​

 

Proces uczenia wymaga wielu powtórzeń. Im więcej razy uruchomimy algorytm dla wszystkich wzorców z ciągu uczącego (im więcej przebiegnie epok uczenia, czyli jednorazowego użycia wszystkich przykładów w zbiorze uczącym), tym błąd sieci będzie mniejszy. ​Po wykonaniu wszystkich iteracji w ramach każdej epoki, algorytm egzaminuje sieć. Przerywamy uczenie gdy uznamy, że błąd generowany przez sieć jest wystarczająco mały.​

 





UCZENIE SIECI WIELOWARSTWOWEJ Z NAUCZYCIELEM

Aby nauczyć sieć musimy posiadać ciąg danych uczących w postaci: zbiór sygnałów na wejściach i przypisane im prawidłowe odpowiedzi.​

 



To jest ciąg uczący dla pewnej sieci neuronowej o 2 wejściach i 1 wyjściu. Na etapie uczenia prezentujemy sieci pary wartości wejściowych (kolumny x1 i x2) i tak modyfikujemy wagi sieci (w rzeczywistości robi to za nas algorytm uczenia), aby wartości wyjściowe generowane przez sieć odpowiadały wartościom wyjściowym w zbiorze uczącym (kolumna z). Najlepiej zmieniać kolejność pokazywania przypadków uczących w kolejnych epokach (randomizować zbiór uczący), co zapobiega zapętleniu uczenia.​

W procesie uczenia szukamy takich wartości wag, aby błąd pomiędzy odpowiedzią sieci ​a odpowiedzią prawidłową z ciągu uczącego był jak najmniejszy.​ Podczas uczenia przeszukujemy powierzchnię błędów w celu znalezienia minimum funkcji błędu.​

 

W przykładzie powyżej: wagi w1 ​i w2 na płaszczyźnie wag muszą mieć wartości w*, aby funkcja błędu zwracała najmniejszą wartość. Wtedy sieć generuje najmniejszy błąd i uczenie powinno się zakończyć.​

A to są inne przykłady powierzchni błędu:



Czerwone strzałki obrazują ideę uczenia sieci neuronowej. Poruszamy się ​w kierunku zmniejszającego się błędu. Algorytmy uczenia pomagają nam znaleźć takie współczynniki wagowe, aby trafić do doliny, gdzie błąd jest najmniejszy – minimalizujemy w ten sposób funkcję błędu. Jeżeli punkt na powierzchni odpowiada aktualnym wartościom wag to nachylenie wykresu w tym punkcie określone jest przez gradient, czyli wektor pochodnych cząstkowych. Zmiana wartości wag powinna odbywać się w przeciwnym do tego wektora kierunku - tylko wtedy poruszamy się w kierunku zmniejszającego się błędu. W kolejnej części kursu zajmiemy się wzorem ogólnym na gradient błędu.


METODA WSTECZNEJ PROPAGACJI BŁĘDU

Algorytm wstecznej propagacji błędów (backpropagation) został odkryty przez Paula Werbosa w 1986 roku. Był to przełomowy moment dla sieci neuronowych. ​

 

​Paul Werbos - autor algorytmu wstecznej propagacji błędów i pionier rekurencyjnych sieci neuronowych. Napisał książkę The Roots of Backpropagation, gdzie wyjaśnił podstawy backpropagation

Backpropagation to jeden z najpopularniejszych algorytmów uczenia nadzorowanego wielowarstwowych, jednokierunkowych sieci. Jest oparty na minimalizacji  błędu, wykorzystując przy tym optymalizacyjną metodę największego spadku. ​Służy do ustalania błędów neuronów znajdujących się w warstwach ukrytych. Na podstawie wyliczonego błędu, dokonywana jest korekta wag, co w efekcie prowadzi do minimalizacji błędu sieci. Działanie algorytmu zaprezentowano poniżej.



1. Na wejście sieci x1 i x2 podajemy dane wejściowe ​



Zacznijmy od 1 warstwy ukrytej​.

2. Obliczanie wartości wyjściowej y1, y2 ​i y3 neuronu 1, 2 i 3 (1 warstwa ukryta)​

Teraz przechodzimy do ​2 warstwy ukrytej​.

3. Obliczanie wartości wyjściowej y4 ​i y5 neuronu 4 i 5 w 2 warstwie ukrytej​


4. Obliczanie wartości wyjściowej sieci (y)​




5. Porównujemy wartość otrzymaną na wyjściu sieci (y) z oczekiwaną wartością sygnału wyjściowego ze zbioru uczącego (z). Różnica wartości nazywana jest sygnałem błędu warstwy wyjściowej (δ).​



6. Obliczony błąd rzutujemy wstecz do wszystkich neuronów poprzedniej warstwy, których wyjścia były połączone z neuronem, dla którego obliczyliśmy błąd (rzutujemy do 4 i 5 neuronu).​



7. Podobnie postępujemy z neuronami we wcześniejszych warstwach sieci.​



8. Mając obliczony błąd δ na każdym neuronie, wyliczamy nowe wartości wag dla każdego neuronu sieci.​ Występujący we wzorze współczynnik η określa tempo uczenia sieci neuronowej, podobnie jak w przypadku uczenia pojedynczego neuronu.​ W przyszłej części kursu omówimy część matematyczną procesu uczenia.

 

Skończyliśmy aktualizację wag w całej sieci. Teraz wszystko trzeba powtórzyć, robiąc to samo dla kolejnych pozycji ​z ciągu uczącego. Gdy wyczerpiemy wszystkie przykłady w zbiorze uczącym – przechodzimy do kolejnej epoki. ​Uczymy do skutku, epoka po epoce, badając wartość błędu generowanego przez sieć neuronową. Przerywamy uczenie gdy będzie dostatecznie mały, o czym już pisałem w 1 części kursu.