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

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

Curva 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 boost 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?

¿Esto es 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() 

Un poco de comprensión de los significados reales (y mecánicos) de la pérdida y la precisión serán de mucha ayuda aquí (refiérase también a 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):

enter image description here

  • y[i] son las tags verdaderas (0 o 1)
  • p[i] son las predicciones (números reales en [0,1]), usualmente interpretados 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 el cálculo de precisión, implica implícitamente un umbral (normalmente a 0.5 para la clasificación binaria), de modo que si p[i] > 0.5 , 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
  • ya que 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
  • dado que todavía es p[k] < 0.5 , nuevamente tenemos una clasificación incorrecta ( output[k] = 0 ) sin contribución a la precisión

Esperemos que empiece a captar la idea, pero veamos una instantánea más posterior, donde obtenemos, digamos, p[k] = 0.49 ; entonces:

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

Como puede ver, nuestro clasificador de hecho mejoró en esta muestra particular, es decir, pasó de una pérdida de 2.3 a 1.5 a 0.71, pero esta mejora aún no se muestra 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 p[k] excede el umbral de 0.5, la pérdida continúa disminuyendo sin problemas como lo ha estado 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.

De forma similar, puede confirmar usted mismo que, una vez que nuestra p[k] ha excedido 0.5, dando una clasificación correcta (y ahora contribuyendo positivamente a la precisión), las mejoras adicionales (es decir, acercándose a 1.0 ) continúan disminuyendo. pérdida, pero no tienen más impacto en la precisión.

Argumentos similares se mantienen 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] son inferiores a 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 unir las piezas, ojalá ahora pueda convencerse de que una pérdida cada vez menor y una precisión cada vez mayor "por pasos" no solo no son incompatibles, sino que tienen perfecto sentido.


En un nivel más general: desde la perspectiva estricta de la optimización matemática, no existe lo que se llama "precisión": solo existe la pérdida; la precisión entra en la discusión solo desde una perspectiva comercial (y una lógica de negocios 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 empresarial , mientras que la pérdida es la función objective que los algoritmos de aprendizaje (optimizadores) intentan minimizar desde una perspectiva matemática . Más en general, se puede considerar la pérdida como la "traducción" del objective comercial (precisión) al dominio matemático, una traducción que es necesaria en los problemas de clasificación (en regresión, generalmente la pérdida y el objective comercial son los lo mismo, o al menos puede ser el mismo en principio, por ejemplo, el RMSE) ...

    Intereting Posts