Risposte:
Prima nota: dovresti davvero dividere anche per la deviazione standard di ogni valore di funzione (pixel). Sottrarre la media centra l'input su 0 e dividendo per la deviazione standard si fa in modo che qualsiasi valore in scala riduca il numero di deviazioni standard alla media.
Per rispondere alla tua domanda: considera come una rete neurale apprende i suoi pesi. I C (NN) apprendono aggiungendo continuamente vettori di errore del gradiente (moltiplicati per una velocità di apprendimento) calcolati dalla backpropagation a varie matrici di peso in tutta la rete man mano che vengono passati esempi di allenamento.
La cosa da notare qui è il "moltiplicato per un tasso di apprendimento".
Se non ridimensionassimo i nostri vettori di formazione di input, gli intervalli delle nostre distribuzioni di valori di funzionalità sarebbero probabilmente diversi per ciascuna funzionalità, e quindi il tasso di apprendimento causerebbe correzioni in ogni dimensione che differirebbero (in termini proporzionali) l'una dall'altra. Potremmo compensare eccessivamente una correzione in una dimensione di peso mentre compensiamo in un'altra.
Questo non è l'ideale in quanto potremmo trovarci in uno stato oscillante (incapace di centrare su un massimo dei massimi nello spazio di costo (pesi)) o in uno stato a movimento lento (viaggiando troppo lentamente per arrivare a un massimo migliore).
È ovviamente possibile avere un tasso di apprendimento per peso, ma è ancora più iperparametro introdurre in una rete già complicata che dovremmo anche ottimizzare per trovare. In genere i tassi di apprendimento sono scalari.
Quindi proviamo a normalizzare le immagini prima di usarle come input nell'algoritmo NN (o qualsiasi gradiente basato).
(image - image.mean()) / (image.std() + 1e-8)