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