W tej chwili metody oparte na gradiencie stochastycznym są prawie zawsze algorytmem z wyboru do głębokiego uczenia się. Oznacza to, że dane przychodzą jako partie, gradienty są obliczane, a parametry aktualizowane. Oznacza to, że można również obliczyć stratę na danych po wybraniu każdej partii. W ramach tej metody, istnieją dwa sposoby, w jaki sposób straty oblicza się, że mogę myśleć, co może prowadzić do tego zjawiska, że błąd jest większy niż trening błędu walidacji. Poniżej pokazuję, że Keras faktycznie oblicza błędy w próbie w ten sposób.
1.) Błąd szkolenia jest uśredniany dla całej epoki, a raczej naraz na końcu epoki, ale błąd walidacji występuje tylko na końcu epoki. Należy zauważyć, że błąd sprawdzania poprawności ma tę zaletę, że jest w pełni aktualizowany, natomiast błąd szkolenia obejmuje obliczenia błędów z mniejszą liczbą aktualizacji. Oczywiście asymptotycznie ten efekt powinien zasadniczo zniknąć.
2.) Błąd szkolenia jest obliczany przed aktualizacją partii. W metodzie opartej na gradiencie stochastycznym gradient jest nieco zakłócony. Podczas wspinaczki na wzgórze istnieje duże prawdopodobieństwo, że zmniejszy się globalna strata obliczona dla wszystkich próbek treningowych. Jednak gdy zbliży się do trybu, kierunek aktualizacji będzie ujemny w odniesieniu do próbek w partii. Ale ponieważ jesteśmy podskakują wokół trybie, to znaczy średnio musimy być wybranie kierunku, który jest pozytywne w odniesieniu do próbek outpartii. Teraz, jeśli mamy zamiar zaktualizować w odniesieniu do próbek w danej partii, oznacza to, że zostały one wypchnięte przez potencjalnie wiele aktualizacji partii, których nie uwzględniono, obliczając ich utratę przed aktualizacją, to wtedy stochastyczny metody przesunęły parametry najbardziej na korzyść innych próbek w zbiorze danych, co daje nam niewielkie odchylenie w górę w zakresie oczekiwanej straty.
Zauważ, że chociaż asymptotycznie efekt (1) znika, (2) nie! Poniżej pokazuję, że Keras wydaje się robić zarówno (1), jak i (2).
(1) Wskazanie, że dane są uśredniane dla każdej partii w epoce, a nie wszystkie jednocześnie na końcu. Zwróć uwagę na OGROMNĄ różnicę w dokładności w próbie w porównaniu z wartością val_accuracy, sprzyjającą wartości val_accuracy w pierwszej epoce. Wynika to z faktu, że niektóre błędy w próbce zostały obliczone przy bardzo niewielu aktualizacjach wsadowych.
>>> 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) Wyświetlanie błędu jest obliczane przed aktualizacją dla każdej partii. Zauważ, że dla epoki 1, kiedy używamy batch_size = nRows
(tj. Wszystkich danych w jednej partii), błąd w próbie wynosi około 0,5 (losowe zgadywanie) dla epoki 1, ale błąd walidacji wynosi 0,82. Dlatego błąd w próbie został obliczony przed aktualizacją partii, podczas gdy błąd sprawdzania poprawności został obliczony po aktualizacji partii.
>>> 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