Blog
Aumento del Rendimiento con tasas de Aprendizaje
- Publicado por: Rafael Fernandez
- Categoría: Deep Learning
-En esta lección descubrirá cómo puede usar calendarios de tasas de aprendizaje diferentes para sus modelos de redes neuronales en Python usando Keras.
-El beneficio de los ritmos de aprendizaje en el aumento del funcionamiento del modelo durante el entrenamiento.
-Cómo configurar y evaluar un horario de aprendizaje basado en el tiempo.
-Cómo configurar y evaluar un horario de ritmo de aprendizaje basado en caídas.
Entrenar una red neuronal o un gran modelo de aprendizaje profundo es una tarea de optimización difícil. El algoritmo clásico para entrenar redes neuronales se llama descenso de gradiente estocástico. Se sabe que se puede lograr un mayor rendimiento y un entrenamiento más rápido en algunos problemas utilizando un ritmo de aprendizaje que cambia durante el entrenamiento.
Tasas de Aprendizaje para Modelos de Capacitación
La adaptación de la velocidad de aprendizaje para su procedimiento de optimización estocástica de descenso de gradiente puede aumentar el rendimiento y reducir el tiempo de entrenamiento. A veces esto se llama tasas de aprendizaje adaptativo. Aquí vamos a llamar a este enfoque como tasa o ritmo de aprendizaje, donde vamos a utilizar una tasa de aprendizaje constante para actualizar los pesos de la red para cada capacitación de la época.
La adaptación más sencilla y quizás la más utilizada de los ritmos de aprendizaje durante la formación son las técnicas que reducen el ritmo de aprendizaje a lo largo del tiempo. Éstos tienen la ventaja de hacer grandes cambios al principio del procedimiento de entrenamiento cuando se utilizan valores de velocidad de aprendizaje más altos, y disminuir la velocidad de aprendizaje de tal manera que una velocidad menor y, por lo tanto, actualizaciones de entrenamiento más pequeñas se hacen a las ponderaciones más adelante en el procedimiento de entrenamiento. Esto tiene el objetivo aprender rápidamente buenos pesos tempranos y sintonizarlos más tarde. Dos tasas de aprendizaje populares y fáciles de usar son las siguientes:
- Disminuir gradualmente el ritmo de aprendizaje en función de la época.
- Disminuya la velocidad de aprendizaje utilizando gotas grandes y punteadas en épocas específicas.
A continuación, veremos cómo se pueden utilizar cada una de estas tasas de aprendizaje por turnos con Keras.
Conjunto de datos de la Clasificación de la Ionosfera
El problema de la clasificación binaria de la ionosfera se usa como una demostración en esta lección. El conjunto de datos describe los retornos del radar donde el objetivo estaba libre de electrones en la ionosfera. Se trata de un problema de clasificación binaria en el que los casos positivos (g para bien) muestran evidencia de algún tipo de estructura en la ionosfera y los casos negativos (b para mal) no. Es un buen conjunto de datos para practicar con redes neuronales porque todas las entradas son pequeños valores numéricos de la misma escala. Hay 34 atributos y 351 observaciones.
Los resultados de última generación de este conjunto de datos alcanzan una precisión de aproximadamente el 94% al 98% utilizando una validación cruzada de 10 veces1. Estos datoa puede descargarlo directamente desde ionosphere. Coloque los datos le en su directorio de trabajo con el nombre ionosphere.csv.
Ritmo de aprendizaje basado en el Tiempo
Keras tiene ya una clase de ritmo de aprendizaje basado en el tiempo. La inclinación estocástica del descenso la clase SGD tiene un argumento llamado decaimiento. Este argumento es utilizado en la ecuación de decaimiento de la tasa de aprendizaje basada en el tiempo de la siguiente manera:
tasa_de_aprendizaje = tasa_de_aprendizaje * 1/ (1 + decaimiento * épocas)
Cuando el argumento decaimiento es cero (por defecto), no tiene efecto sobre la velocidad de aprendizaje (por ejemplo, 0.1):
tasa_de_aprendizaje = 0.1 * 1/(1 + 0.0 * 1)
tasa_de_aprendizaje = 0.1
Cuando se especifique el argumento decaimiento, disminuirá la velocidad de aprendizaje de la época anterior en la cantidad dada. Por ejemplo, si usamos el valor de velocidad de aprendizaje inicial de 0.1 y el decaimiento de 0.001, las primeras 5 épocas adaptarán la velocidad de aprendizaje de la siguiente manera:
Epocas tasa_de_aprendizaje
1 0.1
2 0.0999000999
3 0.0997006985
4 0.09940249103
5 0.09900646517
Extendiendo esto a 100 épocas producirá la siguiente gráfica de velocidad de aprendizaje (eje y) versus época (eje x):
El siguiente ejemplo muestra cómo utilizar la adaptación del ritmo de aprendizaje basado en el tiempo en Keras. Un pequeño modelo de red neuronal se construye con una sola capa oculta con 34 neuronas usando la función de activación de rectier. La capa de salida tiene una sola neurona y utiliza la función de activación sigmoide para emitir valores similares a los de la probabilidad. El ritmo de aprendizaje de el descenso de gradiente estocástico se ha fijado en un valor alto de 0,1. El modelo está entrenado para 50 y el argumento de decaimiento se ha establecido en 0.002, calculado como 0,1 / 50 . Además, puede ser una buena idea utilizar el momentum cuando se utiliza un ritmo de aprendizaje adaptativo. En este caso se utiliza un valor de impulso (momentum) de 0,8. El ejemplo completo muestra continuación:
# Decaimiento de la tasa de aprendizaje basada en el tiempo from pandas import read_csv import numpy from keras.models import Sequential from keras.layers import Dense from keras.optimizers import SGD from sklearn.preprocessing import LabelEncoder # semillas aleatorias para reproducibilidad seed = 7 numpy.random.seed(seed) # cargamos el dataset dataframe = read_csv("ionosphere.csv", header=None) dataset = dataframe.values # dividido en variables de entrada (X) y salida (Y) X = dataset[:,0:34].astype(float) Y = dataset[:,34] # codificar valores de clase como enteros encoder = LabelEncoder() encoder.fit(Y) Y = encoder.transform(Y) # creacion del modelo model = Sequential() model.add(Dense(34, input_dim=34, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal', activation='sigmoid')) # Compila el modelo epochs = 50 learning_rate = 0.1 decay_rate = learning_rate / epochs momentum = 0.8 sgd = SGD(lr=learning_rate, momentum=momentum, decay=decay_rate, nesterov=False) model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy']) # Fit el modelo model.fit(X, Y, validation_split=0.33, epochs=epochs, batch_size=28, verbose=2)
El modelo se entrena en el 67% del conjunto de datos y se evalúa con un conjunto de datos de validación del 33%. Al ejecutar el ejemplo, se muestra una precisión de clasificación del 99,14%. Esto es más alto que la línea base del 95.69% sin la disminución o el impulso de la velocidad de aprendizaje.
Epoch 43/50 - 0s - loss: 0.0659 - acc: 0.9830 - val_loss: 0.0750 - val_acc: 0.9914 Epoch 44/50 - 0s - loss: 0.0656 - acc: 0.9830 - val_loss: 0.0681 - val_acc: 0.9828 Epoch 45/50 - 0s - loss: 0.0620 - acc: 0.9830 - val_loss: 0.0916 - val_acc: 0.9914 Epoch 46/50 - 0s - loss: 0.0680 - acc: 0.9830 - val_loss: 0.0699 - val_acc: 0.9914 Epoch 47/50 - 0s - loss: 0.0659 - acc: 0.9872 - val_loss: 0.0607 - val_acc: 0.9828 Epoch 48/50 - 0s - loss: 0.0626 - acc: 0.9872 - val_loss: 0.0805 - val_acc: 0.9914 Epoch 49/50
Tasa de aprendizaje basada en la caída
Otro ritmo o tasa de aprendizaje popular que se utiliza con los modelos de aprendizaje profundo es sistemáticamente reducir el ritmo de aprendizaje en momentos específicos durante el entrenamiento. A menudo este método es implementado por reducir el ritmo de aprendizaje a la mitad cada número de épocas fijadas. Por ejemplo, podemos tener una tasa de aprendizaje inicial de 0,1 que se reduzca en un factor de 0,5 cada 10 épocas. Las primeras 10 épocas de la formación utilizaría un valor de 0,1, en las próximas 10 épocas se utilizaría una tasa de aprendizaje de 0,05, y así sucesivamente. Si trazamos las tasas de aprendizaje de este ejemplo a 100 épocas, obtendrá la opción gráfico de abajo que muestra la velocidad de aprendizaje (eje y) frente a la época (eje x):
Podemos implementar esto en Keras usando LearningRateScheduler al ajustar el modelo. La devolución de llamada de LearningRateScheduler nos permite definir una función y toma el número de época como argumento y devuelve la velocidad de aprendizaje para usar en el estocástico descenso en pendiente. Cuando se utiliza, se ignora la velocidad de aprendizaje especificada por el descenso estocástico del gradiente. En el código de abajo, usamos el mismo ejemplo que antes de una red de una sola capa oculta en el conjunto de datos de la ionosfera. Una nueva función step_decay() se implementa la ecuación:
tasa_de_aprendizaje = tasa_de_aprendizaje_inicial * DropRate exp(1 + épocas /EpochDrop)
Cuando InitialLearningRate es la tasa de aprendizaje al comienzo de la ejecución, EpochDrop es la frecuencia con la que se reduce la tasa de aprendizaje en épocas y DropRate es cuánto se reduce la tasa de aprendizaje cada vez que se descarta.
# Descenso de la Tasa de Aprendizaje Basado en la Caída from pandas import read_csv import numpy import math from keras.models import Sequential from keras.layers import Dense from keras.optimizers import SGD from sklearn.preprocessing import LabelEncoder from keras.callbacks import LearningRateScheduler # ritmo de aprendizaje def step_decay(epoch): initial_lrate = 0.1 drop = 0.5 epochs_drop = 10.0 lrate = initial_lrate * math.pow(drop, math.floor((1+epoch)/epochs_drop)) return lrate # semilla aleatoria para la reproducibilidad seed = 7 numpy.random.seed(seed) # cargamos el dataset dataframe = read_csv("ionosphere.csv", header=None) dataset = dataframe.values # dividido en variables de entrada (X) y salida (Y) X = dataset[:,0:34].astype(float) Y = dataset[:,34] # codificar valores de clase como enteros encoder = LabelEncoder() encoder.fit(Y) Y = encoder.transform(Y) # creamos el modelo model = Sequential() model.add(Dense(34, input_dim=34, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal', activation='sigmoid')) # Compila el modelo sgd = SGD(lr=0.0, momentum=0.9, decay=0.0, nesterov=False) model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy']) # devolución de llamada del horario de aprendizaje lrate = LearningRateScheduler(step_decay) callbacks_list = [lrate] # Fit el modelo model.fit(X, Y, validation_split=0.33, epochs=50, batch_size=28, callbacks=callbacks_list, verbose=2)
La ejecución del ejemplo da como resultado una precisión de clasificación del 99.14% en el conjunto de datos de validación, una vez más una mejora sobre la línea de base para el modelo en este conjunto de datos.
Epoch 41/50 - 0s - loss: 0.0542 - acc: 0.9872 - val_loss: 0.0696 - val_acc: 0.9914 Epoch 42/50 - 0s - loss: 0.0545 - acc: 0.9872 - val_loss: 0.0675 - val_acc: 0.9914 Epoch 43/50 - 0s - loss: 0.0544 - acc: 0.9872 - val_loss: 0.0653 - val_acc: 0.9914 Epoch 44/50 - 0s - loss: 0.0541 - acc: 0.9872 - val_loss: 0.0654 - val_acc: 0.9914 Epoch 45/50 - 0s - loss: 0.0541 - acc: 0.9872 - val_loss: 0.0629 - val_acc: 0.9914 Epoch 46/50 - 0s - loss: 0.0538 - acc: 0.9872 - val_loss: 0.0633 - val_acc: 0.9914 Epoch 47/50 - 0s - loss: 0.0548 - acc: 0.9872 - val_loss: 0.0690 - val_acc: 0.9914 Epoch 48/50
Consejos para usar los horarios de las tasas de aprendizaje
En esta sección se enumeran algunos consejos y trucos a tener en cuenta al utilizar los programas de ritmo de aprendizaje con las funciones neuronales redes:
- Aumentar el ritmo de aprendizaje inicial. Debido a que el ritmo de aprendizaje disminuirá, comience con un valor mayor para disminuir. Un mayor ritmo de aprendizaje resultará en cambios mucho mayores a los pesos, al menos al principio, lo que le permite beneficios de sintonización más tarde.
- Utiliza un gran impulso. El uso de un valor de impulso mayor ayudará a la optimización haciendo actualizaciones en la dirección correcta cuando su tasa de aprendizaje se reduce a valores pequeños.
- Experimente con calendarios diferentes. No estará claro qué calendario de ritmo de aprendizaje es el mejor así que pruebe con diferentes opciones de configuración y vea qué funciona mejor en su problema. También pruebe calendarios que cambien exponencialmente e incluso calendarios que respondan a la precisión de su modelo en los conjuntos de datos de formación o de pruebas.
Resumen del post “Aumento del Rendimiento con tasas de Aprendizaje”
En esta lección usted descubrió calendarios de tasas de aprendizaje para entrenar modelos de redes neuronales. Aprendiste:
- Los beneficios de usar calendarios de tasas de aprendizaje durante el entrenamiento para elevar el rendimiento del modelo.
- Cómo configurar y utilizar un calendario de aprendizaje basado en el tiempo con Keras.
- Cómo desarrollar su propio calendario de ritmo de aprendizaje basado en caídas con Keras.
➡ Aprende mucho mas de Ingeligencia Artificial con nuestro curso: