machine-learning neural-network keras classification loss

machine learning - Pérdida y precisión: ¿son estas curvas de aprendizaje razonables?



machine-learning neural-network (1)

Estoy aprendiendo redes neuronales y construí una simple en Keras para la clasificación del conjunto de datos de iris del repositorio de aprendizaje automático UCI. Usé una red de una capa oculta con 8 nodos ocultos. El optimizador Adam se usa con una tasa de aprendizaje de 0.0005 y se ejecuta durante 200 épocas. Softmax se utiliza en la salida con pérdida como crossentropía catódica. Estoy obteniendo las siguientes curvas de aprendizaje.

Como puede ver, la curva de aprendizaje para la precisión tiene muchas regiones planas y no entiendo por qué. El error parece estar disminuyendo constantemente, pero la precisión no parece estar aumentando de la misma manera. ¿Qué implican las regiones planas en la curva de aprendizaje de precisión? ¿Por qué la precisión no aumenta en esas regiones a pesar de que el error parece estar disminuyendo?

¿Es esto normal en el entrenamiento o es más probable que esté haciendo algo mal aquí?

dataframe = pd.read_csv("iris.csv", header=None) dataset = dataframe.values X = dataset[:,0:4].astype(float) y = dataset[:,4] scalar = StandardScaler() X = scalar.fit_transform(X) label_encoder = LabelEncoder() y = label_encoder.fit_transform(y) encoder = OneHotEncoder() y = encoder.fit_transform(y.reshape(-1,1)).toarray() # create model model = Sequential() model.add(Dense(8, input_dim=4, activation=''relu'')) model.add(Dense(3, activation=''softmax'')) # Compile model adam = optimizers.Adam(lr=0.0005, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0) model.compile(loss=''categorical_crossentropy'', optimizer=adam, metrics=[''accuracy'']) # Fit the model log = model.fit(X, y, epochs=200, batch_size=5, validation_split=0.2) fig = plt.figure() fig.suptitle("Adam, lr=0.0006, one hidden layer") ax = fig.add_subplot(1,2,1) ax.set_title(''Cost'') ax.plot(log.history[''loss''], label=''Training'') ax.plot(log.history[''val_loss''], label=''Validation'') ax.legend() ax = fig.add_subplot(1,2,2) ax.set_title(''Accuracy'') ax.plot(log.history[''acc''], label=''Training'') ax.plot(log.history[''val_acc''], label=''Validation'') ax.legend() fig.show()


Una pequeña comprensión de los significados reales (y la mecánica) de pérdida y precisión será de mucha ayuda aquí (consulte también esta respuesta mía, aunque reutilizaré algunas partes) ...

En aras de la simplicidad, limitaré la discusión al caso de la clasificación binaria, pero la idea es generalmente aplicable; Aquí está la ecuación de la pérdida (logística):

  • y[i] son las etiquetas verdaderas (0 o 1)
  • p[i] son las predicciones (números reales en [0,1]), generalmente interpretadas como probabilidades
  • output[i] (no se muestra en la ecuación) es el redondeo de p[i] , para convertirlos también a 0 o 1; es esta cantidad la que ingresa al cálculo de precisión, implícitamente implica un umbral (normalmente en 0.5 para la clasificación binaria), de modo que si p[i] > 0.5 , entonces la output[i] = 1 , de lo contrario si p[i] <= 0.5 , output[i] = 0 .

Ahora, supongamos que tenemos una etiqueta verdadera y[k] = 1 , para la cual, en un punto temprano durante el entrenamiento, hacemos una predicción bastante pobre de p[k] = 0.1 ; luego, conectando los números a la ecuación de pérdida anterior:

  • La contribución de esta muestra a la pérdida es la loss[k] = -log(0.1) = 2.3
  • como p[k] < 0.5 , tendremos output[k] = 0 , por lo tanto, su contribución a la precisión será 0 (clasificación incorrecta)

Supongamos ahora que, en el siguiente paso de entrenamiento, estamos mejorando y obtenemos p[k] = 0.22 ; ahora tenemos:

  • loss[k] = -log(0.22) = 1.51
  • como todavía es p[k] < 0.5 , nuevamente tenemos una clasificación incorrecta ( output[k] = 0 ) con cero contribución a la precisión

Esperemos que comience a tener la idea, pero veamos una instantánea más tarde, donde obtenemos, por ejemplo, p[k] = 0.49 ; entonces:

  • loss[k] = -log(0.49) = 0.71
  • todavía output[k] = 0 , es decir, clasificación incorrecta con cero contribución a la precisión

Como puede ver, nuestro clasificador realmente mejoró en esta muestra en particular, es decir, pasó de una pérdida de 2.3 a 1.5 a 0.71, pero esta mejora aún no se ha mostrado en la precisión, que solo se preocupa por las clasificaciones correctas : desde una precisión punto de vista, no importa que obtengamos mejores estimaciones para nuestra p[k] , siempre y cuando estas estimaciones permanezcan por debajo del umbral de 0,5.

En el momento en que nuestra p[k] excede el umbral de 0.5, la pérdida continúa disminuyendo suavemente como lo ha sido hasta ahora, pero ahora tenemos un salto en la contribución de precisión de esta muestra de 0 a 1/n , donde n es el Número total de muestras.

Del mismo modo, puede confirmar por sí mismo que, una vez que nuestra p[k] ha excedido 0.5, por lo tanto, da una clasificación correcta (y ahora contribuye positivamente a la precisión), las mejoras adicionales (es decir, acercarse a 1.0 ) siguen disminuyendo pérdida, pero no tienen más impacto en la precisión.

Argumentos similares son válidos para casos donde la etiqueta verdadera y[m] = 0 y las estimaciones correspondientes para p[m] comienzan en algún lugar por encima del umbral de 0.5; e incluso si las estimaciones iniciales de p[m] están por debajo de 0.5 (por lo tanto, proporcionan clasificaciones correctas y ya contribuyen positivamente a la precisión), su convergencia hacia 0.0 disminuirá la pérdida sin mejorar aún más la precisión.

Al juntar las piezas, es de esperar que ahora pueda convencerse de que una pérdida que disminuye suavemente y una precisión cada vez más "gradual" no solo no son incompatibles, sino que tienen mucho sentido.

En un nivel más general: desde la perspectiva estricta de la optimización matemática, no existe tal cosa como "precisión", solo existe la pérdida; la precisión entra en la discusión solo desde una perspectiva comercial (y una lógica comercial diferente podría incluso requerir un umbral diferente al predeterminado 0.5). Citando de mi propia respuesta vinculada :

La pérdida y la precisión son cosas diferentes; en términos generales, la precisión es lo que realmente nos interesa desde una perspectiva comercial , mientras que la pérdida es la función objetivo que los algoritmos de aprendizaje (optimizadores) están tratando de minimizar desde una perspectiva matemática . Aún más groseramente hablando, puede pensar en la pérdida como la "traducción" del objetivo comercial (precisión) al dominio matemático, una traducción que es necesaria en los problemas de clasificación (en los de regresión, generalmente la pérdida y el objetivo comercial son el igual, o al menos puede ser el mismo en principio, por ejemplo, el RMSE) ...