A cette époque, les méthodes basées sur les gradients stochastiques sont presque toujours l'algorithme de choix pour un apprentissage en profondeur. Cela signifie que les données entrent par lots, que les gradients sont calculés et les paramètres mis à jour. Cela signifie que vous pouvez également calculer la perte sur les données lorsque chaque lot est sélectionné. Dans ce cadre, il y a deux façons de la façon dont la perte est calculé que je peux penser à ce qui peut conduire à ce phénomène que l'erreur de formation est supérieure à l'erreur de validation. Je montre ci-dessous que Keras semble en fait calculer les erreurs dans l'échantillon de cette manière.
1.) L' erreur d'apprentissage est moyennée sur toute une époque, plutôt en une seule fois à la fin de l'époque, mais l'erreur de validation est seulement à la fin de l'époque. Notez que l'erreur de validation présente l'avantage d'être entièrement mise à jour, tandis que l'erreur d'apprentissage inclut des calculs d'erreur avec moins de mises à jour. Bien entendu, asymptotiquement, cet effet devrait généralement disparaître.
2.) L' erreur de formation est calculée avant la mise à jour par lot. Dans une méthode basée sur un gradient stochastique, il y a du bruit dans le dégradé. En grimpant une colline, il est fort probable que la perte globale calculée diminue sur tous les échantillons d’entraînement. Cependant, lorsque l’on se rapproche beaucoup du mode, le sens de la mise à jour sera négatif par rapport aux échantillons de votre lot. Mais comme nous rebondissons sur un mode, cela signifie en moyenne que nous devons choisir une direction positive par rapport aux échantillons .de lot. Maintenant, si nous sommes sur le point de mettre à jour les échantillons d’un lot donné, cela signifie qu’ils ont probablement été contournés par de nombreuses mises à jour de lot dans lesquelles ils n’étaient pas inclus, en calculant leur perte avant la mise à jour, c’est alors que le stochastique les méthodes ont poussé les paramètres les plus en faveur des autres échantillons de votre jeu de données, nous donnant ainsi un léger biais à la hausse dans la perte attendue.
Notez que bien que asymptotiquement, l'effet de (1) disparaisse, (2) ne disparaît pas! Je montre ci-dessous que Keras semble faire les deux (1) et (2).
(1) Montrant que les métriques sont moyennées sur chaque lot de l'époque, plutôt que toutes en même temps à la fin. Notez l’énorme différence entre la précision de l’échantillon et celle de val_accuracy favorisant val_accuracy à la toute première époque. Cela est dû au fait que certaines erreurs dans l'échantillon ont été calculées avec très peu de mises à jour par lots.
>>> 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) L'erreur d'affichage est calculée avant la mise à jour pour chaque lot. Notez que pour l'époque 1, lorsque nous utilisons batch_size = nRows
(c'est-à-dire toutes les données d'un lot), l'erreur dans l'échantillon est d'environ 0,5 (estimation aléatoire) pour l'époque 1, mais l'erreur de validation est de 0,82. Par conséquent, l'erreur dans l'échantillon a été calculée avant la mise à jour par lot, tandis que l'erreur de validation a été calculée après la mise à jour par lot.
>>> 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