Atualmente, os métodos baseados em gradiente estocástico são quase sempre o algoritmo de escolha para o aprendizado profundo. Isso significa que os dados são enviados em lotes, os gradientes são calculados e os parâmetros atualizados. Isso significa que você também pode calcular a perda sobre os dados à medida que cada lote é selecionado. Sob essa estrutura, há duas maneiras pelas quais a perda é calculada e que posso levar a esse fenômeno: o erro de treinamento é maior que o erro de validação. Abaixo, mostro que Keras, de fato, parece calcular os erros dentro da amostra dessa maneira.
1.) O erro de treinamento é calculado em toda a época, ao mesmo tempo no final da época, mas o erro de validação ocorre apenas no final da época. Observe que o erro de validação tem o benefício de ser totalmente atualizado, enquanto o erro de treinamento inclui cálculos de erros com menos atualizações. Obviamente, assintoticamente esse efeito geralmente deve desaparecer.
2.) O erro de treinamento é calculado antes da atualização do lote. Em um método baseado em gradiente estocástico, há algum ruído no gradiente. Enquanto se está subindo uma colina, há uma alta probabilidade de que se esteja diminuindo a perda global calculada em todas as amostras de treinamento. No entanto, quando se aproximar muito do modo, a direção da atualização será negativa em relação às amostras do lote. Mas já que estão saltando em torno de um modo, isso significa que , em média, devemos estar escolhendo uma direção que é positivo no que diz respeito às amostras forado lote. Agora, se estamos prestes a atualizar com relação às amostras de um determinado lote, isso significa que elas foram potencializadas por várias atualizações de lotes em que não foram incluídas, calculando sua perda antes da atualização, é quando o estocástico Os métodos empurraram os parâmetros mais a favor das outras amostras no seu conjunto de dados, dando-nos um pequeno viés ascendente na perda esperada.
Observe que, embora assintoticamente, o efeito de (1) desaparece, (2) não! Abaixo, mostro que Keras parece fazer ambos (1) e (2).
(1) Mostrando que as métricas são calculadas como a média de cada lote na época, em vez de todas de uma vez no final. Observe a enorme diferença na precisão da amostra versus val_accuracy favorecendo val_accuracy na primeira época. Isso ocorre porque alguns dos erros dentro da amostra são calculados com muito poucas atualizações em lote.
>>> 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) O erro de exibição é calculado antes da atualização para cada lote. Observe que, na época 1, quando usamos batch_size = nRows
(ou seja, todos os dados em um lote), o erro na amostra é de cerca de 0,5 (suposição aleatória) na época 1, mas o erro de validação é de 0,82. Portanto, o erro dentro da amostra foi calculado antes da atualização do lote, enquanto o erro de validação foi calculado após a atualização do lote.
>>> 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