work peepholes paper neural networks network how graves example celda neural-network tensorflow lstm recurrent-neural-network

neural-network - peepholes - rnn tensorflow



Regularización para LSTM en tensorflow (3)

Me gusta hacer lo siguiente, pero lo único que sé es que algunos parámetros prefieren no regularse con L2, como los parámetros de norma de lote y los sesgos. LSTMs contiene un tensor de Bias (a pesar de que conceptualmente tiene muchos sesgos, parecen concatenados o algo por el rendimiento), y para la normalización del lote agrego "noreg" en el nombre de las variables para ignorarlo también.

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

Donde lambda_l2_reg es el pequeño multiplicador, por ejemplo: float(0.005)

Hacer esta selección (que es el total if en el ciclo descarta algunas variables en la regularización) una vez me hizo saltar de 0.879 puntaje de F1 a 0.890 en una oportunidad de probar el código sin reajustar el valor de la lambda de la configuración, bueno esto incluía ambos los cambios para la normalización del lote y los sesgos y yo teníamos otros sesgos en la red neuronal.

Según este documento , regularizar los pesos recurrentes puede ayudar a explotar los gradientes.

Además, de acuerdo con este otro documento , la deserción se utilizaría mejor entre las células apiladas y no dentro de las células si usa algunas.

Sobre el problema del gradiente de explosión, si usa el recorte de degradado con la pérdida que ya tiene agregada la regularización L2, dicha regularización también se tendrá en cuenta durante el proceso de recorte.

PD Aquí está la red neuronal en la que estaba trabajando: https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs

Tensorflow ofrece una bonita envoltura LSTM.

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

Me gustaría usar la regularización, digamos la regularización L2. Sin embargo, no tengo acceso directo a las diferentes matrices de peso utilizadas en la celda LSTM, por lo que no puedo hacer algo explícitamente como

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

¿Hay alguna manera de acceder a las matrices o utilizar la regularización de alguna manera con LSTM?


Tensorflow tiene algunas funciones integradas y de ayuda que le permiten aplicar las normas L2 a su modelo, como 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)

en tu paso de entrenamiento ejecuta:

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


tf.trainable_variables le proporciona una lista de objetos Variable que puede usar para agregar el término de regularización L2. Tenga en cuenta que esto agrega regularización para todas las variables en su modelo. Si desea restringir el término L2 solo a un subconjunto de los pesos, puede usar el name_scope para nombrar sus variables con prefijos específicos, y luego usar eso para filtrar las variables de la lista devuelta por tf.trainable_variables .