No tengo claro el motivo por el que normalizamos la imagen para CNN por (image - mean_image) ¡Gracias!
No tengo claro el motivo por el que normalizamos la imagen para CNN por (image - mean_image) ¡Gracias!
Primera nota: también debería estar dividiendo entre la desviación estándar de cada valor de entidad (píxel). Restar la media centra la entrada en 0, y dividir por la desviación estándar hace que cualquier valor de entidad escalado sea el número de desviaciones estándar de la media.
Para responder a su pregunta: considere cómo una red neuronal aprende sus pesos. Los C (NN) aprenden agregando continuamente vectores de error de gradiente (multiplicados por una tasa de aprendizaje) calculados desde la retropropagación a varias matrices de peso en toda la red a medida que se pasan ejemplos de entrenamiento.
Lo que hay que notar aquí es el "multiplicado por una tasa de aprendizaje".
Si no escalamos nuestros vectores de entrenamiento de entrada, los rangos de nuestras distribuciones de valores de características probablemente serían diferentes para cada característica y, por lo tanto, la tasa de aprendizaje causaría correcciones en cada dimensión que serían diferentes (proporcionalmente hablando) entre sí. Podríamos estar sobrecompensando una corrección en una dimensión de peso mientras que sobrecompensa en otra.
Esto no es ideal, ya que podríamos encontrarnos en un estado oscilante (incapaz de centrarnos en un máximo máximo en el espacio de costos (pesos)) o en un estado de movimiento lento (viajar demasiado lento para llegar a un máximo máximo).
Por supuesto, es posible tener una tasa de aprendizaje por peso, pero aún hay más hiperparámetros para introducir en una red ya complicada que también tendríamos que optimizar para encontrar. Generalmente las tasas de aprendizaje son escalares.
Por lo tanto, tratamos de normalizar las imágenes antes de usarlas como entrada en el algoritmo NN (o cualquier gradiente basado).
(image - image.mean()) / (image.std() + 1e-8)