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?
58
Respostas:
É 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:
É 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:
Underfitting - Erro de validação e treinamento alto
Overfitting - Erro de validação alto, erro de treinamento baixo
Bom ajuste - Erro de validação baixo, ligeiramente superior ao erro de treinamento
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.
fonte
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.
fonte
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 ".
fonte
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
fonte
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.
fonte
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.
fonte
@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.
fonte
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.
fonte
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.
fonte
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.
(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.fonte