22 votos

¿Clasificación con etiquetas ruidosas?

Estoy intentando entrenar una red neuronal de clasificación, pero las etiquetas que tengo tienen bastante ruido (alrededor del 30% de las etiquetas son erróneas).

En efecto, la pérdida de entropía cruzada funciona, pero me preguntaba si existen alternativas más eficaces en este caso o si la pérdida de entropía cruzada es la óptima.

No estoy seguro, pero estoy pensando en "recortar" un poco la pérdida de entropía cruzada, de forma que la pérdida para un punto de datos no sea mayor que algún límite superior, ¿funcionará?

Gracias.

Actualización
Según la respuesta de Lucas, obtuve lo siguiente para las derivadas de la salida de predicción $y$ y la entrada de la función softmax $z$ . Así que supongo que esencialmente es la adición de un término de suavizado $\frac{3}{7N}$ a los derivados.
$$p_i=0.3/N+0.7y_i$$ $$l=-\sum t_i\log(p_i)$$ $$\frac{\partial l}{\partial y_i}=-t_i\frac{\partial\log(p_i)}{\partial p_i}\frac{\partial p_i}{\partial y_i}=-0.7\frac{t_i}{p_i}=-\frac{t_i}{\frac{3}{7N}+y_i}$$ $$\frac{\partial l}{\partial z_i}=0.7\sum_j\frac{t_j}{p_j}\frac{\partial y_j}{\partial z_i}=y_i\sum_jt_j\frac{y_j}{\frac{3}{7N}+y_j}-t_i\frac{y_i}{\frac{3}{7N}+y_i}$$ Derivadas para la pérdida de entropía cruzada original: $$\frac{\partial l}{\partial y_i}=-\frac{t_i}{y_i}$$ $$\frac{\partial l}{\partial z_i}=y_i-t_i$$ Por favor, hágamelo saber si me equivoco. Gracias.

Actualización
Acabo de leer un documento de Google que aplica la misma fórmula que en la respuesta de Lucas pero con diferentes interpretaciones.

En la Sección 7 Regularización de modelos mediante suavizado de etiquetas

Sin embargo, esto (la pérdida de entropía cruzada) puede causar dos problemas. En primer lugar, puede dar lugar a sobreajuste: si el modelo aprende a asignar toda la probabilidad a la etiqueta a la etiqueta "groundtruth" para cada ejemplo de entrenamiento, no se garantiza la generalizar. En segundo lugar, fomenta que las diferencias entre el y todas las demás, y esto, combinado con el gradiente gradiente limitado $l/z_k$ reduce la capacidad de la Intuitivamente, esto ocurre porque el modelo se vuelve demasiado confiado en sus predicciones.

Pero en lugar de añadir el término de suavizado a las predicciones, lo añadieron a la verdad sobre el terreno que resultó ser útil.

enter image description here

En nuestros experimentos de ImageNet con K = 1000 clases, utilizamos u(k) = 1/1000 y $\epsilon$ = 0.1. Para ILSVRC 2012, hemos hallado una mejora mejora de alrededor del 0,2% absoluto tanto para el error top-1 como para el error top-5. error.

12voto

Ludwi Puntos 188

Lo que hay que hacer aquí es cambiar el modelo, no la pérdida. Su objetivo sigue siendo clasificar correctamente tantos puntos de datos como sea posible (lo que determina la pérdida), pero sus suposiciones sobre los datos han cambiado (que están codificadas en un modelo estadístico la red neuronal en este caso).

Sea $\mathbf{p}_t$ sea un vector de probabilidades de clase producidas por la red neuronal y $\ell(y_t, \mathbf{p}_t)$ sea la pérdida de entropía cruzada para la etiqueta $y_t$ . Para tener en cuenta explícitamente la suposición de que el 30% de las etiquetas son ruido (se supone que son uniformemente aleatorias), podríamos cambiar nuestro modelo para producir

$$\mathbf{\tilde p}_t = 0.3/N + 0.7 \mathbf{p}_t$$

y optimizar

$$\sum_t \ell(y_t, 0.3/N + 0.7 \mathbf{p}_t),$$

donde $N$ es el número de clases. En realidad, esto se comportará un poco según su intuición, limitando la pérdida a ser finita.

1voto

mwl Puntos 11

Reconozco que este es un foro de estadística y la expectativa es un enfoque en las derivaciones matemáticas, pero si puede ser útil y estás usando Python, hay un paquete para la clasificación con etiquetas ruidosas llamado cleanlab : https://github.com/cgnorthcutt/cleanlab/ . (Descargo de responsabilidad: soy el autor de cleanlab)

En cleanlab Paquete Python, pip install cleanlab de la que soy autor, encuentra errores de etiquetas en conjuntos de datos y soporta la clasificación/aprendizaje con etiquetas ruidosas. Funciona con scikit-learn, PyTorch, Tensorflow, FastText, etc.

Para aprender con etiquetas ruidosas.

# Code taken from https://github.com/cgnorthcutt/cleanlab
from cleanlab.classification import LearningWithNoisyLabels
from sklearn.linear_model import LogisticRegression

# Learning with noisy labels in 3 lines of code.

# Wrap around any classifier. Works with sklearn/pyTorch/Tensorflow/FastText/etc.
lnl = LearningWithNoisyLabels(clf=LogisticRegression())
lnl.fit(X = X_train_data, s = train_noisy_labels)
# Estimate the predictions you would have gotten by training with *no* label errors.
predicted_test_labels = lnl.predict(X_test)

Para encontrar errores de etiquetado en su conjunto de datos.

from cleanlab.latent_estimation import estimate_cv_predicted_probabilities

# Find the indices of label errors in 2 lines of code.

probabilities = estimate_cv_predicted_probabilities(
    X_train_data, 
    train_noisy_labels, 
    clf=LogisticRegression(),
)
label_error_indices = get_noise_indices(
    s = train_noisy_labels, 
    psx = probabilities, 
)

Algunos ejemplos con FastText (PNL) y PyTorch (MNIST AlexNet).

Documentación: https://l7.curtisnorthcutt.com/cleanlab-python-package

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