4 votos

NNs: Sigmoide múltiple + Entropía cruzada binaria dando mejores resultados que Softmax + Entropía cruzada categórica.

Estoy experimentando con la clasificación de documentos en una (y sólo una) de las 20 clases (20_newsgroups dataset) usando Keras.

Estoy utilizando características estándar TF-IDF y .2 división de validación para este ajuste.

Es una tarea de clasificación de 20 vías, así que pensé que era mejor ir con un softmax en la salida y un 'categorical_crossentropy' función de pérdida, lo que me da 85% de precisión de validación :

inputs = Input(shape=(19860,))

x = Dense(64,activation='relu')(inputs)
x = Dropout(0.5)(x)
x = Dense(64,activation='sigmoid')(x)
x = Dropout(0.5)(x)
preds = Dense(20,activation='softmax')(x)

model = Model(inputs=inputs,outputs=preds)
model.compile(loss='categorical_crossentropy',
             optimizer='adam',
             metrics=['acc'])
model.fit(X_train,Y_train, validation_data=(X_val, Y_val),
     epochs=10, batch_size=32)

Resultados (tras 10 épocas) pérdida: 0.4056 - acc: 0.8792 - val_loss: 0.4842 - val_acc: 0.8542

La cosa es que mejores resultados si entreno el mismo modelo utilizando 20 unidades sigmoides individuales en la capa de salida y un 'binary_crossentropy' ¡función de pérdida! Me da la friolera de Precisión de validación del 99 :

inputs = Input(shape=(19860,))

x = Dense(64,activation='relu')(inputs)
x = Dropout(0.5)(x)
x = Dense(64,activation='sigmoid')(x)
x = Dropout(0.5)(x)
preds = Dense(20,activation='sigmoid')(x)

model = Model(inputs=inputs,outputs=preds)
model.compile(loss='binary_crossentropy',
             optimizer='adam',
             metrics=['acc'])
model.fit(X_train,Y_train, validation_data=(X_val, Y_val),
     epochs=10, batch_size=32)

Resultados (tras 10 épocas) pérdida: 0.0510 - acc: 0.9819 - val_loss: 0.0443 - val_acc: 0.9851

Si lo he entendido bien, la configuración sigmoidea múltiple presupone la independencia de las etiquetas, lo que evidentemente no es el caso, ya que sólo puede haber una etiqueta para cada documento.

Entonces, ¿cómo puedo obtener mejores resultados utilizando unidades de salida sigmoidales individuales e independientes en lugar de una única unidad de salida softmax?

¿Podría alguien darme alguna intuición sobre lo que puede estar pasando aquí?

5voto

user184754 Puntos 11

Para su problema, la buena métrica es la categorical_accuracy . Lo que ocurre es que cuando se establece que la pérdida sea binary_crossentropy y métricas para accuracy entonces keras asume que la métrica buena es binary_accuracy lo que es simplemente erróneo cuando hay más de 2 etiquetas.

Lo que hay que hacer es especificar explícitamente que la métrica es categorical_accuracy así:

from keras.metrics import categorical_accuracy
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[categorical_accuracy])

ver los detalles en esta respuesta: https://stackoverflow.com/a/46038271/6338493

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X