Decay al learning rate en Deep Learning

| Última modificación: 4 de octubre de 2024 | Tiempo de Lectura: 4 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Decay al learning rate en Deep Learning es uno de los métodos más importantes para el manejo de redes de neuronas profundas, por ello, en este recorrido se conoce su implementación como uno de unos los más complejos y necesarios.

Por este motivo, en este post, te explicamos qué es el decay al learning rate en Deep Learning.

Decay al learning rate en Deep Learning

En primer lugar, aplicar el decay al learning rate en Deep Learning es una opción muy utilizada para lograr un learning rate óptimo, conforme va disminuyendo la función de pérdidas (lo que indica que estamos llegando al mínimo buscado).

Como puedes imaginar, el learning rate es un parámetro muy importante. De manera que, si ponemos un learning rate muy alto, podemos saltarnos el mínimo. En cambio, si ponemos un learning rate muy bajo, igual tendríamos que esperar una eternidad antes de ver el resultado. ¿Cómo podemos arreglar esto?

Una forma de solucionarlo sería dar pasos más grandes al principio y, conforme nos aproximamos a la meta, empezar a disminuir su longitud para no pasárnosla. A esto se le llama decay al learning rate en Deep Learning y, a continuación, te lo ilustramos con un ejemplo.

Por ejemplo

# definimos la función para entrenar nuestra red con los parámetros deseados
def train_network_decay(learning_rate, lr_decay, batch_size, n_epochs):
  
  # creamos los contenedores para nuestras entradas y salidas
  x = tf.placeholder(tf.float32, [None, 784]) # imágenes del mnist: 28*28=784
  y = tf.placeholder(tf.float32, [None, 10]) # número indicando la clase 0-9 => 10 clases
  
  # creamos las variables W y b para el entrenamiento
  W = tf.Variable(tf.zeros([784, 10]))
  b = tf.Variable(tf.zeros([10]))

  # por último, construimos el modelo
  pred = tf.nn.softmax(tf.matmul(x, W) + b)

  # ahora, definimos nuestra función de pérdidas: la cros-entropía
  # a veces la llaman loss, a veces cost; es lo mismo
  cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))

  # calculamos los gradientes (gradient descent)
  grad_W, grad_b = tf.gradients(xs=[W, b], ys=cost)
  
  # definimos las operaciones para actualizar los pesos con los gradientes calculados
  # e implementamos el learning rate decay **IMPORTANTE**
  new_W = W.assign(W - learning_rate * (1-lr_decay) * grad_W)
  new_b = b.assign(b - learning_rate * (1-lr_decay) * grad_b)

  # inicializamos las variables
  init = tf.global_variables_initializer()
  
  # para almacenar el histórico de costes
  costs = []
  # inicializamos current_lr
  current_lr = learning_rate
  # empezamos la sesión
  with tf.Session() as sess:
      sess.run(init)

      # entrenamiento de nuestra red
      for epoch in range(n_epochs):
          avg_cost = 0.
          total_batch = int(mnist.train.num_examples/batch_size)

          # En vez de actualizar los pesos para cada imagen, podríamos
          # hacerlo de X en X imágenes
          for i in range(total_batch):
              batch_xs, batch_ys = mnist.train.next_batch(batch_size)

              # ejecutamos la optimización
              Wc, bc, c = sess.run([new_W, new_b ,cost], feed_dict={x: batch_xs,
                                                                    y: batch_ys})

              # calculamos el coste teniendo en cuenta los batches que hay
              avg_cost += c / total_batch
              
          # actualizamos el learning_rate igual que lo hace tensorflow
          current_lr = current_lr * (1-lr_decay)

          # guardamos nuestro coste en el histórico
          costs.append(avg_cost)
          
          # Imprimimos las iteraciones
          # current_lr = learning_rate * (1-lr_decay) ** (epoch * batch_size + i)
          print("[{}] cost: {} lr: {}".format(epoch, avg_cost, current_lr))

      print("Entrenamiento finalizado")
# comprobamos lo que ha aprendido nuestra red
      correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))

      # ahora, calculamos el accuracy (precisión)
      accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
      print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))
      
  # veamos nuestra función de pérdidas con respecto a las épocas ejecutadas
  plt.plot(np.arange(0, n_epochs), costs)
  plt.title("Training Loss")
  plt.xlabel("Epoch #")
plt.ylabel("Loss")
# vamos a probar nuestra red con decay al learning rate en Deep Learning
learning_rate = 0.2
lr_decay = 1e-4
n_epochs = 10
batch_size = 128
train_network_decay(learning_rate, lr_decay, batch_size, n_epochs)

Con esta simple mejora, hemos sido capaces de mejorar la precisión con respecto al learning rate óptimo, que habíamos definido como 0.1. También existen métodos más complejos de aplicar el decay que producen mejores resultados.

Cabe destacar que esta implementación de decay al learning rate en Deep Learning es muy básica. En realidad, existen distintos tipos de “calendarios” de actualización de learning rate: de escalón, polinomial, etc. Al final, lo que hacen todos es modificar el learning rate de acuerdo a una ecuación o regla.

En este post, te hemos explicado qué es el decay al learning rate en Deep Learning, de manera que ahora puedas emplearlo en tu procesamiento de los macrodatos. No obstante, sabemos que querrás ampliar tu conocimiento en esta área del manejo Big Data y en KeepCoding, ¡tenemos la opción perfecta para ti!

Para facilitarte el proceso de aprendizaje, te brindamos el Bootcamp de Big Data y Data Science, por medio del que te formarás en el proceso de ingesta, clasificación, resguardo, procesamiento y presentación de los macrodatos gracias al uso de diferentes herramientas, sistemas y lenguajes. Al finalizar, en menos de nueve meses, serás capaz de reconocer las ventajas e inconvenientes de los distintos programas estudiados. ¡Échale un vistazo a nuestro temario e inscríbete ya!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado