Pregunta

estoy usando Flujo tensor para experimentos principalmente con redes neuronales. Aunque he realizado algunos experimentos (Xor Problem, 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 considerarse un principiante.

Antes de llegar a TensorFlow codifiqué algunos MLP totalmente conectados y algunas redes recurrentes por mi cuenta con Pitón y Numpy Pero sobre todo tuve problemas en los que un simple error al cuadrado y un simple descenso de gradiente era suficiente.

Sin embargo, dado que TensorFlow ofrece muchas funciones de costos en sí, así como construir funciones de costos personalizadas, me gustaría saber si hay algún tipo de tutorial, ¿tal vez específicamente para las funciones de costos en las redes neuronales? (Ya he hecho como la mitad de los tutoriales oficiales de TensorFlow, pero en realidad no están explicando por qué Las funciones de costo específicas o los alumnos se utilizan 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 con los logits? Pensé que resume los valores y calcula la entropía cruzada ... ¿entonces alguna medición métrica? ¿No sería esto lo mismo si normalizo la salida, resumiría y tome el error al cuadrado? Además, ¿por qué se usa esto, por ejemplo, MNIST (o incluso problemas mucho más difíciles)? Cuando quiero clasificar como 10 o tal vez incluso 1000 clases, no resume los valores completamente destruyendo ninguna información sobre cual ¿La clase realmente fue la salida?

cost = tf.nn.l2_loss(vector)

¿Para qué es esto? Pensé que la pérdida de L2 es más o menos el error al cuadrado, pero la API de Tensorflow dice que su entrada es solo un tensor. ¿No tiene la idea en absoluto?

Además vi esto para entropía Muy a menudo:

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

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

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

Dónde está el (1 - y_train) * log(1 - y_output) ¿Parte en la mayoría de los ejemplos de flujo de tensor? ¿No está faltando?


Respuestas: Sé que esta pregunta es bastante abierta, pero no espero obtener como 10 páginas con cada función de problema/costo 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 (s) fuente (s) para principiantes;)

¿Fue útil?

Solución

Esta respuesta está en el general Las funciones del lado del costo, no relacionadas 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 era algo arbitraria. El punto era más para presentar al lector un método específico, no a la función de costo específicamente. No debería evitar que siga el tutorial para estar familiarizado con las herramientas, pero mi respuesta debería ayudarlo a elegir la función de costo para sus propios problemas.

Si desea respuestas sobre la entropía cruzada, logit, las 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 su pregunta.


Elegir la función de costo correcta para lograr el resultado deseado es un punto crítico de problemas de aprendizaje automático. El enfoque básico, si no sabe exactamente lo que desea de su método, es usar Error cuadrado medio (Wikipedia) Para problemas de regresión y porcentaje de error para problemas de clasificación. Sin embargo, si quieres bueno resultados fuera de su método, debe Defina bien, y así definir la función de costo adecuada. Esto proviene de ambos conocimientos de dominio (cuáles son sus datos, qué está tratando de lograr) y el conocimiento de las herramientas a su disposición.

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


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

Empezando con propiedades computacionales; Cómo dos funciones que miden lo "mismo" podrían conducir a diferentes resultados. Tome la siguiente función de costo simple; El porcentaje de error. Si usted tiene $ N $ muestras, $ f (y_n) $ es la clase predicha y $ y_n $ la clase verdadera, quieres minimizar

  • $ frac {1} {n} sum_n left { begin {array} {ll} 1 & text {if} f (x_n) not = y_n 0 & text {de lo contrario} End {Array} Right. = sum_n y_n [1-f (x_n)] + [1-y_n] f (x_n) $.

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 conducirá a inconsistencias si intenta usar descenso de gradiente en esta función. Una forma de evitarlo es cambiar la función de costo para usar probabilidades de asignación; $ P (y_n = 1 | x_n) $. La función se convierte en

  • $ frac {1} {n} sum_n y_n p (y_n = 0 | x_n) + (1 - y_n) p (y_n = 1 | x_n) $.

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, digamos que no tiene suficiente información para decir nada mejor que $ P (y_n = 1 | x_n) = 0.5 $. Luego, el uso de 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, se sobrepeta.

Otro problema de esta función es que si $ P (y_n = 1 | x_n) = 1 $ tiempo $ y_n = 0 $, seguramente tendrás razón, pero estás equivocado. Para evitar este problema, puede tomar el registro de la probabilidad, $ log p (y_n | x_n) $. Como $ log (0) = Infty $ y $ log (1) = 0 $, la siguiente función no tiene el problema descrito en el párrafo anterior:

  • $ frac {1} {n} sum_n y_n log p (y_n = 0 | x_n) + (1 - y_n) log p (y_n = 1 | x_n) $.

Esto debería ilustrar eso para optimizar el la misma cosa, el porcentaje de error, diferentes definiciones podrían producir resultados diferentes si son más fáciles de dar sentido computacionalmente.

Es posible para las funciones de costos $ A $ y $ B $ para medir el mismo concepto, pero $ A $ podría llevar su método a mejores resultados que $ B $.


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

  • tener alto precisión, no devolver información irrelevante
  • tener alto recuerdo, devuelva la mayor cantidad de resultados relevantes como sea posible
  • Precisión y retiro (Wikipedia)

Tenga en cuenta que si su algoritmo regresa todo, devolverá todos los resultados relevantes posibles y, por lo tanto, tendrá un alto retiro, pero tendrá muy poca precisión. Por otro lado, si solo regresa una Elemento, el que es el 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 la $ F $-Seje (Wikipedia). El caso común es el $ F_1 $-spore, que da el mismo peso a la precisión y el recuerdo, pero el caso general es el $ F_ beta $-Score, y puedes ajustar $ beta $ Llegar

  • Recuerdo más alto, si usa $ beta> 1 $
  • Mayor precisión, si usa $ beta <1 $.

En tal escenario, Elegir la función de costo es elegir qué compensación debería hacer su algoritmo.

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

  • Las personas más sanas que se clasifican como enfermas (pero entonces, podríamos tratar a las personas sanas, lo cual es costoso y podría lastimarlos si en realidad no están enfermos)
  • Más personas enfermas son clasificadas como saludables (pero entonces, 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 costos tienen buenas formas de algoritmo de alcanzar sus objetivos. Por ejemplo, una buena manera del mínimo de la Pérdida de bisagra (Wikipedia) existe, resolviendo el doble problema en SVM (Wikipedia)

Otros consejos

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

$ - frac {1} {n} sum (y _train * log (y _output) + (1 - y _train) cdot log (1 - y _output)) $

que mencionó es simplemente la pérdida binaria de entropía cruzada donde supone que $ y _train $ es un escalar 0/1 y que $ y _Output $ es nuevamente un escalar que indica la probabilidad de que la salida sea 1.

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

$- sum_n Train _prob cdot log (out _prob) $

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

BLUF: prueba y error iterativo 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 para principiantes" 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 con confianza y eficientemente los pesos para que eventualmente alcance el mínimo global de esa función de costo. Si su función de costo es "llena de baches" con los MAX y MIN locales, y/o no tiene un mínimo global, entonces su algoritmo podría tener dificultades para converger; Sus pesos pueden saltar por todo el lugar, en última instancia, por no 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 media del costo de error al cuadrado debe ser Una curva agradable, suave y convexa. Su algoritmo no tendrá problemas para converger.

Pero digamos, en su lugar, 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 medio cuadrado podría no darle una superficie convexa suave, lo que podría ser malo para el entrenamiento. Y lo dirías por experimentación.

Puede comenzar ejecutando una prueba con el uso de 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 encontrar que, si bien MSE no se ajusta a su problema/solución, la entropía cruzada le brinda una forma convexa suave que se adapte mejor a sus necesidades. Por lo tanto, podría intentarlo con un conjunto de datos de muestra más grande y ver si la hipótesis aún se mantiene. Y si lo hace, entonces puede probarlo con su conjunto de entrenamiento completo varias veces y ver cómo funciona y si ofrece constantemente 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 sumergir profundamente en la teoría matemática detrás de la selección de funciones de costos y Optimización del modelo.

Por supuesto, otras personas ya han realizado gran parte de esta prueba y error, 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 los problemas de clasificación, ya sea la clasificación binaria con regresión logística como el ejemplo anterior o una clasificación múltiple más complicada con una capa Softmax como salida. Mientras que MSE es una buena primera opción para los problemas de regresión lineal en los que busca una predicción escalar en lugar de la probabilidad de membresía en una categoría conocida de un conjunto conocido de posibles categorías, en cuyo caso en lugar de una capa Softmax como resultado usted '' D podría tener una suma ponderada de las entradas más el sesgo sin una función de activación.

Espero que esta respuesta ayude a otros principiantes sin ser demasiado simplistas y obvios.

Regresando tu pregunta

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

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 automáticamente se reducirán 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í observa que, aunque solo aumentamos el tercer término, todos los demás términos redujeron automáticamente

Licenciado bajo: CC-BY-SA con atribución
scroll top