¿Error de validación menor que error de entrenamiento?

58

Encontré dos preguntas aquí y aquí sobre este problema, pero todavía no hay una respuesta o explicación obvia. Hago cumplir el mismo problema donde el error de validación es menor que el error de entrenamiento en mi red neuronal de convolución. Qué significa eso?

Bido
fuente
No creo que esta pregunta pueda responderse sin conocer el número absoluto de entrenamiento (cv) y casos de prueba, así como la varianza observada para MSE tanto para la validación cruzada como para la prueba.
cbeleites apoya a Monica el
barajar los datos
usuario0
¿Qué inferimos de esto? Sí, se genera a partir de una red densa con capas de caída y batchnorm. ! [ingrese la descripción de la imagen aquí ] ( i.stack.imgur.com/KX1Fz.png )
Srinath

Respuestas:

70

Es difícil estar seguro sin conocer su metodología real (por ejemplo, método de validación cruzada, métrica de rendimiento, método de división de datos, etc.).

En términos generales, sin embargo, el error de entrenamiento casi siempre subestimará su error de validación. Sin embargo, es posible que el error de validación sea menor que el entrenamiento. Puedes pensarlo de dos maneras:

  1. Su conjunto de entrenamiento tenía muchos casos "difíciles" para aprender
  2. Su conjunto de validación tenía en su mayoría casos 'fáciles' para predecir

Por eso es importante que realmente evalúe su metodología de capacitación modelo. Si no divide sus datos para el entrenamiento adecuadamente, sus resultados conducirán a conclusiones confusas, si no simplemente incorrectas.

Pienso en la evaluación del modelo en cuatro categorías diferentes:

  1. Underfitting - Validación y error de entrenamiento alto

  2. Sobreajuste: el error de validación es alto, el error de entrenamiento es bajo

  3. Buen ajuste: error de validación bajo, ligeramente superior al error de entrenamiento

  4. Ajuste desconocido: error de validación bajo, error de entrenamiento 'alto'

Digo 'desconocido' porque el resultado es contrario a la intuición de cómo funciona el aprendizaje automático. La esencia de ML es predecir lo desconocido. Si eres mejor para predecir lo desconocido que lo que has "aprendido", AFAIK los datos entre el entrenamiento y la validación deben ser diferentes de alguna manera. Esto podría significar que necesita reevaluar su método de división de datos, agregar más datos o posiblemente cambiar su métrica de rendimiento (¿realmente está midiendo el rendimiento que desea?).

EDITAR

Para abordar la referencia del OP a una pregunta anterior sobre lasaña de pitón .

Esto sugiere que tiene datos suficientes para no requerir validación cruzada y simplemente tener sus subconjuntos de datos de capacitación, validación y prueba. Ahora, si observa el tutorial de lasaña , puede ver que se ve el mismo comportamiento en la parte superior de la página. Me resultaría difícil creer que los autores publicarían tales resultados si fuera extraño, pero en lugar de suponer que son correctos, veamos más. La sección de mayor interés para nosotros aquí está en la sección de bucle de entrenamiento , justo arriba de la parte inferior verá cómo se calculan los parámetros de pérdida.

La pérdida de entrenamiento se calcula sobre todo el conjunto de datos de entrenamiento . Del mismo modo, la pérdida de validación se calcula sobre todo el conjunto de datos de validación . El conjunto de entrenamiento suele ser al menos 4 veces más grande que la validación (80-20). Dado que el error se calcula sobre todas las muestras, puede esperar hasta aproximadamente 4 veces la medida de pérdida del conjunto de validación. Sin embargo, notará que la pérdida de capacitación y la pérdida de validación se acercan entre sí a medida que continúa la capacitación. ¡Esto es intencional ya que si su error de entrenamiento comienza a ser más bajo que su error de validación , comenzaría a sobreajustar su modelo!

Espero que esto aclare estos errores.

cdeterman
fuente
2
Buena respuesta. También existe la posibilidad de que haya un error en el código que hace posible que el entrenamiento no haya convergido a la solución óptima en el conjunto de entrenamiento. O, si el objetivo de entrenamiento no es convexo y el algoritmo de entrenamiento converge a un mínimo local que resulta bueno para el conjunto de validación.
Sobi
@cdeterman gracias. Uso RMSE como una métrica de rendimiento. He dividido mis datos en 20% para pruebas y 80% para capacitación y validación (20% de los datos de capacitación se validan de manera cruzada para calcular el error de validación) En realidad, el error de validación es bajo, ligeramente inferior al error de entrenamiento. El error de prueba es mayor que los errores de entrenamiento y validación. Podemos encontrar un caso similar en MNISTdataset para el reconocimiento de escritura a mano stats.stackexchange.com/questions/178371/…
Bido
@Bido, ¿mi dirección de edición más reciente pregunta?
cdeterman
@cdeterman Gracias. Acabo de notar que has editado tu respuesta. Es claro y útil.
Bido
Gran explicación, si pudieras agregar algunos gráficos, sería el mejor posible
Taras Matsyk
109

Una posibilidad: si está utilizando la capa de regularización de abandono en su red, es razonable que el error de validación sea menor que el error de entrenamiento. Porque generalmente el abandono se activa durante el entrenamiento pero se desactiva al evaluar en el conjunto de validación. Obtiene una función más suave (generalmente significa mejor) en el último caso.

DK
fuente
12
¡Qué respuesta tan simple y sensata!
rajb245
44
Sí, esto debería marcarse como respuesta correcta.
Simanas
2
¡Eliminé mi capa de abandono, pero aún veo la pérdida de validación más baja que la pérdida de entrenamiento inicialmente! (¡No estoy especificando ninguna regularización en las capas, tampoco!)
Josiah Yoder
Se adapta a mi caso. Usando mucho abandono.
André Christoffer Andersen
@JosiahYoder: ¿tienes algo más que compartir sobre esto? Tengo 1650 características de entrada. Cuando mantengo la red pequeña (1650, 50, 1) abandono o ningún abandono, el error de entrenamiento en las épocas iniciales es mayor que el error de validación. Cuando uso redes grandes (1650, 1200, 800, 100 ..... alrededor de 10 capas de 100 con activación selu), el extraño patrón de mayor precisión de validación se ve algo mitigado.
MiloMinderbinder
19

No tengo suficientes puntos para comentar sobre la respuesta de @ DK, pero ahora esto se responde como una pregunta frecuente en la documentación de Keras:

"¿Por qué la pérdida de entrenamiento es mucho mayor que la pérdida de prueba?

Un modelo de Keras tiene dos modos: entrenamiento y pruebas. Los mecanismos de regularización, como el abandono y la regularización de peso L1 / L2, se desactivan en el momento de la prueba.

Además, la pérdida de entrenamiento es el promedio de las pérdidas sobre cada lote de datos de entrenamiento. Debido a que su modelo cambia con el tiempo, la pérdida en los primeros lotes de una época es generalmente mayor que en los últimos lotes. Por otro lado, la pérdida de prueba para una época se calcula utilizando el modelo como está al final de la época, lo que resulta en una pérdida menor ".

dter
fuente
1
Esto tampoco responde completamente a la pregunta. Con el abandono desactivado, sigo viendo la pérdida de validación como la mitad de la pérdida de entrenamiento durante varias épocas seguidas.
Josiah Yoder
¿Sus datos de entrenamiento son representativos de los datos de desarrollo?
entrado el
Divido al azar el conjunto de datos en entrenamiento y pruebas. Visualmente parecía ser una buena muestra. Estaba trabajando en un problema de regresión en el que los mejores clasificadores eran solo un poco mejores que siempre prediciendo el valor medio.
Josiah Yoder
Su respuesta no habla de que la pérdida de capacitación sea mayor que la pérdida de validación, que es la pregunta que se hizo. Estás más enfocado en la pérdida de entrenamiento y la pérdida de prueba
enjal
6

mis 2 centavos: también tuve el mismo problema incluso sin tener capas de deserción. En mi caso, las capas de la norma de lotes fueron los culpables. Cuando los eliminé, la pérdida de entrenamiento se volvió similar a la pérdida de validación. Probablemente, eso sucedió porque durante el entrenamiento, la norma del lote utiliza la media y la varianza del lote de entrada dado, que puede ser diferente de un lote a otro. Pero durante la evaluación, la norma de lote utiliza la media y la varianza de ejecución, las cuales reflejan propiedades de todo el conjunto de entrenamiento mucho mejor que la media y la varianza de un solo lote durante el entrenamiento. Al menos, así es como se implementa la norma de lotes en pytorch

Mans007
fuente
1
Gracias @ Mans007, esto me había pasado y estaba usando Keras. Las capas de la norma del lote fueron la causa.
Roei Bahumi
4

Otra posibilidad que combina la respuesta de @cdeterman y @DK de alguna manera es si está utilizando algún mecanismo de aumento de datos. El aumento de datos de hecho generalmente se realiza solo en el conjunto de entrenamiento y no en el conjunto de validación (en cuanto a la regularización de abandono), y esto puede conducir a un conjunto de validación que contiene casos "más fáciles" de predecir que aquellos en el conjunto de entrenamiento.

se7entyse7en
fuente
2

Obtuve resultados similares (la pérdida de la prueba fue significativamente menor que la pérdida de entrenamiento). Una vez que eliminé la regularización del abandono, tanto la pérdida se volvió casi igual.

Ravi
fuente
0

@cdeterman y @DK tienen una buena explicación. Me gustaría una razón más data leakage. Parte de los datos de su tren están "estrechamente relacionados" con los datos de prueba.

Ejemplo potencial: imagine que tiene 1000 perros y 1000 gatos con 500 imágenes similares por mascota (a algunos propietarios les encanta tomar fotografías de sus mascotas en posiciones muy similares), digamos en el fondo. Entonces, si realiza una división aleatoria de 70/30, obtendrá una fuga de datos de los datos del tren en los datos de prueba.

Danylo Zherebetskyy
fuente
0

En pocas palabras, si la pérdida de entrenamiento y la pérdida de validación se calculan correctamente, es imposible que la pérdida de entrenamiento sea mayor que la pérdida de validación. Esto se debe a que la propagación hacia atrás reduce DIRECTAMENTE el error calculado en el conjunto de entrenamiento y solo INDIRECTAMENTE (¡ni siquiera está garantizado!) Reduce el error calculado en el conjunto de validación.

Debe haber algunos factores adicionales que son diferentes durante el entrenamiento y durante la validación. La deserción es buena, pero puede haber otras. Asegúrese de verificar la documentación de cualquier biblioteca que esté utilizando. Los modelos y las capas generalmente pueden tener configuraciones predeterminadas a las que comúnmente no prestamos atención.

Zhihan Yang
fuente
0

Una validación menor que el error de entrenamiento puede ser causada por fluctuaciones asociadas con el abandono o no, pero si persiste a largo plazo, esto puede indicar que los conjuntos de datos de entrenamiento y validación en realidad no se obtuvieron de los mismos conjuntos estadísticos. Esto podría suceder si sus ejemplos provienen de una serie y si no aleatorizó correctamente los conjuntos de datos de capacitación y validación.

jacaboul
fuente
0

En este momento, los métodos basados ​​en gradientes estocásticos son casi siempre el algoritmo de elección para el aprendizaje profundo. Esto significa que los datos llegan como lotes, los gradientes se calculan y los parámetros se actualizan. Esto significa que también puede calcular la pérdida sobre los datos a medida que se selecciona cada lote. Bajo este marco, hay dos formas en que se calcula la pérdida que puedo pensar que pueden conducir a este fenómeno de que el error de entrenamiento es mayor que el error de validación. A continuación, muestro que Keras, de hecho, parece calcular los errores en la muestra de esta manera.

1.) El error de entrenamiento se promedia en toda la época, más bien de una vez al final de la época, pero el error de validación es solo al final de la época. Tenga en cuenta que el error de validación tiene la ventaja de estar completamente actualizado, mientras que el error de capacitación incluye cálculos de error con menos actualizaciones. Por supuesto, asintóticamente este efecto generalmente debería desaparecer.

2.) El error de entrenamiento se calcula antes de realizar la actualización por lotes. En un método basado en gradiente estocástico, hay algo de ruido en el gradiente. Mientras uno está subiendo una colina, existe una alta probabilidad de que esté disminuyendo la pérdida global calculada en todas las muestras de entrenamiento. Sin embargo, cuando uno se acerca mucho al modo, la dirección de actualización será negativa con respecto a las muestras en su lote. Pero ya que estamos rebotando un modo, esto significa que , en promedio, que deben elegir una dirección que es positivo con respecto a las muestras fuerade lote. Ahora, si estamos a punto de actualizar con respecto a las muestras en un lote dado, eso significa que potencialmente han sido rechazadas por muchas actualizaciones de lotes en las que no se incluyeron, al calcular su pérdida antes de la actualización, esto es cuando el estocástico Los métodos han impulsado los parámetros más a favor de las otras muestras en su conjunto de datos, lo que nos da un pequeño sesgo al alza en la pérdida esperada.

Tenga en cuenta que si bien asintóticamente, el efecto de (1) desaparece, (2) no lo hace. A continuación muestro que Keras parece hacer tanto (1) como (2).

(1) Mostrar que las métricas se promedian sobre cada lote en época, en lugar de todas al mismo tiempo al final. Observe la GRAN diferencia en la precisión en la muestra frente a val_accuracy que favorece val_accuracy en la primera época. Esto se debe a que algunos errores en la muestra se calcularon con muy pocas actualizaciones por lotes.

>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = 100, 
...                 validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 8s 176us/sample 
- loss: 0.2320 - accuracy: 0.9216 
- val_loss: 0.1581 - val_accuracy: 0.9636
Epoch 2/3
46580/46580 [==============================] - 8s 165us/sample 
- loss: 0.1487 - accuracy: 0.9662 
- val_loss: 0.1545 - val_accuracy: 0.9677
Epoch 3/3
46580/46580 [==============================] - 8s 165us/sample 
- loss: 0.1471 - accuracy: 0.9687 
- val_loss: 0.1424 - val_accuracy: 0.9699
<tensorflow.python.keras.callbacks.History object at 0x17070d080>

(2) El error de visualización se calcula antes de la actualización para cada lote. Tenga en cuenta que para la época 1, cuando usamos batch_size = nRows(es decir, todos los datos en un lote), el error en la muestra es de aproximadamente 0.5 (adivinación aleatoria) para la época 1, pero el error de validación es 0.82. Por lo tanto, el error en la muestra se calculó antes de la actualización por lotes, mientras que el error de validación se calculó después de la actualización por lotes.

>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = nRows, 
...                 validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 9s 201us/sample 
- loss: 0.7126 - accuracy: 0.5088 
- val_loss: 0.5779 - val_accuracy: 0.8191
Epoch 2/3
46580/46580 [==============================] - 6s 136us/sample 
- loss: 0.5770 - accuracy: 0.8211 
- val_loss: 0.4940 - val_accuracy: 0.8249
Epoch 3/3
46580/46580 [==============================] - 6s 120us/sample 
- loss: 0.4921 - accuracy: 0.8268 
- val_loss: 0.4502 - val_accuracy: 0.8249
Acantilado
fuente