Yandex on teinud närvivõrkudele alternatiivi avalikult kättesaadavaks. Yandex avab CatBoosti masinõppetehnoloogia

Ajalooliselt on tehisnärvivõrgud oma enam kui poole sajandi pikkuse ajaloo jooksul kogenud kiire tõusu ja languse perioode. suurenenud tähelepanuühiskond ning neile järgnenud skeptitsismi ja ükskõiksuse perioodid. IN Head ajad Teadlastele ja inseneridele tundub, et nad on lõpuks leidnud universaalse tehnoloogia, mis suudab asendada inimesi mis tahes kognitiivsete ülesannete täitmisel. Nagu seeni pärast vihma, ilmuvad mitmesugused uued närvivõrkude mudelid ja nende autorite, professionaalsete matemaatikute vahel käivad intensiivsed vaidlused nende pakutud mudelite suurema või väiksema bioloogilise astme üle. Professionaalsed bioloogid jälgivad neid arutelusid kõrvalt, aeg-ajalt murduvad ja hüüavad: "Jah, seda päris looduses ei juhtu!" – ja ilma suurema efektita, kuna närvivõrgu matemaatikud kuulavad biolooge reeglina ainult siis, kui bioloogide faktid on kooskõlas nende endi teooriatega. Kuid aja jooksul koguneb järk-järgult hulk ülesandeid, mille puhul närvivõrgud toimivad ausalt öeldes halvasti ja inimeste entusiasm jahtub.

Tänapäeval on närvivõrgud tagasi oma kuulsuse haripunktis tänu Restricted Bolzmann Machines'il (RBM) põhineva järelevalveta eeltreeningu meetodi leiutamisele, mis võimaldab treenida sügavaid närvivõrke (st eriti suurte, kümnete tuhandete suurusjärk, neuronite arv) ja sügavate närvivõrkude edu kõne- ja pildituvastuse praktilistes probleemides. Näiteks Androidis rakendatakse kõnetuvastust sügavate närvivõrkude abil. Kui kaua see kestab ja kui hästi sügavad närvivõrgud neile seatud ootustele vastavad, pole teada.
Samal ajal paistab paralleelselt kõigi teadusvaidluste, hoovuste ja trendidega selgelt silma närvivõrgu kasutajate kogukond – praktiseerivad tarkvarainsenerid, keda huvitab närvivõrkude rakenduslik aspekt, nende võime õppida kogutud andmetest ja lahendada äratundmisprobleeme. Paljudega praktilisi ülesandeid Klassifitseerimine ja ennustamine töötavad hästi hästi läbimõeldud, suhteliselt väikeste mitmekihiliste perceptroni (MLP) mudelite ja radiaalpõhiste funktsioonivõrkude (RBF) puhul. Neid närvivõrke on korduvalt kirjeldatud, lähtudes oma isiklikust sümpaatiast nende vastu, soovitaksin ma järgmisi raamatuid: Osovski, piiskop, khaikin; Coursera ja sarnaste ressursside kohta on ka häid kursusi.

Mis puudutab aga üldist lähenemisviisi närvivõrkude kasutamisele praktikas, siis see erineb põhimõtteliselt tavapärasest deterministlikust arenduskäsitlusest "programmeeritud, see töötab, see tähendab, et see töötab alati". Närvivõrgud on oma olemuselt tõenäosusmudelid ja lähenemine neile peaks olema täiesti erinev. Kahjuks teevad seda paljud uued masinõppetehnoloogiate ja eriti närvivõrkude programmeerijad süsteemi vead nendega töötades nad pettuvad ja jätavad asja kõrvale. Idee kirjutada see traktaat Habrist tekkis pärast suhtlemist selliste pettunud närvivõrkude kasutajatega - suurepäraste, kogenud ja enesekindlate programmeerijatega.

Siin on minu reeglite loend ja tüüpilised vead närvivõrkude kasutamine.

1. Kui on võimalik närvivõrke mitte kasutada, siis ära neid kasuta.
Närvivõrgud võimaldavad teil lahendada probleemi, kui andmeid korduvalt (või väga korduvalt) silmadega vaadates pole võimalik algoritmi välja pakkuda. Näiteks kui andmeid on palju, on need mittelineaarsed, mürarikkad ja/või suured.

2. Närvivõrkude keerukus peab vastama ülesande keerukusele.
Kaasaegne personaalarvutid(näiteks Core i5, 8 GB RAM) võimaldavad treenida närvivõrke mugava aja jooksul, kasutades kümnetest tuhandetest näidetest koosnevaid näidiseid, sisendandmete mõõtmetega kuni sadu. Suured näidised on väljakutse ülalmainitud sügavatele närvivõrkudele, mida treenitakse mitme protsessoriga GPU-del. Need mudelid on väga huvitavad, kuid jäävad sellest artiklist kaugemale.

3. Koolituse andmed peavad olema representatiivsed.
Koolituse valim peaks kirjeldatavat nähtust täielikult ja kõikehõlmavalt esindama ning sisaldama erinevaid võimalikke olukordi. On hea, kui teil on palju andmeid, kuid see iseenesest ei aita alati. Kitsates ringkondades on laialt levinud nali, kui geoloog tuleb äratundja juurde, asetab tema ette tüki mineraali ja palub tal selle abil välja töötada süsteem sellise aine äratundmiseks. "Kas ma saan anda rohkem näiteid?" - küsib äratundja. "Kindlasti!" - vastab geoloog, võtab välja kirka ja jagab oma mineraalitüki veel mitmeks tükiks. Nagu te aru saate, pole sellisest toimingust kasu - selline suurendatud valim ei sisalda uut teavet.

4. Sega valik.
Pärast sisend- ja väljundandmevektorite kogumist, kui mõõtmised on üksteisest sõltumatud, muuta vektorite järjekorda mis tahes viisil. See on otsustava tähtsusega valimi õigeks jaotamiseks Train/Test/Validation ja kõigi valimi kaupa koolitusmeetoditeks.

5. Normaliseerige ja tsentreerige andmed.
Mitmekihiliste pertseptronite ja paljude teiste mudelite puhul peavad sisendandmete väärtused jääma vahemikku [-1;1]. Enne nende sisestamist närvivõrku lahutage andmetest keskmine ja jagage kõik väärtused maksimaalse väärtusega.

6. Jagage proov järgmisteks osadeks: Train, Test ja Validation.
Algajate põhiviga on tagada treeningkomplektil närvivõrgu töös minimaalne viga, samal ajal seda põrgulikult ümber õpetades ja seejärel sama head kvaliteeti soovida uutel reaalsetel andmetel. Seda on eriti lihtne teha siis, kui andmeid on vähe (või on need kõik ühest tükist). Tulemus võib olla suur pettumus: närvivõrk kohandub valimiga nii palju kui võimalik ja kaotab oma funktsionaalsuse tegelikel andmetel. Oma mudeli üldistusvõimete kontrollimiseks jagage kõik andmed kolmeks valimiks vahekorras 70:20:10. Treeni rongis, kontrollides perioodiliselt mudeli kvaliteeti testi abil. Lõplikuks erapooletuks hindamiseks – valideerimine.
Ristvalideerimise tehnika, kui Rong ja Test genereeritakse mitu korda juhuslikult samadest andmetest, võib olla salakaval ja jätta vale mulje hea kvaliteet süsteemi toimimine – näiteks kui andmed on võetud erinevatest allikatest ja see on kriitilise tähtsusega. Kasutage õiget kinnitust!

7. Rakenda regulaarsus.
Regulariseerimine on tehnika, mis võimaldab vältida närvivõrgu ületreenimist treeningu ajal, isegi kui andmeid on vähe. Kui leiate selle sõnaga märkeruudu, märkige see kindlasti. Ületreenitud närvivõrgu tunnuseks on suured kaaluväärtused, suurusjärgus sadu ja tuhandeid, selline närvivõrk ei tööta uutel, seninägematutel andmetel normaalselt

8. Pole vaja võrgus närvivõrku ümber õpetada.
Idee närvivõrku pidevalt uutele sissetulevatele andmetele ümber õpetada on tegelikes bioloogilistes süsteemides just see, mis juhtub. Me õpime iga päev ja läheme harva hulluks. Tavapäraste tehisnärvivõrkude puhul aga sisse kaasaegne lava Tehnilises arengus on see praktika riskantne: võrk võib ümber õppida või kohaneda viimaste saadud andmetega - ja kaotada oma üldistusvõime. Süsteemi praktikas kasutamiseks peab närvivõrk: 1) treenima, 2) testima kvaliteeti test- ja valideerimisnäidiste peal, 3) valima eduka võrguvaliku, fikseerima selle kaalud ja 4) kasutama treenitud närvivõrku. võrk praktikas, protsessi kaalud kasutust ei muuda.

9. Kasutage uusi õppimisalgoritme: Levenberg-Marquardt, BFGS, Conjugate Gradients jne.
Olen sügavalt veendunud, et tagasipropageerimisõppe rakendamine on kõigi närvivõrkudega töötavate inimeste püha kohustus. See meetod on kõige lihtsam, suhteliselt lihtsalt programmeeritav ja võimaldab põhjalikult uurida närvivõrkude õppeprotsessi. Vahepeal leiutati 70ndate alguses ja sai populaarseks eelmise sajandi 80ndate keskel. Sellest ajast alates on ilmunud arenenumad meetodid, mis võivad oluliselt parandada õppimise kvaliteeti. Kasutage neid parem.

10. Treeni närvivõrke MATLABis ja sarnastes kasutajasõbralikes keskkondades.
Kui te pole teadlane, kes töötab välja uusi meetodeid närvivõrkude koolitamiseks, vaid praktiseeriv programmeerija, ei soovita ma närvivõrkude treenimise protseduuri ise kodeerida. Peamiselt MATLABis ja Pythonis on suur hulk tarkvarapakette, mis võimaldavad treenida närvivõrke, samal ajal juhtida koolitus- ja testimisprotsessi mugavate visualiseerimis- ja silumistööriistade abil. Nautige inimkonna pärandit! Mulle isiklikult meeldib lähenemine “rongi MATLABis hea raamatukoguga – rakenda koolitatud mudelit käsitsi” see on üsna võimas ja paindlik. Erandiks on pakett STATISTICA, mis sisaldab täiustatud meetodeid närvivõrkude koolitamiseks ja võimaldab neid genereerida C-vormingus programmikoodi kujul, mis on mugav rakendamiseks.

Järgmises artiklis kavatsen üksikasjalikult kirjeldada kommertstarkvaratoote tuvastamisülesannete täitmiseks kasutatava, ülalkirjeldatud põhimõtete alusel realiseeritud närvivõrgu ettevalmistamise täielikku tööstuslikku tsüklit.

Edu!

Kirjandus

Hinton G., Deng L., Yu D., Dahl G., Mohamed A., Jaitly N., vanem A., Vanhoucke V., Nguyen P., Sainath T. ja Kingsbury B. Deep Neural Networks for Acoustic Modeling in Speech Recognition, IEEE Signal Processing Magazine, Vol. 29, nr. 6, 2012, lk. 82-97.
Ciresan D., Meier U., Masci J ja Schmidhuber J. Multi-column Deep Neural Network for Traffic Sign Classification. Neural Networks, Vol. 34, august 2012, lk. 333-338
S. Osovski. Närvivõrgud teabe töötlemiseks - trans. poola keelest. M.: Rahandus ja statistika, 2002. – 344 lk.
Piiskop C.M. Mustri tuvastamine ja masinõpe. Springer, 2006 – 738 lk.
S. Khaikin. Närvivõrgud: täiskursus. Williams, 2006.

Kruchinin Dmitri, Dolotov Evgeniy, Kustikova Valentina, Družkov Pavel, Kornyakov Kirill

Sissejuhatus

Praegu on masinõpe aktiivselt arenev valdkond. teaduslikud uuringud. See on tingitud nii võimalusest koguda ja töödelda andmeid kiiremini, kõrgemalt, tugevamalt, lihtsamalt ja odavamalt kui ka meetodite väljatöötamist, kuidas nendest andmetest tuvastada seaduspärasused, mille järgi toimuvad füüsikalised, bioloogilised, majanduslikud ja muud protsessid. Mõnes probleemis, kui sellist seadust on üsna raske kindlaks teha, kasutatakse süvaõpet.

Sügav õppimine uurib meetodeid andmete kõrgetasemeliste abstraktsioonide modelleerimiseks, kasutades mitut järjestikust mittelineaarset teisendust, mida tavaliselt kujutatakse kunstlike närvivõrkudena. Tänapäeval kasutatakse närvivõrke edukalt selliste probleemide lahendamiseks nagu prognoosimine, mustrituvastus, andmete tihendamine ja mitmed teised.

Masinõppe ja eriti süvaõppe teema asjakohasust kinnitab regulaarne artiklite ilmumine teemal see teema Habré kohta: see artikkel on pühendatud mõne süvaõppe tarkvaratööriista võrdlevale analüüsile, millest Hiljuti ilmus suur hulk. Nende tööriistade hulka kuuluvad tarkvarateegid, programmeerimiskeele laiendused ja iseseisvad keeled, mis võimaldab kasutada närvivõrgu mudelite loomiseks ja treenimiseks valmis algoritme. Olemasolevad süvaõppe tööriistad on erineva funktsionaalsusega ning nõuavad kasutajalt erineval tasemel teadmisi ja oskusi. Õige tööriista valimine on oluline ülesanne, mis võimaldab saavutada soovitud tulemuse võimalikult lühikese ajaga ja väiksema vaevaga.

Artiklis antakse lühiülevaade närvivõrgu mudelite kujundamise ja treenimise tööriistadest. Keskendutakse neljale raamatukogule: Caffe, Pylearn2, Torch ja Theano. Vaadeldakse nende raamatukogude põhivõimalusi ja tuuakse näiteid nende kasutamise kohta. Klassifikatsiooniprobleemi lahendamiseks võrreldakse teekide kvaliteeti ja kiirust identsete närvivõrgu topoloogiate koostamisel. käsitsi kirjutatud numbrid(MNIST-i andmekogumit kasutatakse koolitus- ja testikomplektina). Samuti püütakse hinnata kõnealuste raamatukogude kasutusmugavust praktikas.

MNIST-i andmestik

Järgmisena kasutatakse uuritava andmekogumina käsitsi kirjutatud numbrite kujutiste andmebaasi MNIST (). Selles andmebaasis olevate piltide eraldusvõime on 28x28 ja need salvestatakse halltoonides. Numbrid on pildi keskel. Kogu andmebaas on jagatud kaheks osaks: koolitus, mis koosneb 50 000 pildist, ja testimine, mis koosneb 10 000 pildist.

Tarkvaratööriistad süvaõppeprobleemide lahendamiseks

Süvaõppeprobleemide lahendamiseks on saadaval palju tarkvaratööriistu. Siit leiate üldise võrdluse kõige kuulsamate funktsionaalsuse kohta, siin anname Üldine informatsioon mõne neist (). Esimesed kuus tarkvarateeki rakendavad kõige laiemat valikut süvaõppe meetodeid. Arendajad pakuvad võimalusi luua täielikult ühendatud närvivõrke (FC NN), konvolutsioonilisi närvivõrke (CNN), autoencoderit (AE) ja piiratud Boltzmanni masinaid (RBM). Tähelepanu tuleb pöörata ülejäänud raamatukogudele. Kuigi neil on vähem funktsionaalsust, aitab mõnel juhul nende lihtsus saavutada suuremat tootlikkust.

Tabel 1. Süvaõppe tarkvara võimalused

# Nimi Keel O.C. FC NN CNN A.E. R.B.M.
1 DeepLearnToolbox Matlab Windows, Linux + + + +
2 Theano Python Windows, Linux, Mac + + + +
3 Pylearn2 Python Linux, Vagrant + + + +
4 Deepnet Python Linux + + + +
5 Sügav matt Matlab ? + + + +
6 Tõrvik Lua, C Linux, Mac OS X, iOS, Android + + + +
7 Darch R Windows, Linux + - + +
8 Caff e C++, Python, Matlab Linux, OS X + + - -
9 nnForge C++ Linux + + - -
10 CXXNET C++ Linux + + - -
11 Cuda-convnet C++ Linux, Windows + + - -
12 Cuda CNN Matlab Linux, Windows + + - -

Esitatud teabe ja ekspertide soovituste põhjal valiti edasiseks kaalumiseks neli raamatukogu: - üks küpsemaid ja funktsionaalselt terviklikumaid raamatukogusid ning - kogukonnas laialdaselt kasutatav. Iga raamatukogu käsitletakse järgmise plaani kohaselt:
  1. Lühike taustainfo.
  2. Tehnilised omadused (OS, programmeerimiskeel, sõltuvused).
  3. Funktsionaalsus.
  4. Logistilise regressioonivõrgustiku moodustamise näide.
  5. Koolitus ja konstrueeritud mudeli kasutamine klassifitseerimisel.
Pärast loetletud teekide ülevaatamist võrreldakse neid mitmete testvõrgu konfiguratsioonidega.

Kohviku raamatukogu



Caffe on arenduses olnud alates 2013. aasta septembrist. Arendust alustas Yangqing Jia õpingute ajal California ülikoolis Berkeleys. Sellest ajast peale on Caffet aktiivselt toetanud The Berkeley Vision and Learning Center (BVLC) ning GitHubi arendajate kogukond. Raamatukogu levitatakse BSD 2-klausli litsentsi alusel.

Caffe on realiseeritud C++ programmeerimiskeelega, saadaval on Python ja MATLAB ümbrised. Ametlikult toetatud operatsioonisüsteemideks on Linux ja OS X, lisaks on Windowsi mitteametlik port. Caffe kasutab vektorite ja maatriksite arvutamiseks BLAS-teeki (ATLAS, Intel MKL, OpenBLAS). Lisaks on välised sõltuvused glog, gflags, OpenCV, protoBuf, boost, leveldb, mähe, hdf5, lmdb. Arvutuste kiirendamiseks saab Caffet käivitada GPU-s, kasutades CUDA tehnoloogia põhivõimalusi või süvaõppe primitiivide raamatukogu cuDNN.

Caffe arendajad toetavad võimalust luua, treenida ja testida täielikult ühendatud ja konvolutsioonilisi närvivõrke. Sisendandmeid ja teisendusi kirjeldab mõiste kiht. Sõltuvalt salvestusvormingust saab kasutada järgmist tüüpi lähteandmete kihte.

  • ANDMED – määratleb andmekihi leveldb ja lmdb vormingus.
  • HDF5_DATA - andmekiht hdf5-vormingus.
  • IMAGE_DATA on lihtne vorming, mis eeldab, et fail sisaldab klassisildiga piltide loendit.
  • ja teised.
Teisendusi saab määrata kihtide abil:
  • INNER_PRODUCT on täielikult ühendatud kiht.
  • CONVOLUTION – keerdkiht.
  • POOLING – ruumiline koonduv kiht.
  • Local Response Normaization (LRN) – lokaalne normaliseerimiskiht.
Koos sellega saab neid kasutada teisenduste genereerimisel erinevaid funktsioone aktiveerimine.
  • Positiivne osa (Recified-Linear Unit, ReLU).
  • Sigmoidi funktsioon (SIGMOID).
  • Tangentne hüperboolne (TANH).
  • Absoluutväärtus (ABSVAL).
  • Astendamine (POWER).
  • Binomiaalse normaallogi tõenäosuse (BNLL) funktsioon.
Närvivõrgu mudeli viimane kiht peab sisaldama veafunktsiooni. Raamatukogul on järgmised funktsioonid:
  • Keskmine ruudu viga (MSE).
  • Hinge kaotus.
  • Logistilise kahju funktsioon.
  • Teabe hankimise funktsioon.
  • Sigmoidne ristentroopia kadu.
  • Softmax funktsioon. Üldistab sigmoidse ristentroopia rohkem kui kahe klassi puhul.
Treeningmudelite protsessis kasutatakse erinevaid optimeerimismeetodeid. Caffe arendajad pakuvad mitmeid meetodeid:

Caffe teegis määratakse prototxt formaadis konfiguratsioonifailide abil närvivõrkude topoloogia, lähteandmed ja treeningmeetod. Fail sisaldab sisendandmete (koolitus ja test) ja närvivõrgu kihtide kirjeldust. Vaatleme selliste failide loomise etappe, kasutades "logistilise regressiooni" () võrgu näidet. Järgnevalt eeldame, et faili nimi on linear_regression.prototxt ja see asub examples/mnist kataloogis.
Riis. 2. Närvivõrgu struktuur

Pylearn2 raamatukogu


Pylearn2 on raamatukogu, mis on välja töötatud Montreali ülikooli LISA laboris alates 2011. aasta veebruarist. Sellel on GitHubis umbes 100 arendajat. Raamatukogu levitatakse BSD 3-klausli litsentsi alusel.

Pylearn2 on rakendatud Pythonis, toetab praegu Linuxi operatsioonisüsteemi ja seda saab käivitada ka mis tahes virtuaalmasinat kasutavas operatsioonisüsteemis, kuna arendajad pakuvad konfigureeritud ümbrist virtuaalne keskkond Vagranti põhjal. Pylearn2 on Theano raamatukogu superkomplekt. Lisaks nõutav PyYAML, PIL. Arvutuste kiirendamiseks kasutavad Pylearn2 ja Theano Cuda-convneti, mis on realiseeritud C++/CUDA-s, mis suurendab oluliselt kiirust.

Pylearn2 toetab võimalust luua täielikult ühendatud ja konvolutsioonilisi närvivõrke, erinevat tüüpi automaatkodeerijad (kokkuleppelised automaatkodeerijad, denoiseerivad automaatkodeerijad) ja piiratud Boltzmanni masinad (Gaussi spiraalköiteseadised, spike-and-slab RBM). Pakutakse mitmeid veafunktsioone: ristentroopia, logaritmilisuse tõenäosus. Saadaval järgmisi meetodeid koolitus:

Pylearn2 teegis määratakse närvivõrgud nende kirjelduse järgi konfiguratsioonifail YAML-vormingus. YAML-failid on mugav ja kiire viis objektide serialiseerimiseks, kuna selle väljatöötamisel kasutatakse objektorienteeritud programmeerimistehnikaid.

Tõrviku raamatukogu


Torch on teaduslik andmetöötlusteek, mis toetab laialdaselt masinõppe algoritme. Välja töötatud Idiapi uurimisinstituuti, New Yorgi ülikooli ja NEC Laboratories America poolt alates 2000. aastast, levitatud BSD litsentsi alusel.

Teek on Luas rakendatud C ja CUDA abil. Kiire skriptikeel Lua koos SSE tehnoloogiad, OpenMP, CUDA võimaldavad Torchil teiste raamatukogudega võrreldes head kiirust näidata. Peal Sel hetkel Toetatud on operatsioonisüsteemid Linux, FreeBSD, Mac OS X Põhimoodulid töötavad ka Windowsis. Torchi sõltuvuste hulka kuuluvad imagemagick, gnuplot, nodejs, npm ja teised.

Teek koosneb moodulite komplektist, millest igaüks vastutab erinevad etapid närvivõrkudega töötamine. Nii näiteks moodul nn annab närvivõrgu konfiguratsiooni (kihtide ja nende parameetrite määratlus), mooduli optim sisaldab koolitusel kasutatavate erinevate optimeerimismeetodite rakendusi ja gnuplot annab võimaluse andmeid visualiseerida (graafikute koostamine, piltide kuvamine jne). Lisamoodulite installimine võimaldab laiendada teegi funktsionaalsust.

Torch võimaldab konteinermehhanismi abil luua keerulisi närvivõrke. Konteiner on klass, mis ühendab närvivõrgu deklareeritud komponendid üheks ühiseks konfiguratsiooniks, mille saab hiljem üle kanda treeningprotseduuri. Närvivõrgu komponendiks võivad olla mitte ainult täielikult ühendatud või konvolutsioonilised kihid, vaid ka aktiveerimis- või veafunktsioonid, aga ka valmiskonteinerid. Torch võimaldab teil luua järgmisi kihte:

  • Täielikult ühendatud kiht (lineaarne).
  • Aktiveerimisfunktsioonid: hüperboolne tangens (Tanh), miinimumi (Min) või maksimumi (Max) valik, softmax funktsioon (SoftMax) jt.
  • Konvolutsioonilised kihid: konvolutsioon (Convolution), hõrenemine (SubSampling), ruumiline ühendamine (MaxPooling, AveragePooling, LPPooling), erinevuse normaliseerimine (SubtractiveNormalization).
Veafunktsioonid: Mean Square Error (MSE), CrossEntropy jne.

Treeningu ajal saab kasutada järgmisi optimeerimismeetodeid:

Vaatame Torchis närvivõrgu konfigureerimise protsessi. Kõigepealt peate konteineri deklareerima ja seejärel lisama sellele kihid. Kihtide lisamise järjekord on oluline, sest... (n-1)-nda kihi väljund on n-nda kihi sisend.
regressioon = nn.Järgne() regressioon:lisa(nn.Lineaarne(784,10)) regressioon:lisa(nn.SoftMax()) kaotus = nn.ClassNLLCriterion()
Närvivõrgu kasutamine ja treenimine:

  1. Sisendandmete laadimine X. Funktsioon torch.load(path_to_ready_dset) võimaldab laadida eelnevalt ettevalmistatud andmekogumit teksti- või kahendvormingus. Tavaliselt on see Lua tabel, mis koosneb kolmest väljast: suurus, andmed ja sildid. Kui valmis andmestikku pole, saate kasutada standardseid Lua keele funktsioone (näiteks io.open(failinimi [, režiim])) või Torchi teegipakettide funktsioone (näiteks image.loadJPG(failinimi)).
  2. Võrgu vastuse määramine sisendandmetele X:
    Y = regressioon:edasi(X)
  3. Veafunktsiooni E = loss(Y,T) arvutamine, meie puhul on selleks tõenäosusfunktsioon.
    E = kaotus: edasi (Y, T)
  4. Gradientide arvutamine tagasilevimise algoritmi järgi.
    dE_dY = kaotus:tagasi(Y,T) regressioon:tagasi(X,dE_dY)
Nüüd paneme kõik kokku. Torchi raamatukogus närvivõrgu treenimiseks peate kirjutama oma treeningtsükli. Selles deklareerige spetsiaalne funktsioon (sulgemine), mis arvutab võrgu vastuse, määrab vea väärtuse ja arvutab ümber gradiendid ning edastab selle sulgemise gradiendi laskumise funktsioonile, et värskendada võrgu kaalu.
-- Spetsiaalsete muutujate loomine: närvivõrgu kaalud ja nende gradiendid w, dE_dw = regressioon:getParameters() local eval_E = function(w) dE_dw:zero() -- Gradientide värskendamine lokaalne Y = regressioon:forward(X) local E = kadu : forward(Y,T) local dE_dY = loss:backward(Y,T) regressioon:tagasi(X,dE_dY) return E, dE_dw end -- Seejärel kutsume treeningtsüklis optim.sgd(eval_E, w, optimState)
kus optimState on gradiendi laskumise parameetrid (õppimiskiirus, impulss, kaalulangus jne). Saate vaadata kogu treeningtsüklit.

On hästi näha, et deklareerimisprotseduur, nagu ka koolitusprotseduur, võtab vähem kui 10 koodirida, mis viitab teegi kasutusmugavusele. Samas võimaldab raamatukogu töötada närvivõrkudega üsna madalal tasemel.

Koolitatud võrgu salvestamine ja laadimine toimub spetsiaalsete funktsioonide abil:
tõrvik.save(tee, regressioon) net = tõrvik.load(tee)
Pärast laadimist saab võrku kasutada klassifitseerimiseks või täiendavaks koolituseks. Kui peate välja selgitama, millisesse klassi näidiselement kuulub, peate lihtsalt võrgu läbima ja väljundi arvutama:
tulemus = net:edasi(proov)
Keerulisemaid näiteid leiab raamatukogu koolitusmaterjalidest.

Theano raamatukogu


Theano on Pythoni keele laiendus, mis võimaldab teil tõhusalt hinnata sisaldavaid matemaatilisi avaldisi mitmemõõtmelised massiivid. Raamatukogu sai oma nime Vana-Kreeka filosoofi ja matemaatiku Pythagorase naise Theano (või Theano) auks. Theano töötati välja LISA laboris, et toetada masinõppe algoritmide kiiret arengut.

Teek on rakendatud Pythonis ja seda toetavad operatsioonisüsteemid Windowsi süsteemid, Linux ja Mac OS. Theano sisaldab kompilaatorit, mis tõlgib Pythonis kirjutatud matemaatilised avaldised tõhusaks C- või CUDA-koodiks.

Theano pakub põhikomplekt vahendid närvivõrkude seadistamiseks ja nende treenimiseks. Mitmekihilist on võimalik täielikult rakendada ühendatud võrgud(Multi-Layer Perceptron), Convolutional Neural Networks (CNN), Recurrent Neural Networks (RNN), Autoencoders ja Restricted Boltzmanni masinad. Samuti on ette nähtud erinevad aktiveerimisfunktsioonid, eelkõige sigmoidne, softmax-funktsioon, ristentroopia. Treeningu ajal kasutatakse partii gradiendi laskumist (Batch SGD).

Vaatame Theano närvivõrgu konfiguratsiooni. Mugavuse huvides rakendame klassi LogisticRegression(), mis sisaldab muutujaid - treenitavaid parameetreid W, b ja nendega töötamise funktsioone - võrgu vastuse arvutamist (y = softmax(Wx + b)) ja veafunktsiooni. Seejärel loome närvivõrgu treenimiseks funktsiooni train_model. Selle jaoks on vaja kirjeldada veafunktsiooni määravaid meetodeid, gradientide arvutamise reeglit, närvivõrgu kaalude muutmise meetodit, minipartii valimi suurust ja asukohta (pildid ise ja vastused neile). Kui kõik parameetrid on määratud, kompileeritakse funktsioon ja edastatakse treeningtsüklile.


Riis. 3. Klassiskeem närvivõrgu realiseerimiseks Theanos

Klassi tarkvara juurutamine

klass LogisticRegression(objekt): def __init__(self, input, n_in, n_out): # y = W * x + b # deklareerige muutujad, määrake ise tüüp, sisendite ja väljundite arv.W = theano.shared(# lähtestab algkaalud nullini value=numpy.zeros((n_in, n_out), dtype=theano.config.floatX), name="W", borrow=True) self.b = theano.shared(value=numpy.zeros(() n_out,), dtype=theano.config.floatX), name="b", borrow=True) # lisa softmaxi aktiveerimisfunktsioon, võrguväljund on muutuja y_pred self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b) self.y_pred = T.argmax(self.p_y_given_x, axis=1) self.params = # defineeri veafunktsioon def negative_log_likelihood(self, y): return -T.mean(T. log(self.p_y_given_x )) # x - söödetakse võrgusisendisse # piltide komplekt (minipartii) on maatriksis ridadesse paigutatud x # y - võrgu vastus igale proovile x = T.matrix("x") y = T.vector("y") # loo logistilise regressioonimudel iga MNIST-pildi suurus on 28*28 klassifikaator = Logistiline regressioon(input=x, n_in=28 * 28, n_out=10) # veafunktsiooni väärtus, mida me oleme proovides treeningu ajal minimeerida kulusid = classifier.negative_log_likelihood(y) # gradientide arvutamiseks peate kutsuma Theano funktsiooni - grad g_W = T.grad(cost=cost, wrt=classifier.W) g_b = T.grad(cost =cost, wrt=classifier.b) # määrake reeglid närvivõrgu kaalude värskendamiseks updates = [(klassifikaator.W, klassifikaator.W - õppimise_määr * g_W), (klassifikaator.b, klassifikaator.b - õppimise_määr * g_b)] # koostada treeningfunktsioon, edaspidi kutsutakse seda treeningtsüklis train_model = theano.function(inputs =, outputs=cost, updates=updates, givens=( x: train_set_x, y: train_set_y ))


Sest kiire salvestamine ja närvivõrgu parameetrite laadimisel saate kasutada cPickle paketi funktsioone:
import cPickle save_file = avatud("tee", "wb") cPickle.dump(klassifikaator.W.get_väärtus(laena=True), salvesta_fail, -1) cPickle.dump(klassifikaator.b.get_value(laena=True), salvesta_fail , -1) save_file.close() file = open("tee") klassifikaator.W.set_value(cPickle.load(save_file), borrow=True) classifier.b.set_value(cPickle.load(save_file), borrow=True )
On lihtne mõista, et mudeli loomise ja selle parameetrite määramise protsess nõuab mahuka ja mürarikka koodi kirjutamist. Raamatukogu on madalal tasemel. On võimatu mitte märkida selle paindlikkust, aga ka võimalust oma komponente rakendada ja kasutada. Raamatukogu ametlikul veebisaidil on suur hulk õppematerjale erinevatel teemadel.

Raamatukogude võrdlus käsitsi kirjutatud numbrite klassifitseerimise ülesande näitel

Testi infrastruktuur

Teekide jõudluse hindamiseks tehtud katsete käigus kasutati järgmist testimise infrastruktuuri:
  1. Ubuntu 12.04, Intel Core i5-3210M @ 2,5 GHz (CPU katsed).
  2. Ubuntu 14.04, Intel Core i5-2430M @ 2,4 GHz + NVIDIA GeForce GT 540M (GPU katsed).
  3. GCC 4.8, NVCC 6.5.

Võrgu topoloogiad ja koolitusparameetrid

Arvutuskatsed viidi läbi järgmise struktuuriga täielikult ühendatud ja konvolutsiooniliste närvivõrkudega:

Kõik kaalud lähtestati juhuslikult vastavalt ühtlasele jaotusseadusele vahemikus (−6/(n_in + n_out), 6/(n_in + n_out)), kus n_in, n_out on neuronite arv kihi sisendis ja väljundis. , vastavalt. Stohhastilise gradiendi laskumise (SGD) parameetrid on valitud järgmised väärtused: õppimiskiirus - 0,01, hoog - 0,9, kaalu vähenemine - 5e-4, partii suurus - 128, maksimaalne iteratsioonide arv - 150.

Eksperimentaalsed tulemused

Varem kirjeldatud närvivõrkude treeningaeg ( , ), kasutades nelja vaadeldavat teeki, on toodud allpool (

Tere kõigile!

Selles artiklis räägin uuest mugavast Pythonis programmeerimise viisist.

See on vähem nagu programmeerimine ja pigem artiklite loomine (aruanded/esitlused/uuringud/näited): Pythoni koodiplokkide vahele saate sisestada tavalist selgitavat teksti. Koodi täitmise tulemuseks pole mitte ainult numbrid ja tekst (nagu Pythoniga töötamisel konsooli puhul), vaid ka graafikud, diagrammid, pildid...

Näited dokumentidest, mida saate luua:

Tundub lahe? Kas soovite luua samu dokumente? Siis on see artikkel teie jaoks!

Närvivõrke luuakse ja koolitatakse peamiselt Pythonis. Seetõttu on väga oluline omada algteadmisi sellesse programmide kirjutamisest. Selles artiklis räägin lühidalt ja selgelt selle keele põhimõistetest: muutujad, funktsioonid, klassid ja moodulid.

Materjal on mõeldud inimestele, kes ei tunne programmeerimiskeeli.

Kõigepealt peate installima Pythoni. Siis tuleb panna mugav keskkond programmide kirjutamiseks Pythonis. Portaal on pühendatud neile kahele etapile.

Kui kõik on installitud ja konfigureeritud, võite alustada.

Närvivõrgud peavad olema kirjutatud mõnes programmeerimiskeeles. Neid on väga palju, aga ma soovitan (ja kasutan õpikus ja artiklites) täpselt Pythoni keel. Miks?

  1. Seda on väga lihtne õppida
  2. Suur hulk valmis raamatukogusid
  3. Kui vaatate programmi, näete kohe algoritmi, mida see rakendab
  4. Enamik masinõppespetsialiste kasutab Pythonit ja enamik teeke on samuti loodud spetsiaalselt selle programmeerimiskeele jaoks

Eelmises osas õppisime, kuidas arvutada signaali muutusi närvivõrgu läbimisel. Tutvusime maatriksite, nende korrutistega ja tuletasime lihtsad valemid arvutusteks.

Tõlke 6. osas postitan korraga 4 osa raamatust. Kõik need on pühendatud ühele kõige enam olulised teemad närvivõrkude valdkonnas - tagasilevimise meetod. Õpid arvutama kõigi närvivõrgu neuronite viga ainult võrgu lõpliku vea ja ühenduse kaalude põhjal.

Materjal on keeruline, nii et küsige oma küsimusi foorumis.

Saate üle kanda.

Nautige lugemist!

Tõlke 5. osas esitan 3 tähendusega seotud osa.

Esiteks arvutame isiklikult kahekihilise närvivõrgu väljundid. Seejärel tutvume maatriksite ja nende saadustega. Saadud teadmisi kasutades tuletame lihtsad valemid signaali muundamise arvutamiseks närvivõrgus. Ja viimases osas kontrollime saadud valemeid praktikas, arvutades kolmekihilise närvivõrgu väljundid.

Saate üle kanda.

Nautige lugemist!

4. osa tõlkest on valmis!

Lõpetagem võsa peksmine ja liigume otse raamatu teema juurde – närvivõrgud.

Selles tõlke osas vaatleme bioloogilisi närvivõrke ja võrdleme neid traditsiooniliste arvutitega. Seejärel ehitame tehisneuroni mudeli ja liigume lõpuks otse tehisnärvivõrkudesse.

Saate üle kanda.

Nautige lugemist!

Tõlke kolmas osa!

Artikkel ei ole väga pikk. See hõlmab ainult ühte osa raamatust. Eesmärk on näidata, et igal meetodil on oma piirangud. Artiklis käsitletakse lineaarse klassifikaatori piiranguid. Samuti tutvustatakse mõisteid loogilised funktsioonid ja XOR probleeme.

Saate üle kanda.

Nautige lugemist!

Selles artiklis räägin huvitavast muusikageneraatorist, mis töötab närvivõrkudes. Generaatori nimi on Amper. Selle abiga saab iga inimene, isegi keegi, kes on kompositsioonide loomisest kaugel, iseseisvalt luua ainulaadse meloodia ja kasutada seda oma eesmärkidel.

Siin on näiteks see, mida närvivõrk minu jaoks välja arendas.

Vaatleme impulssnärvivõrke: omadusi, väljavaateid ja eeliseid, tänu millele vahetatakse edukalt välja 2. põlvkond.

Igaüks, kes jälgib praegust andmeanalüüsi arengut, on kuulnud teise põlvkonna tehisnärvivõrkude kasutamisest masinõppes. Need võrgud on tavaliselt täielikult ühendatud, võttes vastu ja väljastades pidevalt muutuvaid väärtusi. Kuigi närvivõrgud on teinud läbimurdeid, ei ühti need bioloogiliselt päris neuronite struktuuriga ja inimaju infotöötlusmehhanismidega.

Impulssnärvivõrgud: tööpõhimõte

Spiking-närvivõrgud (SNN) on looduslikule füsioloogiale lähemal. Suurepärased närvivõrgud ületavad lõhe neuroteaduse ja masinõppe vahel, kasutades teabe töötlemiseks bioloogiliselt realistlikke neuronimudeleid.

Spiking närvivõrk erineb põhimõtteliselt teise põlvkonna närvivõrkudest, mida andmeanalüütikud kasutavad. Selline võrk, selle asemel, et aja jooksul pidevalt väärtusi muuta, töötab diskreetsete sündmustega, mis toimuvad teatud ajahetkedel. Võrk võtab sisenditest vastu rea impulsse ja toodab impulsse väljundis.


Näide signaalidest impulssnärvivõrgu kolmel neuronil

Reaalses neuronis määratakse impulsi ülekanne diferentsiaalvõrranditega, mis vastavad neuronimembraanil potentsiaalsete moodustumise biofüüsikalistele protsessidele. Niipea, kui potentsiaal saavutab teatud väärtuse, reageerib neuron sellele impulsi edastamisega ja membraan omandab oma esialgse potentsiaali.


Neuronmembraani potentsiaal signaali edastamise ajal

Protsessi kirjeldamiseks kasutatakse erinevaid mudeleid. Lülituvad närvivõrgud erinevad teise põlvkonna võrkudest ka selle poolest, et nad on topoloogialt vähem koherentsed ja spetsiifilisemad.

Spike-närvivõrgud: kaugus ja aeg

Esmapilgul võib SNN-i lähenemine tunduda sammuna tagasi – pidevast analoogpildist impulss-binaarsele pildile. SNN-i eeliseks on aga see, et impulss-lähenemine võimaldab opereerida andmetega, võttes arvesse neuronitevahelisi kaugusi ja signaali levimise kestust ehk ruumi ja aja kontekstis. Tänu sellele sobivad SNN-võrgud palju paremini reaalsete andurite andmete töötlemiseks.

Ruumiline aspekt peegeldab tõsiasja, et neuronid on peamiselt seotud lähimate naabritega ja seega töödeldakse sisendfragmente eraldi.

Ajaline aspekt vastab sellele, et treeningimpulsid tulevad kaasa mitmesugused viivitused, ja teave, mille me "kaotame", kui liigume pidevalt signaalilt impulsssignaalile, salvestatakse tegelikult teabesse impulsside viivituse kohta üksteise suhtes. See võimaldab töödelda ajutisi andmeid loomulikult ilma täiendava keerukuseta. On tõestatud, et spike neuronid on võimsamad arvutusüksused kui traditsioonilised tehisneuronid.

Probleemid praktiliseks kasutamiseks

Arvestades, et SNN-id on teoreetiliselt võimsamad närvivõrgud kui teise põlvkonna võrgud, on üllatav, miks me neid laialdaselt ei kasuta. Peamine probleem SNN-i praktilisel kasutamisel on koolitus. Vaatamata bioloogiliste järelevalveta õppemeetodite (nt Hebbian ja STDP) kättesaadavusele, ei ole need endiselt teada tõhusad meetodid rohkemat pakkuvate SNN-ide õppimine suur jõudlus kui teise põlvkonna võrgud.

Terade diferentseerimisega seotud probleemide tõttu ei saa SNN-e treenida gradiendi laskumise abil, kaotamata täpset ajalist teavet piikide kohta. Seetõttu on SNN-ide tõhusaks kasutamiseks reaalsete probleemide lahendamiseks vaja välja töötada sobivad juhendatud õppemeetodid. See on raske ülesanne – arvestades nende võrkude bioloogilist realismi, nõuab see täpset arusaamist sellest, kuidas inimaju õpib.

Teine, lahendusele lähemal olev probleem seisneb riistvarakomponendis. SNN-i simuleerimine standardse riistvaraga on aeganõudev ülesanne, kuna see nõuab simulatsiooni diferentsiaalvõrrandid. Neuromorfne riistvara, nagu IBM TrueNorth, püüab seda probleemi lahendada, simuleerides neuroneid spetsiaalse riistvara abil, mis vastab bioloogiliste närvivõrkude diskreetsusele ja hõredusele.

Arenguväljavaated

SNN-i tulevik on ebaselge. Ühest küljest on nad tänapäevaste närvivõrkude loomulikud järglased. Teisest küljest on SNN-id enamiku ülesannete jaoks endiselt praktilistest tööriistadest kaugel. Reaalajas pildi- ja helitöötluseks on juba olemas SNN-ide reaalsed rakendused, kuid selle kohta on kirjandus praktilisi rakendusi jääb napiks.

Enamik SNN-e käsitlevaid väljaandeid on kas teoreetilised või näitavad tänapäevaste probleemide jaoks ebarahuldavat jõudlust. Arvestades selle valdkonna äärmist lubadust, töötavad paljud teadusrühmad nende probleemide lahendamise kallal.

Yandex on kasutusele võtnud uue närvivõrkudel põhineva otsingualgoritmi. Ekspertide hinnangul peaks see aitama ettevõttel kasvada Venemaa turg vahe peamisest konkurendist – Google’ist

Venemaa Interneti-ettevõte Yandex võttis kasutusele uue närvivõrkudel põhineva otsingualgoritmi. Sellest teatas teenistuse asjakohasuse talituse juht Aleksandr Safronov. Uus algoritm nimega “Koroljov” otsib mitte ainult märksõnade, vaid ka tähenduse järgi ning keerulistele küsimustele antakse täpsemaid vastuseid, selgitas Yandexi esindaja.

2016. aastal tutvustas Yandex Palekhi algoritmi, mis võrdleb reaalajas haruldase ja ainulaadse päringu tähendust ja veebilehe pealkirja, isegi kui neil pole ühist. märksõnad. Näiteks kui küsite "maal, kus taevas keerleb", suudab otsingumootor tagastada Van Goghi "Tähelise öö". Erinevalt Palekhist suudab Korolev analüüsida kogu lehte ja ka teisi kasutajaid sellele suunavate päringute tähendust.

Yandexi otsingusuuna juht Andrei Stõkin tõi veel ühe näite keerulisest palvest: “film kosmosest, kus isa suhtleb tütrega läbi teise käega" Sel juhul ei sisalda päring märksõnu, kuid otsingualgoritm suudab aru saada, et jutt käib filmist “Interstellar”, ütleb Styskin.

Teenuse esindajate sõnul on närvivõrk võimeline ise õppima, seega mida rohkem kasutajaid otsingumootoris otsib, seda täpsemad on tulemused. Testimiseks kasutatakse 2014. aastal käivitatud avatud ühishankeplatvormi Yandex.Toloka. Põhimõtteliselt on see teenus, kus igaüks saab osaleda Yandexi toodete testimises, anda neile hinnanguid ja jätta kommentaare. See võimaldab ettevõttel oma teenuseid täiustada ja kasutajad saavad selle eest rahalised preemiad. Praegu on Yandex.Tolokas registreeritud üle 1 miljoni kasutaja.

"Närvivõrkude probleem seisnes selles, et need olid väga aeglased ja neid ei saanud kasutada suure hulga tekstidega reaalajas töötamiseks," ütleb Igor Ashmanov, Ashmanov ja partnerite asutaja ja juhtivpartner. "Kui Yandex suutis tõesti kaasata närvivõrgud kogu Runeti mahu indekseerimisele, on see huvitav, tehnoloogilisest seisukohast on see üsna tõsine läbimurre." Kui palju uus algoritm otsingu kvaliteeti parandab ja kas see seda põhimõtteliselt parandab, jääb analüüsimiseks, märkis Ašmanov.

Yandexi peamine konkurent Google ei ole Ashmanov ja Partnersi juhi sõnul veel ametlikult teatanud närvivõrkude kasutuselevõtust oma otsingualgoritmidesse. "Google saab endale lubada järjestamistogureid erinevalt seadistada ja katsetada selles valdkonnas kauem ilma otsingusse uusi tehnoloogiaid kasutusele võtmata, lihtsalt seetõttu, et ettevõttel on rohkem programmeerijaid ja ressursse," märkis ekspert.​


Jõua järele ja möödasõit

VTB Capitali analüütiku Vladimir Bespalovi sõnul uus versioon Vene otsingumootor - samm Yandexi turuosa säilitamiseks. "Uuendatud otsingu mobiilirakendus, uus otsingumootori algoritm - kõik see peaks aitama Yandexil stabiliseerida ja suurendada oma osakaalu otsinguturul," ütleb ekspert. — Mõju ei avaldu kohe, kuid otsingupäringute vähenemine pikemas perspektiivis võib edaspidisele toimivusele vähem soodsalt mõjuda. Otsing on Yandexi põhitoode; ettevõtte peamine sissetulek on reklaam, mis on seotud otsinguga.

FAS-i otsus võib aidata Yandexil säilitada oma positsiooni mobiiliotsingus, meenutab Bespalov. Selle aasta aprillis sõlmis osakond kokkuleppe Venemaa ettevõtte peamise konkurendiga aasta otsinguturg- Google. Selle kohaselt vaatab Ameerika Interneti-hiiglane uuesti läbi kokkulepped Android-nutitelefonide tootjatega Venemaal ja võimaldab kasutajatel valida oma seadmetes põhilistena. alternatiivne Google otsinguteenused.

Selle aasta teise kvartali lõpus oli Yandexi osa Venemaa otsinguturul 54,3%, teatas Yandex N.V. (Yandexi emaettevõte) oma finantsaruandes viitega oma analüüsiteenusele Yandex.Radar. Yandex.Radari andmetel oli Google 31. juuli seisuga 40,36% otsingumootorid Venemaal. LiveInneti andmetel oli viimase kolme kuu keskmisena otsingumootorite seas Yandex 51,1% osakaaluga, Google'il 43,9%. Yandex N.V. ei avalda otsingutulu, kuid suund “otsing ja portaal” tõi ettevõttele 20,135 miljardit rubla, mis on 22% rohkem kui 2016. aasta samal perioodil.

"Matrixneti otsingu eelmine revolutsiooniline versioon võimaldas Yandexil Google'ist lahku lüüa ja suurendada oma osakaalu peaaegu 10 protsendipunkti võrra. Pooleks aastaks. See on ilmekas näide sellest, kuidas läbimurdeliste tehnoloogiate kasutamine toob ilmseid äritulemusi isegi nii keerulisel turul nagu otsinguturg,” ütleb Skyengi veebikooli juhtivpartner ja Yandexi endine rahvusvahelise arenduse direktor Alexander Laryanovsky.

ABBYY ettevõtete grupi teadus- ja arendusdirektori asedirektori Tatjana Danieljani sõnul võib uute otsingualgoritmide kasutuselevõtt muuta ka pingerida (saitide otsingutulemustes kuvamise järjekord). See on aga pluss saitidele endile, ütleb ta: "Kasutajad külastavad tõenäolisemalt lehti, mis tegelikult nende vajadustele vastavad, ja saidikonversioonid võivad märkimisväärselt suureneda."