Por que normalizar imagens subtraindo a média da imagem do conjunto de dados, em vez da média da imagem atual no aprendizado profundo?

88

Existem algumas variações de como normalizar as imagens, mas a maioria parece usar esses dois métodos:

  1. Subtraia a média por canal calculada em todas as imagens (por exemplo, VGG_ILSVRC_16_layers )
  2. Subtrair por pixel / canal calculado sobre todas as imagens (por exemplo , CNN_S , consulte também a rede de referência da Caffe )

Na minha opinião, a abordagem natural normalizaria cada imagem. Uma imagem tirada em plena luz do dia fará com que mais neurônios disparem do que uma imagem noturna e, embora possa nos informar sobre o tempo em que geralmente nos preocupamos com recursos mais interessantes presentes nas bordas, etc.

Pierre Sermanet refere em 3.3.3 que a normalização de contraste local que seria baseada em imagem, mas não encontrei isso em nenhum dos exemplos / tutoriais que vi. Também vi uma pergunta interessante do Quora e o post de Xiu-Shen Wei, mas eles não parecem apoiar as duas abordagens acima.

O que exatamente estou perdendo? Esse é um problema de normalização de cores ou existe um artigo que realmente explica por que tantos usam essa abordagem?

Max Gordon
fonte
Não sei a resposta, mas você já tentou cada um dos métodos? Existe alguma diferença nas performances?
User112758
@ user112758 - implementá-los é um pouco doloroso (especialmente para o pixel) e minha experiência é que normalizar por imagem funciona bem, mas meus dados não são tão representativos. Vou tentar experimentar a normalização, mas estou curioso para ouvir a motivação por trás desses (em minha mente) procedimentos estranhos de normalização.
Max Gordon
Ok, talvez você possa perguntar isso nas questões do caffe GitHub do Google caffe group. Eu acho que haveria mais especialistas nesse tópico.
User112758

Respostas:

58

Subtrair a média do conjunto de dados serve para "centralizar" os dados. Além disso, você idealmente gostaria de dividir pelo sttdev desse recurso ou pixel também se quiser normalizar cada valor de recurso para um z-score.

A razão pela qual fazemos essas duas coisas é que, no processo de treinamento de nossa rede, multiplicaremos (pesos) e adicionamos (preconceitos) essas entradas iniciais, a fim de causar ativações que retropropagamos com os gradientes para treinar o modelo.

Neste processo, gostaríamos que cada recurso tivesse um intervalo semelhante, para que nossos gradientes não saíssem de controle (e que apenas precisamos de um multiplicador de taxa de aprendizado global).

Outra maneira de pensar é nas redes de aprendizado profundo que tradicionalmente compartilham muitos parâmetros - se você não dimensionasse suas entradas de uma maneira que resultasse em valores de recursos de alcance semelhante (por exemplo: em todo o conjunto de dados subtraindo a média), o compartilhamento não seria isso acontece com muita facilidade, porque uma parte do peso da imagem wé muito e para outra é muito pequena.

Você verá em alguns modelos da CNN que o clareamento por imagem é usado, o que é mais parecido com o seu pensamento.

lollercoaster
fonte
4
Obrigado pela resposta. Estou familiarizado com o conceito de centralizar os dados e garantir que o intervalo seja semelhante para obter gradientes estáveis. A questão é mais sobre por que precisamos fazer isso em todo o conjunto de dados e por que isso ajudaria em contraste com o clareamento por imagem? Gostaria de uma referência simples que mostre de alguma forma que isso melhore o aprendizado antes de aceitar a resposta. Eu sei que a normalização em lote é uma técnica incrivelmente poderosa, mas não vejo a conexão com a normalização de conjunto de dados inteiro.
Max Gordon
Se você aceitar que a normalização do lote seja boa, já estará lá. O único motivo para normalizar o lote é quando você não pode ajustar o conjunto de dados completo na memória ou está distribuindo o treinamento (geralmente o mesmo problema). É por isso que temos lotes.
Lollercoaster
Eu pensei que os lotes também são a base para a descida do gradiente estocástico. Mesmo que eu pudesse colocar tudo na memória, quero atualizar os parâmetros com mais frequência do que após cada época.
Max Gordon
3
Eles são. E você pode atualizar quantas vezes quiser - as implicações analíticas são idênticas, o que é tão agradável e escalável na descida do gradiente. A razão pela qual usamos descida de gradiente estocástico (ordem de entrada aleatória + lote) é suavizar nossa subida pelo espaço do gradiente. Dado um único ponto, não podemos realmente ter certeza de que nossa atualização nos levará na direção dos máximos locais; no entanto, se você selecionar pontos suficientes, essa probabilidade se tornará maior (na expectativa).
Lollercoaster
2
Como isso ajuda a colocar os recursos em um intervalo semelhante? Se eu tiver duas imagens, uma variando de 0 a 255 e outra variando de 0 a 50 em valores de pixel, digamos com uma média de 50 e stdev de 15. A normalização fornece a imagem 1, que varia de -3,3 a 13,6, e a imagem 2, que varia de -3,3 a 0. Eles ainda não estão na mesma escala.
Daniel
9

Antes da normalização do lote, a subtração média por canal foi usada para centralizar os dados em torno da média zero para cada canal (R, G, B). Isso normalmente ajuda a rede a aprender mais rapidamente, pois os gradientes agem de maneira uniforme para cada canal. Eu suspeito que, se você usar a normalização em lote, a etapa média de pré-processamento da subtração por canal não é realmente necessária, pois você está normalizando por mini-lote de qualquer maneira.

Sid M
fonte
1
"Eu suspeito que, se você usar a normalização em lote, a etapa de pré-processamento médio por subtração por canal não é realmente necessária, pois você está normalizando por mini-lote." Mas a norma de lote se refere à normalização dos pesos nas camadas da sua rede ... e não nas imagens de entrada reais. Estas são duas coisas diferentes.
Monica Heddneck
4

A normalização por imagem é comum e é até a única função incorporada atualmente no Tensorflow (principalmente devido à sua facilidade de implementação). É usado pelo motivo exato que você mencionou (dia versus noite para a mesma imagem). No entanto, se você imaginar um cenário mais ideal onde a iluminação fosse controlada, as diferenças relativas entre cada imagem seriam de grande valor no algoritmo, e não desejaríamos acabar com isso com a normalização por imagem (e desejaríamos normalize no contexto de todo o conjunto de dados de treinamento).

JPJ
fonte
4

Isso é chamado de pré-processamento de dados antes de usá-lo. Você pode processar de várias maneiras, mas há uma condição em que você deve processar cada dado com a mesma função X_preproc = f (X) e esse f (.) Não deve depender dos próprios dados; portanto, se você usar a imagem atual, significa processar isso imagem atual, então seu f (X) será realmente f (X, imagem) e você não deseja isso.

A normalização do contraste da imagem de que você estava falando é para um propósito diferente. A normalização do contraste da imagem ajudará no recurso.

Mas f (.) Acima ajudará na otimização, mantendo todos os recursos numericamente iguais entre si (é claro, aproximadamente)

Hacklavya
fonte