Antworten:
Erste Anmerkung: Sie sollten wirklich auch durch die Standardabweichung jedes Merkmals (Pixel) dividieren. Durch Subtrahieren des Mittelwerts wird die Eingabe auf 0 zentriert, und durch Dividieren durch die Standardabweichung wird die Anzahl der Standardabweichungen, die von dem Mittelwert entfernt sind, zu einem skalierten Merkmalswert.
Um Ihre Frage zu beantworten: Überlegen Sie, wie ein neuronales Netzwerk seine Gewichte lernt. C (NN) lernen durch kontinuierliches Addieren von Gradientenfehlervektoren (multipliziert mit einer Lernrate), die aus der Rückausbreitung berechnet wurden, zu verschiedenen Gewichtsmatrizen im gesamten Netzwerk, während Trainingsbeispiele durchlaufen werden.
Das was hier auffällt ist das "multipliziert mit einer Lernrate".
Wenn wir unsere Eingabe-Trainingsvektoren nicht skalieren würden, wären die Bereiche unserer Verteilungen von Merkmalswerten wahrscheinlich für jedes Merkmal unterschiedlich, und daher würde die Lernrate in jeder Dimension Korrekturen hervorrufen, die sich (proportional) voneinander unterscheiden würden. Wir könnten eine Korrektur in einer Gewichtsdimension überkompensieren, während wir in einer anderen unterkompensieren.
Dies ist nicht ideal, da wir uns möglicherweise in einem oszillierenden (nicht in der Lage sind, ein besseres Maximum im Kosten- (Gewichts-) Raum) -Zustand oder in einem sich langsam bewegenden (zu langsamen, um ein besseres Maximum zu erreichen) Zustand befinden.
Es ist natürlich möglich, eine Lernrate pro Gewicht zu haben, aber es sind noch mehr Hyperparameter, die in ein bereits kompliziertes Netzwerk eingeführt werden müssen, um es zu finden. Im Allgemeinen sind Lernraten Skalare.
Daher versuchen wir, Bilder zu normalisieren, bevor wir sie als Eingabe in einen NN-Algorithmus (oder einen auf einem Gradienten basierenden Algorithmus) verwenden.
(image - image.mean()) / (image.std() + 1e-8)