Come inizializzare gli elementi della matrice del filtro?


24

Sto cercando di capire meglio le reti neurali convoluzionali scrivendo il codice Python che non dipende dalle librerie (come Convnet o TensorFlow) e mi sto bloccando in letteratura su come scegliere i valori per la matrice del kernel, quando eseguendo una convoluzione su un'immagine.

Sto cercando di comprendere i dettagli dell'implementazione nel passaggio tra le mappe delle caratteristiche nell'immagine seguente che mostra i livelli di una CNN.

Strati della rete neurale convoluzionale

Secondo questo diagramma:

Convolgere un'immagine

Il kernel della matrice del kernel "passa" sull'immagine, creando una mappa delle caratteristiche, in cui ogni pixel è la somma di tutti i prodotti saggi tra ogni peso del kernel (o matrice del filtro) e il corrispondente valore di pixel dell'immagine di input.

La mia domanda è: come inizializziamo i pesi della matrice del kernel (o filtro)?

Nella dimostrazione sopra, sono semplicemente 1 e 0, ma suppongo che questo sia semplificato dal punto di vista del diagramma.

Questi pesi vengono addestrati in alcune fasi di preelaborazione? O scelto esplicitamente dall'utente?

Risposte:


19

Uno in genere inizializza una rete da una distribuzione casuale, in genere significa zero e si presta attenzione alla scelta della sua varianza. In questi giorni con i progressi nelle tecniche di ottimizzazione (SGD + Momentum tra gli altri metodi) e le non linearità di attivazione (ReLUs e attivazioni simili a ReLU consentono una migliore riprogrammazione dei segnali di gradiente, anche nelle reti più profonde), si è in grado di allenare realmente lo stato dell'arte convoluzionale reti neurali da un'inizializzazione randomizzata.

Le proprietà chiave sono le seguenti:

  • Perché casuale? Perché non inizializzarli tutti su 0? Un concetto importante qui si chiama rottura della simmetria . Se tutti i neuroni hanno gli stessi pesi, produrranno gli stessi risultati e non impareremo caratteristiche diverse. Non impareremo caratteristiche diverse perché durante la fase di backpropagation, tutti gli aggiornamenti di peso saranno esattamente gli stessi. Quindi, iniziare con una distribuzione randomizzata ci consente di inizializzare i neuroni in modo diverso (con probabilità molto alta) e ci consente di apprendere una gerarchia di funzionalità ricca e diversificata.

  • Perché significa zero? Una pratica comune nell'apprendimento automatico è centrare o normalizzare i dati di input, in modo tale che le funzionalità di input non elaborate (per i dati di immagine siano pixel) siano in media da zero.

    Abbiamo centrato a zero i nostri dati e inizializzeremo casualmente i pesi della nostra rete (matrici come indicato da loro). Che tipo di distribuzione dovremmo scegliere? La distribuzione dei dati di input sulla nostra rete ha significato zero poiché abbiamo centrato lo zero. Supponiamo che inizializziamo anche i nostri termini di bias su zero. Quando inizializziamo l'allenamento della nostra rete, non abbiamo motivo di favorire un neurone rispetto all'altro poiché sono tutti casuali. Una pratica è quella di inizializzare in modo casuale i nostri pesi in modo tale che tutti abbiano zero risultati di attivazione in attesa. In questo modo nessun neurone è favorito per "attivare" (avere un valore di uscita positivo) rispetto a qualsiasi altro neurone mentre contemporaneamente rompe la simmetria a causa dell'inizializzazione casuale. Bene, un modo semplice per ottenere ciò è scegliere una distribuzione zero media.

  • Come scegliamo le varianze? Non vuoi scegliere una varianza troppo grande, anche se è zero medio. Valori estremi in pesi di reti profonde possono comportare uscite di attivazione che aumentano esponenzialmente in grandezza e questo problema può aggravarsi con la profondità della rete. Questo può provocare il caos sulla formazione della nostra rete. Inoltre, non vuoi scegliere che sia troppo piccolo in quanto ciò potrebbe rallentare l'apprendimento poiché stiamo calcolando valori di gradiente molto piccoli. Quindi c'è un equilibrio qui, specialmente quando si tratta di reti più profonde poiché non vogliamo che le nostre propagazioni in avanti o all'indietro aumentino o diminuiscano in modo esponenziale in profondità.

    Esistono due schemi di inizializzazione del peso molto popolari: Glorot Uniform ( Comprensione della difficoltà di allenare le reti neurali feedforward profonde ) e l'inizializzatore He Normal ( Scavare in profondità nei raddrizzatori: superare le prestazioni a livello umano sulla classificazione ImageNet ).

    Entrambi sono costruiti con l'intento di formare reti profonde tenendo presente il seguente principio fondamentale (la citazione è tratta dall'articolo Delving Deeper in Rectifiers):

    "Un metodo di inizializzazione adeguato dovrebbe evitare di ridurre o ingrandire in modo esponenziale le dimensioni dei segnali di ingresso."

    In parole povere, questi due schemi di inizializzazione inizializzano la varianza di ogni strato in modo che la distribuzione in uscita di ciascun neurone sia la stessa. La sezione 2.2 di Delving Deep in Raddrizzatori fornisce un'analisi approfondita.

Un'ultima nota: a volte vedrai anche persone che usano gaussiano con deviazione standard uguale a 0,005 o 0,01, o qualche altra "piccola" deviazione standard, su tutti i livelli. Altre volte vedrai le persone giocherellare a mano con le varianze, fondamentalmente eseguendo la validazione incrociata per trovare una configurazione dalle prestazioni migliori.


1
Ma che dire della forma a "X" (creata da 1) del filtro giallo nella GIF sopra? Capisco che è quello che vorrei utilizzare per rilevare le forme "X" in qualsiasi punto dell'immagine, ma come faccio a sapere che "X" è la forma che desidero? Ho l'impressione che la forma del filtro venga appresa automaticamente, ma non so come. Forse questa era anche la domanda del PO?
Felipe Almeida,

2

Non posso commentare a causa della scarsa reputazione e quindi sto scrivendo questo in risposta alla domanda di Felipe Almeida. Dopo la risposta perfetta di AI Indie, non c'è molto altro da aggiungere. Se si desidera rilevare forme specifiche (come una X), è possibile pre-definire un filtro specifico, come nel caso del rilevamento dei bordi. Ma questa è la bellezza del deep learning, ci sono così tanti livelli, così tanti filtri e così tante iterazioni che i filtri apprendono quasi ogni forma di oggetto necessaria da sola. Quindi in teoria, se c'è una X da rilevare, uno dei filtri imparerà a rilevare una X (come filtro giallo)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.