Classificazione dei disegni manoscritti. Segnala in Yandex

Alcuni mesi fa, i nostri colleghi di Google condotto su Kaggle un concorso per creare un classificatore per le immagini ottenute nel sensazionale il gioco "Veloce bozza!" Il team, di cui faceva parte lo sviluppatore Yandex Roman Vlasov, si è classificato quarto nella competizione. Al corso di formazione sul machine learning di gennaio, Roman ha condiviso le idee del suo team, l'implementazione finale del classificatore e le pratiche interessanti dei suoi avversari.


- Ciao a tutti! Mi chiamo Roma Vlasov, oggi vi parlerò di Quick, Draw! Sfida di riconoscimento degli scarabocchi.

Classificazione dei disegni manoscritti. Segnala in Yandex

C'erano cinque persone nella nostra squadra. Mi sono iscritto subito prima della scadenza della fusione. Siamo stati sfortunati, siamo stati scossi un po', ma noi siamo stati scossi dalla posizione monetaria, e loro sono stati scossi dalla posizione sull'oro. E abbiamo conquistato un onorevole quarto posto.

(Durante la competizione, le squadre si sono osservate in una valutazione, che è stata formata sulla base dei risultati mostrati su una parte del set di dati proposto. La valutazione finale, a sua volta, è stata formata su un'altra parte del set di dati. Ciò avviene così che i partecipanti al concorso non adattano i loro algoritmi a dati specifici. Pertanto, nelle finali, quando si passa da una valutazione all'altra, le posizioni si scuotono leggermente (dall'inglese shake up - mescolare): su altri dati, il risultato potrebbe risultare essere diverso. La squadra di Roman è arrivata prima tra le prime tre. In questo caso, i primi tre sono soldi, zona di valutazione monetaria, poiché solo i primi tre posti hanno ricevuto un premio in denaro. Dopo la riorganizzazione, la squadra era già in quarto posto. Allo stesso modo, l'altra squadra ha perso la vittoria, la posizione d'oro. - Ndr.)

Classificazione dei disegni manoscritti. Segnala in Yandex

La competizione è stata significativa anche in quanto Evgeniy Babakhnin ha ricevuto un Gran Maestro, Ivan Sosin ha ricevuto un Maestro, Roman Soloviev è rimasto un Gran Maestro, Alex Parinov ha ricevuto un Maestro, io sono diventato un esperto e ora sono già un maestro.

Classificazione dei disegni manoscritti. Segnala in Yandex

Cos'è questo Quick, Draw? Questo è un servizio di Google. Google aveva l’obiettivo di rendere popolare l’intelligenza artificiale e con questo servizio voleva mostrare come funzionano le reti neurali. Vai lì, fai clic su Disegniamo e si apre una nuova pagina in cui ti viene detto: disegna uno zigzag, hai 20 secondi per farlo. Stai cercando di disegnare uno zigzag in 20 secondi, come qui, ad esempio. Se ci riesci, la rete dice che è uno zigzag e tu vai avanti. Ci sono solo sei di queste immagini.

Se la rete di Google non riconosceva ciò che hai disegnato, veniva posizionata una croce sull'attività. Più tardi ti dirò cosa significherà in futuro se un disegno verrà riconosciuto dalla rete oppure no.

Questo servizio ha raccolto un numero abbastanza elevato di utenti e tutte le immagini disegnate dagli utenti sono state registrate.

Classificazione dei disegni manoscritti. Segnala in Yandex

Siamo riusciti a raccogliere quasi 50 milioni di immagini. Da ciò sono state formate la data del treno e della prova per la nostra competizione. A proposito, la quantità di dati nel test e il numero di classi sono evidenziati in grassetto per un motivo. Te ne parlerò un po' più tardi.

Il formato dei dati era il seguente. Queste non sono solo immagini RGB, ma, grosso modo, un registro di tutto ciò che ha fatto l'utente. La parola è il nostro obiettivo, il codice paese è il luogo di provenienza dell'autore dello scarabocchio, il timestamp è l'ora. L'etichetta riconosciuta mostra semplicemente se la rete ha riconosciuto o meno l'immagine di Google. E il disegno stesso è una sequenza, un'approssimazione di una curva che l'utente disegna con dei punti. E tempi. Questo è il tempo dall'inizio del disegno dell'immagine.

Classificazione dei disegni manoscritti. Segnala in Yandex

I dati sono stati presentati in due formati. Questo è il primo formato e il secondo è semplificato. Hanno tagliato i tempi da lì e hanno approssimato questo insieme di punti con un insieme di punti più piccolo. Per questo hanno usato Algoritmo di Douglas-Pecker. Hai un ampio insieme di punti che approssima semplicemente una linea retta, ma in realtà puoi approssimare questa linea con solo due punti. Questa è l’idea dell’algoritmo.

I dati sono stati distribuiti come segue. Tutto è uniforme, ma ci sono alcuni valori anomali. Quando abbiamo risolto il problema, non lo abbiamo guardato. La cosa principale è che non esistevano classi davvero poche, non dovevamo fare campionatori ponderati e sovracampionamento dei dati.

Classificazione dei disegni manoscritti. Segnala in Yandex

Che aspetto avevano le immagini? Questa è la classe "aeroplano" e i suoi esempi con le etichette riconosciute e non riconosciute. Il loro rapporto era intorno a 1 a 9. Come puoi vedere, i dati sono piuttosto rumorosi. Immagino che sia un aereo. Se guardi non riconosciuto, nella maggior parte dei casi è solo rumore. Qualcuno ha provato anche a scrivere “aereo”, ma pare in francese.

La maggior parte dei partecipanti ha semplicemente preso delle griglie, ha disegnato i dati da questa sequenza di linee come immagini RGB e le ha inserite nella rete. Ho disegnato più o meno allo stesso modo: ho preso una tavolozza di colori, ho disegnato la prima linea con un colore, che era all'inizio di questa tavolozza, l'ultima linea con un'altra, che era alla fine della tavolozza, e tra di loro Ho interpolato ovunque utilizzando questa tavolozza. A proposito, questo ha dato un risultato migliore che se disegnassi come nella primissima diapositiva, solo in nero.

Altri membri del team, come Ivan Sosin, hanno provato approcci leggermente diversi al disegno. Con un canale ha semplicemente disegnato un'immagine grigia, con un altro canale ha disegnato ogni tratto con una sfumatura dall'inizio alla fine, da 32 a 255, e con il terzo canale ha disegnato una sfumatura su tutti i tratti da 32 a 255.

Un'altra cosa interessante è che Alex Parinov ha caricato le informazioni sulla rete utilizzando il codice paese.

Classificazione dei disegni manoscritti. Segnala in Yandex

La metrica utilizzata nella competizione è la precisione media media. Qual è l’essenza di questo parametro per la concorrenza? Puoi fornire tre previsioni e se non c'è una previsione corretta in queste tre, ottieni 0. Se ce n'è una corretta, viene preso in considerazione il suo ordine. E il risultato target verrà conteggiato come 1 diviso per l'ordine della tua previsione. Ad esempio, hai creato tre predittori e quello corretto è il primo, quindi dividi 1 per 1 e ottieni 1. Se il predittore è corretto e il suo ordine è 2, dividi 1 per 2, ottieni 0,5. Bene, ecc.

Classificazione dei disegni manoscritti. Segnala in Yandex

Con la preelaborazione dei dati - come disegnare immagini e così via - abbiamo deciso un po'. Quali architetture abbiamo utilizzato? Abbiamo provato a utilizzare architetture grasse come PNASNet, SENet e architetture già classiche come SE-Res-NeXt, che stanno entrando sempre più in nuove competizioni. C'erano anche ResNet e DenseNet.

Classificazione dei disegni manoscritti. Segnala in Yandex

Classificazione dei disegni manoscritti. Segnala in Yandex

Classificazione dei disegni manoscritti. Segnala in Yandex

Come lo abbiamo insegnato? Tutti i modelli che abbiamo preso sono stati pre-addestrati su imagenet. Sebbene ci siano molti dati, 50 milioni di immagini, tuttavia, se si prende una rete pre-addestrata su imagenet, ha mostrato risultati migliori che se l'avessi semplicemente addestrata da zero.

Quali tecniche didattiche abbiamo utilizzato? Si tratta del Cosing Annealing with Warm Restarts, di cui parlerò poco dopo. Questa è una tecnica che utilizzo in quasi tutte le mie ultime gare, e con esse riesco ad allenare abbastanza bene le griglie, per ottenere un buon minimo.

Classificazione dei disegni manoscritti. Segnala in Yandex

Successivo Ridurre il tasso di apprendimento sull'Altopiano. Inizi ad addestrare la rete, stabilisci un certo tasso di apprendimento, continui a insegnarla e la tua perdita converge gradualmente verso un certo valore. Controlla questo, ad esempio, per dieci epoche la perdita non è cambiata affatto. Riduci il tuo tasso di apprendimento di un certo valore e continui ad apprendere. Cala di nuovo un po', converge al minimo, quindi abbassi nuovamente il tasso di apprendimento e così via, finché la tua rete non converge finalmente.

La prossima è una tecnica interessante: non diminuire la velocità di apprendimento, aumentare la dimensione del batch. C'è un articolo con lo stesso nome. Quando si addestra una rete, non è necessario ridurre la velocità di apprendimento, è sufficiente aumentare la dimensione del batch.

Questa tecnica, tra l'altro, è stata utilizzata da Alex Parinov. Ha iniziato con un batch pari a 408 e quando la sua rete ha raggiunto un certo plateau, ha semplicemente raddoppiato la dimensione del batch, ecc.

In effetti, non ricordo quale valore raggiunse la dimensione del batch, ma la cosa interessante è che c'erano team su Kaggle che utilizzavano la stessa tecnica, la dimensione del batch era di circa 10000. A proposito, i framework moderni per il deep learning, come PyTorch, ad esempio, ti consente di farlo molto facilmente. Generi il tuo batch e lo invii alla rete non così com'è, nella sua interezza, ma lo dividi in blocchi in modo che si adatti alla tua scheda video, calcoli i gradienti e, dopo aver calcolato il gradiente per l'intero batch, aggiorni i pesi.

A proposito, lotti di grandi dimensioni erano ancora inclusi in questa competizione, perché i dati erano piuttosto rumorosi e una dimensione di batch di grandi dimensioni aiutava ad approssimare con maggiore precisione il gradiente.

È stata utilizzata anche la pseudo-etichettatura, utilizzata principalmente da Roman Soloviev. Ha campionato circa la metà dei dati del test in lotti e ha addestrato la griglia su tali lotti.

La dimensione delle immagini era importante, ma il fatto è che hai molti dati, devi allenarti per molto tempo e se la dimensione della tua immagine è piuttosto grande, ti allenerai per molto tempo. Ma questo non ha aggiunto molto alla qualità del classificatore finale, quindi valeva la pena usare una sorta di compromesso. E abbiamo provato solo immagini di dimensioni non molto grandi.

Come è stato appreso tutto? Per prima cosa sono state scattate foto di piccole dimensioni, su di esse sono state eseguite diverse epoche, ciò ha richiesto molto tempo. Poi sono state fornite immagini di grandi dimensioni, la rete è stata addestrata, poi ancora di più, ancora di più, per non addestrarla da zero e non perdere molto tempo.

Informazioni sugli ottimizzatori. Abbiamo usato SGD e Adam. In questo modo è stato possibile ottenere un unico modello, che ha fornito una velocità di 0,941-0,946 nella classifica pubblica, il che è abbastanza buono.

Se uniamo i modelli in qualche modo, otterremo qualcosa intorno a 0,951. Se usi un'altra tecnica, otterrai un punteggio finale di 0,954 sul tabellone pubblico, proprio come abbiamo ottenuto noi. Ma ne parleremo più avanti. Successivamente ti dirò come abbiamo assemblato i modelli e come siamo riusciti a raggiungere questa velocità finale.

Successivamente vorrei parlare del Cosing Annealing con riavvii a caldo o della discesa del gradiente stocastico con riavvii a caldo. In parole povere, in linea di principio, puoi utilizzare qualsiasi ottimizzatore, ma il punto è questo: se alleni solo una rete e gradualmente converge al minimo, allora va tutto bene, otterrai una rete, commette alcuni errori, ma tu puoi addestrarlo in modo leggermente diverso. Imposterai un tasso di apprendimento iniziale e lo abbasserai gradualmente secondo questa formula. Lo abbassi, la tua rete arriva al minimo, quindi salvi i pesi e imposti nuovamente il tasso di apprendimento che era all'inizio dell'allenamento, andando così da qualche parte verso l'alto rispetto a questo minimo e abbassando nuovamente il tasso di apprendimento.

Pertanto, puoi visitare più minimi contemporaneamente, in cui la tua perdita sarà, più o meno, la stessa. Ma il fatto è che le reti con questi pesi daranno errori diversi alla tua data. Facendo la media, otterrai una sorta di approssimazione e la tua velocità sarà maggiore.

Classificazione dei disegni manoscritti. Segnala in Yandex

Su come abbiamo assemblato i nostri modelli. All'inizio della presentazione ho detto di prestare attenzione alla quantità di dati nel test e al numero di lezioni. Se aggiungi 1 al numero di obiettivi nel set di test e dividi per il numero di classi, otterrai il numero 330, e questo è stato scritto sul forum: che le classi nel test sono bilanciate. Questo potrebbe essere usato.

Sulla base di ciò, Roman Soloviev ha ideato un parametro, l'abbiamo chiamato Proxy Score, che si correlava abbastanza bene con la classifica. Il punto è: fai una previsione, prendi il primo dei tuoi predittori e conti il ​​numero di oggetti per ciascuna classe. Successivamente, sottrai 1 da ciascun valore e somma i valori assoluti risultanti.

Sono stati ottenuti i seguenti valori. Questo ci ha aiutato non a creare una classifica esplorativa, ma a convalidare localmente e selezionare i coefficienti per i nostri ensemble.

Con un ensemble potresti ottenere una tale velocità. Cos'altro potrei fare? Supponiamo che tu abbia utilizzato l'informazione che le classi nel tuo test sono bilanciate.

Il bilanciamento era diverso. Un esempio di uno di loro - bilanciamento da parte dei ragazzi che hanno preso il primo posto.

Cosa abbiamo fatto? Il nostro bilanciamento è stato abbastanza semplice, ci è stato suggerito da Evgeny Babakhnin. Per prima cosa abbiamo ordinato le nostre previsioni in base ai primi 1 e abbiamo selezionato i candidati tra loro, in modo che il numero di classi non superasse 330. Ma per alcune classi ti ritroverai con meno di 330 predittori. Ok, ordiniamo anche in base ai primi 2 e ai primi 3 , e selezioneremo anche i candidati.

In cosa differiva il nostro bilanciamento dal bilanciamento del primo posto? Hanno usato un approccio iterativo, prendendo la classe più popolare e diminuendo le probabilità per quella classe di un numero piccolo fino a quando quella classe non era più la più popolare. Abbiamo seguito la lezione successiva più popolare. Quindi continuarono ad abbassarli finché il numero di tutte le classi non divenne uguale.

Tutti hanno utilizzato un approccio più o meno per addestrare le reti, ma non tutti hanno utilizzato il bilanciamento. Usando il bilanciamento, potresti passare all'oro e, se sei fortunato, al denaro.

Come preelaborare una data? Tutti hanno preelaborato la data, più o meno, allo stesso modo: creando caratteristiche artigianali, cercando di codificare i tempi con diversi colori di tratto, ecc. Alexey Nozdrin-Plotnitsky, che ha ottenuto l'8 ° posto, ne ha parlato.

Classificazione dei disegni manoscritti. Segnala in Yandex

Lo ha fatto diversamente. Ha detto che tutte queste tue funzionalità artigianali non funzionano, non è necessario che tu lo faccia, la tua rete dovrebbe imparare tutto questo da sola. E invece, ha inventato moduli di apprendimento che preelaboravano i tuoi dati. Ha inserito i dati originali in essi senza pre-elaborazione: coordinate e tempi dei punti.

Quindi ha preso la differenza in base alle coordinate e ha calcolato la media in base ai tempi. E ha inventato una matrice piuttosto lunga. Ha applicato più volte la convoluzione 1D per ottenere una matrice di dimensione 64xn, dove n è il numero totale di punti, e 64 viene creato per alimentare la matrice risultante allo strato di qualsiasi rete convoluzionale, che accetta il numero di canali - 64. ottenne una matrice 64xn, quindi da questa fu necessario creare un tensore di una certa dimensione tale che il numero di canali fosse pari a 64. Normalizzò tutti i punti X, Y nell'intervallo da 0 a 32 per creare una matrice tensore di dimensioni 32x32. Non so perché volesse il 32×32, è semplicemente andata così. E a questa coordinata ha collocato un frammento di questa matrice di dimensioni 64xn. Quindi il risultato è un tensore 32x32x64 che potresti inserire ulteriormente nella tua rete neurale convoluzionale. Questo è tutto quello che volevo dire.

Fonte: habr.com

Aggiungi un commento