Sieci neuronowe #2 - Moja próba implementacji i użycia perceptronu

in pl-artykuly •  7 years ago 

Wstęp

W tym artykule chciałbym omówić pojęcie perceptronu. Bardzo chętnie przeczytam komentarz osoby znającej się na temacie, która powie mi czy moja implementacja algorytmu jest w 100% poprawna, ponieważ nie jestem wstanie tego potwierdzić z moją wiedzą.
Kod został napisany w języku javascript i jest on uruchamiany w przeglądarce. Wynik działania pokazywany jest w konsoli developerskiej klikając F12 w przeglądarce.

Zasada działania perceptronu

Nie będę wam tu wykładał matematycznej teorii, gdyż zwyczajnie nie jestem na tyle kompetentny, żeby to zrobić. Natomiast chce przekazać wam co to robi.

Głównym zadaniem perceptronu w takiej postaci jakiej go zaimplementowałem jest rozróżnianie pewnych danych znajdujących się w pewnych zbiorach. Te dane muszą być w pewien sposób "liniowo separowalne". Ja na to mówię "liniowo niezależne", ale sam nie wiem czy dokładnie o to chodzi. Po prostu w algebrze są takie macierze, które muszą być liniowo niezależne, żeby wykonywać pewne operacje na nich z tego co pamiętam. A żeby to zweryfikować, to chyba wtedy można doprowadzić macierz do postaci schodkowej(?). Jak mówiłem nie jestem dobry z matmy :D No dobra, chodzi po prostu oto, że mamy jakieś kształty w grupie A i w grupie B. Te grupy są "liniowo separowalne", czyli możemy z nimi robić coś sensownego w perceptronie. Mówimy naszemu perceptronowi, żeby nauczył się tych kształtów w tych grupach i potem jak mu dalibyśmy jakieś kształty, to żeby powiedział z jakiej grupy one są. Jeżeli obrazki nie byłyby liniowo separowalne, to perceptron nie zdołał się ustabilizować i nie mógł by poprawnie rozpoznawać nauczonych obrazków. Ta cała nauka to polega po prostu na ustaleniu odpowiednich wag, dzięki którym nasza ultra prosta sieć neuronowa "wie" co to za obrazek.
Tak naprawdę, to po prostu nadzorujemy perceptron i pilnujemy go, żeby nauczył się rozpoznawać obrazki na podstawie przykładowych obrazków.

Obrazki, które go uczymy

Obrazki są zapisane w 26 pikselach o kolorze białym i czarnym. Czarny kolor oznaczany jest jako 1.0, a biały kolor jako 0.0. Obrazki są zwykłym wektorem o długości 26. Liczby w wektorze są typu double.

Uczymy perceptron 5 obrazków. Pierwsze 3 będą w pierwszej grupie pozostałe 2 będą w drugiej grupie. Jest to moja marna próba reprezentacji ich w paincie, więc mogą być lekko zniekształcone te piksele :D
Obrazki wyglądają następująco:

visualize.png

U+ oznacza jedną grupę obrazków (wektorów przechowujących kolory), a U- drugą grupę obrazków.

Implementacja algorytmu

Teraz opiszę wam co dzieje się po kolei w kodzie. Wykorzystamy sobie teraz algorytm związany z neuronem McCullocha-pittsa, którego omówiłem w poprzednim artykule, ponieważ jest on częscią implementacji perceptronu.

Cały kod starałem się interpretować tak, żebym czytając go, rozumiał co się w nim dzieje, a nie wklepując tylko algorytm ze znaczkami typu zt, t itd., które nic mi nie mówią po tygodniu po zaimplementowaniu algorytmu.

W głównej funkcji o nazwie usePerceptron wykonuję uczenie perceptronu z 3 różnymi możliwościami. Funkcja perceptron przyjmuje parametr "agresji" uczenia się czegoś. To znaczy, że jak bardzo ma kombinować podczas nauki. Czy ma robić duże zmiany w rozumowaniu, czy jednak ma po troszku analizować obrazki i modyfikować wagi po troszku. Im wyższa wartość parametru, tym perceptron zachowuje się bardziej losowo. Czasem lepiej jest zastosować bardziej agresywną naukę, ale czasem zupełnie odwrotnie. W naszym przypadku "agresywna" taktyka działa tu najlepiej.

Funkcja neutron to nasza implementacja neuronu. Funkcja createZEroedVector tworzy wstępnie wektor wag służący do nauki perceptronu. Wypełniany jest on wstępnie iczbami 1.0.

Funkcja decide decyduje co ma podjąć neutron przy określonych obliczonych wartościach.

Funkcja perceptron to nasza funkcja z implementacją nauki naszego perceptronu. Powinienem tę funkcję trochę zrefaktoryzować, aby definicja obrazków nie znajdowała się w tamtym miejscu, ale tego nie zrobiłem. Tak tylko piszę, żeby nie było, że zrobiłem to przypadkowo :D

Zmienne u1 do u5 to nasze 5 obrazków, które przedstawiłem powyżej.

Potem obrazki dodajemy do jednej tablicy.

Tworzymy wektor wag dla perceptronu i rozpoczynamy algorytm uczenia perceptronu.

Zakładamy, że dopóki nie będzie poprawnie rozpoznawał 5 obrazków, to ma dalej się uczyć.

Przy każdym błędzie perceptronu karamy go zmuszając go do zbierania nagrody od początku. Nagrodę kumulujemy w zmiennej good.

Funkcja learnDecider mówi o jakiej grupie mu chodzi w danym czasie. W tej funkcji używamy operacji modulo %, czyli mówimy, że co za każdym razem liczymy od 0 do 4 i tak w kółko w zależności od czasu.

Następnie wybieramy sobie zdjęcie ze względu na czas. Także zdjęcia brane są z przedziału od indeksu 0 do 4.

Następnie neuron przetwarza obrazek i wagi jakie aktualnie sobie przydzielił w perceptronie.

Następnie dla każdego piksela liczymy sobie wagi dla naszego perceptronu. Tu jest magiczne sformułowanie, które nie jestem wam wstanie wytłumaczyć, ale pewnie znajdzie się ktoś mądrzejszy i napisze :D

Następnie jeżeli nauczyciel zgodzi się z wynikiem rezultatu neuronu, to nagradzamy nasz perceptron, w przeciwnym razie karamy go i zerujemy zmienną good.

Cały czas upływa nam kolejnym odcinek czasu.

Jeżeli algorytm nauczy się obrazków, to swój wynik będzie przechowywał w zmiennej weights.

Na końcu zweryfikowałem czy nauczył się rozpoznawać w jakiej grupie jest obrazek i wziąłem piąty obrazek, żeby neuron powiedział, do jakiej grupy należy obrazek.

Tak to wszystko wygląda i takie jest moje rozumowanie perceptronu. Jeżeli mam gdzieś błąd w rozumowaniu, to bardzo chętnie się nauczę poprawnego rozumowania, gdyż interesują mnie właśnie sieci neuronowe, algorytmy genetyczne i różne ich kombinacje.

Podsumowanie

Implementacja algorytmu nie jest jakoś ogromna i mieście się w około 120 linijkach w jsie. Pewnie można to nawet prościej napisać, ale to już tylko pajtonowcy umieją :D

Spróbujcie sobie sami zaimplementować takiego perceptrona i zobaczyć jak to wszystko działa. Zawsze jest satysfakcja kiedy nasz kod działa.

Cały kod znajduje się tutaj
Więcej informacji tutaj

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Implementacja algorytmu nie jest jakoś ogromna i mieście się w około 120 linijkach w jsie. Pewnie można to nawet prościej napisać, ale to już tylko pajtonowcy umieją :D

To prawda, w pythonie można w 11 linijkach ;) https://iamtrask.github.io/2015/07/12/basic-python-network/
Swoja drogą bardzo polecam ten artykuł, pozwala zrozumieć działanie sieci neuronowej od A do Z.

Congratulations @grzegorz2047! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes received

Click on any badge to view your own Board of Honor on SteemitBoard.

To support your work, I also upvoted your post!
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

Upvote this notification to help all Steemit users. Learn why here!

niezly materiał wg mnie. kiedys chciałbym coś w kierunku sieci neuronowych zrobić

W Internecie jest sporo różnych materiałów związanych z siecią neuronową. Tę serię artykułów akurat robię na podstawię zajęć z sieci neuronowych jakie mam na studiach. Generalnie poznaję tam zasadę działania jakieś części związanej z siecią neuronową, dostaję wskazówki co do algorytmu i na końcu implementuję go właśnie w taki sposób jaki przedstawiłem w powyższym artykule.
Jeżeli znasz trochę angielski, to polecam ten kanał oraz playlstę. Ta osoba tworzy właśnie różne projekty na żywo i omawia co jak działa, dzięki czemu możesz pisać na tej podstawie coś swojego.

Może kiedyś napiszesz artykuł, a tym gdzie szukać wiedzy o sieciach neuronowych .

Nie ma problemu. Mogę napisać nawet coś bardziej ogólnego nt. szukania informacji w Internecie.

I just upvoted You! (Reply "STOP" to stop automatic upvotes). Do społeczności: Jeżeli uważasz że głos został przyznany niesłusznie, przedstaw krótkie uzasadnienie w odpowiedzi do tego komentarza.

Trafiłem tu przez przypadek, i jestem kompletnym nobkiem jeśli chodzi o programowanie ale to co napisałeś brzmi całkiem ciekawie. Właśnie sprawdzm ten link co podałeś na końcu bo chce lepiej ogarnąć sieci neuronowe.

Nie jestem ekspertem w sieciach neuronowych i sam się uczę. Co do kodu, to zawsze piszę tak, aby każdy mógł go czytać jak książkę :) W tym przypadku problemem jest znalezienie takich wzorów, żeby można było nauczyć sieć neuronową. W następnych artykułach będę próbował zaimplementować bardziej skomplikowane algorytmy i mam nadzieję, że uda mi się je zrozumieć xd

Nie przypuszczałem, że do oprogramowania Sieci neuronowej wystarczy tylko kilka linii kodu.

Jeżeli nie potrafisz czegoś prosto wyjaśnić - to znaczy, że niewystarczająco to rozumiesz.
Albert Einstein

@grzegorz2047 jak najbardziej nadajesz się wykładowcę, gdyż tłumaczysz w przystępny sposób❗

A dziękuje. Ten perceptron to jeden z pierwszych sieci jakie wymyślili. Jest on oczywiście ograniczony, ale i tak potrafi już coś sensownego robić. No i nie wymaga skomplikowanej matematyki.
Co do tłumaczenia, to cały czas podążam zasadą, że kod ma być jasny w każdym momencie, co potem ułatwia wytłumaczenie zasady działania.