Erro de validação menor que erro de treinamento?

58

Encontrei duas perguntas aqui e aqui sobre esse problema, mas ainda não há uma resposta ou explicação óbvia. Eu imponho o mesmo problema em que o erro de validação é menor que o erro de treinamento na minha Rede Neural de Convolução. O que isso significa?

Bido
fonte
Eu não acho que essa pergunta possa ser respondida sem conhecer o número absoluto de treinamento (cv) e casos de teste, bem como a variação observada para o MSE para validação cruzada e teste.
cbeleites suporta Monica
embaralhe os dados
user0
O que deduzimos disso? Sim, é gerado a partir de uma rede densa com camadas de dropout e batchnorm. ! [insira a descrição da imagem aqui ] ( i.stack.imgur.com/KX1Fz.png )
Srinath

Respostas:

70

É difícil ter certeza sem conhecer sua metodologia real (por exemplo, método de validação cruzada, métrica de desempenho, método de divisão de dados, etc.).

De um modo geral, porém, o erro de treinamento quase sempre subestima o erro de validação. No entanto, é possível que o erro de validação seja menor que o treinamento. Você pode pensar nisso de duas maneiras:

  1. Seu conjunto de treinamento teve muitos casos "difíceis" para aprender
  2. Seu conjunto de validação tinha principalmente casos "fáceis" para prever

É por isso que é importante que você realmente avalie sua metodologia de treinamento de modelo. Se você não dividir seus dados para o treinamento adequado, seus resultados levarão a conclusões confusas, se não simplesmente incorretas.

Penso na avaliação do modelo em quatro categorias diferentes:

  1. Underfitting - Erro de validação e treinamento alto

  2. Overfitting - Erro de validação alto, erro de treinamento baixo

  3. Bom ajuste - Erro de validação baixo, ligeiramente superior ao erro de treinamento

  4. Ajuste desconhecido - Erro de validação baixo, erro de treinamento 'alto'

Eu digo ajuste 'desconhecido' porque o resultado é contra-intuitivo ao funcionamento do aprendizado de máquina. A essência do ML é prever o desconhecido. Se você é melhor em prever o desconhecido do que o que “aprendeu”, AFAIK os dados entre treinamento e validação devem ser diferentes de alguma forma. Isso pode significar que você precisa reavaliar seu método de divisão de dados, adicionar mais dados ou possivelmente alterar sua métrica de desempenho (você está realmente medindo o desempenho que deseja?).

EDITAR

Abordar a referência do OP a uma pergunta anterior sobre lasanha python .

Isso sugere que você possui dados suficientes para não exigir validação cruzada e simplesmente possui subconjuntos de dados de treinamento, validação e teste. Agora, se você olhar o tutorial sobre lasanha, poderá ver que o mesmo comportamento é visto na parte superior da página. Eu achava difícil acreditar que os autores publicariam esses resultados se fosse estranho, mas em vez de apenas supor que eles estão corretos, vamos olhar mais longe. A seção de maior interesse para nós aqui está na seção de loop de treinamento , logo acima da parte inferior, você verá como os parâmetros de perda são calculados.

A perda de treinamento é calculada em todo o conjunto de dados de treinamento . Da mesma forma, a perda de validação é calculada em todo o conjunto de dados de validação . O conjunto de treinamento normalmente é pelo menos quatro vezes maior que a validação (80-20). Como o erro é calculado em todas as amostras, você pode esperar até aproximadamente 4X a medida de perda do conjunto de validação. Você notará, no entanto, que a perda de treinamento e a perda de validação estão se aproximando à medida que o treinamento continua. Isso é intencional, como se o seu erro de treinamento começasse a ficar mais baixo do que o erro de validação, você começaria a ajustar demais o seu modelo !!!

Espero que isso esclareça esses erros.

cdeterman
fonte
2
Boa resposta. Também existe a possibilidade de haver um erro no código, o que torna possível que o treinamento não tenha convergido para a solução ideal no conjunto de treinamento. Ou, se o objetivo do treinamento não for convexo e o algoritmo de treinamento convergir para um mínimo local que seja bom para o conjunto de validação.
Sobi 18/12/2015
@cdeterman thanks.I use RMSE como uma métrica de desempenho. Dividi meus dados em 20% para teste e 80% para treinamento e validação (20% dos dados de treinamento são validados cruzadamente para calcular o erro de validação). Na verdade, o erro de validação é baixo, um pouco menor que o erro de treinamento. O erro de teste é superior aos erros de treinamento e validação. Podemos encontrar um caso semelhante em MNISTdataset para reconhecimento de escrita stats.stackexchange.com/questions/178371/...
Bido
@Bido, o meu endereço de edição mais recente que você pergunta?
cdeterman
@cdeterman Obrigado. Acabei de perceber que você editou sua resposta. É claro e útil.
Bido
Ótima explicação, se você pudesse adicionar alguns gráficos - seria o melhor possível
Taras Matsyk
109

Uma possibilidade: se você estiver usando a camada de regularização de abandono na sua rede, é razoável que o erro de validação seja menor que o erro de treinamento. Como geralmente o abandono é ativado durante o treinamento, mas desativado ao avaliar no conjunto de validação. Você obtém uma função mais suave (geralmente significa melhor) neste último caso.

DK
fonte
12
Que resposta simples e sensata!
rajb245 #
4
Sim, isso deve ser marcado como resposta correta, de fato.
Simanas
2
Eu removi minha camada de abandono, mas ainda vejo a perda de validação menor do que a perda de treinamento inicialmente! (Não estou especificando qualquer regularização sobre as camadas, quer!)
Josias Yoder
Se encaixa no meu caso. Usando muita desistência.
André Christoffer Andersen
@ JosiahYoder - você tem mais alguma coisa para compartilhar sobre isso? Eu tenho 1650 recursos de entrada. Quando mantenho a interrupção da rede pequena (1650, 50, 1) ou nenhuma interrupção, o erro de treinamento nas épocas iniciais é maior que o erro de validação. Quando uso redes grandes (1650, 1200, 800, 100 ..... em torno de 10 camadas de 100 com ativação selu), o padrão estranho de maior precisão de validação é um pouco atenuado.
MiloMinderbinder
19

Não tenho pontos suficientes para comentar a resposta de @ DK, mas agora isso é respondido como uma FAQ na documentação de Keras:

"Por que a perda de treinamento é muito maior que a perda de teste?

Um modelo Keras possui dois modos: treinamento e teste. Mecanismos de regularização, como Dropout e regularização de peso L1 / L2, são desativados no momento do teste.

Além disso, a perda de treinamento é a média das perdas em cada lote de dados de treinamento. Como o modelo está mudando ao longo do tempo, a perda nos primeiros lotes de uma época geralmente é maior do que nos últimos lotes. Por outro lado, a perda de teste para uma época é calculada usando o modelo no final da época, resultando em uma perda menor ".

dter
fonte
11
Isso também não responde totalmente à pergunta. Com o abandono desativado, ainda vejo a perda de validação em cerca de metade da perda de treinamento por várias épocas consecutivas!
Josiah Yoder
Seus dados de treinamento são representativos dos dados do desenvolvedor?
dter
Dividi aleatoriamente o conjunto de dados em treinamento e teste. Visualmente, parecia ser uma boa amostra. Eu estava trabalhando em um problema de regressão em que os melhores classificadores eram apenas um pouco melhores do que sempre prever o valor médio.
21718 Josiah Yoder
Sua resposta não fala sobre a perda de treinamento ser maior que a perda de validação, que é a pergunta que foi feita. Você está mais focado na perda de treinamento e perda de teste
enjal
6

meus 2 centavos: eu também tive o mesmo problema, mesmo sem ter camadas de abandono. No meu caso - as camadas de norma de lote foram os culpados. Quando os apaguei - a perda de treinamento tornou-se semelhante à perda de validação. Provavelmente, isso ocorreu porque, durante o treinamento, a norma do lote usa a média e a variação do lote de entrada especificado, que podem ser diferentes de lote para lote. Porém, durante a avaliação, a norma de lote usa média e variação de execução, as quais refletem propriedades de todo o conjunto de treinamento muito melhores do que a média e a variação de um único lote durante o treinamento. Pelo menos, é assim que a norma de lote é implementada no pytorch

Mans007
fonte
11
Obrigado @ Mans007, isso tinha acontecido comigo e eu estava usando Keras. As camadas de norma de lote foram a causa.
Roei Bahumi 21/04
4

Outra possibilidade que combina a resposta de @cdeterman e @DK de alguma forma é se você estiver usando algum mecanismo de aumento de dados. O aumento de dados efetivos geralmente é feito apenas no conjunto de treinamento e não no conjunto de validação (como na regularização de abandono), e isso pode levar a um conjunto de validação contendo casos "mais fáceis" de prever do que aqueles no conjunto de treinamento.

se7entyse7en
fonte
2

Obtive resultados semelhantes (a perda de teste foi significativamente menor que a perda de treinamento). Depois que eu removi a regularização da evasão, ambas as perdas tornaram-se quase iguais.

Ravi
fonte
0

@cdeterman e @DK têm uma boa explicação. Eu gostaria de mais uma razão - data leakage. Alguma parte dos dados do seu trem está "intimamente relacionada" com os dados do teste.

Exemplo em potencial: imagine que você tenha 1000 cães e 1000 gatos com 500 fotos semelhantes por animal de estimação (alguns proprietários adoram tirar fotos de seus animais de estimação em posições muito semelhantes), digamos, ao fundo. Portanto, se você fizer uma divisão aleatória 70/30, obterá o vazamento de dados de trem nos dados de teste.

Danylo Zherebetskyy
fonte
0

Simplificando, se a perda de treinamento e a perda de validação forem calculadas corretamente, é impossível que a perda de treinamento seja maior que a perda de validação. Isso ocorre porque a retropropagação reduz DIRETAMENTE o erro calculado no conjunto de treinamento e apenas INDIRETAMENTE (nem mesmo garantido!) Reduz o erro calculado no conjunto de validação.

Deve haver alguns fatores adicionais diferentes durante o treinamento e a validação. O abandono é bom, mas pode haver outros. Certifique-se de verificar a documentação de qualquer biblioteca que você está usando. Modelos e camadas geralmente podem ter configurações padrão às quais normalmente não prestamos atenção.

Zhihan Yang
fonte
0

Uma validação mais baixa que o erro de treinamento pode ser causada por flutuações associadas ao abandono ou, no entanto, se persistir a longo prazo, isso pode indicar que os conjuntos de dados de treinamento e validação não foram realmente retirados dos mesmos conjuntos estatísticos. Isso pode acontecer se seus exemplos vierem de uma série e se você não randomizar adequadamente os conjuntos de dados de treinamento e validação.

jacaboul
fonte
0

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
Cliff AB
fonte