Derzeit sind stochastische gradientenbasierte Methoden fast immer der Algorithmus der Wahl für das Tiefenlernen. Dies bedeutet, dass Daten als Stapel eingehen, Verläufe berechnet und Parameter aktualisiert werden. Dies bedeutet, dass Sie auch den Verlust über die Daten berechnen können, wenn jeder Stapel ausgewählt wird. Unter diesem Rahmen gibt es zwei Arten, wie der Verlust berechnet wird, von denen ich mir vorstellen kann, dass sie zu dem Phänomen führen, dass der Trainingsfehler größer als der Validierungsfehler ist. Im Folgenden zeige ich, dass Keras tatsächlich die In-Sample-Fehler auf diese Weise zu berechnen scheint.
1.) Der Trainingsfehler wird über die gesamte Epoche gemittelt, am Ende der Epoche auf einmal, der Validierungsfehler jedoch erst am Ende der Epoche. Beachten Sie, dass der Validierungsfehler den Vorteil hat, dass er vollständig aktualisiert wird, während der Trainingsfehler Fehlerberechnungen mit weniger Aktualisierungen enthält. Natürlich sollte dieser Effekt asymptotisch im Allgemeinen verschwinden.
2.) Der Trainingsfehler wird berechnet, bevor die Stapelaktualisierung abgeschlossen ist. Bei einer stochastischen gradientenbasierten Methode tritt Rauschen auf. Während man auf einen Hügel steigt, besteht eine hohe Wahrscheinlichkeit, dass man den über alle Trainingsmuster berechneten globalen Verlust verringert. Wenn Sie sich dem Modus jedoch sehr nähern, ist die Aktualisierungsrichtung in Bezug auf die Proben in Ihrem Stapel negativ . Aber da wir um einen Modus prallen, bedeutet dies im Durchschnitt müssen wir eine Richtung werden die Wahl, die in Bezug auf die Proben positiv ausder Charge. Wenn wir jetzt eine Aktualisierung in Bezug auf die Beispiele in einem bestimmten Stapel durchführen möchten, bedeutet dies, dass sie durch potenziell viele Stapelaktualisierungen, in denen sie nicht enthalten waren, verschoben wurden, indem der Verlust vor der Aktualisierung berechnet wurde Die Methoden haben die Parameter am meisten zugunsten der anderen Stichproben in Ihrem Dataset verschoben, sodass der erwartete Verlust leicht nach oben tendiert.
Beachten Sie, dass die Wirkung von (1) asymptotisch verschwindet, die von (2) jedoch nicht! Unten zeige ich, dass Keras sowohl (1) als auch (2) zu tun scheint.
(1) Zeigen, dass die Metriken über jede Charge in der Epoche gemittelt werden und nicht alle auf einmal am Ende. Beachten Sie den RIESIGEN Unterschied zwischen der Genauigkeit in der Stichprobe und der Genauigkeit von val_accuracy, der die Genauigkeit von val_accuracy in der ersten Epoche begünstigt. Dies liegt daran, dass einige In-Sample-Fehler mit sehr wenigen Batch-Aktualisierungen berechnet wurden.
>>> 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) Der Anzeigefehler wird vor der Aktualisierung für jeden Stapel berechnet . Beachten Sie, dass für Epoche 1, wenn wir verwenden batch_size = nRows
(dh alle Daten in einem Stapel), der In-Sample-Fehler für Epoche 1 etwa 0,5 (zufälliges Erraten) beträgt, der Validierungsfehler jedoch 0,82. Daher wurde der In-Sample-Fehler vor der Stapelaktualisierung berechnet , während der Validierungsfehler nach der Stapelaktualisierung berechnet wurde .
>>> 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