Superalimente el entrenamiento de sus modelos de aprendizaje profundo |  de Raghav Bali |  noviembre de 2023

Súper convergencia con tasas de aprendizaje de un ciclo

Foto por Philip Swinburn en desempaquetar

h¿Se ha encontrado con escenarios en los que es fácil obtener una ráfaga inicial de precisión pero una vez que alcanza el 90%, tiene que esforzarse mucho para lograr cualquier mejora en el rendimiento? ¿Tu modelo tarda demasiado en entrenarse?

En este artículo, veremos una técnica interesante para potenciar tu configuración de entrenamiento y obtener ese rendimiento extra que has estado buscando y entrenar más rápido. Esencialmente, trabajaremos para cambiar dinámicamente la tasa de aprendizaje a lo largo de las épocas utilizando una política llamada Tasa de aprendizaje de un ciclo.

Mencionado originalmente en un artículo de Leslie Smith, el programa de tasa de aprendizaje de un ciclo[1], [2] se centra en una estrategia única para actualizar dinámicamente la tasa de aprendizaje durante el proceso de capacitación. Suena como un montón de términos, no se preocupe, primero comencemos con una configuración de entrenamiento típica y luego comprenderemos gradualmente cómo podemos mejorar los resultados utilizando la tasa de aprendizaje de un ciclo.

Mientras trabajamos para aprender un truco ingenioso (velocidad de ciclo) para mejorar el rendimiento del modelo, ¿por qué no hacerlo mientras disfrutamos del clásico? piedra Papel tijeras juego.

Foto por Markus Spiske en desempaquetar

Planteamiento del problema

El juego de piedra, papel y tijera es un clásico juego infantil en el que dos jugadores utilizan gestos con las manos (piedra, papel o tijera) y compiten para dominar a su oponente. Por ejemplo, el gesto de la piedra le gana a la tijera pero el gesto del papel le gana a la piedra. Interesante, ¿no?

Nuestro objetivo aquí es entrenar un modelo de clasificación de imágenes que pueda detectar uno de los tres gestos. Luego podremos aprovechar dicho modelo capacitado para desarrollar un juego de un extremo a otro. A los efectos de este artículo, limitaremos el alcance al entrenamiento de un clasificador en sí; el juego de un extremo a otro completo con un modelo desplegable probablemente sea para otro artículo.

El conjunto de datos

Tenemos suerte de que ya contamos con un conjunto de datos etiquetados que podemos aprovechar para entrenar un modelo de clasificación con gran efecto. El conjunto de datos está alojado en Conjunto de datos TensorFlow catálogo puesto a disposición por Laurence Moroney (CC POR 2.0). Tiene los siguientes atributos:

  • Número de puntos de datos: 2800
  • Número de clases : 3
  • División tren-prueba disponible: Sí
  • Tamaño del conjunto de datos: 220 MiB

TensorFlow proporciona una API agradable y limpia para acceder a dichos conjuntos de datos; el siguiente fragmento nos permite descargar el tren y las divisiones de validación.

import tensorflow_datasets as tfds

DATASET_NAME = 'rock_paper_scissors'
(dataset_train_raw, dataset_test_raw), dataset_info = tfds.load(
name=DATASET_NAME,
data_dir='tmp',
with_info=True,
as_supervised=True,
split=[tfds.Split.TRAIN, tfds.Split.TEST],
)

# plot samples from the dataset
fig = tfds.show_examples(dataset_train_raw, dataset_info)

Las siguientes son algunas imágenes de muestra de este conjunto de datos:

Figura: Puntos de datos de muestra en el conjunto de datos Piedra, papel o tijera
Figura: Puntos de datos de muestra en el conjunto de datos Piedra, papel y tijera

Tasa de aprendizaje

La tasa de aprendizaje es uno de los hiperparámetros clave que puede hacer o deshacer una configuración, pero que normalmente se pasa por alto. La razón por la que se pasa por alto es porque, para empezar, la mayoría de las bibliotecas/paquetes vienen con valores predeterminados suficientemente buenos. Pero estos valores predeterminados sólo pueden llevarle hasta cierto punto.

Es muy importante obtener la tasa de aprendizaje correcta para un caso de uso personalizado como el nuestro. Es una compensación complicada encontrar el valor óptimo. Vaya demasiado lento (o pequeño) con la tasa de aprendizaje y su modelo difícilmente aprenderá nada. Si va demasiado rápido (o demasiado grande), sobrepasará los siempre tan misteriosos mínimos que todas las redes neuronales pretenden encontrar. Lo mismo se muestra en la siguiente ilustración para una mejor comprensión.

Figura: Impacto de la tasa de aprendizaje en la capacidad del modelo para aprender el objetivo (mínimos). Fuente: Autor

Descenso de gradiente y optimizadores

El descenso de gradiente es la forma estándar de entrenar/optimizar redes neuronales. Funciona minimizando la función objetivo actualizando los parámetros de la red en la dirección opuesta al gradiente. Sin entrar en muchos detalles, ayuda a viajar cuesta abajo a lo largo de la pendiente de la función objetivo. Está disponible una introducción detallada al descenso de gradientes. aquí para referencia.

La comunidad de aprendizaje profundo ha recorrido un largo camino desde que los modelos iniciales se entrenaron con descenso de gradiente básico. A lo largo de los años, una serie de mejoras han ayudado a entrenar más rápido y evitar obstáculos obvios. Brevemente, algunos de los más notables y populares son:

adagrad
Algoritmo de gradiente adaptativo es un algoritmo de optimización que adapta las tasas de aprendizaje de parámetros individuales en función de sus gradientes históricos, lo que permite actualizaciones más grandes para parámetros poco frecuentes y actualizaciones más pequeñas para los frecuentes. Está diseñado para manejar datos escasos de manera eficiente. Es muy adecuado cuando se trata de datos escasos.

RMSProp
Propagación de la media cuadrática Optimiza el aprendizaje ajustando las tasas de aprendizaje para cada parámetro individualmente. Aborda el problema de la disminución de las tasas de aprendizaje en AdaGrad mediante el uso de un promedio móvil de gradientes cuadrados. Esto ayuda a escalar de forma adaptativa las tasas de aprendizaje en función de las magnitudes de gradiente recientes.

ADÁN
Estimación del momento adaptativo es un algoritmo de optimización que combina ideas de los métodos RMSProp y de impulso. Mantiene promedios que decaen exponencialmente de gradientes pasados ​​y gradientes cuadrados, usándolos para actualizar parámetros de forma adaptativa. ADAM es conocido por su eficiencia y eficacia en el entrenamiento de redes neuronales profundas.

La tasa de aprendizaje de un ciclo es un proceso simple de dos pasos para improvisar sobre la tasa de aprendizaje y el impulso a medida que avanza la capacitación. Funciona de la siguiente manera:

  • Paso 1: Comenzamos aumentando la tasa de aprendizaje inicialmente de un valor inferior a uno superior de forma incremental lineal durante algunas épocas.
  • Paso 2: Mantenemos el valor más alto de tasa de aprendizaje durante algunas épocas.
  • Paso 3: Luego volvemos a una tasa de aprendizaje más baja que decae con el tiempo.

Durante estos tres pasos, el impulso se actualiza exactamente en la dirección opuesta, es decir, cuando la tasa de aprendizaje aumenta, el impulso disminuye y viceversa.

Tasa de aprendizaje de un ciclo en acción

Primero trabajemos a través de una implementación simple para la tasa de aprendizaje de un ciclo y luego usémosla para entrenar nuestro modelo. Aprovecharemos una implementación lista para usar para el cronograma LR de un ciclo desde Charla de Martin Gorner 2019 en Mundo TensorFlow como se muestra en el listado 2.

def lr_function(epoch):
# set start, min and max value for learning rate
start_lr = 1e-3; min_lr = 1e-3; max_lr = 2e-3

# define the number of epochs to increase
# LR lineary and then the decay factor
rampup_epochs = 6; sustain_epochs = 0; exp_decay = .5

# method to update the LR value based on the current epoch
def lr(epoch, start_lr, min_lr, max_lr, rampup_epochs,
sustain_epochs, exp_decay):
if epoch < rampup_epochs:
lr = ((max_lr - start_lr) / rampup_epochs
* epoch + start_lr)
elif epoch < rampup_epochs + sustain_epochs:
lr = max_lr
else:
lr = ((max_lr - min_lr) *
exp_decay**(epoch - rampup_epochs -
sustain_epochs) + min_lr)
return lr

return lr(epoch, start_lr, min_lr, max_lr,
rampup_epochs, sustain_epochs, exp_decay)

Ejecutamos esta función (ver listado 2) durante un número fijo de épocas para mostrar cómo cambia la tasa de aprendizaje según los dos pasos que analizamos anteriormente. Aquí comenzamos con una tasa de aprendizaje inicial de 1e-3 y aumentarlo hasta 2e-3 en las primeras épocas. Luego se reduce nuevamente a 1e-3 en el transcurso de las épocas restantes. Esta curva de tasa de aprendizaje dinámica se representa con una muestra de 24 épocas en la siguiente figura.

Política de tasa de aprendizaje de un ciclo durante 50 épocas.  La tasa de aprendizaje aumenta inicialmente, seguida de una lenta caída a lo largo de las épocas.  Fuente de la imagen: por autor
Política de tasa de aprendizaje de un ciclo durante 24 épocas. La tasa de aprendizaje aumenta linealmente, seguida de una lenta caída en las épocas restantes. Fuente de la imagen: Autor

Ahora pondremos a prueba nuestro programador de tasa de aprendizaje de un ciclo aplicándolo cuando usemos un modelo MobileNetV2 como extractor de características mientras entrenamos un cabezal de clasificación para nuestro caso actual de piedra, papel y tijera. Luego lo compararemos con una CNN simple y con un cabezal de clasificación MobileNetV2+ con el optimizador Adam estándar. El cuaderno completo está disponible como referencia en github. Para obtener una descripción general rápida, el siguiente fragmento describe cómo utilizamos las devoluciones de llamada de TensorFlow para conectar nuestra utilidad de velocidad de 1 ciclo.

# Set Image Shape 
INPUT_IMG_SHAPE= (128, 128, 3)

# Get Pretrained MobileNetV2
base_model = tf.keras.applications.MobileNetV2(
input_shape=INPUT_IMG_SHAPE,
include_top=False,
weights='imagenet',
pooling='avg'
)

# Attach a classification head
model_lr = tf.keras.models.Sequential()
model_lr.add(base_model)
model_lr.add(tf.keras.layers.Dropout(0.5))
model_lr.add(tf.keras.layers.Dense(
units=NUM_CLASSES,
activation=tf.keras.activations.softmax,
kernel_regularizer=tf.keras.regularizers.l2(l=0.01)
))

# compile the model
model_lr.compile(
optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=['accuracy']
)

# set number of epochs
initial_epochs = 24

# Set the model for training
# The LearningRateScheduler callback is where we
# plug our custom 1-cycle rate function
training_history_lr = model_lr.fit(
x=dataset_train_augmented_shuffled.repeat(),
validation_data=dataset_test_shuffled.repeat(),
epochs=initial_epochs,
steps_per_epoch=steps_per_epoch,
validation_steps=validation_steps,
callbacks=[
tf.keras.callbacks.LearningRateScheduler(lambda epoch: \
lr_function(epoch),
verbose=True)
],
verbose=1
)

Entrenamos los 3 modelos durante 24 épocas con un tamaño de lote de 64. La siguiente figura muestra el impacto de la tasa de aprendizaje de 1 ciclo. Puede ayudar a nuestro modelo a lograr la convergencia en solo 5 épocas en comparación con los otros dos modelos. El fenómeno de superconvergencia también es visible para los conjuntos de datos de validación.

MobileNetV2 con tasa de aprendizaje de 1 ciclo (mobileNetV2_lr) supera a MobileNetV2 y a las arquitecturas CNN simples al lograr una convergencia en solo 5 épocas.

Alcanzamos valores consistentes de precisión de validación que oscilan entre el 90% y el 92% en 10 épocas, que es hasta ahora lo mejor que hemos visto en todos nuestros modelos. En la evaluación, el rendimiento del modelo en el conjunto de datos de prueba también muestra la misma historia, es decir, MobileNetV2_lr supera a los otros dos muy fácilmente.

# Simple CNN
Test loss: 0.7511898279190063
Test accuracy: 0.7768816947937012

# MobileNetV2
Test loss: 0.24527719616889954
Test accuracy: 0.9220430254936218

# MobileNetV2_LR
Test loss: 0.27864792943000793
Test accuracy: 0.9166666865348816

Se puede superar el estancamiento en el rendimiento del modelo más allá del 90% de precisión y optimizar el tiempo de capacitación mediante la implementación de la tasa de aprendizaje de un ciclo. Esta técnica, introducida por Leslie Smith y su equipo, ajusta dinámicamente la tasa de aprendizaje durante el entrenamiento, ofreciendo un enfoque estratégico para potenciar el rendimiento del modelo. Al adoptar este método, puede navegar de manera eficiente por las complejidades de las configuraciones de capacitación y desbloquear el potencial de modelos de aprendizaje profundo más rápidos y efectivos. ¡Aproveche el poder de One-Cycle Learning Rate para mejorar su experiencia de entrenamiento y lograr resultados superiores!