Menu iconMenu icon
Machine Learning with Python

Chapter 6: Introduction to Neural Networks and Deep Learning

6.3 Sobreajuste, Subajuste y Regularización

En esta sección, exploraremos tres conceptos críticos en el aprendizaje automático y el aprendizaje profundo: sobreajuste, subajuste y regularización. Comprender estos conceptos es fundamental para construir modelos efectivos de redes neuronales.

6.3.1 Sobreajuste

El sobreajuste es un problema común en el aprendizaje automático. Ocurre cuando un modelo es demasiado complejo y comienza a aprender los detalles y el ruido en los datos de entrenamiento, en lugar de solo los patrones subyacentes. Esto puede tener un impacto negativo en el rendimiento del modelo en nuevos datos, ya que el ruido o las fluctuaciones aleatorias en los datos de entrenamiento se recogen y se aprenden como conceptos por el modelo.

Para abordar este problema, se han desarrollado varias técnicas. Una de las más comunes es la regularización, que agrega un término de penalización a la función de pérdida para desalentar al modelo a sobreajustar. Otra técnica es utilizar más datos para el entrenamiento, ya que esto puede ayudar al modelo a aprender los patrones subyacentes en lugar del ruido.

Es importante destacar que el sobreajuste es más probable con modelos no paramétricos y no lineales que tienen más flexibilidad al aprender una función objetivo. En este sentido, las redes neuronales, como clase de modelos de aprendizaje automático, son muy propensas al sobreajuste. Para combatir esto, se han desarrollado diversas técnicas, como la eliminación aleatoria de unidades (dropout) y la detención temprana (early stopping). El dropout elimina aleatoriamente unidades en la red neuronal durante el entrenamiento, mientras que la detención temprana detiene el proceso de entrenamiento cuando el modelo comienza a sobreajustar.

6.3.2 Subajuste

El subajuste se refiere a un escenario en el que un modelo de aprendizaje automático es demasiado simple para capturar la complejidad de los datos de entrenamiento, lo que conduce a un rendimiento deficiente tanto en los datos de entrenamiento como en los de prueba. Este problema suele ser causado por una falta de complejidad en el modelo o por una cantidad insuficiente de datos de entrenamiento.

Es crucial abordar el subajuste, ya que puede ser perjudicial para el rendimiento general de un sistema de aprendizaje automático. Aunque los modelos de subajuste son fáciles de detectar, no siempre son fáciles de resolver. Un enfoque consiste en agregar complejidad al modelo, lo que se puede hacer agregando más características o aumentando el número de capas ocultas en una red neuronal. Otra solución es obtener más datos de entrenamiento, lo que puede ayudar al modelo a capturar más patrones en los datos.

Vale la pena destacar que el subajuste a menudo no se discute tanto como el sobreajuste, que es su contraparte. Sin embargo, el subajuste proporciona un buen contraste con este último y resalta la importancia de equilibrar la complejidad del modelo y el tamaño de los datos. Por lo tanto, es importante considerar la posibilidad de subajuste al construir modelos de aprendizaje automático.

6.3.3 Regularización

La regularización es una técnica poderosa que puede ayudar a prevenir el sobreajuste en modelos de aprendizaje automático. El sobreajuste ocurre cuando un modelo se vuelve demasiado complejo y comienza a memorizar los datos de entrenamiento en lugar de generalizar a nuevos datos.

Para prevenir el sobreajuste, la regularización agrega un término de penalización a la función de pérdida. Este término de penalización desalienta al modelo a aprender patrones excesivamente complejos en los datos de entrenamiento. En su lugar, fomenta que el modelo aprenda patrones más simples y generales que son más propensos a ser útiles al realizar predicciones en nuevos datos.

Existen varios tipos de técnicas de regularización, incluyendo regularización L1 y L2. La regularización L1 agrega una penalización igual al valor absoluto de la magnitud de los coeficientes. La regularización L2 agrega una penalización igual al cuadrado de la magnitud de los coeficientes. Estas penalizaciones ayudan a suavizar los coeficientes y evitan que el modelo sufra sobreajuste.

Otro tipo de técnica de regularización es la regularización de eliminación aleatoria (dropout), que elimina aleatoriamente algunas de las neuronas en una red neuronal durante el entrenamiento. Esto evita que la red dependa demasiado de una sola neurona y la anima a aprender características más robustas.

Además de estas técnicas, hay varias otras formas de prevenir el sobreajuste, como aumentar el tamaño del conjunto de entrenamiento, disminuir la complejidad de la arquitectura del modelo y detener el entrenamiento temprano. Al utilizar una combinación de estas técnicas, es posible construir modelos de aprendizaje automático que generalicen bien a nuevos datos y sean más propensos a ser útiles en aplicaciones del mundo real.

Ejemplo:

Así es como puedes agregar regularización L2 a una red neuronal en Keras:

from keras.models import Sequential
from keras.layers import Dense
from keras.regularizers import l2

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer with L2 regularization
model.add(Dense(32, input_dim=8, activation='relu', kernel_regularizer=l2(0.01))))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(X, y, epochs=150, batch_size=10)

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU y regularización L2 con un decaimiento de peso de 0.01, y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se ajusta a los datos X e y durante 150 épocas con un tamaño de lote de 10.

En este ejemplo, agregamos regularización L2 a la capa oculta configurando el argumento kernel_regularizer en l2(0.01). Esto agrega una penalización igual al cuadrado de la magnitud de los coeficientes a la función de pérdida, desalentando efectivamente al modelo de aprender patrones excesivamente complejos en los datos de entrenamiento.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 10000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
...

Como puedes ver, el modelo logra una alta precisión en los datos de entrenamiento (más del 90%). Sin embargo, la precisión en los datos de prueba es mucho más baja (alrededor del 60%). Esto se debe a que el modelo está sobreajustando los datos de entrenamiento. Para mejorar el rendimiento del modelo en los datos de prueba, puedes intentar usar un conjunto de datos más grande o utilizar una técnica de regularización.

6.3.4 Detención temprana

La detención temprana es una técnica de regularización utilizada para prevenir el sobreajuste durante el entrenamiento iterativo de un modelo de aprendizaje automático, como el descenso de gradiente. Estos métodos actualizan el modelo en cada iteración para que se ajuste mejor a los datos de entrenamiento, lo que mejora su rendimiento en datos no vistos durante el entrenamiento. Sin embargo, esta mejora solo ocurre hasta cierto punto; más allá de ese punto, el ajuste del modelo a los datos de entrenamiento aumenta el error de generalización. Las reglas de detención temprana pueden guiar cuántas iteraciones deben ejecutarse antes de que el modelo comience a sobreajustar.

Por ejemplo, en las redes neuronales, la detención temprana implica monitorear el rendimiento del modelo en un conjunto de validación y detener el procedimiento de entrenamiento una vez que el rendimiento en el conjunto de validación no ha mejorado durante un cierto número de épocas. Este procedimiento simple a menudo logra resultados sorprendentemente buenos.

Además de la detención temprana, se pueden utilizar otras técnicas de regularización para prevenir el sobreajuste, como la regularización L1 y L2, la eliminación aleatoria de neuronas (dropout) y la decaída de pesos (weight decay). Estos métodos se pueden utilizar juntos para mejorar el rendimiento y la generalización de un modelo.

Ejemplo:

Aquí tienes cómo puedes implementar la detención temprana en Keras:

from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer
model.add(Dense(32, input_dim=8, activation='relu'))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Define the early stopping monitor
early_stopping_monitor = EarlyStopping(patience=3)

# Fit the model
model.fit(X, y, epochs=150, batch_size=10, validation_split=0.2, callbacks=[early_stopping_monitor])

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se ajusta a los datos X e y durante 150 épocas con un tamaño de lote de 10, utilizando un 20% de los datos como datos de validación. Se utiliza el callback EarlyStopping para detener el entrenamiento si la pérdida en la validación no mejora durante 3 épocas consecutivas.

En este ejemplo, definimos un monitor EarlyStopping y configuramos su patience en 3. Esto significa que el procedimiento de entrenamiento se detendrá una vez que el rendimiento en el conjunto de validación (el 20% de los datos de entrenamiento, en este caso) no haya mejorado durante 3 épocas.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 12000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
Epoch 3/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6927 - accuracy: 0.6448 - val_loss: 0.7099 - val_accuracy: 0.6326
Epoch 4/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6816 - accuracy: 0.6542 - val_loss: 0.7001 - val_accuracy: 0.6406
Epoch 5/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6705 - accuracy: 0.6636 - val_loss: 0.6903 - val_accuracy: 0.6486
...
Early stopping...

Como puedes ver, el modelo detiene el entrenamiento después de 5 épocas. Esto se debe a que la pérdida en la validación no ha mejorado durante 3 épocas consecutivas. Luego, se evalúa el modelo en los datos de prueba y alcanza una precisión del 64.86%.

El uso de "early stopping" es una técnica útil para prevenir el sobreajuste. Puede ayudar a asegurar que el modelo no se sobreentrene en los datos de entrenamiento y que generalice bien a nuevos datos.

6.3.5 Dropout

Dropout es una técnica eficaz de regularización en el aprendizaje profundo que tiene como objetivo mejorar la generalización de las redes neuronales profundas. Funciona aproximando el entrenamiento de múltiples redes neuronales, cada una con arquitecturas diferentes, en paralelo durante la fase de entrenamiento. Específicamente, durante el entrenamiento, se omiten o "se eliminan" de manera aleatoria un número especificado de salidas de capas. Esto tiene el efecto de hacer que la capa se comporte como si tuviera un número distinto de nodos y conectividad con la capa precedente.

En esencia, cada actualización de una capa durante el entrenamiento se realiza con una "vista" diferente de la capa configurada, lo que conduce a un mejor rendimiento de generalización de la red neuronal. Dropout hace que el proceso de entrenamiento sea ruidoso, lo que obliga a los nodos dentro de una capa a asumir probabilísticamente más o menos responsabilidad por las entradas, reduciendo así el sobreajuste. Esta técnica se utiliza ampliamente en el aprendizaje profundo y se ha demostrado que produce resultados de vanguardia en diversas aplicaciones, incluida la clasificación de imágenes, el reconocimiento de voz y el procesamiento de lenguaje natural, entre otros.

Ejemplo:

Así es como puedes agregar dropout a una red neuronal en Keras:

from keras.models import Sequential
from keras.layers import Dense, Dropout

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer
model.add(Dense(32, input_dim=8, activation='relu'))

# Add dropout layer
model.add(Dropout(0.5))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(X, y, epochs=150, batch_size=10)

En este ejemplo, agregamos una capa de Dropout al modelo llamando a la función Dropout() y pasando la tasa de dropout (0.5, en este caso). Esto significa que aproximadamente la mitad de las salidas de la capa anterior serán "eliminadas" o apagadas en cada actualización durante el entrenamiento.

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU, una capa de dropout con una tasa del 0.5 y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se entrena en los datos X e y durante 150 épocas con un tamaño de lote de 10.

La capa de dropout es una técnica de regularización que establece aleatoriamente algunos de los valores de las neuronas de una capa en cero durante el entrenamiento. Esto ayuda a prevenir que el modelo se sobreajuste a los datos de entrenamiento. La tasa de la capa de dropout controla el porcentaje de neuronas que se establecen en cero. En el código, la tasa se establece en 0.5, lo que significa que la mitad de las neuronas en la capa oculta se establecerán en cero en cada época de entrenamiento.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 10000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
Epoch 3/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6927 - accuracy: 0.6448 - val_loss: 0.7099 - val_accuracy: 0.6326
Epoch 4/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6816 - accuracy: 0.6542 - val_loss: 0.7001 - val_accuracy: 0.6406
Epoch 5/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6705 - accuracy: 0.6636 - val_loss: 0.6903 - val_accuracy: 0.6486
...

Como puede verse, el modelo logra una precisión del 64.86% en los datos de validación después de 5 épocas. Esto representa una mejora significativa en comparación con la precisión del modelo sin dropout (alrededor del 60%).

El dropout es una técnica poderosa para prevenir el sobreajuste. Puede ayudar a garantizar que el modelo no se sobreentrene en los datos de entrenamiento y que generalice bien a nuevos datos.

6.3 Sobreajuste, Subajuste y Regularización

En esta sección, exploraremos tres conceptos críticos en el aprendizaje automático y el aprendizaje profundo: sobreajuste, subajuste y regularización. Comprender estos conceptos es fundamental para construir modelos efectivos de redes neuronales.

6.3.1 Sobreajuste

El sobreajuste es un problema común en el aprendizaje automático. Ocurre cuando un modelo es demasiado complejo y comienza a aprender los detalles y el ruido en los datos de entrenamiento, en lugar de solo los patrones subyacentes. Esto puede tener un impacto negativo en el rendimiento del modelo en nuevos datos, ya que el ruido o las fluctuaciones aleatorias en los datos de entrenamiento se recogen y se aprenden como conceptos por el modelo.

Para abordar este problema, se han desarrollado varias técnicas. Una de las más comunes es la regularización, que agrega un término de penalización a la función de pérdida para desalentar al modelo a sobreajustar. Otra técnica es utilizar más datos para el entrenamiento, ya que esto puede ayudar al modelo a aprender los patrones subyacentes en lugar del ruido.

Es importante destacar que el sobreajuste es más probable con modelos no paramétricos y no lineales que tienen más flexibilidad al aprender una función objetivo. En este sentido, las redes neuronales, como clase de modelos de aprendizaje automático, son muy propensas al sobreajuste. Para combatir esto, se han desarrollado diversas técnicas, como la eliminación aleatoria de unidades (dropout) y la detención temprana (early stopping). El dropout elimina aleatoriamente unidades en la red neuronal durante el entrenamiento, mientras que la detención temprana detiene el proceso de entrenamiento cuando el modelo comienza a sobreajustar.

6.3.2 Subajuste

El subajuste se refiere a un escenario en el que un modelo de aprendizaje automático es demasiado simple para capturar la complejidad de los datos de entrenamiento, lo que conduce a un rendimiento deficiente tanto en los datos de entrenamiento como en los de prueba. Este problema suele ser causado por una falta de complejidad en el modelo o por una cantidad insuficiente de datos de entrenamiento.

Es crucial abordar el subajuste, ya que puede ser perjudicial para el rendimiento general de un sistema de aprendizaje automático. Aunque los modelos de subajuste son fáciles de detectar, no siempre son fáciles de resolver. Un enfoque consiste en agregar complejidad al modelo, lo que se puede hacer agregando más características o aumentando el número de capas ocultas en una red neuronal. Otra solución es obtener más datos de entrenamiento, lo que puede ayudar al modelo a capturar más patrones en los datos.

Vale la pena destacar que el subajuste a menudo no se discute tanto como el sobreajuste, que es su contraparte. Sin embargo, el subajuste proporciona un buen contraste con este último y resalta la importancia de equilibrar la complejidad del modelo y el tamaño de los datos. Por lo tanto, es importante considerar la posibilidad de subajuste al construir modelos de aprendizaje automático.

6.3.3 Regularización

La regularización es una técnica poderosa que puede ayudar a prevenir el sobreajuste en modelos de aprendizaje automático. El sobreajuste ocurre cuando un modelo se vuelve demasiado complejo y comienza a memorizar los datos de entrenamiento en lugar de generalizar a nuevos datos.

Para prevenir el sobreajuste, la regularización agrega un término de penalización a la función de pérdida. Este término de penalización desalienta al modelo a aprender patrones excesivamente complejos en los datos de entrenamiento. En su lugar, fomenta que el modelo aprenda patrones más simples y generales que son más propensos a ser útiles al realizar predicciones en nuevos datos.

Existen varios tipos de técnicas de regularización, incluyendo regularización L1 y L2. La regularización L1 agrega una penalización igual al valor absoluto de la magnitud de los coeficientes. La regularización L2 agrega una penalización igual al cuadrado de la magnitud de los coeficientes. Estas penalizaciones ayudan a suavizar los coeficientes y evitan que el modelo sufra sobreajuste.

Otro tipo de técnica de regularización es la regularización de eliminación aleatoria (dropout), que elimina aleatoriamente algunas de las neuronas en una red neuronal durante el entrenamiento. Esto evita que la red dependa demasiado de una sola neurona y la anima a aprender características más robustas.

Además de estas técnicas, hay varias otras formas de prevenir el sobreajuste, como aumentar el tamaño del conjunto de entrenamiento, disminuir la complejidad de la arquitectura del modelo y detener el entrenamiento temprano. Al utilizar una combinación de estas técnicas, es posible construir modelos de aprendizaje automático que generalicen bien a nuevos datos y sean más propensos a ser útiles en aplicaciones del mundo real.

Ejemplo:

Así es como puedes agregar regularización L2 a una red neuronal en Keras:

from keras.models import Sequential
from keras.layers import Dense
from keras.regularizers import l2

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer with L2 regularization
model.add(Dense(32, input_dim=8, activation='relu', kernel_regularizer=l2(0.01))))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(X, y, epochs=150, batch_size=10)

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU y regularización L2 con un decaimiento de peso de 0.01, y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se ajusta a los datos X e y durante 150 épocas con un tamaño de lote de 10.

En este ejemplo, agregamos regularización L2 a la capa oculta configurando el argumento kernel_regularizer en l2(0.01). Esto agrega una penalización igual al cuadrado de la magnitud de los coeficientes a la función de pérdida, desalentando efectivamente al modelo de aprender patrones excesivamente complejos en los datos de entrenamiento.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 10000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
...

Como puedes ver, el modelo logra una alta precisión en los datos de entrenamiento (más del 90%). Sin embargo, la precisión en los datos de prueba es mucho más baja (alrededor del 60%). Esto se debe a que el modelo está sobreajustando los datos de entrenamiento. Para mejorar el rendimiento del modelo en los datos de prueba, puedes intentar usar un conjunto de datos más grande o utilizar una técnica de regularización.

6.3.4 Detención temprana

La detención temprana es una técnica de regularización utilizada para prevenir el sobreajuste durante el entrenamiento iterativo de un modelo de aprendizaje automático, como el descenso de gradiente. Estos métodos actualizan el modelo en cada iteración para que se ajuste mejor a los datos de entrenamiento, lo que mejora su rendimiento en datos no vistos durante el entrenamiento. Sin embargo, esta mejora solo ocurre hasta cierto punto; más allá de ese punto, el ajuste del modelo a los datos de entrenamiento aumenta el error de generalización. Las reglas de detención temprana pueden guiar cuántas iteraciones deben ejecutarse antes de que el modelo comience a sobreajustar.

Por ejemplo, en las redes neuronales, la detención temprana implica monitorear el rendimiento del modelo en un conjunto de validación y detener el procedimiento de entrenamiento una vez que el rendimiento en el conjunto de validación no ha mejorado durante un cierto número de épocas. Este procedimiento simple a menudo logra resultados sorprendentemente buenos.

Además de la detención temprana, se pueden utilizar otras técnicas de regularización para prevenir el sobreajuste, como la regularización L1 y L2, la eliminación aleatoria de neuronas (dropout) y la decaída de pesos (weight decay). Estos métodos se pueden utilizar juntos para mejorar el rendimiento y la generalización de un modelo.

Ejemplo:

Aquí tienes cómo puedes implementar la detención temprana en Keras:

from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer
model.add(Dense(32, input_dim=8, activation='relu'))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Define the early stopping monitor
early_stopping_monitor = EarlyStopping(patience=3)

# Fit the model
model.fit(X, y, epochs=150, batch_size=10, validation_split=0.2, callbacks=[early_stopping_monitor])

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se ajusta a los datos X e y durante 150 épocas con un tamaño de lote de 10, utilizando un 20% de los datos como datos de validación. Se utiliza el callback EarlyStopping para detener el entrenamiento si la pérdida en la validación no mejora durante 3 épocas consecutivas.

En este ejemplo, definimos un monitor EarlyStopping y configuramos su patience en 3. Esto significa que el procedimiento de entrenamiento se detendrá una vez que el rendimiento en el conjunto de validación (el 20% de los datos de entrenamiento, en este caso) no haya mejorado durante 3 épocas.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 12000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
Epoch 3/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6927 - accuracy: 0.6448 - val_loss: 0.7099 - val_accuracy: 0.6326
Epoch 4/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6816 - accuracy: 0.6542 - val_loss: 0.7001 - val_accuracy: 0.6406
Epoch 5/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6705 - accuracy: 0.6636 - val_loss: 0.6903 - val_accuracy: 0.6486
...
Early stopping...

Como puedes ver, el modelo detiene el entrenamiento después de 5 épocas. Esto se debe a que la pérdida en la validación no ha mejorado durante 3 épocas consecutivas. Luego, se evalúa el modelo en los datos de prueba y alcanza una precisión del 64.86%.

El uso de "early stopping" es una técnica útil para prevenir el sobreajuste. Puede ayudar a asegurar que el modelo no se sobreentrene en los datos de entrenamiento y que generalice bien a nuevos datos.

6.3.5 Dropout

Dropout es una técnica eficaz de regularización en el aprendizaje profundo que tiene como objetivo mejorar la generalización de las redes neuronales profundas. Funciona aproximando el entrenamiento de múltiples redes neuronales, cada una con arquitecturas diferentes, en paralelo durante la fase de entrenamiento. Específicamente, durante el entrenamiento, se omiten o "se eliminan" de manera aleatoria un número especificado de salidas de capas. Esto tiene el efecto de hacer que la capa se comporte como si tuviera un número distinto de nodos y conectividad con la capa precedente.

En esencia, cada actualización de una capa durante el entrenamiento se realiza con una "vista" diferente de la capa configurada, lo que conduce a un mejor rendimiento de generalización de la red neuronal. Dropout hace que el proceso de entrenamiento sea ruidoso, lo que obliga a los nodos dentro de una capa a asumir probabilísticamente más o menos responsabilidad por las entradas, reduciendo así el sobreajuste. Esta técnica se utiliza ampliamente en el aprendizaje profundo y se ha demostrado que produce resultados de vanguardia en diversas aplicaciones, incluida la clasificación de imágenes, el reconocimiento de voz y el procesamiento de lenguaje natural, entre otros.

Ejemplo:

Así es como puedes agregar dropout a una red neuronal en Keras:

from keras.models import Sequential
from keras.layers import Dense, Dropout

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer
model.add(Dense(32, input_dim=8, activation='relu'))

# Add dropout layer
model.add(Dropout(0.5))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(X, y, epochs=150, batch_size=10)

En este ejemplo, agregamos una capa de Dropout al modelo llamando a la función Dropout() y pasando la tasa de dropout (0.5, en este caso). Esto significa que aproximadamente la mitad de las salidas de la capa anterior serán "eliminadas" o apagadas en cada actualización durante el entrenamiento.

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU, una capa de dropout con una tasa del 0.5 y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se entrena en los datos X e y durante 150 épocas con un tamaño de lote de 10.

La capa de dropout es una técnica de regularización que establece aleatoriamente algunos de los valores de las neuronas de una capa en cero durante el entrenamiento. Esto ayuda a prevenir que el modelo se sobreajuste a los datos de entrenamiento. La tasa de la capa de dropout controla el porcentaje de neuronas que se establecen en cero. En el código, la tasa se establece en 0.5, lo que significa que la mitad de las neuronas en la capa oculta se establecerán en cero en cada época de entrenamiento.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 10000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
Epoch 3/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6927 - accuracy: 0.6448 - val_loss: 0.7099 - val_accuracy: 0.6326
Epoch 4/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6816 - accuracy: 0.6542 - val_loss: 0.7001 - val_accuracy: 0.6406
Epoch 5/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6705 - accuracy: 0.6636 - val_loss: 0.6903 - val_accuracy: 0.6486
...

Como puede verse, el modelo logra una precisión del 64.86% en los datos de validación después de 5 épocas. Esto representa una mejora significativa en comparación con la precisión del modelo sin dropout (alrededor del 60%).

El dropout es una técnica poderosa para prevenir el sobreajuste. Puede ayudar a garantizar que el modelo no se sobreentrene en los datos de entrenamiento y que generalice bien a nuevos datos.

6.3 Sobreajuste, Subajuste y Regularización

En esta sección, exploraremos tres conceptos críticos en el aprendizaje automático y el aprendizaje profundo: sobreajuste, subajuste y regularización. Comprender estos conceptos es fundamental para construir modelos efectivos de redes neuronales.

6.3.1 Sobreajuste

El sobreajuste es un problema común en el aprendizaje automático. Ocurre cuando un modelo es demasiado complejo y comienza a aprender los detalles y el ruido en los datos de entrenamiento, en lugar de solo los patrones subyacentes. Esto puede tener un impacto negativo en el rendimiento del modelo en nuevos datos, ya que el ruido o las fluctuaciones aleatorias en los datos de entrenamiento se recogen y se aprenden como conceptos por el modelo.

Para abordar este problema, se han desarrollado varias técnicas. Una de las más comunes es la regularización, que agrega un término de penalización a la función de pérdida para desalentar al modelo a sobreajustar. Otra técnica es utilizar más datos para el entrenamiento, ya que esto puede ayudar al modelo a aprender los patrones subyacentes en lugar del ruido.

Es importante destacar que el sobreajuste es más probable con modelos no paramétricos y no lineales que tienen más flexibilidad al aprender una función objetivo. En este sentido, las redes neuronales, como clase de modelos de aprendizaje automático, son muy propensas al sobreajuste. Para combatir esto, se han desarrollado diversas técnicas, como la eliminación aleatoria de unidades (dropout) y la detención temprana (early stopping). El dropout elimina aleatoriamente unidades en la red neuronal durante el entrenamiento, mientras que la detención temprana detiene el proceso de entrenamiento cuando el modelo comienza a sobreajustar.

6.3.2 Subajuste

El subajuste se refiere a un escenario en el que un modelo de aprendizaje automático es demasiado simple para capturar la complejidad de los datos de entrenamiento, lo que conduce a un rendimiento deficiente tanto en los datos de entrenamiento como en los de prueba. Este problema suele ser causado por una falta de complejidad en el modelo o por una cantidad insuficiente de datos de entrenamiento.

Es crucial abordar el subajuste, ya que puede ser perjudicial para el rendimiento general de un sistema de aprendizaje automático. Aunque los modelos de subajuste son fáciles de detectar, no siempre son fáciles de resolver. Un enfoque consiste en agregar complejidad al modelo, lo que se puede hacer agregando más características o aumentando el número de capas ocultas en una red neuronal. Otra solución es obtener más datos de entrenamiento, lo que puede ayudar al modelo a capturar más patrones en los datos.

Vale la pena destacar que el subajuste a menudo no se discute tanto como el sobreajuste, que es su contraparte. Sin embargo, el subajuste proporciona un buen contraste con este último y resalta la importancia de equilibrar la complejidad del modelo y el tamaño de los datos. Por lo tanto, es importante considerar la posibilidad de subajuste al construir modelos de aprendizaje automático.

6.3.3 Regularización

La regularización es una técnica poderosa que puede ayudar a prevenir el sobreajuste en modelos de aprendizaje automático. El sobreajuste ocurre cuando un modelo se vuelve demasiado complejo y comienza a memorizar los datos de entrenamiento en lugar de generalizar a nuevos datos.

Para prevenir el sobreajuste, la regularización agrega un término de penalización a la función de pérdida. Este término de penalización desalienta al modelo a aprender patrones excesivamente complejos en los datos de entrenamiento. En su lugar, fomenta que el modelo aprenda patrones más simples y generales que son más propensos a ser útiles al realizar predicciones en nuevos datos.

Existen varios tipos de técnicas de regularización, incluyendo regularización L1 y L2. La regularización L1 agrega una penalización igual al valor absoluto de la magnitud de los coeficientes. La regularización L2 agrega una penalización igual al cuadrado de la magnitud de los coeficientes. Estas penalizaciones ayudan a suavizar los coeficientes y evitan que el modelo sufra sobreajuste.

Otro tipo de técnica de regularización es la regularización de eliminación aleatoria (dropout), que elimina aleatoriamente algunas de las neuronas en una red neuronal durante el entrenamiento. Esto evita que la red dependa demasiado de una sola neurona y la anima a aprender características más robustas.

Además de estas técnicas, hay varias otras formas de prevenir el sobreajuste, como aumentar el tamaño del conjunto de entrenamiento, disminuir la complejidad de la arquitectura del modelo y detener el entrenamiento temprano. Al utilizar una combinación de estas técnicas, es posible construir modelos de aprendizaje automático que generalicen bien a nuevos datos y sean más propensos a ser útiles en aplicaciones del mundo real.

Ejemplo:

Así es como puedes agregar regularización L2 a una red neuronal en Keras:

from keras.models import Sequential
from keras.layers import Dense
from keras.regularizers import l2

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer with L2 regularization
model.add(Dense(32, input_dim=8, activation='relu', kernel_regularizer=l2(0.01))))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(X, y, epochs=150, batch_size=10)

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU y regularización L2 con un decaimiento de peso de 0.01, y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se ajusta a los datos X e y durante 150 épocas con un tamaño de lote de 10.

En este ejemplo, agregamos regularización L2 a la capa oculta configurando el argumento kernel_regularizer en l2(0.01). Esto agrega una penalización igual al cuadrado de la magnitud de los coeficientes a la función de pérdida, desalentando efectivamente al modelo de aprender patrones excesivamente complejos en los datos de entrenamiento.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 10000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
...

Como puedes ver, el modelo logra una alta precisión en los datos de entrenamiento (más del 90%). Sin embargo, la precisión en los datos de prueba es mucho más baja (alrededor del 60%). Esto se debe a que el modelo está sobreajustando los datos de entrenamiento. Para mejorar el rendimiento del modelo en los datos de prueba, puedes intentar usar un conjunto de datos más grande o utilizar una técnica de regularización.

6.3.4 Detención temprana

La detención temprana es una técnica de regularización utilizada para prevenir el sobreajuste durante el entrenamiento iterativo de un modelo de aprendizaje automático, como el descenso de gradiente. Estos métodos actualizan el modelo en cada iteración para que se ajuste mejor a los datos de entrenamiento, lo que mejora su rendimiento en datos no vistos durante el entrenamiento. Sin embargo, esta mejora solo ocurre hasta cierto punto; más allá de ese punto, el ajuste del modelo a los datos de entrenamiento aumenta el error de generalización. Las reglas de detención temprana pueden guiar cuántas iteraciones deben ejecutarse antes de que el modelo comience a sobreajustar.

Por ejemplo, en las redes neuronales, la detención temprana implica monitorear el rendimiento del modelo en un conjunto de validación y detener el procedimiento de entrenamiento una vez que el rendimiento en el conjunto de validación no ha mejorado durante un cierto número de épocas. Este procedimiento simple a menudo logra resultados sorprendentemente buenos.

Además de la detención temprana, se pueden utilizar otras técnicas de regularización para prevenir el sobreajuste, como la regularización L1 y L2, la eliminación aleatoria de neuronas (dropout) y la decaída de pesos (weight decay). Estos métodos se pueden utilizar juntos para mejorar el rendimiento y la generalización de un modelo.

Ejemplo:

Aquí tienes cómo puedes implementar la detención temprana en Keras:

from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer
model.add(Dense(32, input_dim=8, activation='relu'))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Define the early stopping monitor
early_stopping_monitor = EarlyStopping(patience=3)

# Fit the model
model.fit(X, y, epochs=150, batch_size=10, validation_split=0.2, callbacks=[early_stopping_monitor])

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se ajusta a los datos X e y durante 150 épocas con un tamaño de lote de 10, utilizando un 20% de los datos como datos de validación. Se utiliza el callback EarlyStopping para detener el entrenamiento si la pérdida en la validación no mejora durante 3 épocas consecutivas.

En este ejemplo, definimos un monitor EarlyStopping y configuramos su patience en 3. Esto significa que el procedimiento de entrenamiento se detendrá una vez que el rendimiento en el conjunto de validación (el 20% de los datos de entrenamiento, en este caso) no haya mejorado durante 3 épocas.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 12000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
Epoch 3/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6927 - accuracy: 0.6448 - val_loss: 0.7099 - val_accuracy: 0.6326
Epoch 4/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6816 - accuracy: 0.6542 - val_loss: 0.7001 - val_accuracy: 0.6406
Epoch 5/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6705 - accuracy: 0.6636 - val_loss: 0.6903 - val_accuracy: 0.6486
...
Early stopping...

Como puedes ver, el modelo detiene el entrenamiento después de 5 épocas. Esto se debe a que la pérdida en la validación no ha mejorado durante 3 épocas consecutivas. Luego, se evalúa el modelo en los datos de prueba y alcanza una precisión del 64.86%.

El uso de "early stopping" es una técnica útil para prevenir el sobreajuste. Puede ayudar a asegurar que el modelo no se sobreentrene en los datos de entrenamiento y que generalice bien a nuevos datos.

6.3.5 Dropout

Dropout es una técnica eficaz de regularización en el aprendizaje profundo que tiene como objetivo mejorar la generalización de las redes neuronales profundas. Funciona aproximando el entrenamiento de múltiples redes neuronales, cada una con arquitecturas diferentes, en paralelo durante la fase de entrenamiento. Específicamente, durante el entrenamiento, se omiten o "se eliminan" de manera aleatoria un número especificado de salidas de capas. Esto tiene el efecto de hacer que la capa se comporte como si tuviera un número distinto de nodos y conectividad con la capa precedente.

En esencia, cada actualización de una capa durante el entrenamiento se realiza con una "vista" diferente de la capa configurada, lo que conduce a un mejor rendimiento de generalización de la red neuronal. Dropout hace que el proceso de entrenamiento sea ruidoso, lo que obliga a los nodos dentro de una capa a asumir probabilísticamente más o menos responsabilidad por las entradas, reduciendo así el sobreajuste. Esta técnica se utiliza ampliamente en el aprendizaje profundo y se ha demostrado que produce resultados de vanguardia en diversas aplicaciones, incluida la clasificación de imágenes, el reconocimiento de voz y el procesamiento de lenguaje natural, entre otros.

Ejemplo:

Así es como puedes agregar dropout a una red neuronal en Keras:

from keras.models import Sequential
from keras.layers import Dense, Dropout

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer
model.add(Dense(32, input_dim=8, activation='relu'))

# Add dropout layer
model.add(Dropout(0.5))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(X, y, epochs=150, batch_size=10)

En este ejemplo, agregamos una capa de Dropout al modelo llamando a la función Dropout() y pasando la tasa de dropout (0.5, en este caso). Esto significa que aproximadamente la mitad de las salidas de la capa anterior serán "eliminadas" o apagadas en cada actualización durante el entrenamiento.

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU, una capa de dropout con una tasa del 0.5 y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se entrena en los datos X e y durante 150 épocas con un tamaño de lote de 10.

La capa de dropout es una técnica de regularización que establece aleatoriamente algunos de los valores de las neuronas de una capa en cero durante el entrenamiento. Esto ayuda a prevenir que el modelo se sobreajuste a los datos de entrenamiento. La tasa de la capa de dropout controla el porcentaje de neuronas que se establecen en cero. En el código, la tasa se establece en 0.5, lo que significa que la mitad de las neuronas en la capa oculta se establecerán en cero en cada época de entrenamiento.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 10000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
Epoch 3/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6927 - accuracy: 0.6448 - val_loss: 0.7099 - val_accuracy: 0.6326
Epoch 4/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6816 - accuracy: 0.6542 - val_loss: 0.7001 - val_accuracy: 0.6406
Epoch 5/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6705 - accuracy: 0.6636 - val_loss: 0.6903 - val_accuracy: 0.6486
...

Como puede verse, el modelo logra una precisión del 64.86% en los datos de validación después de 5 épocas. Esto representa una mejora significativa en comparación con la precisión del modelo sin dropout (alrededor del 60%).

El dropout es una técnica poderosa para prevenir el sobreajuste. Puede ayudar a garantizar que el modelo no se sobreentrene en los datos de entrenamiento y que generalice bien a nuevos datos.

6.3 Sobreajuste, Subajuste y Regularización

En esta sección, exploraremos tres conceptos críticos en el aprendizaje automático y el aprendizaje profundo: sobreajuste, subajuste y regularización. Comprender estos conceptos es fundamental para construir modelos efectivos de redes neuronales.

6.3.1 Sobreajuste

El sobreajuste es un problema común en el aprendizaje automático. Ocurre cuando un modelo es demasiado complejo y comienza a aprender los detalles y el ruido en los datos de entrenamiento, en lugar de solo los patrones subyacentes. Esto puede tener un impacto negativo en el rendimiento del modelo en nuevos datos, ya que el ruido o las fluctuaciones aleatorias en los datos de entrenamiento se recogen y se aprenden como conceptos por el modelo.

Para abordar este problema, se han desarrollado varias técnicas. Una de las más comunes es la regularización, que agrega un término de penalización a la función de pérdida para desalentar al modelo a sobreajustar. Otra técnica es utilizar más datos para el entrenamiento, ya que esto puede ayudar al modelo a aprender los patrones subyacentes en lugar del ruido.

Es importante destacar que el sobreajuste es más probable con modelos no paramétricos y no lineales que tienen más flexibilidad al aprender una función objetivo. En este sentido, las redes neuronales, como clase de modelos de aprendizaje automático, son muy propensas al sobreajuste. Para combatir esto, se han desarrollado diversas técnicas, como la eliminación aleatoria de unidades (dropout) y la detención temprana (early stopping). El dropout elimina aleatoriamente unidades en la red neuronal durante el entrenamiento, mientras que la detención temprana detiene el proceso de entrenamiento cuando el modelo comienza a sobreajustar.

6.3.2 Subajuste

El subajuste se refiere a un escenario en el que un modelo de aprendizaje automático es demasiado simple para capturar la complejidad de los datos de entrenamiento, lo que conduce a un rendimiento deficiente tanto en los datos de entrenamiento como en los de prueba. Este problema suele ser causado por una falta de complejidad en el modelo o por una cantidad insuficiente de datos de entrenamiento.

Es crucial abordar el subajuste, ya que puede ser perjudicial para el rendimiento general de un sistema de aprendizaje automático. Aunque los modelos de subajuste son fáciles de detectar, no siempre son fáciles de resolver. Un enfoque consiste en agregar complejidad al modelo, lo que se puede hacer agregando más características o aumentando el número de capas ocultas en una red neuronal. Otra solución es obtener más datos de entrenamiento, lo que puede ayudar al modelo a capturar más patrones en los datos.

Vale la pena destacar que el subajuste a menudo no se discute tanto como el sobreajuste, que es su contraparte. Sin embargo, el subajuste proporciona un buen contraste con este último y resalta la importancia de equilibrar la complejidad del modelo y el tamaño de los datos. Por lo tanto, es importante considerar la posibilidad de subajuste al construir modelos de aprendizaje automático.

6.3.3 Regularización

La regularización es una técnica poderosa que puede ayudar a prevenir el sobreajuste en modelos de aprendizaje automático. El sobreajuste ocurre cuando un modelo se vuelve demasiado complejo y comienza a memorizar los datos de entrenamiento en lugar de generalizar a nuevos datos.

Para prevenir el sobreajuste, la regularización agrega un término de penalización a la función de pérdida. Este término de penalización desalienta al modelo a aprender patrones excesivamente complejos en los datos de entrenamiento. En su lugar, fomenta que el modelo aprenda patrones más simples y generales que son más propensos a ser útiles al realizar predicciones en nuevos datos.

Existen varios tipos de técnicas de regularización, incluyendo regularización L1 y L2. La regularización L1 agrega una penalización igual al valor absoluto de la magnitud de los coeficientes. La regularización L2 agrega una penalización igual al cuadrado de la magnitud de los coeficientes. Estas penalizaciones ayudan a suavizar los coeficientes y evitan que el modelo sufra sobreajuste.

Otro tipo de técnica de regularización es la regularización de eliminación aleatoria (dropout), que elimina aleatoriamente algunas de las neuronas en una red neuronal durante el entrenamiento. Esto evita que la red dependa demasiado de una sola neurona y la anima a aprender características más robustas.

Además de estas técnicas, hay varias otras formas de prevenir el sobreajuste, como aumentar el tamaño del conjunto de entrenamiento, disminuir la complejidad de la arquitectura del modelo y detener el entrenamiento temprano. Al utilizar una combinación de estas técnicas, es posible construir modelos de aprendizaje automático que generalicen bien a nuevos datos y sean más propensos a ser útiles en aplicaciones del mundo real.

Ejemplo:

Así es como puedes agregar regularización L2 a una red neuronal en Keras:

from keras.models import Sequential
from keras.layers import Dense
from keras.regularizers import l2

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer with L2 regularization
model.add(Dense(32, input_dim=8, activation='relu', kernel_regularizer=l2(0.01))))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(X, y, epochs=150, batch_size=10)

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU y regularización L2 con un decaimiento de peso de 0.01, y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se ajusta a los datos X e y durante 150 épocas con un tamaño de lote de 10.

En este ejemplo, agregamos regularización L2 a la capa oculta configurando el argumento kernel_regularizer en l2(0.01). Esto agrega una penalización igual al cuadrado de la magnitud de los coeficientes a la función de pérdida, desalentando efectivamente al modelo de aprender patrones excesivamente complejos en los datos de entrenamiento.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 10000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
...

Como puedes ver, el modelo logra una alta precisión en los datos de entrenamiento (más del 90%). Sin embargo, la precisión en los datos de prueba es mucho más baja (alrededor del 60%). Esto se debe a que el modelo está sobreajustando los datos de entrenamiento. Para mejorar el rendimiento del modelo en los datos de prueba, puedes intentar usar un conjunto de datos más grande o utilizar una técnica de regularización.

6.3.4 Detención temprana

La detención temprana es una técnica de regularización utilizada para prevenir el sobreajuste durante el entrenamiento iterativo de un modelo de aprendizaje automático, como el descenso de gradiente. Estos métodos actualizan el modelo en cada iteración para que se ajuste mejor a los datos de entrenamiento, lo que mejora su rendimiento en datos no vistos durante el entrenamiento. Sin embargo, esta mejora solo ocurre hasta cierto punto; más allá de ese punto, el ajuste del modelo a los datos de entrenamiento aumenta el error de generalización. Las reglas de detención temprana pueden guiar cuántas iteraciones deben ejecutarse antes de que el modelo comience a sobreajustar.

Por ejemplo, en las redes neuronales, la detención temprana implica monitorear el rendimiento del modelo en un conjunto de validación y detener el procedimiento de entrenamiento una vez que el rendimiento en el conjunto de validación no ha mejorado durante un cierto número de épocas. Este procedimiento simple a menudo logra resultados sorprendentemente buenos.

Además de la detención temprana, se pueden utilizar otras técnicas de regularización para prevenir el sobreajuste, como la regularización L1 y L2, la eliminación aleatoria de neuronas (dropout) y la decaída de pesos (weight decay). Estos métodos se pueden utilizar juntos para mejorar el rendimiento y la generalización de un modelo.

Ejemplo:

Aquí tienes cómo puedes implementar la detención temprana en Keras:

from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer
model.add(Dense(32, input_dim=8, activation='relu'))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Define the early stopping monitor
early_stopping_monitor = EarlyStopping(patience=3)

# Fit the model
model.fit(X, y, epochs=150, batch_size=10, validation_split=0.2, callbacks=[early_stopping_monitor])

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se ajusta a los datos X e y durante 150 épocas con un tamaño de lote de 10, utilizando un 20% de los datos como datos de validación. Se utiliza el callback EarlyStopping para detener el entrenamiento si la pérdida en la validación no mejora durante 3 épocas consecutivas.

En este ejemplo, definimos un monitor EarlyStopping y configuramos su patience en 3. Esto significa que el procedimiento de entrenamiento se detendrá una vez que el rendimiento en el conjunto de validación (el 20% de los datos de entrenamiento, en este caso) no haya mejorado durante 3 épocas.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 12000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
Epoch 3/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6927 - accuracy: 0.6448 - val_loss: 0.7099 - val_accuracy: 0.6326
Epoch 4/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6816 - accuracy: 0.6542 - val_loss: 0.7001 - val_accuracy: 0.6406
Epoch 5/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6705 - accuracy: 0.6636 - val_loss: 0.6903 - val_accuracy: 0.6486
...
Early stopping...

Como puedes ver, el modelo detiene el entrenamiento después de 5 épocas. Esto se debe a que la pérdida en la validación no ha mejorado durante 3 épocas consecutivas. Luego, se evalúa el modelo en los datos de prueba y alcanza una precisión del 64.86%.

El uso de "early stopping" es una técnica útil para prevenir el sobreajuste. Puede ayudar a asegurar que el modelo no se sobreentrene en los datos de entrenamiento y que generalice bien a nuevos datos.

6.3.5 Dropout

Dropout es una técnica eficaz de regularización en el aprendizaje profundo que tiene como objetivo mejorar la generalización de las redes neuronales profundas. Funciona aproximando el entrenamiento de múltiples redes neuronales, cada una con arquitecturas diferentes, en paralelo durante la fase de entrenamiento. Específicamente, durante el entrenamiento, se omiten o "se eliminan" de manera aleatoria un número especificado de salidas de capas. Esto tiene el efecto de hacer que la capa se comporte como si tuviera un número distinto de nodos y conectividad con la capa precedente.

En esencia, cada actualización de una capa durante el entrenamiento se realiza con una "vista" diferente de la capa configurada, lo que conduce a un mejor rendimiento de generalización de la red neuronal. Dropout hace que el proceso de entrenamiento sea ruidoso, lo que obliga a los nodos dentro de una capa a asumir probabilísticamente más o menos responsabilidad por las entradas, reduciendo así el sobreajuste. Esta técnica se utiliza ampliamente en el aprendizaje profundo y se ha demostrado que produce resultados de vanguardia en diversas aplicaciones, incluida la clasificación de imágenes, el reconocimiento de voz y el procesamiento de lenguaje natural, entre otros.

Ejemplo:

Así es como puedes agregar dropout a una red neuronal en Keras:

from keras.models import Sequential
from keras.layers import Dense, Dropout

# Create a Sequential model
model = Sequential()

# Add an input layer and a hidden layer
model.add(Dense(32, input_dim=8, activation='relu'))

# Add dropout layer
model.add(Dropout(0.5))

# Add an output layer
model.add(Dense(1, activation='sigmoid'))

# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(X, y, epochs=150, batch_size=10)

En este ejemplo, agregamos una capa de Dropout al modelo llamando a la función Dropout() y pasando la tasa de dropout (0.5, en este caso). Esto significa que aproximadamente la mitad de las salidas de la capa anterior serán "eliminadas" o apagadas en cada actualización durante el entrenamiento.

El código de ejemplo crea un modelo secuencial con una capa de entrada de 8 neuronas, una capa oculta de 32 neuronas con activación ReLU, una capa de dropout con una tasa del 0.5 y una capa de salida de 1 neurona con activación sigmoide. El modelo se compila con una pérdida de entropía cruzada binaria, el optimizador Adam y métricas de precisión. El modelo se entrena en los datos X e y durante 150 épocas con un tamaño de lote de 10.

La capa de dropout es una técnica de regularización que establece aleatoriamente algunos de los valores de las neuronas de una capa en cero durante el entrenamiento. Esto ayuda a prevenir que el modelo se sobreajuste a los datos de entrenamiento. La tasa de la capa de dropout controla el porcentaje de neuronas que se establecen en cero. En el código, la tasa se establece en 0.5, lo que significa que la mitad de las neuronas en la capa oculta se establecerán en cero en cada época de entrenamiento.

Salida:

Aquí tienes un ejemplo de la salida del código:

Train on 60000 samples, validate on 10000 samples
Epoch 1/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7149 - accuracy: 0.6260 - val_loss: 0.7292 - val_accuracy: 0.6162
Epoch 2/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.7038 - accuracy: 0.6354 - val_loss: 0.7197 - val_accuracy: 0.6244
Epoch 3/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6927 - accuracy: 0.6448 - val_loss: 0.7099 - val_accuracy: 0.6326
Epoch 4/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6816 - accuracy: 0.6542 - val_loss: 0.7001 - val_accuracy: 0.6406
Epoch 5/150
60000/60000 [==============================] - 1s 17us/sample - loss: 0.6705 - accuracy: 0.6636 - val_loss: 0.6903 - val_accuracy: 0.6486
...

Como puede verse, el modelo logra una precisión del 64.86% en los datos de validación después de 5 épocas. Esto representa una mejora significativa en comparación con la precisión del modelo sin dropout (alrededor del 60%).

El dropout es una técnica poderosa para prevenir el sobreajuste. Puede ayudar a garantizar que el modelo no se sobreentrene en los datos de entrenamiento y que generalice bien a nuevos datos.