Närvivõrkude loomine nullist. Uurime närvivõrke neljas etapis. Märkused ja viidete loetelu edasiseks lugemiseks

Minu tutvus närvivõrkudega tekkis siis, kui see välja tuli Prisma rakendus. See töötleb kõiki fotosid närvivõrkude abil ja reprodutseerib need valitud stiili kasutades nullist. Olles selle vastu huvi tundnud, tormasin otsima artikleid ja “õpetusi”, peamiselt Habré kohta. Ja oma suureks üllatuseks ei leidnud ma ühtegi artiklit, mis oleks selgelt ja samm-sammult kirjeldanud närvivõrkude toimimise algoritmi. Teave oli hajutatud ja puudus võtmepunktid. Samuti kiirustab enamik autoreid ühes või teises programmeerimiskeeles koodi näitama, ilma üksikasjalikke selgitusi kasutamata.

P Minu esimene ja kõige olulisem avastus oli Ameerika programmeerija Jeff Heatoni playlist, milles ta selgitab üksikasjalikult ja selgelt närvivõrkude toimimise põhimõtteid ja nende klassifikatsiooni. Pärast selle esitusloendi vaatamist otsustasin luua oma närvivõrgu, alustades kõigest lihtne näide. Tõenäoliselt teate seda siis, kui hakkate just õpetama uus keel, on teie esimene programm Hello World. See on omamoodi traditsioon. maailmas masinõpe on ka oma Tere maailm ja see on närvivõrk probleemide lahendamine eksklusiivne või (XOR). XOR-i tabel näeb välja selline:

Sellest lähtuvalt võtab närvivõrk sisendiks kaks numbrit ja peab väljastama teise numbri – vastuse. Nüüd närvivõrkudest endist.

Mis on närvivõrk?

Närvivõrk on sünapside kaudu ühendatud neuronite jada. Närvivõrgu struktuur tuli programmeerimismaailma otse bioloogiast. Tänu sellele struktuurile omandab masin võime analüüsida ja isegi meeles pidada mitmesugust teavet. Närvivõrgud on samuti võimelised mitte ainult sissetulevat teavet analüüsima, vaid ka seda oma mälust reprodutseerima. Huvilistele vaadake kindlasti 2 videot TED Talksist:1. video , 2. video ). Teisisõnu on närvivõrk inimese aju masintõlgendus, mis sisaldab miljoneid neuroneid, mis edastavad teavet elektriliste impulsside kujul.

Mis seal on närvivõrgud?

Praegu käsitleme näiteid tegelikkusest põhitüüp närvivõrgud – see on edastusvõrk (edaspidi DPR). Ka järgmistes artiklites tutvustan rohkem mõisteid ja räägin teile korduvatest närvivõrkudest. SPR, nagu nimigi ütleb, on närvikihtide järjestikuse ühendusega võrk, milles info liigub alati ainult ühes suunas.

Milleks on närvivõrgud?

Närvivõrke kasutatakse keeruliste probleemide lahendamiseks, mis nõuavad inimajuga sarnaseid analüütilisi arvutusi. Närvivõrkude levinumad rakendused on:

Klassifikatsioon - andmete jaotus parameetrite järgi. Näiteks antakse teile sisendiks hulk inimesi ja peate otsustama, kellele neist au anda ja kellele mitte. Seda tööd saab teha närvivõrk, analüüsides infot nagu vanus, maksevõime, krediidiajalugu jne.

Ennustus - võime ennustada järgmist sammu. Näiteks aktsiate tõus või langus lähtuvalt olukorrast börsil.

Tunnustamine - Praegu on kõige levinum närvivõrkude kasutamine. Kasutatakse Google'is, kui otsite fotot, või telefonikaamerates, kui see tuvastab teie näo asukoha ja tõstab selle esile ja palju muud.

Nüüd, et mõista, kuidas närvivõrgud töötavad, vaatame selle komponente ja nende parameetreid.

Mis on neuron?

Neuron on arvutusüksus, mis võtab vastu teavet ja toodab sellel lihtsad arvutused ja annab selle edasi. Need on jagatud kolme põhitüüpi: sisend (sinine), peidetud (punane) ja väljund (roheline). Samuti on olemas nihke neuron ja konteksti neuron, millest räägime järgmises artiklis. Juhul, kui närvivõrk koosneb suurest hulgast neuronitest, võetakse kasutusele termin kiht. Vastavalt sellele on sisendkiht, mis võtab vastu teavet, n peidetud kihti (tavaliselt mitte rohkem kui 3), mis seda töötlevad, ja väljundkiht, mis väljastab tulemuse. Igal neuronil on 2 peamist parameetrit: sisendandmed ja väljundandmed. Sisendneuroni puhul: input=output. Ülejäänud osas sisaldab sisendväli kõigi eelmise kihi neuronite koguteavet, misjärel see normaliseeritakse aktiveerimisfunktsiooni abil (praegu kujutame ette f(x)) ja jõuab väljundväljale.

Oluline meeles pidada et neuronid töötavad numbritega vahemikus või [-1,1]. Aga kuidas siis, küsite, töödelda numbreid, mis jäävad sellest vahemikust välja? Sees selles etapis, lihtsaim vastus on jagada 1 selle arvuga. Seda protsessi nimetatakse normaliseerimiseks ja seda kasutatakse väga sageli närvivõrkudes. Sellest veidi hiljem lähemalt.

Mis on sünaps?

Sünaps on ühendus kahe neuroni vahel. Sünapsitel on 1 parameeter – kaal. Tänu sellele muutub sisendinfo ühelt neuronilt teisele edastamisel. Oletame, et on 3 neuronit, mis edastavad teavet järgmisele. Siis on meil 3 kaalu, mis vastavad igale neist neuronitest. Neuronil, mille kaal on suurem, on see teave domineeriv järgmises neuronis (näiteks värvide segamine). Tegelikult on närvivõrgu või kaalumaatriksi kaalude kogum kogu süsteemi omamoodi aju. Just tänu nendele kaaludele töödeldakse sisendinfot ja muudetakse tulemuseks.

Oluline meeles pidada , et närvivõrgu initsialiseerimise ajal paigutatakse kaalud juhuslikus järjekorras.

Kuidas närvivõrk töötab?

IN selles näites näitab osa närvivõrgust, kus tähed I tähistavad sisendneuroneid, täht H tähistab peidetud neuronit ja täht w tähistab raskusi. Valem näitab, et sisendteave on kõigi sisendandmete summa, mis on korrutatud nende vastavate kaaludega. Seejärel anname sisendiks 1 ja 0 Olgu w1=0.4 ja w2 = 0.7 Neuron H1 sisendandmed on järgmised: 1*0.4+0*0.7=0.4. Nüüd, kui meil on sisend, saame väljundi, ühendades sisendi aktiveerimisfunktsiooniga (sellest lähemalt hiljem). Nüüd, kui meil on väljund, anname selle edasi. Ja nii kordame kõigi kihtide jaoks, kuni jõuame väljundneuronini. Olles sellise võrgustiku esimest korda käivitanud, näeme, et vastus pole kaugeltki õige, sest võrk pole koolitatud. Tulemuste parandamiseks koolitame teda. Kuid enne, kui õpime seda tegema, tutvustame mõnda närvivõrgu terminit ja omadust.

Aktiveerimisfunktsioon

Aktiveerimisfunktsioon on viis sisendandmete normaliseerimiseks (sellest rääkisime varem). See tähendab, et kui teil on sissepääsu juures suur hulk Läbides selle aktiveerimisfunktsioonist, saate vajalikus vahemikus väljundi. Aktiveerimisfunktsioone on üsna palju, seega käsitleme kõige elementaarsemaid: lineaarne, sigmoidne (logistiline) ja hüperboolne puutuja. Nende peamised erinevused on väärtuste vahemik.

Lineaarne funktsioon

Seda funktsiooni ei kasutata peaaegu kunagi, välja arvatud juhul, kui peate testima närvivõrku või edastama väärtuse ilma konversioonita.

Sigmoidne

See on kõige levinum aktiveerimisfunktsioon ja selle väärtuste vahemik on . Siin kuvatakse enamik veebis olevaid näiteid ja seda nimetatakse mõnikord ka logistiliseks funktsiooniks. Seega, kui teie puhul on negatiivsed väärtused (näiteks aktsiad võivad mitte ainult tõusta, vaid ka langeda), siis vajate funktsiooni, mis fikseerib ka negatiivsed väärtused.

Hüperboolne puutuja

Hüperboolset puutujat on mõttekas kasutada ainult siis, kui teie väärtused võivad olla nii negatiivsed kui ka positiivsed, kuna funktsiooni vahemik on [-1,1]. Seda funktsiooni ei ole soovitatav kasutada ainult positiivsete väärtustega, kuna see halvendab oluliselt teie närvivõrgu tulemusi.

Treeningkomplekt

Treeningkomplekt on andmejada, millel närvivõrk töötab. Meie elimineerimise või (xor) puhul on meil ainult 4 erinevat tulemust, see tähendab, et meil on 4 treeningkomplekti: 0xor0=0, 0xor1=1, 1xor0=1,1xor1=0.

Iteratsioon

See on omamoodi loendur, mis suureneb iga kord, kui närvivõrk läbib ühe treeningkomplekti. Teisisõnu, see on närvivõrgu läbitud koolituskomplektide koguarv.

ajastu

Kui närvivõrk on lähtestatud, määratakse selle väärtuseks 0 ja sellel on käsitsi seatud ülemmäär. Mida suurem ajastu, seda paremini koolitatud on võrk ja vastavalt ka selle tulemus. Epohh pikeneb iga kord, kui läbime kogu treeningseeriate, meie puhul 4 seeriat või 4 iteratsiooni.

Tähtis ärge ajage iteratsiooni ajajärku segamini ja mõistke nende juurdekasvu järjestust. Esimene nkord suureneb iteratsioon ja siis epohh ja mitte vastupidi. Teisisõnu, te ei saa kõigepealt treenida närvivõrku ainult ühes komplektis, seejärel teises ja nii edasi. Iga seeriat tuleb treenida üks kord ajastu kohta. Nii saate vältida vigu arvutustes.

Viga

Viga on protsent, mis kajastab erinevust oodatud ja saadud vastuste vahel. Viga kujuneb igal ajastul ja peab kahanema. Kui seda ei juhtu, siis teete midagi valesti. Viga saab arvutada erineval viisil, kuid me käsitleme ainult kolme peamist meetodit: keskmine ruutviga (edaspidi MSE), Root MSE ja Arctan. Siin pole kasutuspiiranguid, nagu aktiveerimisfunktsioonis, ja võite vabalt valida mis tahes meetodi, mis toob teile parim tulemus. Peate lihtsalt meeles pidama, et iga meetod loeb vigu erinevalt. Arctani puhul on viga peaaegu alati suurem, kuna see töötab põhimõttel: mida suurem on erinevus, seda rohkem viga. Juur-MSE-l on väikseim viga, seega on kõige tavalisem kasutada MSE-d, mis säilitab vea arvutamisel tasakaalu.

MSE juur

Arctan

Vigade arvutamise põhimõte on kõigil juhtudel sama. Iga komplekti puhul loeme vea, lahutades tulemuse ideaalsest vastusest. Järgmisena paneme selle kas ruutu või arvutame sellest erinevusest ruuttangensi, misjärel jagame saadud arvu hulkade arvuga.

Ülesanne

Nüüd enda testimiseks arvutage antud närvivõrgu väljund sigmoidi abil ja selle viga MSE abil.

Andmed:

I1=1, I2=0, w1=0,45, w2=0,78, w3=-0,12, w4=0,13, w5=1,5, w6=-2,3.

Lahendus

H1sisend = 1*0,45+0*-0,12=0,45

H1väljund = sigmoid(0,45)=0,61

H2sisend = 1*0,78+0*0,13=0,78

H2väljund = sigmoid (0,78) = 0,69

O1sisend = 0,61*1,5+0,69*-2,3=-0,672

O1 väljund = sigmoid (-0,672) = 0,33

O1ideaalne = 1 (0xor1 = 1)

Viga = ((1-0,33)^2)/1=0,45

Tulemus - 0,33, viga - 45%.

Tänan teid väga tähelepanu eest! Loodan, et see artikkel aitas teid närvivõrkude uurimisel. Järgmises artiklis räägin kallutatavatest neuronitest ja sellest, kuidas meetodi abil närvivõrku treenida tagasipaljundamine ja gradient laskumine.

Kasutatud ressursid:

Mida me tegema hakkame? Püüame luua lihtsa ja väga väikese närvivõrgu, mida me selgitame Ja me õpetame midagi eristama. Samas ei lasku me ajalukku ja matemaatilisse džunglisse (sellist infot on väga lihtne leida) – selle asemel püüame ülesande (pole fakt, et see õnnestub) teile ja iseendale selgeks teha. joonised ja kood.
Paljud närvivõrkude terminid on seotud bioloogiaga, seega alustame algusest:

Aju on keeruline asi, kuid selle võib jagada mitmeks põhiosaks ja operatsiooniks:

Põhjustajaks võib olla sisemine(näiteks pilt või idee):

Vaatame nüüd põhilist ja lihtsustatud osad aju:

Aju on üldiselt nagu kaabelvõrk.

Neuron- aju arvutamise põhiühik, see võtab vastu ja töötleb keemilisi signaale teistelt neuronitelt ning sõltuvalt mitmetest teguritest ei tee midagi või genereerib elektriimpulsi või tegevuspotentsiaali, mis saadab seejärel signaale sünapside kaudu naaberriikidesse. ühed seotud neuronid:

Unenäod, mälestused, isereguleeruvad liigutused, refleksid ja kõik, mida sa mõtled või teed – kõik juhtub tänu sellele protsessile: miljonid või isegi miljardid neuronid töötavad erinevad tasemed ja luua seoseid, mis loovad erinevaid paralleelseid alamsüsteeme ja esindavad bioloogilist närvi net.

Loomulikult on need kõik lihtsustused ja üldistused, kuid tänu neile saame kirjeldada lihtsat
närvivõrk:

Ja kirjeldage seda formaalselt graafiku abil:

Siin on vaja mõningaid selgitusi. Ringid on neuronid ja jooned on nendevahelised ühendused ning et asjad oleks siinkohal lihtsad, suhted esindavad teabe otsest liikumist vasakult paremale. Esimene neuron sisse hetkel aktiivne ja halliga esile tõstetud. Määrasime sellele ka numbri (1, kui see töötab, 0, kui see ei tööta). Numbrid neuronite vahel näitavad kaal side.

Ülaltoodud graafikud näitavad võrgu ajahetke täpsema kuvamise jaoks, peate selle ajaperioodideks jagama:

Oma närvivõrgu loomiseks peate mõistma, kuidas kaalud mõjutavad neuroneid ja kuidas neuronid õpivad. Näitena võtame jänese (testiküülik) ja paneme selle klassikalise katse tingimustesse.

Kui neile on suunatud ohutu õhuvool, vilguvad küülikud nagu inimesed:

Seda käitumismudelit saab kujutada graafikutena:

Nagu eelmisel diagrammil, näitavad need graafikud ainult hetke, mil küülik tunneb hingeõhku ja seega meie kodeerida whiff kui tõeväärtus. Lisaks arvutame kaaluväärtuse põhjal välja, kas teine ​​neuron süttib. Kui see on võrdne 1-ga, siis sensoorne neuron süttib, me pilgutame; kui kaal on väiksem kui 1, siis me ei pilguta: teine ​​neuron piiri— 1.

Tutvustame veel üht elementi – ohutut piiks:

Saame küüliku huvi modelleerida järgmiselt:

Peamine erinevus seisneb selles, et nüüd on kaal võrdne null, nii et me ei saanud vilkuvat jänest, noh, vähemalt mitte veel. Nüüd õpetame jänest segamise teel käsu peale vilkuma
Stiimulid (piiks ja löök):

On oluline, et need sündmused toimuksid erinevatel aegadel ajastu, graafikutel näeb see välja järgmine:

Heli ise ei tee midagi, aga õhuvool paneb jänesel siiski vilkuma ja me näitame seda läbi stiimulitega korrutatud raskuste (punasega). Haridus keerulist käitumist saab lihtsustatult väljendada kui järkjärgulist kaalumuutust ühendatud neuronite vahel aja jooksul.

Küüliku treenimiseks kordame samme:

Esimesel kolmel katsel näevad skeemid välja järgmised:

Pange tähele, et helistiimuli kaal suureneb pärast iga kordust (punasega esile tõstetud), see väärtus on praegu meelevaldne - valisime 0,30, kuid arv võib olla ükskõik milline, isegi negatiivne. Pärast kolmandat kordamist ei märka te jänese käitumises muutust, kuid pärast neljandat kordamist juhtub midagi hämmastavat – käitumine muutub.

Eemaldasime õhuga kokkupuute, kuid jänes vilgub endiselt, kui kuuleb piiksu! Meie viimane diagramm võib seda käitumist selgitada:

Treenisime jänest pilgutades helidele reageerima.

Sellise tõelise katse puhul võib tulemuse saavutamiseks kuluda rohkem kui 60 kordust.

Nüüd lahkume aju ja küülikute bioloogilisest maailmast ning proovime kõike seda kohandada
õppis looma kunstlikku närvivõrku. Esiteks proovime teha lihtsa ülesande.

Oletame, et meil on nelja nupuga masin, mis õige nupu vajutamisel väljastab toitu
nupud (hästi või energia, kui olete robot). Ülesanne on välja selgitada, milline nupp annab preemia:

Saame kujutada (skemaatiliselt), mida nupp klõpsamisel teeb, järgmiselt:

Parim on see probleem täielikult lahendada, nii et vaatame kõiki võimalikke tulemusi, sealhulgas õiget:

Õhtusöögi saamiseks klõpsake 3. nuppu.

Närvivõrgu koodis reprodutseerimiseks peame esmalt tegema mudeli või graafiku, millega võrku võrrelda. Siin on üks ülesande jaoks sobiv graafik, lisaks näitab see hästi selle bioloogilist analoogi:

See närvivõrk võtab lihtsalt vastu sissetulevat teavet – antud juhul seda, millist nuppu vajutati. Järgmisena asendab võrk sisendteabe kaaludega ja teeb järelduse kihi lisamise põhjal. See kõlab pisut segane, kuid vaatame, kuidas nupp meie mudelis on kujutatud:

Pange tähele, et kõik kaalud on 0, seega on närvivõrk nagu beebi, täiesti tühi, kuid täielikult omavahel seotud.

Seega võrdleme välist sündmust närvivõrgu sisendkihiga ja arvutame selle väljundis väärtuse. See võib tegelikkusega kokku langeda, kuid ei pruugi, kuid me ignoreerime seda praegu ja hakkame probleemi kirjeldama arvutist arusaadav viisil. Alustame kaalude sisestamisega (kasutame JavaScripti):

Var sisendid = ; var kaalud = ; // Mugavuse huvides võib neid vektoreid kutsuda

Järgmine samm on luua funktsioon, mis võtab sisendväärtused ja kaalud ning arvutab välja väljundväärtuse:

Funktsioon hinnataNeuralNetwork(inputVector, weightVector)( vari result = 0; inputVector.forEach(function(inputValue, weightIndex) ( layerValue = inputValue*weightVector; result += layerValue; )); return (result.toFixed(2)); ) / / Võib tunduda keeruline, kuid see ei tee muud, kui sobitab kaalu/sisendpaarid ja lisab tulemuse

Nagu oodatud, saame selle koodi käivitamisel sama tulemuse, mis meie mudelis või graafikus...

HinnakeNeuralNetwork(sisendid, kaalud); // 0,00

Reaalajas näide: Neural Net 001. Järgmine samm meie närvivõrgu täiustamisel on viis kontrollida oma väljundeid või saadud väärtused reaalse olukorraga võrreldav, kodeerime esmalt selle konkreetse reaalsuse muutujaks:

Vastuolude (ja nende arvu) tuvastamiseks lisame veafunktsiooni:

Viga = tegelikkus – närvivõrgu väljund

Selle abil saame hinnata oma närvivõrgu jõudlust:

Kuid mis veelgi olulisem, kuidas on lood olukordadega, kus tegelikkus annab positiivse tulemuse?

Nüüd teame, et meie närvivõrgu mudel on katki (ja me teame, kui palju), suurepärane! Tore on see, et nüüd saame oma õppimise juhtimiseks kasutada veafunktsiooni. Kuid see kõik on mõttekas, kui määratleme veafunktsiooni järgmiselt:

Viga = Soovitud väljund- Neuraalne võrguväljund

Tabamatu, kuid nii oluline lahknevus, mis näitab vaikselt, et me teeme
kasutage eelmisi tulemusi tulevaste tegevustega võrdlemiseks
(ja õppimiseks, nagu hiljem näeme). See on olemas ka riigis päris elu, täis
korduvad mustrid, nii et sellest võib saada evolutsiooniline strateegia (noh, sees
enamikul juhtudel).

Var sisend = ; var kaalud = ; var soovitudTulemus = 1;

Ja uus funktsioon:

Funktsioon assessmentNeuralNetError(desired,actual) ( return (desired — aktuaalne); ) // Nii võrgu kui ka vea hindamise järel saame: // "Neural Net output: 0.00 Error: 1"

Reaalajas näide: Neural Net 002. Teeme kokkuvõtte. Alustasime ülesandega, saime sellega hakkama lihtne mudel bioloogilise närvivõrgu kujul ja neil on võimalus mõõta selle toimivust võrreldes tegelikkuse või soovitud tulemusega. Nüüd peame leidma viisi lahknevuse parandamiseks – protsessi, mida nii arvutite kui ka inimeste jaoks võib pidada õppimiseks.

Kuidas treenida närvivõrku?

Nii bioloogiliste kui ka tehisnärvivõrkude treenimise aluseks on kordamine.
Ja õppimisalgoritmid, seega töötame nendega eraldi. Alustame sellest
treeningalgoritmid.

Looduses viitavad õppimisalgoritmid muutustele füüsikalistes või keemilistes tingimustes
neuronite omadused pärast katseid:

Dramaatiline näide sellest, kuidas kaks neuronit aja jooksul koodis ja meie "õppealgoritmi" mudelis muutuvad, tähendab, et me lihtsalt muudame aja jooksul asju, et oma elu lihtsamaks muuta. Nii et lisame muutuja, mis näitab, kui lihtne on elu:

Var learningRate = 0,20; // Mida suurem väärtus, seda kiirem on õppeprotsess :)

Ja mida see muudab?

See muudab raskusi (nagu küülikul!), eriti väljundkaalu, mida tahame toota:

Kuidas sellist algoritmi kodeerida, on teie valik, lihtsuse huvides lisan kaalule õppimisteguri, siin on see funktsiooni kujul:

Funktsiooni õppimine(sisendvektor, kaalvektor) ( kaalVektor.Igale(funktsioon(kaal, indeks, kaalud) ( if (sisendvektor > 0) ( kaalud = kaal + õppimiskiirus; ) )); )

Selle treeningfunktsiooni kasutamisel lisab see lihtsalt meie õppimisteguri kaaluvektorile aktiivne neuron, enne ja pärast treeningringi (või kordamist), on tulemused järgmised:

// Algne kaaluvektor: // Neuraalne Netoväljund: 0.00 Viga: 1 õppida(sisend, kaalud); // Uus kaaluvektor: // Neuraalne netoväljund: 0,20 Viga: 0,8 // Kui see pole ilmne, on närvi netoväljund 1-le lähedal (kana väljund) – see on see, mida me tahtsime, seega võime järeldada, et liigume õiges suunas

Reaalajas näide: Neural Net 003. Olgu, nüüd, kui liigume õiges suunas, on selle pusle viimane tükk selle rakendamine kordused.

See pole nii raske, looduses teeme sama asja ikka ja jälle, kuid koodis määrame lihtsalt kordamiste arvu:

Var katsed = 6;

Ja korduste arvu funktsiooni rakendamine meie treeningnärvivõrku näeb välja järgmine:

Funktsioonirong(katsed) ( jaoks (i = 0; i< trials; i++) { neuralNetResult = evaluateNeuralNetwork(input, weights); learn(input, weights); } }

Noh, siin on meie lõpparuanne:

Neuraalne Netoväljund: 0,00 Viga: 1,00 Kaaluvektor: Neuraalne Netoväljund: 0,20 Viga: 0,80 Kaalvektor: Neuraalne Netoväljund: 0,40 Viga: 0,60 Kaaluvektor: Neuraalne Netoväljund: 0,60 Viga: 0,40 Kaaluvektor: Neuraalne Netoväljund: 0.20 : 0.20 Kaaluvektor: Neuraalne Netoväljund: 1.00 Viga: 0.00 Kaaluvektor: // Kana õhtusöök !

Reaalajas näide: Neural Net 004. Nüüd on meil kaaluvektor, mis annab ainult ühe väljundi (kana õhtusöögiks), kui sisendvektor vastab tegelikkusele (klõpsates kolmandat nuppu). Mis on siis kõige lahedam asi, mida me just tegime?

Sel konkreetsel juhul suudab meie närvivõrk (pärast koolitust) sisendandmed ära tunda ja öelda, mis viib soovitud tulemuseni (peame ikkagi konkreetsed olukorrad programmeerima):

Lisaks on see skaleeritav mudel, mänguasi ja tööriist meie õppimiseks. Saime õppida midagi uut masinõppe, närvivõrkude ja tehisintellekti kohta. Hoiatus kasutajatele:

  • Õpitud kaalude salvestamiseks pole mehhanismi, nii et see närvivõrk unustab kõik, mida ta teab. Koodi värskendamisel või uuesti käivitamisel on võrgu täielikuks õppimiseks vaja vähemalt kuut edukat iteratsiooni, kui arvate, et inimene või masin vajutab nuppe juhuslikult... See võtab aega.
  • Bioloogilised võrgustikud õppimiseks tähtsaid asjuõppimiskiirus on 1, seega on vaja ainult ühte edukat kordamist.
  • On olemas õppimisalgoritm, mis sarnaneb väga bioloogiliste neuronitega ja millel on meeldejääv nimi: Widroff-hoffi reegel, või Widroff-hoffi koolitus.
  • Neuronide läved (meie näites 1) ja ümberõppeefektid (koos suured kogused kordusi tuleb rohkem 1) arvesse ei võeta, kuid need on oma olemuselt väga olulised ja vastutavad suurte ja keerulised plokid käitumuslikud reaktsioonid. Nii ka negatiivsed kaalud.

Märkused ja viidete loetelu edasiseks lugemiseks

Püüdsin vältida matemaatikat ja tehnilisi termineid, kuid kui olete huvitatud, ehitasime pertseptroni, mis on määratletud kui kahe klassifikaatori juhendatud õppimisalgoritm (supervised learning) - raske kraam. Aju bioloogiline struktuur ei ole lihtne teema, osaliselt ebatäpsuse ja osaliselt selle keerukuse tõttu. Parem on alustada neuroteadustest (Purves) ja kognitiivsetest neuroteadustest (Gazzaniga). Olen muutnud ja kohandanud Gateway to Memory (Gluck) jänese näidet, mis on ka suurepärane sissejuhatus graafikute maailma. Sissejuhatus närvivõrkudesse (Gurney) on veel üks suurepärane ressurss kõigi teie tehisintellekti vajaduste rahuldamiseks.
Ja nüüd Pythonis! Täname Ilja Andshmidti Pythoni versiooni pakkumise eest:

Sisendid = kaalud = soovitud_tulemus = 1 õppimiskiirus = 0,2 katset = 6 def hinnata_närvivõrk(sisendmassiiv, kaalu_massiv): tulemus = 0 i jaoks vahemikus (len(sisendmassiv)): kihi_väärtus = sisendi_massiiv[i] * kaalu_massiivi[i] tulemus += kihi_väärtus print("evaluate_neural_network: " + str(result)) print("kaalud: " + str(kaalud)) tagasta tulemus def hindamisviga(soovitav, tegelik): viga = soovitud - tegelik print("hindamisviga: " + str(viga) ) tagastamise tõrge def õppida(sisend_massiiv, kaalu_massiv): print("õppimine...") i jaoks vahemikus(len(sisendmassiiv)): if input_massiivi[i] > 0: weight_massiivi[i] += learning_rate def train(trials) ): i jaoks vahemikus (katsed): neural_net_result = hinda_närvivõrku(sisendid, kaalud) õpi(sisendid, kaalud) treeni(katsed)

Ja nüüd GO! Täname selle versiooni eest Kieran Maherit.

Paketi põhiimport ("fmt" "matemaatika") func main() ( fmt.Println("Sisendite ja kaalude loomine ...") inputs:= float64(0.00, 0.00, 1.00, 0.00) kaalud:= float64(0.00, 0,00, 0,00, 0,00) soovitud:= 1,00 õppimiskiirus:= 0,20 katset:= 6 harjutust (katsed, sisendid, kaalud, soovitud, õppimise kiirus) ) func train(katsed int, sisendid ujuvad64, kaalud ujuvad64, soovitud ujuvad64,4õppimine) i jaoks:= 1;< trials; i++ { weights = learn(inputs, weights, learningRate) output:= evaluate(inputs, weights) errorResult:= evaluateError(desired, output) fmt.Print("Output: ") fmt.Print(math.Round(output*100) / 100) fmt.Print(" Error: ") fmt.Print(math.Round(errorResult*100) / 100) fmt.Print(" ") } } func learn(inputVector float64, weightVector float64, learningRate float64) float64 { for index, inputValue:= range inputVector { if inputValue >0,00 ( kaalVektor = kaalVektor + õppimiskiirus ) tagasta kaalVektor ) funktsioon hindama(sisendVektor hõljuk64, kaalVektor hõljuk64) float64 ( tulemus:= 0.00 indeksi jaoks, sisendVäärtus:= vahemik sisendVektor ( kihtVäärtus:= sisendVäärtus * kaalVektor tulemus) tulemus = tulemus + kihiväärtus func assessmentError(soovitud float64, tegelik float64) float64 ( tagastab soovitud - tegelik )

Järjehoidjad

Me räägime teile, kuidas luua lihtsat närvivõrku mõne sammuga ja õpetame seda fotodelt kuulsaid ettevõtjaid ära tundma.

Samm 0. Saame aru, kuidas närvivõrgud töötavad

Kõige lihtsam viis närvivõrkude toimimispõhimõtetest aru saada on Google’i õppeprojekti Teachable Machine näitel.

Teachable Machine kasutab sisendandmetena sülearvuti kaamera pilti – seda, mida närvivõrk peab töötlema. Väljundandmetena – mida peaks närvivõrk peale sissetulevate andmete töötlemist tegema – saab kasutada gifi või heli.

Näiteks saate õpetada Teachable Machine'i ütlema "Tere", kui teie peopesa on üles tõstetud. Pöidlad püsti - “Lahe” ja üllatunud näoga lahtise suuga – “Vau”.

Kõigepealt peate treenima närvivõrku. Selleks tõstke peopesa üles ja vajutage nuppu “Treeni rohelist” – teenus teeb mitukümmend pilti, et piltidelt muster leida. Selliste kujutiste komplekti nimetatakse tavaliselt "andmestikuks".

Nüüd jääb üle vaid valida toiming, mis tuleb pildi äratundmisel kutsuda – öelda fraas, näidata GIF-i või esitada heli. Samamoodi treenime närvivõrku ära tundma üllatunud nägu ja pöialt.

Kui närvivõrk on koolitatud, saab seda kasutada. Teachable Machine näitab "kindluse" faktorit – kui "kindel" on süsteem, et talle üht oskust õpetatakse.

Lühivideo õpetatava masina toimimisest

1. samm. Arvuti ettevalmistamine närvivõrguga töötamiseks

Nüüd loome oma närvivõrgu, mis pildi saates annab teada pildil näidatust. Esmalt õpetame närvivõrku ära tundma pildil olevaid lilli: kummelit, päevalille, võilille, tulpi või roosi.

Oma närvivõrgu loomiseks vajate Pythonit – üht kõige minimalistlikumat ja levinumat programmeerimiskeelt ning TensorFlow avatud raamatukogu Google närvivõrkude loomiseks ja treenimiseks.

Närvivõrgud on praegu moes ja seda mõjuval põhjusel. Nende abiga saab näiteks piltidel objekte ära tunda või vastupidi joonistada Salvador Dali õudusunenägusid. Tänu mugavatele teekidele saab luua kõige lihtsamad närvivõrgud vaid paari koodireaga, et IBMi tehisintellekti poole pöörduda ei kulu palju rohkem.

teooria

Bioloogid ei tea siiani täpselt, kuidas aju töötab, kuid selle tööpõhimõte üksikud elemendid närvisüsteem on hästi uuritud. See koosneb neuronitest - spetsiaalsetest rakkudest, mis vahetavad üksteisega elektrokeemilisi signaale. Igal neuronil on palju dendriite ja üks akson. Dendriite saab võrrelda sisenditega, mille kaudu andmed neuronisse sisenevad, samas kui akson toimib selle väljundina. Dendriitide ja aksonite vahelisi ühendusi nimetatakse sünapsideks. Nad mitte ainult ei edasta signaale, vaid võivad muuta ka nende amplituudi ja sagedust.

Üksikute neuronite tasandil toimuvad transformatsioonid on väga lihtsad, kuid ka väga väikesed närvivõrgud on võimelised paljuks. Kogu Caenorhabditis elegans ussi käitumise mitmekesisus – liikumine, toidu otsimine, mitmesugused reaktsioonid välistele stiimulitele ja palju muud – on kodeeritud vaid kolmesajas neuronis. Ja okei ussid! Isegi sipelgad vajavad 250 tuhat neuronit ja see, mida nad teevad, ületab kindlasti masinate võimalused.

Ligi kuuskümmend aastat tagasi püüdis Ameerika teadlane Frank Rosenblatt luua arvutisüsteem, mis on kujundatud aju kujutise ja sarnasuse järgi, kuid selle loomise võimalused olid äärmiselt piiratud. Sellest ajast peale on huvi närvivõrkude vastu korduvalt lahvatanud, kuid aeg-ajalt selgus, et arvutusvõimsusest ei piisa ühegi arenenud närvivõrgu jaoks. Viimase kümnendi jooksul on selles osas palju muutunud.

Elektromehaaniline aju koos mootoriga

Rosenblatti masinat kutsuti Mark I Perceptroniks. See oli mõeldud pildituvastuseks, ülesandeks, mille täitmisel arvutid ikka ainult nii-nii. Mark I oli varustatud võrkkesta sarnasega: ruutmaatriks 400 fotoelementi, kakskümmend vertikaalselt ja kakskümmend horisontaalselt. Fotoelemendid ühendati juhuslikult neuronite elektrooniliste mudelitega ja need omakorda kaheksa väljundiga. Rosenblatt kasutas potentsiomeetreid sünapsidena, mis ühendasid elektroonilisi neuroneid, fotoelemente ja väljundeid. Pertseptroni treenimisel pöörasid 512 samm-mootorit automaatselt potentsiomeetri nuppe, reguleerides neuronite pinget sõltuvalt väljundtulemuse täpsusest.

Nii toimib närvivõrk lühidalt. Tehisneuronil, nagu päris neuronil, on mitu sisendit ja üks väljund. Igal sisendil on kaalutegur. Neid koefitsiente muutes saame treenida närvivõrku. Väljundsignaali sõltuvus sisendsignaalidest määratakse nn aktiveerimisfunktsiooniga.

Rosenblatti perceptronis liitis aktiveerimisfunktsioon kõigi loogilise ühe saanud sisendite kaalu ja võrdles tulemust läviväärtusega. Selle puuduseks oli see, et ühe kaalukoefitsiendi kerge muutus selle lähenemisviisi korral võib tulemust ebaproportsionaalselt palju mõjutada. See muudab õppimise keeruliseks.

Kaasaegsed närvivõrgud kasutavad tavaliselt mittelineaarseid aktiveerimisfunktsioone, näiteks sigmoidi. Lisaks oli vanadel närvivõrkudel liiga vähe kihte. Tänapäeval paikneb sisendi ja väljundi vahel tavaliselt üks või mitu peidetud neuronikihti. Seal toimub kogu lõbus.

Et oleks lihtsam aru saada, mida me räägime, vaadake seda diagrammi. See on ühe peidetud kihiga edasisuunaline närvivõrk. Iga ring vastab neuronile. Vasakul on sisendkihi neuronid. Paremal on väljundkihi neuron. Keskel on peidetud kiht nelja neuroniga. Kõikide sisendkihi neuronite väljundid on ühendatud esimese peidetud kihi iga neuroniga. Väljundkihi neuroni sisendid on omakorda ühendatud kõigi peidetud kihi neuronite väljunditega.

Mitte kõik närvivõrgud pole sellisel viisil loodud. Näiteks on olemas (ehkki vähem levinud) võrke, milles neuronite signaal edastatakse mitte ainult järgmisse kihti, nagu meie diagrammi otseses levimisvõrgus, vaid ka vastupidine suund. Selliseid võrke nimetatakse korduvateks. Täielikult ühendatud kihid on samuti vaid üks võimalus ja me puudutame isegi ühte alternatiividest.

Harjuta

Niisiis, proovime oma kätega lihtsat närvivõrku ehitada ja mõistame, kuidas see toimib. Kasutame Pythonit koos Numpy teegiga (saaksime hakkama ka ilma Numpyta, kuid Numpy lineaaralgebraga võtab vähem vaeva). Kõnealune näide põhineb Andrew Traski koodil.

Sigmoidi ja selle tuletise arvutamiseks vajame funktsioone:

Jätkamine on saadaval ainult tellijatele

Valik 1. Tellige Hacker, et lugeda kõiki saidil olevaid materjale

Tellimine võimaldab teil määratud aja jooksul lugeda KÕIKI saidi tasulisi materjale.


Aktsepteerime makseid pangakaartidega, e-rahaga ja ülekandeid mobiilioperaatori kontodelt. Tehisintellekt, närvivõrgud, masinõpe – mida kõik need praegu populaarsed mõisted tegelikult tähendavad? Enamiku asjatundmatute inimeste jaoks, kes ma ise olen, tundusid nad alati millegi fantastilisena, kuid tegelikult peitub nende olemus pinnal. Mul on pikka aega olnud mõte kirjutada lihtsas keeles


Tehisintellekt, närvivõrgud, masinõpe – mida kõik need praegu populaarsed mõisted tegelikult tähendavad? Enamiku asjatundmatute inimeste jaoks, kes ma ise olen, tundusid nad alati millegi fantastilisena, kuid tegelikult peitub nende olemus pinnal. Mul on pikka aega olnud mõte kirjutada lihtsas keeles kunstlikest närvivõrkudest. Uurige ise ja rääkige teistele, mis see tehnoloogia on, kuidas see töötab, kaaluge selle ajalugu ja väljavaateid. Selles artiklis püüdsin mitte tungida umbrohtu, vaid lihtsalt ja rahvapäraselt rääkida sellest paljulubavast suunast kõrgtehnoloogia maailmas.

Natuke ajalugu

Esmakordselt tekkis tehisnärvivõrkude (ANN) kontseptsioon, püüdes simuleerida ajuprotsesse. Esimeseks suuremaks läbimurdeks selles vallas võib pidada McCulloch-Pittsi närvivõrgu mudeli loomist 1943. aastal. Teadlased töötasid esmakordselt välja tehisneuroni mudeli. Samuti pakkusid nad välja nende elementide võrgu kujundamise loogiliste toimingute tegemiseks. Kuid mis kõige tähtsam, teadlased on tõestanud, et selline võrgustik on õppimisvõimeline.

Edasi oluline samm oli Donald Hebbi poolt 1949. aastal esimese ANN-i arvutamise algoritmi väljatöötamine, mis sai oluliseks mitmeks järgnevaks aastakümneks. 1958. aastal töötas Frank Rosenblatt välja parceptroni – süsteemi, mis imiteerib ajuprotsesse. Kunagi polnud sellel tehnoloogial analooge ja see on siiani närvivõrkudes põhiline. 1986. aastal täiustasid Ameerika ja Nõukogude teadlased peaaegu samaaegselt üksteisest sõltumatult mitmekihilise pertseptroni väljaõppe põhimeetodit. 2007. aastal kogesid närvivõrgud taassündi. Briti arvutiteadlane Geoffrey Hinton töötas esmalt välja süvaõppe algoritmi mitmekihiliste närvivõrkude jaoks, mida nüüd kasutatakse näiteks mehitamata sõidukite juhtimiseks.

Lühidalt peamisest

IN üldises mõttes sõnad, närvivõrgud on matemaatilised mudelid, mis töötab loomakeha närvirakkude võrgustike põhimõttel. ANN-e saab rakendada nii programmeeritavates kui ka riistvaralistes lahendustes. Asjade mõistmise hõlbustamiseks võib neuronit pidada rakuks, millel on palju sisend- ja üks väljundava. See, kuidas mitmest sissetulevast signaalist moodustatakse väljundsignaal, määrab arvutusalgoritm. Tõhusad väärtused antakse igale neuroni sisendile, mis seejärel jaotatakse mööda neuronitevahelisi ühendusi (sünopsid). Sünapsitel on üks parameeter – kaal, mille tõttu muutub sisendinfo liikudes ühelt neuronilt teisele. Lihtsaim viis närvivõrkude tööpõhimõtet ette kujutada on värvide segamine. Sinine, roheline ja punane neuronid on erinevad kaalud. Selle neuroni teave, mille kaal on suurem, on järgmises neuronis domineeriv.

Närvivõrk ise on paljude selliste neuronite (protsessorite) süsteem. Üksiti on need protsessorid üsna lihtsad (palju lihtsamad kui a personaalarvuti), kuid olles ühendatud suur süsteem neuronid on võimelised täitma väga keerulisi ülesandeid.

Olenevalt rakendusalast saab närvivõrku tõlgendada erinevalt. Näiteks masinõppe seisukohalt on ANN mustrituvastusmeetod. Matemaatilisest vaatenurgast on see mitme parameetriga ülesanne. Küberneetika seisukohalt – mudel adaptiivne juhtimine robootika. Tehisintellekti jaoks on ANN põhikomponent loomuliku intelligentsuse modelleerimiseks arvutusalgoritmide abil.

Närvivõrkude peamine eelis tavapäraste arvutusalgoritmide ees on nende õppimisvõime. Selle sõna üldises tähenduses tähendab õppimine neuronite vahel õigete sidestuskoefitsientide leidmist, samuti andmete kokkuvõtmist ning sisend- ja väljundsignaalide keerukate sõltuvuste tuvastamist. Tegelikult tähendab närvivõrgu edukas treenimine seda, et süsteem suudab tuvastada õige tulemuse andmete põhjal, mida koolituskomplektis pole.

Praegune olukord

Ja hoolimata sellest, kui paljutõotav see tehnoloogia ka poleks, on ANN-id võimalikust veel väga kaugel inimese aju ja mõtlemine. Närvivõrke kasutatakse aga juba paljudes inimtegevuse valdkondades. Siiani pole nad võimelised tegema väga intelligentseid otsuseid, kuid suudavad asendada inimest seal, kus teda varem vajati. ANN-i arvukate rakendusvaldkondade hulgast võime märkida: iseõppivate, mehitamata tootmisprotsessisüsteemide loomine. sõidukid, pildituvastussüsteemid, intelligentsed turvasüsteemid, robootika, kvaliteedi jälgimise süsteemid, häälliidesed interaktsioonid, analüüsisüsteemid ja palju muud. Selline närvivõrkude laialdane kasutamine on muuhulgas tingitud sellest, et erinevatel viisidel kiirendades ANN koolitust.

Tänapäeval on närvivõrkude turg tohutu – miljardeid ja miljardeid dollareid. Nagu praktika näitab, erineb enamik närvivõrgu tehnoloogiaid üle maailma üksteisest vähe. Närvivõrkude kasutamine on aga väga kulukas tegevus, mida enamikul juhtudel ainult endale lubada saab suured ettevõtted. Närvivõrkude arendamine, koolitamine ja testimine nõuab palju arvutusvõimsus, on ilmne, et IT-turu suurtel tegijatel on seda küllaga. Selle valdkonna peamiste arendusettevõtete hulgas on Google DeepMind, Microsoft Researchi divisjon, IBM, Facebook ja Baidu.

See kõik on muidugi hea: närvivõrgud arenevad, turg kasvab, aga seni peamine ülesanne ikka veel lahendamata. Inimkond ei ole suutnud luua tehnoloogiat, mis on inimajule isegi lähedased. Vaatame peamisi erinevusi inimese aju ja tehisnärvivõrkude vahel.

Miks on närvivõrgud inimese ajust ikka veel kaugel?

Kõige olulisem erinevus, mis muudab radikaalselt süsteemi põhimõtet ja efektiivsust, on erinevad käigud signaalid tehisnärvivõrkudes ja neuronite bioloogilises võrgus. Fakt on see, et ANN-is edastavad neuronid väärtusi, mis on tegelikud väärtused, see tähendab numbreid. Inimese ajus edastatakse impulsse kindla amplituudiga ja need impulsid on peaaegu hetkelised. See toob kaasa mitmeid eeliseid inimese neuronite võrgustikul.

Esiteks on aju sideliinid palju tõhusamad ja ökonoomsemad kui ANN-i omad. Teiseks tagab impulssahel tehnoloogia rakendamise lihtsuse: piisab kasutamisest analoogahelad keerukate arvutusmehhanismide asemel. Lõppkokkuvõttes on impulssvõrgud helihäirete suhtes immuunsed. Reaalarvud on müra all, mis suurendab vigade tõenäosust.

Alumine rida

Muidugi on viimasel kümnendil toimunud tõeline närvivõrkude arengu buum. Selle põhjuseks on eelkõige asjaolu, et ANN-i koolitusprotsess on muutunud palju kiiremaks ja lihtsamaks. Aktiivselt on hakatud arendama ka nn “eelkoolitatud” närvivõrke, mis võivad tehnoloogia juurutamise protsessi oluliselt kiirendada. Ja kui on liiga vara öelda, kas närvivõrgud suudavad ühel päeval inimaju võimeid täielikult reprodutseerida, on tõenäosus, et järgmisel kümnendil suudavad ANN-id asendada inimesi veerandis olemasolevatest ametitest, muutub üha sarnasemaks. tõde.

Neile, kes tahavad rohkem teada

  • Suur närvisõda: millega Google tegelikult tegeleb
  • Kuidas kognitiivsed arvutid võivad meie tulevikku muuta