Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Antaŭ kelkaj monatoj, niaj kolegoj de Guglo elspezita sur Kaggle konkurso por krei klasigilon por bildoj akiritaj en la sensacia la ludo "Rapide, Desegnas!" La teamo, kiu inkludis Yandex-programiston Roman Vlasov, prenis la kvaran lokon en la konkurado. Ĉe la januara maŝinlernado trejnado, Roman dividis la ideojn de sia teamo, la finan efektivigon de la klasigilo kaj interesajn praktikojn de siaj kontraŭuloj.


- Saluton al ĉiuj! Mi nomiĝas Roma Vlasov, hodiaŭ mi rakontos al vi pri Rapida, Desegnu! Doodle-Rekono-Defio.

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Estis kvin homoj en nia teamo. Mi aliĝis tuj antaŭ la limdato de kunfandado. Ni estis malbonŝancaj, ni estis skuitaj iomete, sed ni estis skuitaj de la monpozicio, kaj ili estis skuitaj de la ora pozicio. Kaj ni prenis honorindan kvaran lokon.

(Dum la konkurso, la teamoj observis sin en taksado, kiu estis formita surbaze de la rezultoj montritaj sur unu parto de la proponita datumaro. La fina takso, siavice, estis formita sur alia parto de la datumaro. Ĉi tio estas farita tiel. ke la konkursantoj ne alĝustigu siajn algoritmojn al specifaj datumoj.Sekve, en la finalo, kiam ŝanĝas inter taksoj, la pozicioj iom skuiĝas (el la angla shake up - miksi): ĉe aliaj datumoj, la rezulto povas rezulti. esti malsama.La teamo de Roman estis unua en la supraj tri.En ĉi tiu kazo, la supraj tri estas mono, mona taksa zono, ĉar nur la unuaj tri lokoj ricevis kontantan premion.Post la skuado, la teamo jam estis en kvara loko. Same la alia teamo perdis la venkon, la oran pozicion. - Red.)

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

La konkurso estis ankaŭ signifa, ke Evgenij Babaĥnin ricevis grandmajstron, Ivan Sosin ricevis majstron, Roman Soloviev restis grandmajstro, Alex Parinov ricevis majstron, mi fariĝis spertulo, kaj nun mi jam estas majstro.

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Kio estas ĉi tiu Rapida, Desegnu? Ĉi tio estas servo de Guglo. Google havis la celon popularigi AI kaj per ĉi tiu servo volis montri kiel funkcias neŭralaj retoj. Vi iras tien, klaku Ni desegnu, kaj nova paĝo aperas kie oni diras al vi: desegnu zigzagon, vi havas 20 sekundojn por fari tion. Vi provas desegni zigzagon en 20 sekundoj, kiel ĉi tie, ekzemple. Se vi sukcesas, la reto diras, ke ĝi estas zigzago kaj vi pluiras. Estas nur ses tiaj bildoj.

Se la reto de Google ne rekonis tion, kion vi desegnis, kruco estis metita sur la taskon. Poste mi diros al vi, kion signifos estonte ĉu desegnaĵo estas rekonita de la reto aŭ ne.

Ĉi tiu servo kolektis sufiĉe grandan nombron da uzantoj, kaj ĉiuj bildoj, kiujn uzantoj desegnis, estis registritaj.

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Ni sukcesis kolekti preskaŭ 50 milionojn da bildoj. El tio formiĝis la trajno kaj testdato por nia konkurso. Cetere, la kvanto da datumoj en la testo kaj la nombro da klasoj estas emfazitaj en grasa kaŭzo. Pri ili mi rakontos al vi iom poste.

La datumformato estis kiel sekvas. Ĉi tiuj ne estas nur RGB-bildoj, sed, proksimume, protokolo de ĉio, kion faris la uzanto. Vorto estas nia celo, landokodo estas de kie la aŭtoro de la doodle estas, tempostampo estas tempo. La agnoskita etikedo nur montras ĉu la reto rekonis la bildon de Guglo aŭ ne. Kaj la desegnaĵo mem estas sinsekvo, proksimuma kurbo, kiun la uzanto desegnas per punktoj. Kaj tempoj. Ĉi tiu estas la tempo de la komenco de desegno de la bildo.

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Datumoj estis prezentitaj en du formatoj. Ĉi tiu estas la unua formato, kaj la dua estas simpligita. Ili tranĉis la tempigojn de tie kaj proksimigis ĉi tiun aron de punktoj kun pli malgranda aro de punktoj. Por tio ili uzis Douglas-Pecker-algoritmo. Vi havas grandan aron da punktoj, kiuj simple proksimigas rektan linion, sed fakte vi povas proksimigi ĉi tiun linion per nur du punktoj. Ĉi tiu estas la ideo de la algoritmo.

La datumoj estis distribuitaj jene. Ĉio estas unuforma, sed estas kelkaj eksteruloj. Kiam ni solvis la problemon, ni ne rigardis ĝin. La ĉefa afero estas, ke ne estis klasoj kiuj estis vere malmultaj, ni ne devis fari pezbalancilojn kaj datumtrospecimenton.

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Kiel aspektis la bildoj? Ĉi tiu estas la "aviadilo" klaso kaj ekzemploj de ĝi kun la etikedoj rekonitaj kaj nerekonitaj. Ilia proporcio estis ie ĉirkaŭ 1 ĝis 9. Kiel vi povas vidi, la datumoj estas sufiĉe bruaj. Mi supozus, ke ĝi estas aviadilo. Se vi rigardas ne rekonita, en la plej multaj kazoj ĝi estas nur bruo. Iu eĉ provis skribi "aviadilo", sed ŝajne en la franca.

Plej multaj partoprenantoj simple prenis kradojn, desegnis datumojn de ĉi tiu sekvenco de linioj kiel RGB-bildojn, kaj ĵetis ilin en la reton. Mi desegnis proksimume same: mi prenis paletron da koloroj, desegnis la unuan linion per unu koloro, kiu estis komence de ĉi tiu paletro, la lastan linion kun alia, kiu estis ĉe la fino de la paletro, kaj inter ili. Mi interpolis ĉie uzante ĉi tiun paletron. Cetere, ĉi tio donis pli bonan rezulton ol se vi desegnas kiel sur la unua diapozitivo - nur nigre.

Aliaj grupanoj, kiel Ivan Sosin, provis iomete malsamajn alirojn al desegnaĵo. Per unu kanalo li simple desegnis grizan bildon, per alia kanalo li desegnis ĉiun strekon kun gradiento de komenco ĝis fino, de 32 ĝis 255, kaj per la tria kanalo li desegnis gradienton super ĉiuj strekoj de 32 ĝis 255.

Alia interesa afero estas, ke Alex Parinov alŝutis informojn al la reto uzante landokodon.

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

La metriko uzata en la konkurso estas Meza Meza Precizo. Kio estas la esenco de ĉi tiu metriko por konkurado? Vi povas doni tri antaŭdirojn, kaj se ne estas ĝusta antaŭdiro en ĉi tiuj tri, tiam vi ricevas 0. Se estas ĝusta, tiam ĝia ordo estas konsiderata. Kaj la cela rezulto estos kalkulita kiel 1 dividita per la ordo de via prognozo. Ekzemple, vi faris tri antaŭdirojn, kaj la ĝusta estas la unua, tiam vi dividas 1 per 1 kaj ricevas 1. Se la prognozilo estas ĝusta kaj ĝia ordo estas 2, tiam dividu 1 per 2, vi ricevas 0,5. Nu, ktp.

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Kun antaŭtraktado de datumoj - kiel desegni bildojn kaj tiel plu - ni iom decidis. Kiajn arkitekturojn ni uzis? Ni provis uzi grasajn arkitekturojn kiel PNASNet, SENet, kaj tiajn jam klasikajn arkitekturojn kiel SE-Res-NeXt, ili ĉiam pli eniras novajn konkursojn. Ekzistis ankaŭ ResNet kaj DenseNet.

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Kiel ni instruis ĉi tion? Ĉiuj modeloj, kiujn ni prenis, estis antaŭtrejnitaj sur imagenet. Kvankam estas multe da datumoj, 50 milionoj da bildoj, sed tamen, se vi prenas reton antaŭtrejnitan ĉe imagenet, ĝi montris pli bonajn rezultojn ol se vi simple trejnis ĝin de nulo.

Kiajn instruteknikojn ni uzis? Ĉi tio estas Cosing Annealing kun Varmaj Rekomencoj, pri kiu mi parolos iom poste. Ĉi tio estas tekniko, kiun mi uzas en preskaŭ ĉiuj miaj lastatempaj konkursoj, kaj per ili rezultas sufiĉe bone trejni la kradojn, por atingi bonan minimumon.

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Sekva Redukti Lernan Procenton sur Altebenaĵo. Vi komencas trejni la reton, fiksas certan lernprocenton, daŭre instruas ĝin, kaj via perdo iom post iom konverĝas al certa valoro. Vi kontrolas tion, ekzemple, dum dek epokoj la perdo tute ne ŝanĝiĝis. Vi reduktas vian lernadon je iom da valoro kaj daŭre lernas. Ĝi denove falas iomete, konverĝas almenaŭ, kaj vi denove malaltigas la lernadon, kaj tiel plu, ĝis via reto finfine konverĝas.

Poste estas interesa tekniko: Ne malkresku la lernprocenton, pliigu la aron. Estas artikolo kun la sama nomo. Kiam vi trejnas reton, vi ne devas redukti la lernadon, vi povas simple pliigi la aran grandecon.

Ĉi tiu tekniko, cetere, estis uzata de Alex Parinov. Li komencis kun aro egala al 408, kaj kiam lia reto atingis iun altebenaĵon, li simple duobligis la aron, ktp.

Fakte, mi ne memoras, kian valoron atingis lia aro-grandeco, sed kio estas interesa estas, ke estis teamoj sur Kaggle, kiuj uzis la saman teknikon, ilia aro-grandeco estis ĉirkaŭ 10000 XNUMX. Cetere, modernaj kadroj por profunda lernado, kiel ekzemple PyTorch, ekzemple, permesas vin fari tion tre facile. Vi generas vian aron kaj sendas ĝin al la reto ne tia, kia ĝi estas, en ĝia tuteco, sed dividu ĝin en partojn por ke ĝi konvenu en vian vidkarton, kalkulu la gradientojn, kaj post kiam vi kalkulis la gradienton por la tuta aro, ĝisdatigu. la pezoj.

Cetere, grandaj aroj ankoraŭ estis inkluzivitaj en ĉi tiu konkurso, ĉar la datumoj estis sufiĉe bruaj, kaj granda aro helpis vin pli precize proksimigi la gradienton.

Pseŭdo-etikedado ankaŭ estis uzita, plejparte uzita fare de Roman Soloviev. Li provis proksimume duonon de la datumoj de la testo en aroj, kaj trejnis la kradon sur tiaj aroj.

Gravis la grandeco de la bildoj, sed la fakto estas, ke vi havas multajn datumojn, vi bezonas trejni dum longa tempo, kaj se via bildogrando estas sufiĉe granda, tiam vi trejnos tre longan tempon. Sed ĉi tio ne multe aldonis al la kvalito de via fina klasigilo, do valoris uzi iun specon de kompromiso. Kaj ni nur provis bildojn, kiuj ne estis tre grandaj.

Kiel ĉio estis lernita? Unue oni faris etajn bildojn, oni kuris sur ili plurajn epokojn, tio okupis sufiĉe da tempo. Tiam oni donis grandgrandajn bildojn, la reto estis trejnita, poste eĉ pli, eĉ pli, por ne trejni ĝin de nulo kaj ne malŝpari multe da tempo.

Pri optimumigiloj. Ni uzis SGD kaj Adam. Tiel eblis akiri ununuran modelon, kiu donis rapidon de 0,941-0,946 sur la publika gvidtabulo, kio estas sufiĉe bona.

Se vi ensemblos la modelojn iel, vi ricevos ie ĉirkaŭ 0,951. Se vi uzas unu plian teknikon, vi ricevos finan poentaron de 0,954 sur la publika tabulo, same kiel ni ricevis. Sed pli pri tio poste. Poste mi rakontos al vi kiel ni kunvenis la modelojn, kaj kiel ni sukcesis atingi tian finan rapidon.

Poste mi ŝatus paroli pri Cosing Annealing kun Warm Restarts aŭ Stochastic Gradient Descent kun Warm Restarts. Proksimume dirite, principe, vi povas uzi ajnan optimumigilon, sed la afero estas jena: se vi nur trejnas unu reton kaj iom post iom ĝi konverĝas al iom da minimumo, tiam ĉio estas en ordo, vi ricevos unu reton, ĝi faras iujn erarojn, sed vi povas trejni ĝin iomete alimaniere. Vi starigos ian komencan lernprocenton, kaj iom post iom malaltigos ĝin laŭ ĉi tiu formulo. Vi malaltigas ĝin, via reto venas al iom da minimumo, tiam vi ŝparas la pezojn, kaj denove fiksas la lernprocenton, kiu estis komence de trejnado, tiel irante ien supren de ĉi tiu minimumo, kaj denove malaltigante vian lernadon.

Tiel, vi povas viziti plurajn minimumojn samtempe, en kiuj via perdo estos, plus aŭ minus, la sama. Sed la fakto estas, ke retoj kun ĉi tiuj pezoj donos malsamajn erarojn en via dato. Per mezumo de ili, vi ricevos ian proksimumadon, kaj via rapideco estos pli alta.

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Pri kiel ni kunvenis niajn modelojn. Komence de la prezento, mi diris, ke mi atentu la kvanton da datumoj en la testo kaj la nombro da klasoj. Se vi aldonas 1 al la nombro da celoj en la testaro kaj dividas per la nombro da klasoj, vi ricevos la nombron 330, kaj ĉi tio estis skribita sur la forumo - ke la klasoj en la testo estas ekvilibraj. Ĉi tio povus esti uzata.

Surbaze de ĉi tio, Roman Soloviev elpensis metrikon, ni nomis ĝin Prokura Poentaro, kiu sufiĉe bone korelaciis kun la gvidtabulo. La punkto estas: vi faras antaŭdiron, prenu la supran 1 el viaj prognoziloj kaj kalkulas la nombron da objektoj por ĉiu klaso. Poste, subtrahu 330 el ĉiu valoro kaj sumu la rezultajn absolutajn valorojn.

La sekvaj valoroj estis akiritaj. Ĉi tio helpis nin ne krei sondan gvidtablon, sed validigi loke kaj elekti koeficientojn por niaj ensembloj.

Kun ensemblo oni povus akiri tian rapidecon. Kion alian mi povus fari? Supozu, ke vi uzis la informojn, ke la klasoj en via testo estas ekvilibraj.

La ekvilibro estis malsama. Ekzemplo de unu el ili — ekvilibro de la uloj kiuj prenis la unuan lokon.

Kion ni faris? Nia ekvilibro estis sufiĉe simpla, ĝi estis proponita de Evgeny Babaĥnin. Ni unue ordigis niajn antaŭdirojn laŭ la supraj 1 kaj elektis kandidatojn el ili - tiel ke la nombro da klasoj ne superis 330. Sed por iuj klasoj oni finas kun malpli ol 330 antaŭdiroj. Bone, ni ankaŭ ordigu laŭ supraj 2 kaj la supraj 3. , kaj ni ankaŭ elektos kandidatojn.

Kiel nia ekvilibro diferencis de la ekvilibro de la unua loko? Ili uzis ripetan aliron, prenante la plej popularan klason kaj malpliigante la probablojn por tiu klaso je iu malgranda nombro ĝis tiu klaso ne plu estis la plej populara. Ni prenis la sekvan plej popularan klason. Do ili daŭre malaltigis ilin ĝis la nombro de ĉiuj klasoj egaliĝis.

Ĉiuj uzis pli aŭ minus unu aliron por trejni retojn, sed ne ĉiuj uzis ekvilibron. Uzante ekvilibron, vi povus iri en oron, kaj se vi estus bonŝanca, tiam en monon.

Kiel antaŭprocezi daton? Ĉiuj antaŭprocesis la daton, plus aŭ minus, en la sama maniero - farante manfaritajn funkciojn, provante kodi tempojn per malsamaj strekkoloroj, ktp. Pri tio parolis Aleksej Nozdrin-Plotnitsky, kiu prenis la 8-an lokon.

Klasifiko de manskribitaj desegnaĵoj. Raporto en Yandex

Li faris ĝin alimaniere. Li diris, ke ĉiuj ĉi tiuj manfaritaj funkcioj viaj ne funkcias, vi ne bezonas fari tion, via reto devus lerni ĉion ĉi memstare. Kaj anstataŭe, li elpensis lernajn modulojn, kiuj antaŭtraktis viajn datumojn. Li ĵetis la originajn datumojn en ilin sen antaŭtraktado - punktokoordinatoj kaj tempoj.

Tiam li prenis la diferencon bazitan sur la koordinatoj, kaj averaĝis ĉion surbaze de la tempoj. Kaj li elpensis sufiĉe longan matricon. Li plurfoje aplikis 1D-konvolucion al ĝi por akiri matricon de grandeco 64xn, kie n estas la tutsumo de punktoj, kaj 64 estas farita por nutri la rezultan matricon al la tavolo de iu konvolucia reto, kiu akceptas la nombron da kanaloj. - 64. li akiris 64xn-matricon, tiam el tio necesis krei tensoron de iu grandeco, por ke la nombro da kanaloj estu egala al 64. Li normaligis ĉiujn punktojn X, Y en la intervalo de 0 ĝis 32 por krei tensoro de grandeco 32x32. Mi ne scias kial li volis 32x32, ĝi simple okazis tiel. Kaj ĉe ĉi tiu koordinato li metis fragmenton de ĉi tiu matrico de grandeco 64xn. Do ĝi ĵus finiĝis kun 32x32x64 tensoro, kiun vi povus meti plu en vian konvolucian neŭralan reton. Tion mi volis diri.

fonto: www.habr.com

Aldoni komenton