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:
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.
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.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
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
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
niezly materiał wg mnie. kiedys chciałbym coś w kierunku sieci neuronowych zrobić
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
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 tę 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.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Może kiedyś napiszesz artykuł, a tym gdzie szukać wiedzy o sieciach neuronowych .
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Nie ma problemu. Mogę napisać nawet coś bardziej ogólnego nt. szukania informacji w Internecie.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
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.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
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.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
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
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Nie przypuszczałem, że do oprogramowania Sieci neuronowej wystarczy tylko kilka linii kodu.
@grzegorz2047 jak najbardziej nadajesz się wykładowcę, gdyż tłumaczysz w przystępny sposób❗
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
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.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit