MLP per la regressione non sta imparando abbastanza?
Sto lavorando a un problema di regressione per prevedere 3 uscite da 5 input, Gli input vanno da -30 a 30 ad eccezione di un input che va da 20000 a -2e7. Le 3 uscite vanno da 0 a 2e6, sto usando l'API di Keras e la mia rete è semplice 3 strati nascosti (32 16 9),
Sto usando leaky relu e Adam optimizer e sto addestrando oltre 500 epoche con una dimensione batch = 64. Uso sklearn standardscaler () per standardizzare i dati.
Il mio problema è che la rete non impara e le previsioni che sto ottenendo non sono affatto accurate !! Ho provato a complicare la rete aggiungendo strati e unità ma non funziona affatto, ho anche provato a utilizzare diversi metodi di normalizzazione come minmax () e tanh estimator ma non sono stati notati miglioramenti !!
Ho provato molte combinazioni di velocità di apprendimento (da 0,1 a 0,000001) anche epoche = (da 100 a 1000000), ho provato a cambiare la dimensione del lotto (da 10 a 256) senza fortuna.
Ho provato diverse funzioni di attivazione (relu, elu ... ecc.) Ho anche provato diversi ottimizzatori (RMSprop, SGD, adagrad, adam ... ecc.) Nessun miglioramento !!!
La mia perdita di convalida in genere va da circa 1 a 0,3 e smette di migliorare, ho provato a dividere la rete in 3 reti in cui ognuna prevede un solo output ma non ha migliorato nulla !!
questo è il mio modello:
e questa è la mia curva di apprendimento:
Queste sono le distribuzioni dei dati di output
e qui ci sono le distribuzioni dei dati di input:
Non c'è relazione tra gli ingressi e le uscite !! Qualcuno può aiutarmi con questo problema?! grazie!
Risposte
La tua curva di apprendimento sembra buona, l'errore quadratico medio sta diminuendo sia per il set di test che per quello di addestramento e dopo un po 'la rete ha imparato ciò che può apparentemente. "Non abbastanza" è soggettivo, ma sembra che sia apprendimento, nessun problema evidente.
Detto questo, ho i seguenti suggerimenti
- Scala i tuoi input per assomigliare a una distribuzione normale. Per gli input da 1 a 3, l'effetto sarà limitato, dovresti semplicemente dividerlo per la deviazione standard (assicurati di stimarlo dalla distribuzione del test). Per gli altri due, applica prima una scala logaritmica, quindi ridimensionala.
- Scala anche la variabile di output usando un logaritmo e ridimensionala
- La tua rete sembra un po 'pesante, riduci il numero di livelli a due e riduci anche il numero di nodi nei livelli nascosti. Ad esempio, usa
5 input - 5 livelli nascosti - 3 output 5 input - 3 livelli nascosti - 3 output
EDIT: se è vero che gli input e gli output sono indipendenti, tutto questo esercizio è inutile. Non puoi fare buone previsioni se i tuoi input non dicono nulla sugli output. Bravo a @Dave per aver colto questo problema fondamentale.
EDIT: Allora la domanda è; come può ancora diminuire il MSE? Immagino che ciò sia dovuto al fatto che la rete sta imparando i risultati medi. Se si inizializza una rete, soprattutto con tali predittori e risultati non graduati, sarà molto peggio della previsione della media degli output. Adatterà i parametri in modo da prevedere la media per tutti gli output, che è il meglio che puoi fare con informazioni indipendenti (in altre parole, inutili).
Hai detto che gli ingressi e le uscite sono indipendenti. In tal caso, stai ottenendo la risposta giusta. Non dovresti essere in grado di utilizzare gli input per prevedere gli output.
Questo è ciò che significa indipendenza: conoscere qualcosa su uno non dà un'idea dell'altro.