I codificatori automatici non possono apprendere funzioni significative


24

Ho 50.000 immagini come queste due:

esempio di dati esempio di dati 2

Rappresentano grafici di dati. Volevo estrarre funzionalità da queste immagini, quindi ho usato il codice di autoencoder fornito da Theano (deeplearning.net).

Il problema è che questi codificatori automatici non sembrano apprendere alcuna funzionalità. Ho provato RBM ed è lo stesso.

Il set di dati MNIST offre funzioni interessanti ma i miei dati non sembrano produrre alcunché. Allego esempi di seguito:

Filtri creati su MNIST:

filtro mnist

Filtri creati dall'allenamento sui miei dati:

filtri dai miei dati

Ho usato molte diverse permutazioni di dimensioni di strati nascosti ed epoche di allenamento, ma i risultati sono sempre gli stessi.

Perché non funziona? Perché i codificatori automatici non possono estrarre funzionalità da queste immagini?

MODIFICARE:

Per chiunque abbia un problema simile. La soluzione era davvero semplice e la causa era davvero stupida. Ho appena dimenticato di ridimensionare i valori dei pixel dalla codifica RGB a float nell'intervallo 0 - 1.

Il salvataggio dei valori ha risolto il problema.

Risposte:


15

Il debug delle reti neurali di solito comporta la modifica di iperparametri, la visualizzazione dei filtri appresi e la stampa di metriche importanti. Potresti condividere quali iperparametri stai usando?

  • Qual è la dimensione del tuo lotto?
  • Qual è il tuo tasso di apprendimento?
  • Che tipo di codificatore automatico stai usando?
  • Hai provato a utilizzare un autodificatore Denoising? (Quali valori di corruzione hai provato?)
  • Quanti strati nascosti e di quali dimensioni?
  • Quali sono le dimensioni delle immagini di input?

Anche l'analisi dei registri di allenamento è utile. Traccia un grafico della perdita di ricostruzione (asse Y) in funzione dell'epoca (asse X). La tua perdita di ricostruzione sta convergendo o divergendo?

Ecco un esempio di un codificatore automatico per la classificazione di genere umano che era divergente, è stato fermato dopo 1500 epoche, aveva sintonizzato gli iperparametri (in questo caso una riduzione del tasso di apprendimento) e riavviato con gli stessi pesi che stavano divergendo e alla fine convergevano.

Eccone uno che converge: (lo vogliamo)

La vaniglia "non vincolata" può incorrere in un problema in cui semplicemente imparano la mappatura dell'identità. Questo è uno dei motivi per cui la community ha creato i sapori Denoising, Sparse e Contractive.

Potresti pubblicare un piccolo sottoinsieme dei tuoi dati qui? Sarei più che disposto a mostrarti i risultati di uno dei miei autoencoder.

Nota a margine: potresti chiederti perché stai usando le immagini dei grafici in primo luogo quando quei grafici potrebbero essere facilmente rappresentati come un vettore di dati. Vale a dire,

[0, 13, 15, 11, 2, 9, 6, 5]

Se riesci a riformulare il problema come sopra, essenzialmente stai semplificando la vita del tuo codificatore automatico. Non è necessario prima imparare a vedere le immagini prima di poter provare a imparare la distribuzione generatrice.

Risposta di follow-up (dati forniti)

Ecco i filtri di un'unità nascosta 1000, Autoencoder Denoising a strato singolo. Nota che alcuni dei filtri sono apparentemente casuali. Questo perché ho smesso di allenarmi così presto e la rete non ha avuto il tempo di imparare quei filtri.

Ecco gli iperparametri con cui l'ho allenato:

batch_size = 4
epochs = 100
pretrain_learning_rate = 0.01
finetune_learning_rate = 0.01
corruption_level = 0.2

Ho smesso di pre-allenamento dopo la 58a epoca perché i filtri erano sufficientemente buoni per essere pubblicati qui. Se fossi in te, mi allenerò per iniziare un codificatore di denoising in pila a 3 strati completo con un'architettura 1000x1000x1000.

Ecco i risultati della fase di messa a punto:

validation error 24.15 percent
test error 24.15 percent

Quindi, a prima vista, sembra meglio del caso, tuttavia, quando osserviamo la suddivisione dei dati tra le due etichette, vediamo che ha esattamente la stessa percentuale (75,85% redditizio e 24,15% non redditizio). Ciò significa che la rete ha imparato a rispondere semplicemente "redditizio", indipendentemente dal segnale. Probabilmente lo farei allenare più a lungo con una rete più grande per vedere cosa succede. Inoltre, sembra che questi dati siano generati da una sorta di set di dati finanziari sottostante. Consiglierei di esaminare le reti neurali ricorrenti dopo aver riformulato il problema nei vettori come descritto sopra. Gli RNN possono aiutare a catturare alcune delle dipendenze temporali che si trovano nei dati della timeseries come questa. Spero che sia di aiuto.


La dimensione del mio lotto è 20. La velocità di apprendimento è impostata su 0,1. Ho provato inutilmente gli autoencoders contrattuali e denigratori. Uso un livello nascosto. Ho provato di tutto, dai 50 ai 1000 neuroni. Ridimensiono le immagini su 25x25, quindi sono anche più piccole di mnist. Per quello che vale, allego tutti i miei dati in questo archivio: Potresti mostrarmi i risultati dei tuoi codificatori automatici e questi dati?
b93dh44,

L'archivio: mega.co.nz/…
b93dh44

OK, ho addestrato una rete con quei dati. Vedi la modifica nella risposta.
Sabalaba,

Sembra davvero interessante. Potresti pubblicare il tuo codice? Lo apprezzerei davvero. Penso che potrei avere qualche bug nel mio codice che impedisce alla rete di allenarsi. Ho notato che hai una fase di messa a punto? Penso che il mio auto-codificatore preceda solo senza alcuna messa a punto. Potresti mostrarmi la tua soluzione, se non ti dispiace?
b93dh44,

Non riesco a pubblicare il mio codice perché è la mia azienda, ma posso indicarti questo tutorial che ha un codice di esempio per creare un codificatore automatico di Denoising: deeplearning.net/tutorial/dA.html . Tutti i consigli sull'iperparametro saranno validi per quel codice.
Sabalaba,

3

Non ho abbastanza rappresentante per commentare, quindi lo rispondo. Non conosco il motivo esatto, tuttavia:

  1. Il motivo nella regione in basso a sinistra è simile al secondo esempio e il motivo nell'angolo in basso a destra sembra molto simile al tuo primo esempio, se esaminato attentamente. La domanda è: quanta varietà c'è nei tuoi dati di origine? Se tutte le 50.000 immagini sono variazioni dello stesso modello, queste 3 mappe delle caratteristiche significative che vediamo possono essere abbastanza sufficienti per l'auto-codificatore per spiegare e ricostruire tutti i tuoi dati.

  2. In secondo luogo, potresti voler esaminare l'errore di ricostruzione e le immagini ricostruite effettive. Quanto sono buoni i risultati? Se l'errore di ricostruzione è basso, potresti avere un eccesso di vestibilità, forse a causa delle risonanze descritte di seguito (o forse la combinazione di questi 3 schemi è appena sufficiente per descrivere tutti i dati a cui sei interessato). Altrimenti, il codificatore automatico non può semplicemente imparare a ricostruire i tuoi dati e hai bisogno di un codificatore automatico più grande o di un algoritmo di allenamento migliore.


1. Penso che ci sia molta varietà in questi dati. Ognuno di questi 50.000 grafici è leggermente diverso. Penso che sia impossibile che il codificatore automatico possa ricostruirli tutti in base a soli 3 filtri. 2. Qualche consiglio per stimare l'errore di ricostruzione? Il codice che sto usando fornisce l'errore ma è un numero davvero grande che non mi dice molto. Dovrei confrontare l'errore di ricostruzione con la dimensione dell'input o il numero di livelli nascosti?
b93dh44,
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.