El sobreajuste es aprender los datos de memoria
El sobreajuste (overfitting en inglés) ocurre cuando una red neuronal se aprende de memoria los datos de entrenamiento y falla con datos nuevos. Puede parecer perfecta en el entrenamiento y ser inútil en la práctica.
Hoy aprendes a verlo en una tabla de pérdidas y a parar el entrenamiento a tiempo.
Al final de esta lección
Nota
Puedo detectar el sobreajuste y reducirlo.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Sobreajuste | acertar con los datos vistos y fallar con los nuevos |
| Entrenamiento | los datos con los que la red corrige sus pesos |
| Validación | datos que la red no usa para aprender, solo para comprobar |
| Parada temprana | dejar de entrenar cuando la validación deja de mejorar |
| Paciencia | cuántas épocas sin mejora se esperan antes de parar |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Se separan los datos en tres conjuntos
Una red que se juzga con los datos que ya vio engaña, porque puede recordarlos. Por eso se separan los datos antes de entrenar.
El entrenamiento corrige los pesos. La validación sirve para decidir cuándo parar y qué ajustes probar. La prueba se mira una sola vez, al final.
Ejemplo resuelto: 365 días en tres partes
| Conjunto | Días | Para qué sirve |
|---|---|---|
| Entrenamiento | 255 | Corregir los pesos |
| Validación | 55 | Decidir cuándo parar |
| Prueba | 55 | Juzgar la red una sola vez |
| Total | 365 | Un año |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Comprueba que las tres partes suman un año
docker exec jupyter python3 -c "print(255 + 55 + 55)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
El sobreajuste se ve en las curvas
Cada época se mide la pérdida con el entrenamiento y con la validación. Al principio las dos bajan.
Después la del entrenamiento sigue bajando, pero la de validación se detiene y sube. La red ya no aprende la regla: aprende los ejemplos. El hueco entre las dos crece.
Ejemplo resuelto: siete épocas de entrenamiento
| Época | Pérdida de entrenamiento | Pérdida de validación | Hueco |
|---|---|---|---|
| 1 | 0,90 | 0,95 | 0,05 |
| 2 | 0,60 | 0,70 | 0,10 |
| 3 | 0,40 | 0,52 | 0,12 |
| 4 | 0,28 | 0,45 | 0,17 |
| 5 | 0,18 | 0,47 | 0,29 |
| 6 | 0,10 | 0,52 | 0,42 |
| 7 | 0,05 | 0,60 | 0,55 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Busca la mejor época con un bucle
# Pérdida de cada época, medida con los datos de entrenamiento y con los de validación.
entrenamiento = [0.90, 0.60, 0.40, 0.28, 0.18, 0.10, 0.05]
validacion = [0.95, 0.70, 0.52, 0.45, 0.47, 0.52, 0.60]
mejor = validacion[0]
mejor_epoca = 1
for n in range(len(validacion)):
if validacion[n] < mejor:
mejor = validacion[n]
mejor_epoca = n + 1
hueco = round(validacion[n] - entrenamiento[n], 2)
print("época", n + 1, "hueco", hueco)
print("la mejor época es la", mejor_epoca)
# Cambia validacion[4] a 0.40 y ejecuta otra vez. ¿Qué época es la mejor?
Un error muy común
Advertencia
Mucha gente cree que una pérdida de entrenamiento muy baja prueba que la red es buena. No es así. Esa cifra solo dice cuánto recuerda. Para saber si funciona con días nuevos, mira la pérdida de validación.
La parada temprana corta el entrenamiento a tiempo
La parada temprana vigila la pérdida de validación. Si pasan varias épocas sin que baje, el entrenamiento se detiene.
Ese número de épocas es la paciencia. Al parar, se conservan los pesos de la mejor época, no los de la última.
Ejemplo resuelto: paciencia 2 con las siete épocas
| Época | Validación | ¿Mejora? | Épocas sin mejora |
|---|---|---|---|
| 4 | 0,45 | Sí, es la mejor | 0 |
| 5 | 0,47 | No | 1 |
| 6 | 0,52 | No | 2, el entrenamiento para |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La pérdida de validación más baja
docker exec jupyter python3 -c "print(min([0.95, 0.70, 0.52, 0.45, 0.47]))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
La época de esa pérdida
docker exec jupyter python3 -c "print([0.95, 0.70, 0.52, 0.45, 0.47].index(0.45) + 1)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos: cambiar la paciencia
Con la tabla de siete épocas, calcula en qué época para el entrenamiento con paciencia 1 y con paciencia 3.
Explica qué se pierde con una paciencia demasiado baja: piensa en una validación que sube una época y vuelve a bajar.