Ricerca di iperparametri per LSTM-RNN usando Keras (Python)


18

Da Keras RNN Tutorial: "Gli RNN sono difficili. La scelta della dimensione del batch è importante, la scelta della perdita e l'ottimizzatore sono fondamentali, ecc. Alcune configurazioni non convergono."

Quindi questa è più una domanda generale sull'ottimizzazione degli iperparametri di un LSTM-RNN su Keras. Vorrei sapere un approccio per trovare i migliori parametri per il tuo RNN.

Ho iniziato con l' esempio IMDB sul Github di Keras .

il modello principale si presenta così:

(X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words=max_features,
                                                      test_split=0.2)

max_features = 20000
maxlen = 100  # cut texts after this number of words (among top max_features most common words)
batch_size = 32

model = Sequential()
model.add(Embedding(max_features, 128, input_length=maxlen))
model.add(LSTM(128))  
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
          optimizer='adam',
          class_mode="binary")

print("Train...")
model.fit(X_train, y_train, batch_size=batch_size, nb_epoch=3,
      validation_data=(X_test, y_test), show_accuracy=True)
score, acc = model.evaluate(X_test, y_test,
                        batch_size=batch_size,
                        show_accuracy=True)

print('Test accuracy:', acc)
Test accuracy:81.54321846

81.5 è un punteggio equo e, soprattutto, significa che il modello, anche se non completamente ottimizzato, funziona.

I miei dati sono serie temporali e l'attività è la previsione binaria, lo stesso dell'esempio. E ora il mio problema è simile al seguente:

#Training Data
train = genfromtxt(os.getcwd() + "/Data/trainMatrix.csv", delimiter=',', skip_header=1)
validation = genfromtxt(os.getcwd() + "/Data/validationMatrix.csv", delimiter=',', skip_header=1)

#Targets
miniTrainTargets = [int(x) for x in genfromtxt(os.getcwd() + "/Data/trainTarget.csv", delimiter=',', skip_header=1)]
validationTargets = [int(x) for x in genfromtxt(os.getcwd() + "/Data/validationTarget.csv", delimiter=',', skip_header=1)]

#LSTM
model = Sequential()
model.add(Embedding(train.shape[0], 64, input_length=train.shape[1]))
model.add(LSTM(64)) 
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
          optimizer='adam',
          class_mode="binary")

model.fit(train, miniTrainTargets, batch_size=batch_size, nb_epoch=5,
      validation_data=(validation, validationTargets), show_accuracy=True)
valid_preds = model.predict_proba(validation, verbose=0)
roc = metrics.roc_auc_score(validationTargets, valid_preds)
print("ROC:", roc)
ROC:0.5006526

Il modello è sostanzialmente lo stesso di quello IMDB. Sebbene il risultato significhi che non sta imparando nulla. Tuttavia, quando uso un MLP-NN alla vaniglia non ho lo stesso problema, il modello impara e il punteggio aumenta. Ho provato ad aumentare il numero di epoche e ad aumentare-diminuire il numero di unità LTSM ma il punteggio non aumenterà.

Quindi vorrei conoscere un approccio standard alla messa a punto della rete perché in teoria l'algoritmo dovrebbe funzionare meglio di una rete percettrice multistrato appositamente per questi dati di serie temporali.


1
Quanti dati hai? Qual è la lunghezza delle tue sequenze? Gli LSTM sono davvero utili solo per problemi con molti dati e dipendenze a lungo termine.
pir

La ricerca casuale o l'ottimizzazione bayesiana sono metodi standard per trovare iperparametri :)
pir

1
Sei sicuro di aver bisogno del livello di incorporamento? Molte serie di dati di serie temporali non ne avrebbero bisogno.
pir

Ho quasi 100.000 punti dati e il doppio delle funzionalità dell'esempio IMDB, quindi non credo che sia questo il problema. Per quanto riguarda il livello di incorporamento, come si collega esattamente il livello LSTM all'input? Secondo la documentazione keras.io/layers/recurrent/#lstm LSTM di Keras prende solo inizializzazioni, attivazioni e output_dim come argomenti. Se questa è la fonte dell'errore, il codice che descrive come eliminare il livello di incorporamento sarà molto apprezzato.
Wacax,

Si prega di vedere la mia risposta. Sembra che non ti serva il livello di incorporamento.
pir

Risposte:


5

Un livello di incorporamento trasforma numeri interi positivi (indici) in vettori densi di dimensione fissa. Per esempio, [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]. Questa conversione della rappresentazione viene appresa automaticamente con il livello di incorporamento in Keras (consultare la documentazione ).

Tuttavia, sembra che i tuoi dati non abbiano bisogno di tale livello di incorporamento per eseguire una conversione. Avere un livello di incorporamento non necessario è probabilmente il motivo per cui non è possibile far funzionare correttamente LSTM. In tal caso, è sufficiente rimuovere il livello di incorporamento.

Al primo livello della rete dovrebbe quindi essere input_shapeaggiunto l' argomento con informazioni sulle dimensioni dei dati (vedere esempi ). Si noti che è possibile aggiungere questo argomento a qualsiasi livello: non sarà presente nella documentazione per alcun livello specifico.


A proposito, gli iperparametri sono spesso sintonizzati usando la ricerca casuale o l'ottimizzazione bayesiana. Vorrei utilizzare RMSProp e concentrarmi sull'ottimizzazione delle dimensioni del batch (dimensioni come 32, 64, 128, 256 e 512), ritaglio gradiente (sull'intervallo 0,1-10) e dropout (sull'intervallo 0,1-0,6). Le specifiche ovviamente dipendono dai dati e dall'architettura del modello.


Con cosa proponete di sostituire il livello di incorporamento? Ho provato semplicemente a rimuovere il livello di incorporamento, ma non funziona.
Wacax,

1
Guarda gli altri esempi: inizia ad es. Direttamente con il livello Dense. Ricorda di impostare il parametro input_shape.
pir

5

Consiglierei l'ottimizzazione bayesiana per la ricerca di iperparametri e avrei avuto buoni risultati con Spearmint. https://github.com/HIPS/Spearmint Potrebbe essere necessario utilizzare una versione precedente per uso commerciale.



2

Talos è esattamente quello che stai cercando; una soluzione automatizzata per la ricerca di combinazioni di iperparametri per i modelli di Keras. Potrei non essere obiettivo poiché sono l'autore, ma l'intenzione è stata quella di fornire un'alternativa con la curva di apprendimento più bassa possibile mentre esponevo interamente la funzionalità di Keras.

In alternativa, come è già stato menzionato, è possibile esaminare Hyperas o SKlearn o AutoKeras . Per quanto ne so, al momento della stesura, queste 4 sono le opzioni specifiche per gli utenti di Keras.

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.