El learning rate en Deep Learning es uno de los procesos que forman parte de la optimización de hiperparámetros en Deep Learning.
En efecto, de entre todos los hiperparámetros, el learning rate y el batch size son dos parámetros directamente relacionados con el algoritmo del gradient descent.
En este post, te presentamos que es el learning rate en Deep Learning.
Learning rate en Deep Learning
Para aprender sobre el learning rate en Deep Learning, te recordamos que la forma de actualizar los pesos es mediante estas fórmulas:

Lo que multiplica al ∂Etotal/∂wn, llamado η, es el learning rate, que indica la importancia que le damos al error para actualizar cada peso, es decir, la rapidez o cómo de abruptos son los cambios en los pesos.
Así, un η muy alto, hará que los cambios en los pesos sean muy grandes de una iteración a otra, lo que genera el problema de que podemos llegar a saltarnos nuestro mínimo.
Con esta imagen podrás verlo mejor:

Otra posibilidad es establecer un η muy bajo, lo que haría que nuestra red necesitara muchísimas épocas para llegar a un mínimo aceptable. Además, correríamos el riesgo de quedarnos atrapados en un mínimo peor del mejor que podríamos conseguir con un η más alto.

Vamos a hacer un pequeño inciso para hablar sobre los mínimos: lo que conseguimos con una red neuronal, normalmente, no es alcanzar el mínimo global de nuestra función, sino que alcanzamos un mínimo local lo suficientemente bueno como para realizar correctamente la tarea que estamos desarrollando.
Tras haber aclarado esto, queda patente lo importante que es conseguir un learning rate adecuado. Fíjate en esta imagen:

Lo que queremos es un learning rate en Deep Learning óptimo que nos permita ir reduciendo el error conforme van pasando las épocas hasta llegar a nuestro mínimo buscado. En la gráfica, este learning rate sería la línea roja. ¿Y cómo conseguimos que nuestro learning rate sea óptimo?
Una opción muy utilizada es aplicar un decrecimiento o decay a nuestro learning rate conforme va disminuyendo la función de pérdidas (lo que indica que estamos llegando al mínimo buscado).

Vamos a ver cómo se comportaría la última red que implementamos (la que trabajaba con el MNIST) con diferentes learning rates:
# recuerda elegir TF 1.x o no te funcionarán los ejemplos: %tensorflow_version 1.x
TensorFlow 1.x selected.
# Ejemplos learning rate # En primer lugar, hacemos los imports necesarios y después definimos una # función que creará y entrenará la red # imports necesarios import numpy as np import matplotlib.pyplot as plt import tensorflow as tf # importamos el dataset MNIST y cargamos los datos from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

# Definimos la función para entrenar nuestra red con los parámetros deseados
def train_network(learning_rate, 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
# y 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: esta vez, 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
# y el learning rate
new_W = W.assign(W - learning_rate * grad_W)
new_b = b.assign(b - learning_rate * grad_b)
# Inicializamos las variables
init = tf.global_variables_initializer()
# para almacenar el histórico de costes
costs = []
# 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)
# ¿Y si en vez de actualizar los pesos para cada imagen, lo hacemos
# 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
_, _, 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
# guardamos nuestro coste en el histórico
costs.append(avg_cost)
# Imprimimos las iteraciones
print("[{}] cost: {}".format(epoch, avg_cost))
print("Entrenamiento finalizado!!")
# comprobamos lo que ha aprendido nuestra red
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
# 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")
Por último, los valores típicos de learning rate en Deep Learning suelen ser:
- 0.1
- 0.01
- 0.001
En este post, te hemos expuesto qué es el learning rate en Deep Learning para el desarrollo de las redes neuronales profundas.
Desde KeepCodging, te traemos el Bootcamp Big Data, gracias al que podrás aprender mucho más sobre el learning rate en Deep Learning, así como sobre los sistemas y herramientas más importantes en el universo del Big Data. ¡No dudes en solicitar más información e inscríbete ahora!
