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
.