Kako stvoriti vlastitu neuronsku mrežu od nule u Pythonu. Proučavamo neuronske mreže u četiri koraka kako pisati umjetnu inteligenciju na Pythonu

Ali stvarno, to je želja za stvaranje savršene umjetne inteligencije, bilo da je to model igre ili mobilni program, došao je na put programera mnogi od nas. Problem je u tome što iza tona obrazovnog materijala i oštroj stvarnosti kupaca, to su želje zamijenjene jednostavnom željom za samo-razvoju. Za one koji nikada nisu počeli izvršenje dječjih snova, onda kratki vodič za stvaranje pravog umjetnog uma.

Faza 1. razočaranje

Kada govorimo o stvaranju barem jednostavnih botova, oči su ispunjene blistavom, a stotine ideja je bljesnulo u glavi da bi trebao biti u mogućnosti to učiniti. Međutim, kada je u pitanju implementacija, ispada da je ključ za rješavanje stvarnog modela ponašanja ... matematika. Biti malo više specifičnije, ovdje je popis njegovih particija koje se moraju pomaknuti barem u formatu sveučilišnog obrazovanja:

    Linearna algebra;

  • Teorija grafova;

    Teorija vjerojatnosti i matematičke statistike.

Ovo je znanstveno mostobran na kojem će se graditi vaše daljnje programiranje. Bez znanja i razumijevanja ove teorije, sve ideje brzo će prekinuti interakciju s osobom, jer je umjetno um zapravo ne više od skupa formula.

Faza 2. Usvajanje

Kada spavanje je malo oboren od strane studentske literature, možete početi učiti jezike. Nije vrijedno žuriti na lispu ili drugima, prvo morate naučiti kako raditi s varijabli i nedvosmislenim državama. Što se tiče brzog studija, a daljnji razvoj je savršen, ali općenito možete uzeti osnovu bilo kojeg jezika s relevantnim knjižnicama.

Faza 3. Razvoj

Sada idite izravno na teoriju AI. Mogu se podijeliti u 3 kategorije:

    Slab ai su roboti koje vidimo u računalnim igrama ili običnim zdravim pomagačima, kao što su Siri. Oni ili izvode visoko specijalizirane zadatke ili su manji kompleks onih, a svaka nepredvidljivost interakcije stavlja ih u slijepu slijepoj.

    Strojevi AI su strojevi čija je inteligencija usporediva s ljudskim mozgom. Do danas ne postoje pravi predstavnici ovog razreda, ali računala, kao što su Watson su vrlo blizu postizanju tog cilja.

    Perfect ai je budućnost, stroj mozak koji će premašiti naše sposobnosti. Riječ je o opasnosti od takvih zbivanja koje Stephen Hokking, Elon Mask i Franmshis "Terminator" upozorava.

Naravno, trebate početi s najjednostavnijim robotima. Da biste to učinili, sjetite se staro-dobre igre "cross-bock-krpelji" kada koristite 3x3 polje i pokušati shvatiti algoritme osnovnih aktivnosti: vjerojatnost pobjede u slučaju akata bez pogrešaka, najuspješnija mjesta na Polje za mjesto lik, potreba za smanjenjem igre na ždrijeb i tako dalje.

Dok ste shvatili čak i iz imena, to je API koji više neće vremena omogućiti da stvori neke sličnosti ozbiljnih AI.

Faza 5. Rad

Sada, kada već jasno zamislite kako stvoriti i kako ga koristiti, vrijeme je da povučete svoje znanje na novu razinu. Prvo, to će zahtijevati proučavanje discipline koja se zove "strojno osposobljavanje". Drugo, morate naučiti kako raditi s relevantnim knjižnicama odabranog programskog jezika. Za Python koji nas smatraju je Sciikt-Learn, NLTK, Scipy, PyBrain i NUMP. Treće, u razvoju bilo kojeg mjesta ne može učiniti

Ovaj put sam odlučio istražiti neuronske mreže. Osnovne vještine u ovom pitanju uspio sam preći ljeti i jesen 2015. godine. Pod osnovnim vještinama, mislim da mogu stvoriti jednostavnu neuronsku mrežu od nule. Primjeri se mogu naći u mojim spremištima na Github. U ovom članku dat ću nekoliko pojašnjenja i podijeliti sredstva koja vam mogu biti korisna za istraživanje.

Korak 1. Neuroni i metoda izravne distribucije

Dakle, što je "neuronska mreža"? Pričekajte s ovim i prvi posao s jednim neuronom.

Neuron je sličan funkciji: potrebno je nekoliko vrijednosti za ulazak i povratak.

Krug ispod označava umjetni neuron. Ona prima 5 i vraća 1. Unesite - to je zbroj tri sinapa povezana s neuronom (tri strijele s lijeve strane).

Na lijevoj strani slike vidimo 2 ulazne vrijednosti (zelena) i offset (označeno s smeđim).

Ulazni podaci mogu biti numerički prikazi dva različita svojstva. Na primjer, pri stvaranju filtra za neželjenu poštu, mogli bi značiti prisutnost više od jedne riječi koju su napisali velika slova i prisutnost riječi "Viagra".

Ulazne vrijednosti množe se takozvanim "težinama", 7 i 3 (označeno plavom).

Sada presavljamo dobivene vrijednosti s pomakom i dobijete broj u našem slučaju 5 (označeno crvenom bojom). To je uvođenje našeg umjetnog neurona.

Tada neuron proizvodi neku vrstu izračuna i izdaje izlaznu vrijednost. Dobili smo 1, jer Okrugli vrijednost Sigmoida u točki 5 je 1 (detaljnije o ovoj funkciji, razgovarajmo kasnije).

Ako je to filtar za neželjenu poštu, izlaz 1 bi značilo da je tekst označen s neuronom kao spam.

Ilustracija neuronske mreže s Wikipedijem.

Ako kombinirate ove neurone, a zatim dobiti izravno distribuira neuronsku mrežu - proces dolazi od ulaza do izlaza, kroz neurone povezane sinapsom, kao na slici s lijeve strane.

Korak 2. Sigmoid

Nakon što ste pogledali lekcije iz laboratorija, dobru ideju bila bi upoznata s četvrtom tjednu tečaja stroja iz tečaja posvećenih neuronskim mrežama - to će pomoći u razumijevanju načela njihovog rada. Tečaj je vrlo produbljen u matematici i temelji se na oktavi, a ja više volim Python. Zbog toga sam propustio vježbe i naučio sva potrebna znanja iz videa.

Sigmoid jednostavno prikazuje vašu vrijednost (horizontalna os) na segmentu od 0 do 1.

Prvi prioritet za mene bio je proučavanje Sigmoida, kao što se pojavilo u mnogim aspektima neuronskih mreža. Nešto o njoj već sam znao iz trećeg tjedna gore navedenog tečaja, tako da sam iz tamo revidirao videozapis.

Ali na nekim videozapisima neće otići. Za potpuno razumijevanje odlučio sam plakati sam. Stoga sam počeo pisati provedbu algoritma logističkog regresije (koji koristi Sigmoid).

Trebalo je cijeli dan, i jedva da je rezultat bio zadovoljavajući. Ali to nije važno, jer sam shvatio kako sve radi. Kôd se može vidjeti.

Ne morate to učiniti sami, jer je potrebno posebno znanje - glavna stvar je da shvatite kako je SIGMOid raspoređen.

Korak 3. Način inverzne distribucije pogrešaka

Razumjeti princip rada neuronske mreže od unosa do izlaza nije tako teško. Mnogo je teže shvatiti kako se neuronska mreža nauči na skupovima podataka. Načelo koje koristi me zove

James Loy, Georgia Tehnologija tehnologije tehnologije. Vodič za početnike, nakon čega možete stvoriti vlastitu neuronsku mrežu na Pythonu.

Motivacija:usredotočujući se na osobno iskustvo u učenju dubokog treninga, odlučio sam stvoriti neuronsku mrežu od nule bez kompleksne knjižnice za obuku, kao što je, na primjer,. Vjerujem da je za novake podataka znanstvenik, važno je razumjeti unutarnju strukturu neuronske mreže.

Ovaj članak sadrži ono što sam naučio i nadam se da će vam biti korisno! Ostali korisni članci na temu:

Što je neuronska mreža?

Većina članaka o neuronskim mrežama provodi se s paralelima mozga. Lakše mi je opisati neuronske mreže kao matematičku funkciju koja prikazuje navedeni ulaz na željeni rezultat, a ne isporučen u detalje.

Neuronske mreže sastoje se od sljedećih komponenti:

  • ulazni sloj, x
  • proizvoljan broj Skriveni slojevi
  • izlazni sloj, ŷ
  • namjestiti težiti i sile Između svakog sloja W. i b.
  • izbor funkcije aktivacije Za svaki skriveni sloj σ ; U ovom radu koristit ćemo značajku Sigmoida.

Dijagram u nastavku prikazuje arhitekturu dvoslojne neuronske mreže (imajte na umu da je ulazna razina obično isključena prilikom brojanja broja slojeva u neuronskoj mreži).

Stvaranje neuronske mreže klase na Pythonu izgleda jednostavno:

Obuka Neuralna mreža

Izlaz ŷ jednostavna dvoslojna neuronska mreža:

U gornjoj jednadžbi, težina w i offset b su jedine varijable koje utječu na izlaz ŷ.

Naravno, ispravne vrijednosti za utege i pomace određuju točnost predviđanja. Proces fino podešavanja vaga i offseta iz ulaznih podataka poznat je kao trening neuronske mreže.

Svaka iteracija procesa učenja sastoji se od sljedećih koraka

  • izračun predviđenog izlaza ŷ pod nazivom izravna distribucija
  • ažuriranje težina i pomaka nazvanih inverznim

Serijski grafikon ispod ilustrira proces:

Izravna distribucija

Kao što smo vidjeli na grafikonu gore, izravna distribucija je jednostavno lako računanje, a za bazu 2-slojne neuronske mreže, povlačenje neuronske mreže daje formula:

Dodajmo funkciju izravne distribucije našem kodu na Python-E to učiniti. Imajte na umu da za jednostavnost predložili smo da je offset jednak 0.

Međutim, trebate način da se procijenite "kvalitetu" naših prognoza, to jest, koliko su naše prognoze). Funkcija gubitka Samo nam dopušta da to učinimo.

Funkcija gubitka

Postoji mnogo dostupnih funkcija gubitaka, a priroda našeg problema treba nam diktirati izbor funkcije gubitka. U ovom radu koristit ćemo zbroj kvadrata pogrešaka Kao funkcija gubitka.

Količina kvadrata pogrešaka je prosječna razlika između svake predviđene i stvarne vrijednosti.

Svrha učenja je pronaći skup skala i pomaka koji smanjuje funkciju gubitka.

Inverzna distribucija

Sada kada smo izmjerili našu pogrešku prognoze (gubitak), moramo pronaći način Širenje pogrešaka natrag i ažurirajte naše težine i pomake.

Da biste saznali pravu količinu za podešavanje težine i pomaka, moramo znati derivatnu funkciju gubitka u odnosu na utege i offsete.

Podsjetiti se iz analize derivat funkcija je tangentni kut nagiba funkcije.

Ako imamo derivat, onda možemo jednostavno ažurirati utege i offsete, povećanje / smanjenje (vidi grafikon iznad). To se zove gradijentni silazak.

Međutim, ne možemo izravno izračunati derivat funkcije gubitka u odnosu na utege i pomaka, budući da jednadžba funkcije gubitka ne sadrži skale i pomake. Stoga nam je potrebno pravilo lanca za pomoć u izračunu.

Fuch! Bio je glomazan, ali je dopušteno dobiti ono što nam je potrebno - derivat (nagib) funkcija gubitka u odnosu na utege. Sada možemo prikladno podesiti težine.

Dodajte značajku backpropagacije na naš kôd na Python-E:

Provjera rada neurosetika

Sada kada imamo naš puni kod na Python-E za izvođenje izravne i obrnute distribuciju, pogledajmo našu neuronsku mrežu na primjer i vidjeti kako to radi.


Savršen skup skala

Naša neuronska mreža trebala bi istražiti savršen skup skala za predstavljanje ove funkcije.

Trenirajmo neuronsku mrežu za 1500 iteracija i pogledajte što se događa. S obzirom na raspored gubitaka na iteracijama u nastavku, možemo jasno vidjeti da se gubitak monotono smanjuje na minimum. To je u skladu s algoritmom podrijetla gradijenta, koji smo rekli ranije.

Pogledajmo konačnu predviđanje (izlaz) iz neuronske mreže nakon 1500 iteracija.

Uspjeli smo!Naš izravni i povratni algoritam za povratak pokazao je uspješan rad neuronske mreže, a predviđanja približavaju istinske vrijednosti.

Imajte na umu da postoji mala razlika između predviđanja i stvarnih vrijednosti. To je poželjno jer sprječava da neuronska mreža bolje generirati nevidljive podatke.

Finalna razmišljanja

Naučila sam mnogo u procesu pisanja od nulske mreže. Iako knjižnice dubokog učenja, kao što su Tensorflow i Keras, omogućuju stvaranje dubokih mreža bez potpunog razumijevanja unutarnjeg rada neuronske mreže, smatram da je znanstvenik novaka - am je koristan za njihovo dublje razumijevanje.

Uložio sam mnogo osobno vrijeme u ovom radu, i nadam se da će vam biti korisno!

Sada doživljavamo pravi bum neuronskih mreža. Koriste se za prepoznavanje, lokalizaciju i obradu slike. Neuronske mreže već mogu učiniti mnogo što nije dostupno osobi. Potrebno je u ovom slučaju ugraditi u ovaj slučaj! Razmotrite neutronsku mrežu koja će prepoznati brojeve na ulaznoj slici. Sve je vrlo jednostavno: samo jedan sloj i aktivacija funkcija. Neće nam dopustiti da prepoznamo apsolutno sve test slike, ali ćemo se nositi s ogromnom većinom. Kao podatke, koristit ćemo svjetski prepoznavanje u svijetu Mnističkog odabira podataka.

Raditi s njom u Pythonu nalazi se Python-masti knjižnica. Instalirati:

PIP instalirati Python-mnist

Sada možemo učitati podatke

Od Mnist Import MNDATA \u003d MNIST ("/ PATH_TO_MNIST_DATA_DATA_") TR_IMAGE, TR_LABELS \u003d MNDATA.Loload () test_images, test_labels \u003d mndata.load_testing ()

Arhivi s podacima moraju se preuzeti neovisno, a program određuje put do kataloga s njima. Sada TR_images varijable i test_images sadrže slike za umrežavanje i testiranje odgovarajuće. A varijable Tr_labels i test_labels su oznake s ispravnom klasifikacijom (tj. Brojke s slika). Sve slike su veličine 28x28. Odredite varijablu s veličinom.

Img_shape \u003d (28, 28)

Mi pretvoriti sve podatke u Numpy nizovi i normalizirati ih (dajemo veličinu od -1 do 1). To će povećati točnost izračuna.

Uvoz NP-a kao NP za I u dometu (0, LEN (test_images)): test_images [i] \u003d np.array (test_images [i]) / 255 za I u dometu (0, LEN (TR_IMAGE)): TR_IMAGES [i] \u003d Np.array (Tr_images [i]) / 255

Napomim da, iako se slike uzimaju za predstavljanje u obliku dvodimenzionalnog niza koristit ćemo jednodimenzionalnu, to je jednostavnije za računanje. Sada morate razumjeti "što je neuronska mreža"! A to je samo jednadžba s velikim brojem koeficijenata. Imamo niz 28 * 28 \u003d 784 elemenata na ulazu, a još 784 težina za određivanje svake znamenke. Tijekom rada neuronske mreže pomnožite vrijednosti unosa težine. Presavili su podatke i dodajte offset. Rezultat se primjenjuje na aktivacijsku funkciju. U našem slučaju, to će biti RELU. Ova značajka je nula za sve negativne argumente i argument za sve pozitivne.

Još uvijek postoje mnoge značajke aktivacije! Ali ovo je najlakša neuronska mreža! Definiramo ovu značajku s NUNPY

Def relu (x): povratak np.maximum (x, 0)

Sada izračunati sliku na slici, morate izračunati rezultat za 10 kompleta koeficijenata.

Def nn_calculate (img): resp \u003d popis (raspon (0, 10)) za i u dometu (0,10): r \u003d w [:, i] * img r \u003d relu (np.sum (R) + B [i] ) Resp [i] \u003d r povratak np.argmax (ent)

Za svaki skup ćemo dobiti rezultat izlaz. Izlaz s najvećim rezultatom najvjerojatnije postoji naš broj.

U ovom slučaju, 7. to je sve! Ali ne ... zato što trebate uzeti te vrlo koeficijente negdje. Morate trenirati našu neuronsku mrežu. Da biste to učinili, koristite metodu obrnutog pogreške. Njegova bit je izračunavanje mrežnih izlaza, usporedite ih s ispravnim, a zatim oduzeti od omjera broja koji je rezultat ispravan. Mora se zapamtiti da je potrebno izračunati te vrijednosti, potrebna je derivat funkcije aktivacije. U našem slučaju, to je nula za sve negativne brojeve i 1 za sve pozitivne. Definiramo koeficijente nasumično.

W \u003d (2 * np.random.rand (10, 784) - 1) / 10 b \u003d (2 * np.random.rand (10) - 1) / 10 za N u dometu (LEN (TR_IMAGES)): IMG \u003d Tr_images [n] Cls \u003d TR_Labels [n] #forwarward propagacija RESP \u003d np.zeros (10, dtelype \u003d np.float32) za I u dometu (0,10): r \u003d w [i] * img r \u003d relu (np. Zbroj (R) + b [i]) resp [i] \u003d r em_cls \u003d np.argmax (ent) odnos \u003d np.zeros (10, dtelype \u003d np.float32) resp \u003d 1,0 #back propagacija true_resp \u003d np. Nula ( 10, dtype \u003d np.float32) True_Resp \u003d 1.0 Error \u003d Resp - True_Resp delta \u003d Error * ((erc\u003e \u003d 0) * np.Ones (10)) za I u dometu (0.10): w [i] - \u003d np .Dot (img, delta [i]) b [i] - \u003d delta [i]

U procesu učenja, koeficijenti će biti nešto slični brojevima:

Provjerite točnost rada:

Def nn_calculate (img): resp \u003d popis (raspon (0, 10)) za i u dometu (0.10): r \u003d w [i] * img r \u003d np.maximum (np.sum® + B [i] , 0) #Relus Resp [i] R RETURN NP.ARGMAX (REM) Ukupno \u003d LEN (test_images) Valid \u003d 0 Invalid \u003d za I u dometu (0, ukupno): img \u003d test_images [i] predviđen \u003d nn_calculate (img ) Istinito \u003d test_labels [i] ako je predviđeno \u003d\u003d TRUE: Valid \u003d Valid + 1 Else: Invalid.apend (("Image": IMG ", predviđeno": Predviđeni, "True": True)) Ispis ("točnost (") ". Format (valjano / ukupno))

Imam 88%. Nije tako cool, ali vrlo zanimljivo!