Redes neuronales: ¿qué función de costo usar?


49

Estoy usando TensorFlow para experimentos principalmente con redes neuronales. Aunque he realizado bastantes experimentos (XOR-Problema, MNIST, algunas cosas de Regresión, ...) ahora, me cuesta elegir la función de costo "correcta" para problemas específicos porque en general podría ser considerado un principiante.

Antes de venir a TensorFlow, codifiqué algunos MLP completamente conectados y algunas redes recurrentes por mi cuenta con Python y NumPy, pero sobre todo tuve problemas en los que un simple error al cuadrado y un gradiente simple eran suficientes.

Sin embargo, dado que TensorFlow ofrece una gran cantidad de funciones de costo en sí, así como la construcción de funciones de costo personalizadas, me gustaría saber si existe algún tipo de tutorial, ¿tal vez específicamente para funciones de costo en redes neuronales? (Ya he hecho la mitad de los tutoriales oficiales de TensorFlow, pero en realidad no explican por qué las funciones de costo específicas o los alumnos se usan para problemas específicos, al menos no para principiantes)

Para dar algunos ejemplos:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

Supongo que aplica la función softmax en ambas entradas para que la suma de un vector sea igual a 1. Pero, ¿qué es exactamente la entropía cruzada con logits? Pensé que resume los valores y calcula la entropía cruzada ... ¿alguna medida métrica? ¿No sería esto lo mismo si normalizo el resultado, lo sumo y tomo el error al cuadrado? Además, ¿por qué se usa esto, por ejemplo, para MNIST (o incluso para problemas mucho más difíciles)? Cuando quiero clasificar como 10 o tal vez incluso 1000 clases, ¿resumir los valores no destruye por completo ninguna información sobre qué clase fue realmente la salida?

cost = tf.nn.l2_loss(vector)

¿Para qué es esto? Pensé que la pérdida de l2 es prácticamente el error al cuadrado, pero la API de TensorFlow dice que su entrada es solo un tensor. ¿No se te ocurre la idea?

Además, vi esto para la entropía cruzada con bastante frecuencia:

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

... pero ¿por qué se usa esto? ¿No es matemáticamente la pérdida en la entropía cruzada esto:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

¿Dónde está la (1 - y_train) * log(1 - y_output)parte en la mayoría de los ejemplos de TensorFlow? ¿No le falta?


Respuestas: Sé que esta pregunta es bastante abierta, pero no espero obtener como 10 páginas con cada función problema / costo enumerada en detalle. Solo necesito un breve resumen sobre cuándo usar qué función de costo (en general o en TensorFlow, no me importa mucho) y alguna explicación sobre este tema. Y / o alguna fuente (s) para principiantes;)


1
Buena pregunta. Bienvenido al sitio :)
Dawny33

2
Por lo general, MSE se toma para regresión y Cross-Entropy para clasificación. Hampshire y Waibel introdujeron la Figura de Clasificación del Mérito (CFM) en "Una nueva función objetivo para mejorar el reconocimiento de fonemas utilizando redes neuronales de retardo de tiempo". Si lo recuerdo correctamente, también explican por qué diseñaron CFM como lo hicieron.
Martin Thoma

1
Creo que reduce_sum (y_train * tf.log (y_output)) se usa mucho porque es un ejemplo bastante común de "caso simple". Se ejecutará sumando el error de cada lote, lo que significa que su error es el doble del costo (y la magnitud del gradiente) si su lote de tamaños se duplica. Hacer el simple cambio a reduce_mean al menos hará que la depuración y jugar con configuraciones sea más comprensible en mi opinión.
neurona

Respuestas:


34

Esta respuesta está en el lado general de las funciones de costo, no está relacionada con TensorFlow, y abordará principalmente la parte de "alguna explicación sobre este tema" de su pregunta.

En la mayoría de los ejemplos / tutoriales que seguí, la función de costo utilizada fue algo arbitraria. El punto era más introducir al lector a un método específico, no a la función de costos específicamente. No debería detenerte seguir el tutorial para familiarizarte con las herramientas, pero mi respuesta debería ayudarte a elegir la función de costo para tus propios problemas.

Si desea respuestas sobre Cross-Entropy, Logit, normas L2, o cualquier cosa específica, le aconsejo que publique múltiples preguntas más específicas. Esto aumentará la probabilidad de que alguien con conocimiento específico vea tu pregunta.


Elegir la función de costo correcta para lograr el resultado deseado es un punto crítico de los problemas de aprendizaje automático. El enfoque básico, si no sabe exactamente lo que quiere de su método, es utilizar el error cuadrático medio (Wikipedia) para los problemas de regresión y el porcentaje de error para los problemas de clasificación. Sin embargo, si desea obtener buenos resultados de su método, debe definir buenos y, por lo tanto, definir la función de costo adecuada. Esto proviene tanto del conocimiento del dominio (cuáles son sus datos, qué está tratando de lograr) como del conocimiento de las herramientas a su disposición.

No creo que pueda guiarlo a través de las funciones de costo ya implementadas en TensorFlow, ya que tengo muy poco conocimiento de la herramienta, pero puedo darle un ejemplo sobre cómo escribir y evaluar diferentes funciones de costo.


Para ilustrar las diversas diferencias entre las funciones de costo, usemos el ejemplo del problema de clasificación binaria, donde queremos, para cada muestra , la clase .xnf(xn){0,1}

Comenzando con propiedades computacionales ; cómo dos funciones que miden la "misma cosa" podrían conducir a resultados diferentes. Tome la siguiente función de costo simple; El porcentaje de error. Si tiene muestras, es la clase pronosticada y la clase verdadera, desea minimizarNf(yn)yn

  • 1Nn{1 if f(xn)yn0 otherwise=nyn[1f(xn)]+[1yn]f(xn) .

Esta función de costo tiene el beneficio de ser fácilmente interpretable. Sin embargo, no es suave; si solo tiene dos muestras, la función "salta" de 0, a 0.5, a 1. Esto generará inconsistencias si intenta usar el descenso de gradiente en esta función. Una forma de evitarlo es cambiar la función de costo para usar las probabilidades de asignación; . La función se conviertep(yn=1|xn)

  • 1Nnynp(yn=0|xn)+(1yn)p(yn=1|xn) .

Esta función es más suave y funcionará mejor con un enfoque de descenso de gradiente. Obtendrá un modelo 'más fino'. Sin embargo, tiene otro problema; Si tiene una muestra que es ambigua, supongamos que no tiene suficiente información para decir algo mejor que . Luego, el uso del descenso de gradiente en esta función de costo conducirá a un modelo que aumenta esta probabilidad tanto como sea posible y, por lo tanto, tal vez, sobreajuste.p(yn=1|xn)=0.5

Otro problema de esta función es que si mientras , está seguro de que tiene razón, pero está equivocado. Para evitar este problema, puede tomar el registro de la probabilidad, . Como y , la siguiente función no tiene el problema descrito en el párrafo anterior:p(yn=1|xn)=1yn=0logp(yn|xn)log(0)=log(1)=0

  • 1Nnynlogp(yn=0|xn)+(1yn)logp(yn=1|xn) .

Esto debería ilustrar que, para optimizar lo mismo , el porcentaje de error, las diferentes definiciones pueden producir resultados diferentes si son más fáciles de entender, computacionalmente.

Es posible que las funciones de costos y para medir el mismo concepto , pero podría dar lugar a su método de mejores resultados que .ABA BAB


Ahora veamos cómo funcionan los diferentes costos pueden medir diferentes conceptos. En el contexto de la recuperación de información, como en la búsqueda de Google (si ignoramos la clasificación), queremos que los resultados devueltos

Tenga en cuenta que si su algoritmo devuelve todo , devolverá todos los resultados relevantes posibles y, por lo tanto, tendrá una alta recuperación, pero tendrá una precisión muy baja. Por otro lado, si devuelve solo un elemento, el que es más seguro es relevante, tendrá alta precisión pero baja recuperación.

Para juzgar tales algoritmos, la función de costo común es el puntaje (Wikipedia) . El caso común es el F_1, que otorga el mismo peso a la precisión y la recuperación, pero el caso general es el puntaje , y puede ajustar para obtenerFF1Fββ

  • Mayor recuerdo, si usaβ>1
  • Mayor precisión, si usa .β<1

En tal escenario, elegir la función de costo es elegir qué compensación debe hacer su algoritmo .

Otro ejemplo que a menudo se menciona es el caso del diagnóstico médico, puede elegir una función de costo que castigue más falsos negativos o falsos positivos dependiendo de lo que sea preferible:

  • Más personas sanas se clasifican como enfermas (pero entonces, podríamos tratar a personas sanas, lo que es costoso y podría lastimarlas si en realidad no están enfermas)
  • Más personas enfermas se clasifican como saludables (pero luego, podrían morir sin tratamiento)

En conclusión, definir la función de costo es definir el objetivo de su algoritmo. El algoritmo define cómo llegar allí.


Nota al margen: Algunas funciones de costo tienen buenas formas de algoritmo para alcanzar sus objetivos. Por ejemplo, existe una buena manera de minimizar la pérdida de Bisagra (Wikipedia) , resolviendo el problema dual en SVM (Wikipedia)


10

Para responder a su pregunta sobre la entropía cruzada, notará que ambos de lo que ha mencionado son lo mismo.

-1norte(y_ _trunayonorteIniciar sesión(y_ _otutpagstut)+(1-y_ _trunayonorte)Iniciar sesión(1-y_ _otutpagstut))

que mencionó es simplemente la pérdida de entropía cruzada binaria en la que supone que es un escalar 0/1 y que es nuevamente un escalar que indica la probabilidad de que la salida sea 1.y_ _trunayonortey_ _otutpagstut

La otra ecuación que mencionó es una variante más genérica de la que se extiende a múltiples clases.

-tf.reduce_sum(y_train * tf.log(y_output)) es lo mismo que escribir

-nortetrunayonorte_ _pagsrosiIniciar sesión(otut_ _pagsrosi)

donde la suma es sobre las clases múltiples y las probabilidades son para cada clase. Claramente en el caso binario es exactamente lo mismo que se mencionó anteriormente. El término se omite ya que no contribuye de ninguna manera a la minimización de pérdidas, ya que es una constante.norte


4

BLUF: prueba y error iterativa con subconjunto de datos y matplotlib.

Respuesta larga:

Mi equipo estaba luchando con esta misma pregunta no hace mucho tiempo. Todas las respuestas aquí son geniales, pero quería compartir con ustedes mi "respuesta de principiante" para el contexto y como punto de partida para las personas que son nuevas en el aprendizaje automático.

Desea apuntar a una función de costo que sea suave y convexa para su elección específica de algoritmo y conjunto de datos. Esto se debe a que desea que su algoritmo pueda ajustar los pesos de manera confiable y eficiente para eventualmente alcanzar el mínimo global de esa función de costo. Si su función de costo es "desigual" con máximos y mínimos locales, y / o no tiene un mínimo global, entonces su algoritmo podría tener dificultades para converger; sus pesos podrían saltar por todo el lugar, en última instancia, fallar en darle predicciones precisas y / o consistentes.

Por ejemplo, si está utilizando una regresión lineal para predecir el peso de alguien (número real, en libras) en función de su altura (número real, en pulgadas) y edad (número real, en años), entonces la función de costo de error cuadrático medio debería ser Una curva agradable, suave y convexa. Su algoritmo no tendrá problemas para converger.

Pero supongamos que está utilizando un algoritmo de regresión logística para un problema de clasificación binaria, como predecir el género de una persona en función de si la persona ha comprado pañales en los últimos 30 días y si la persona ha comprado cerveza en los últimos 30 días. En este caso, el error cuadrático medio podría no darle una superficie convexa lisa, lo que podría ser malo para el entrenamiento. Y lo dirías por experimentación.

Puede comenzar ejecutando una prueba con MSE y una muestra pequeña y simple de sus datos o con datos simulados que generó para este experimento. Visualice lo que está sucediendo con matplotlib (o cualquier solución de trazado que prefiera). ¿La curva de error resultante es suave y convexa? Intente nuevamente con una variable de entrada adicional ... ¿la superficie resultante sigue siendo lisa y convexa? A través de este experimento, puede descubrir que si bien MSE no se ajusta a su problema / solución, la entropía cruzada le brinda una forma convexa suave que se adapta mejor a sus necesidades. Por lo tanto, podría probarlo con un conjunto de datos de muestra más grande y ver si la hipótesis aún se cumple. Y si lo hace, puede probarlo con su conjunto de entrenamiento completo varias veces y ver cómo funciona y si ofrece consistentemente modelos similares. Si no es así, elija otra función de costo y repita el proceso.

Este tipo de proceso de prueba y error altamente iterativo ha funcionado bastante bien para mí y para mi equipo de científicos de datos principiantes, y nos permite centrarnos en encontrar soluciones a nuestras preguntas sin tener que profundizar en la teoría matemática detrás de la selección de funciones de costos y Optimización del modelo.

Por supuesto, muchas de estas pruebas y errores ya han sido realizadas por otras personas, por lo que también aprovechamos el conocimiento público para ayudarnos a filtrar nuestras elecciones de lo que podrían ser buenas funciones de costos al principio del proceso. Por ejemplo, la entropía cruzada es generalmente una buena opción para problemas de clasificación, ya sea una clasificación binaria con regresión logística como el ejemplo anterior o una clasificación de etiquetas múltiples más complicada con una capa softmax como salida. Mientras que MSE es una buena primera opción para problemas de regresión lineal en los que busca una predicción escalar en lugar de la probabilidad de pertenecer a una categoría conocida de un conjunto conocido de categorías posibles, en cuyo caso, en lugar de una capa softmax como su salida, usted ' d podría tener una suma ponderada de las entradas más sesgo sin una función de activación.

Espero que esta respuesta ayude a otros principiantes sin ser demasiado simplista y obvio.


3

Regrabando tu pregunta

¿Dónde está la parte (1 - y_train) * log (1 - y_output) en la mayoría de los ejemplos de TensorFlow? ¿No le falta?

La respuesta es que la mayoría de las funciones de salida son softmax. Eso significa que no necesariamente necesita reducir todas las probabilidades en casos incorrectos, ya que se reducirán automáticamente cuando aumente la probabilidad de la correcta

Por ejemplo:

antes de la optimización

y_output = [0.2, 0.2, 0.6] y y_train = [0, 0, 1]

después de la optimización

y_output = [0.15, 0.15, 0.7] y y_train = [0, 0, 1]

Aquí observamos que aunque acabamos de aumentar el tercer término, todos los demás términos se redujeron automáticamente

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.