Respostas:
Primeira observação: você também deve dividir pelo desvio padrão do valor de cada recurso (pixel). Subtrair a média centraliza a entrada para 0 e dividir pelo desvio padrão faz com que qualquer valor de recurso dimensionado seja o número de desvios padrão distantes da média.
Para responder à sua pergunta: Considere como uma rede neural aprende seus pesos. C (NN) s aprendem adicionando continuamente vetores de erro de gradiente (multiplicados por uma taxa de aprendizado) calculados desde a retropropagação a várias matrizes de peso em toda a rede, à medida que exemplos de treinamento são transmitidos.
O que se deve notar aqui é o "multiplicado por uma taxa de aprendizado".
Se não escalássemos nossos vetores de treinamento de entrada, os intervalos de nossas distribuições de valores de recursos provavelmente seriam diferentes para cada recurso e, portanto, a taxa de aprendizado causaria correções em cada dimensão que difeririam (proporcionalmente) umas das outras. Podemos compensar demais uma correção em uma dimensão de peso e subcompensar em outra.
Isso não é o ideal, pois poderíamos nos encontrar em um estado oscilante (incapaz de centrar-se em um estado máximo de máximo de custo (pesos) de espaço) ou em um estado lento (viajando muito devagar para obter um máximo máximo).
É claro que é possível ter uma taxa de aprendizado por peso, mas ainda há mais parâmetros para introduzir em uma rede já complicada que também precisaríamos otimizar para encontrar. Geralmente, as taxas de aprendizado são escalares.
Assim, tentamos normalizar as imagens antes de usá-las como entrada no algoritmo NN (ou qualquer gradiente).
(image - image.mean()) / (image.std() + 1e-8)