In questo momento, i metodi basati sul gradiente stocastico sono quasi sempre l'algoritmo di scelta per l'apprendimento profondo. Ciò significa che i dati arrivano come batch, i gradienti vengono calcolati e i parametri aggiornati. Ciò significa che è anche possibile calcolare la perdita sui dati quando viene selezionato ciascun batch. In questo quadro, ci sono due modi in cui viene calcolata la perdita a cui posso pensare, che può portare a questo fenomeno che l'errore di addestramento è maggiore dell'errore di validazione. Di seguito, mostro che Keras, in effetti, sembra calcolare gli errori nel campione in questi modi.
1.) L' errore di allenamento è calcolato in media su tutta l'epoca, piuttosto tutto in una volta alla fine dell'epoca, ma l'errore di validazione è solo alla fine dell'epoca. Si noti che l'errore di convalida ha il vantaggio di essere completamente aggiornato, mentre l'errore di addestramento include calcoli di errori con meno aggiornamenti. Naturalmente, asintoticamente questo effetto dovrebbe generalmente scomparire.
2.) L' errore di addestramento viene calcolato prima dell'aggiornamento batch. In un metodo basato sul gradiente stocastico, c'è del rumore nel gradiente. Mentre si sta salendo una collina, c'è un'alta probabilità che si stia riducendo la perdita globale calcolata su tutti i campioni di allenamento. Tuttavia, quando ci si avvicina molto alla modalità, la direzione di aggiornamento sarà negativa rispetto ai campioni nel batch. Ma poiché stiamo rimbalzando attorno a una modalità, ciò significa in media che dobbiamo scegliere una direzione positiva rispetto ai campioni fuoridi batch. Ora, se stiamo per aggiornare rispetto ai campioni in un determinato batch, ciò significa che sono stati respinti da potenzialmente molti aggiornamenti batch in cui non sono stati inclusi, calcolando la loro perdita prima dell'aggiornamento, questo è quando lo stocastico i metodi hanno spinto i parametri più a favore degli altri campioni nel set di dati, dandoci in tal modo una leggera distorsione verso l'alto nella perdita attesa.
Nota che mentre asintoticamente, l'effetto di (1) scompare, (2) no! Di seguito mostro che Keras sembra fare sia (1) che (2).
(1) Dimostrando che la metrica viene calcolata in media su ciascun lotto in epoca, piuttosto che tutti contemporaneamente alla fine. Notare l'enorme differenza nella precisione nel campione rispetto a val_accuracy che favorisce val_accuracy alla primissima epoca. Questo perché alcuni errori nel campione calcolati con pochissimi aggiornamenti batch.
>>> 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) La visualizzazione dell'errore viene calcolata prima dell'aggiornamento per ciascun batch. Si noti che per l'epoca 1, quando utilizziamo batch_size = nRows
(cioè tutti i dati in un batch), l'errore nel campione è di circa 0,5 (ipotesi casuali) per l'epoca 1, ma l'errore di convalida è 0,82. Pertanto, l'errore nel campione è stato calcolato prima dell'aggiornamento batch, mentre l'errore di convalida è stato calcolato dopo l'aggiornamento batch.
>>> 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