2016-06-01 50 views
6

Tensorflow offre un bel wrapper LSTM.Regolarizzazione per LSTM in tensorflow

rnn_cell.BasicLSTM(num_units, forget_bias=1.0, input_size=None, 
      state_is_tuple=False, activation=tanh) 

Vorrei utilizzare regolarizzazione, dicono L2 regolarizzazione. Tuttavia, non ho accesso diretto alle diverse matrici dei pesi utilizzati nella cella LSTM, quindi non posso fare qualcosa di simile in modo esplicito

loss = something + beta * tf.reduce_sum(tf.nn.l2_loss(weights)) 

Esiste un modo per accedere alle matrici o utilizzare regolarizzazione in qualche modo con LSTM?

+0

Ho messo un intero processo come risposta alla tua domanda. Chk out https://stackoverflow.com/questions/37869744/tensorflow-lstm-regularization/46761296#46761296 – sdr2002

risposta

9

tf.trainable_variables fornisce un elenco di oggetti Variable che è possibile utilizzare per aggiungere il termine di regolarizzazione L2. Si noti che questo aggiunge la regolarizzazione per tutte le variabili nel modello. Se si desidera limitare il termine L2 solo a un sottoinsieme dei pesi, è possibile utilizzare name_scope per assegnare un nome alle variabili con prefissi specifici e utilizzarlo successivamente per filtrare le variabili dall'elenco restituito da tf.trainable_variables.

0

tensorflow ha alcune funzioni incorporate e di supporto che consentono di applicare le norme L2 al vostro modello come tf.clip_by_global_norm:

# ^^^ define your LSTM above here ^^^ 

    params = tf.trainable_variables() 

    gradients = tf.gradients(self.losses, params) 

    clipped_gradients, norm = tf.clip_by_global_norm(gradients,max_gradient_norm) 
    self.gradient_norms = norm 

    opt = tf.train.GradientDescentOptimizer(self.learning_rate) 
    self.updates = opt.apply_gradients(
        zip(clipped_gradients, params), global_step=self.global_step) 

nella tua formazione passo run:

outputs = session.run([self.updates, self.gradient_norms, self.losses], input_feed) 
6

mi piace fare ciò che segue, tuttavia, l'unica cosa che so è che alcuni parametri preferiscono non essere regolarizzati con L2, come i parametri e i bias della norma batch. LSTM contiene un tensore Bias (nonostante concettualmente ha molti bias, sembrano concatenati o qualcosa, per le prestazioni), e per la normalizzazione del lotto aggiungo "noreg" nel nome delle variabili per ignorarlo anch'io.

loss = your regular output loss 
l2 = lambda_l2_reg * sum(
    tf.nn.l2_loss(tf_var) 
     for tf_var in tf.trainable_variables() 
     if not ("noreg" in tf_var.name or "Bias" in tf_var.name) 
) 
loss += l2 

Dove lambda_l2_reg è il piccolo moltiplicatore, ad esempio: float(0.005)

Facendo questa selezione (che è la piena if nel circuito scartando alcune variabili nella regolarizzazione) una volta mi ha fatto saltare da 0,879 punteggio F1 a 0,890 in un colpo di test del codice senza riaggiustare il valore di lambda della config, beh questo includeva sia le modifiche per la normalizzazione batch che i Bias e io avevo altri pregiudizi nella rete neurale.

In base a this paper, la regolarizzazione dei pesi ricorrenti può aiutare con i gradienti di esplosione.

Inoltre, in base a this other paper, il dropout sarebbe meglio utilizzato tra le celle impilate e non all'interno delle celle se ne si utilizza un po '.

Informazioni sul problema del gradiente di esplosione, se si utilizza il ritaglio sfumato con la perdita a cui è già stata aggiunta la regolarizzazione L2, tale regolarizzazione verrà presa in considerazione anche durante il processo di ritaglio.


P.S. Ecco la rete neurale su cui stavo lavorando: https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs