7.A Funciones de coste

Para poder calcular los mejores parámetros de la red neuronal primero debemos saber como es de buena la salida que genera nuestra red neuronal. Para ello vamos a comparar la salida que debería dar la red neuronal con lo que realmente está generando la red neuronal. Así que a partir de ahora a las salida las vamos a diferenciar y llamar de forma distinta

Por lo tanto la red neuronal debería ser así:

pero lo que realmente va a hacer es:

En keras se suele usar la siguiente nomenclatura

¿como de buena es nuestra red neuronal? Pues no hay mas que comprar con . Cuanto más se parezcan, mejor será la red.

La forma mas fácil de ver las diferencias que hay entre e es simplemente restarlas y eso nos dará lo que llamamos el error:

Pero como tenemos muchas e así que deberemos sumar todos los errores y hacer la media (dividirlo entre el número de datos):

A las funciones de coste también se les llama funciones de pérdida o loss en inglés.

sin embargo este primer intento no es muy adecuado ya que la suma de los errores positivos mas los errores negativos se podrían cancelar y obtener que no hay coste.

La primera función de coste sería entonces hacer el valor absoluto de los errores.

Siguiendo con nuestro ejemplo de:

Nos queda que el coste es:

La formula completa no es importante pero si saber que el error depende tanto de los , de la y de la verdadera.

Veamos el código en Python:

Teníamos del tema anterior la creación de la red en Keras y hemos usado como loss (función de pérdida) a MAE:

Ahora creamos la función get_parameters_from_model para obtener los parámetros del modelo.

La creación de la red neuronal mediante la fórmula es:

Hasta aquí todo es prácticamente igual que el tema anterior. Ahora pasemos a definir la función de coste de MAE

Y por último vamos a calcular el loss tanto con Keras como con la función de coste:

En redes neuronales se suelen usar entre otras las siguientes funciones de coste:

Problemas de regresión

Mean Absolute Error (MAE). Error absoluto medio

Mean Square Error (MSE). Error cuadrático medio

Huber

Distancia del coseno.

Problemas de clasificación:

Binary Cross Entropy

Categorical Cross Entropy

Hay mas funciones de coste que se usan en otros problemas como por ejemplo en imágenes pero aquí solo vamos a ver lo básico.

Mas información:

Loss/Cost Functions Every Data Scientist should know about

Importance of Loss functions in Deep Learning and Python Implementation

Deep Learning: Which Loss and Activation Functions should I use?

Creating custom Loss functions using TensorFlow 2

Uso en Keras

Al igual que pasaba con las funciones de activación, las funciones de coste se pueden definir de 3 formas distintas y se usan en el método compile con el argumento loss:

La ventaja de usar la clase es podremos parametrizar la función. Por ejemplo, la función de perdida Huber tiene un parámetro llamado delta .

Mas información:

Regression losses

Probabilistic losses

Veamos ahora las distintas funciones de coste

MAE

El error absoluto medio o en inglés Mean Absolute Error (MAE) suma el valor absoluto de los errores. Al hacer el valor absoluto de cada error, no se cancelarán si hay errores positivos y negativos.

Su fórmula es:

Su uso en Keras es:

MAE vs MSECon el algoritmo de descenso de gradiente nunca nos interesa usar MAE como función de coste ya que el valor de su derivada siempre es constante por lo que al llegar cerca del mínimo es muy fácil que no lo alcance al ser los pasos demasiado largos para llegar al mínimo y pasará sobre él. Mas información: A Comparison of Deep Learning Techniques for Arterial Blood Pressure Prediction

Mas información:

mean_absolute_error function

MeanAbsoluteError class

Understand Manhattan vs Euclidean Distance in Minutes

MSE

El error cuadrático medio o en inglés Mean Square Error (MSE) es similar al anterior solo que eleva al cuadrado cada uno de los errores.

Su fórmula es:

Al elevar al cuadrado ocurre que no hace falta calcular el valor absoluto por lo que la fórmula es más común verla de la siguiente forma:

Su uso en Keras es:

Mas información:

mean_squared_error function

MeanSquaredError class

Where Does the Mean Squared Error Come from?

Error Cuadrático Medio para Regresión: Explicación básica del Error Cuadrático Medio

Distancia del coseno

La distancia del coseno lo que calcula es en vez de la distancia entre 2 puntos, lo que hace es obtener el coseno de la diferencia entre sus ángulos.

Es decir que obtiene el ángulo que tiene cada vectos, resta esos ángulos y calcula el coseno.

Veamos ahora valores del coseno de algunos ángulos:

Si nos fijamos en la siguiente imagen en la que en la parte superior de cada par de vectores está el resultado de la distancia del coseno:

con un poco de ojo, podremos ver que los ángulos que forman y sus cosenos coinciden exactamente con la distancia entre los vectores.

Notar que si la resta de los ángulos es 0, es decir que son iguales, el resultado de 1, pero si forman un ángulo de 180° la diferencia es máxima, y su valor es -1. Por lo tanto la distancia del coseno está en el rango [-1,1].

Para hacer el cálculo matemáticamente podríamos usar algo de trigonometría, pero sería una forma muy costosa de calcularlo. En vez de eso, se usa la siguiente formula que es equivalente (Podemos ver la demostración aqui Cosine similarity: How does it measure the similarity, Maths behind and usage in Python):

En Python se hace de la siguiente forma:

Y el resultado es éste:

sin embargo si usamos la función de coste de Keras:

Vemos que el resultado sale con el signo al revés. Esto es así porque las funciones de coste deben ser de forma que cuanto mayor es el valor, mayor es la diferencia entre $y$ e $\hat{y}$ . Así que simplemente la función de coste de tf.keras.losses.cosine_similarity es como la fórmula que hemos visto pero con un signo menos delante.

Su uso en es Keras

Utilidad de la distancia del coseno

Acabamos de ver como funciona matemáticamente la distancia del coseno pero , ¿cual es su utilidad?

Primero veamos un posible problema de la distancia del coseno. Imaginemos los siguientes 2 vectores A y B

Los 2 vectores no son iguales pero la distancia del coseno nos dirá que son iguales ya que ambos tienen el mismo ángulo. Así que esta función de coste lo que le interesa es la dirección del vector y no el tamaño del vector. Pero, ¿donde puede eso ser últil? Veamos un ejemplo.

OpenPose es una librería que dado un vídeo, obtiene la posición de las personas.

Podemos definir la posición como un conjunto de vectores de cada una de las extremidades. El angulo de cada vector nos dice la posición de cada extremidad pero el tamaño del vector no dice el tamaño de la extremidad. Ahora veamos la siguiente imagen.

Son 3 personas distintas cada una con tamaños de extremidades distintas además que dependiendo de si están en la imagen más hacia el fondo, sus tamaños serán distintos. Para saber si las 3 están haciendo los mismos movimientos, ¿nos interesa que el tamaño de cada vector sea el mismo o nos interesa que los ángulos de cada vector sean los mismo? Obviamente lo que nos interesa es que el ángulo sea el mismo y no si el tamaño es el mismo.

Lo mismo se puede aplicar a un partido de papel:

distancia_coseno_padel.mp4

Otro ejemplo sería para catalogar películas de géneros semejantes. Veamos la siguiente gráfica:

En ángulo nos dice si la película tiene mas porcentaje de aventura o de comedia y la longitud como es de buena la película. Para buscar películas con géneros similares, ¿nos interesa que el tamaño del vector sea el mismo o nos interesa que el ángulo del vector sea el mismo? Como en el caso de antes nos interesa es que el ángulo sea el mismo y no si el tamaño es el mismo.

Otro uso común de la distancia del coseno el comprar si dos documentos se parecen según el Nº de palabras que tiene cada uno. Cada palabra es un vector n-dimensional y palabras similares tienen orientaciones similares. En este caso es necesario previamente tener una "base de datos" con todas las palabras codificadas como vectores. Podemos ver distintas bases de datos aquí:

Github aitoralmeida/spanish_word2vec

Github dccuchile/spanish-word-embeddings "Spanish Word Embeddings"

Spanish Billion Word Corpus and Embeddings

Kaggle Pre-trained Word Vectors for Spanish

Una explicación esto está en:

INTRO al Natural Language Processing (NLP) #1 - ¡De PALABRAS a VECTORES!

INTRO al Natural Language Processing (NLP) #2 - ¿Qué es un EMBEDDING?

Mas información:

Cosine Similarity

Cosine similarity: How does it measure the similarity, Maths behind and usage in Python: Incluye la demostración de la fórmula

Cosine Similarity – Understanding the math and how it works (with python codes)

How the Dot Product Measures Similarity: Explicación matemática de Similitud de coseno

Understanding Cosine Similarity And Its Application

Qué son las distancias, tipos y cómo calcularlas con Python 2/2.

Binary Cross Entropy

Las funciones de coste que hemos visto hasta ahora se usan en problemas de regresión, las siguientes funciones de coste que vamos a ver ahora se usan en problemas de clasificación.

La función de coste "Entropía cruzada binaria" o en inglés "Binary Cross Entropy" se usa en problemas de clasificación cuando solo hay 2 posibles resultados en la clasificación. Por ejemplo si una foto es o no una persona. Esta función de coste se suele usar junto a la función de activación "Sigmoide" como vimos en las funciones de activación.

La fórmula es la siguiente:

Los valores de suelen ser 0 o 1, mientras que los valores de es un número real entre 0 y 1

Veamos ahora graficamente como es la fórmula según si o

Su uso en Keras es:

Mas información:

BinaryCrossentropy class

Where did the Binary Cross-Entropy Loss Function come from?

How to derive the likelihood function for binomial distribution for parameter estimation?

A Gentle Introduction to Cross-Entropy for Machine Learning

Categorical Cross Entropy

La función de coste "Entropía cruzada categórica" o en inglés "Categorical Cross Entropy" se usa en problemas de clasificación cuando hay más de 2 resultados en la clasificación. Por ejemplo si una foto es un perro o un gato o una vaca.

Esta función de coste se suele usar junto a la función de activación "Softmax" como vimos en las funciones de activación. No vamos a poner su fórmula pero es una variación un poco más compleja de la fórmula de Binary Cross Entropy

Su uso en Keras es:

Mas información:

CategoricalCrossentropy class

Para acabar vamos a ver una tabla con la relación entre las funciones de activación usadas en la salida de una red neuronal y la función de coste que se podría usar.

Problema	Función de Activación a la salida	Función de coste
Regresión	Lineal	MSE o Distancia del coseno
Clasificación con 2 posibles valores	Sigmoide	Binary Cross Entropy
Clasificación con más de 2 posibles valores NO excluyentes entre si	Sigmoide	Binary Cross Entropy
Clasificación con más de 2 posibles valores SI excluyentes entre si	Softmax	Categorical Cross Entropy

Para terminar este apartado seguimos con nuestro ejemplo de red neuronal ahora incluyendo la función de coste:

Ejercicios

Ejercicio 1.A

En una red neuronal

Estos son los valores que debería haber sacado la red

Estos son los valores que realmente ha generado la red

Haz un programa en python que calcule mediante las fórmulas la pérdida de la red con MAE, MSE y Binary Cross Entropy

Ejercicio 1.B

Repita el ejercicio anterior pero ahora en vez de usar su código en python, usan las funciones de coste de keras:

tf.keras.losses.mean_absolute_error

tf.keras.losses.mean_squared_error

tf.keras.losses.categorical_crossentropy

Ejercicio 2

Tenemos dos redes neuronales, que deberían haber sacado los siguientes datos.

La red A ha sacado los siguientes datos:

La red B, ha sacado los siguientes datos:

Calcula la pérdida de las 2 redes con MAE, MSE y Binary Cross Entropy (mediante las funciones de Keras).

MAE	MSE	Binary Cross Entropy
Red A
Red B

¿cual es mejor red? Explica porqué

Ejercicio 3

Usando los siguientes datos:

Y con la siguiente red neuronal:

Entrena la red durante 80 épocas, usando MAE y vuelve a entrenar la red usando MSE

Muestra una gráfica similar a la siguiente:

En este tema ya hemos aprendido que la función de perdida para este ejemplo debe ser Binary Cross Entropy pero seguimos usando MAE y MSE porque son más fáciles de calcular manualmente por el alumno en los ejercicios.

Ejercicio 4

Usando los siguientes datos:

Y con la siguiente red neuronal:

Entrena la red durante 80 épocas, usando MSE y obtén:

La pérdida de MSE que obtenemos con el métodos fit. Será la de la última época.

Obtén el array y_pred con el método predict

Calcula manualmente mediante las fórmulas la pérdida de MSE

Calcula mediante las funciones de Keras la pérdida de MSE

Comprueba si las 3 pérdidas tienen el mismo valor.

En este tema ya hemos aprendido que la función de perdida para este ejemplo debe ser Binary Cross Entropy pero seguimos usando MAE y MSE porque son más fáciles de calcular manualmente por el alumno en los ejercicios.

Ejercicio 5.A

Vamos a comprobar como funciona la distancia del coseno para textos. Para ello vamos a obtener una base de datos con 1.692.025 palabras organizadas en vectores de 300 dimensiones.

Para prepararlo todo, antes hay que hacer lo siguiente

Descarga el fichero SBW-vectors-300-min5.bin.gz, que se creo en Spanish Billion Word Corpus and Embeddings

Descomprime el fichero y obtendrás el nuevo fichero llamado sbwce.wordvectors.all.bin

Instala el paquete de python llamado gensim.

Ahora desde python vamos a usarlo:

Importa el siguiente código:

Carga el fichero

Muestra el número exacto de palabras que tiene

El método similarity del objeto vw obtiene la distancia del coseno entre 2 palabras

Ejercicio 5.B

Siguiendo con el ejercicio anterior. Muestra la distancia del coseno entre los siguientes pares de palabras:

verdura , lechuga

tigre , gato

movil , android

tiburón , libro

matemáticas , hijo

Ejercicio 5.C

Siguiendo con el ejercicio anterior. Crea un heatmap usando Seaborn con la distancia del coseno de todas las anteriores palabras.

Deberás crear un dataframe con las columnas:

palabra_x

palabra_y

distancia_coseno

y ejecutar la siguiente línea para que transforme el DataFrame en una matriz válida para hacer el heatmap:

muestra el heatmap

Ejercicio 5.D

Siguiendo con el ejercicio anterior.

Ejecuta la siguiente línea. ¿que crees que hace?

Ejecuta la siguiente línea. ¿Como se ha modificado el resultado?

Ejecuta la siguiente línea. ¿Como se ha modificado el resultado?

Ejercicio 5.E

¿Le has visto alguna utilidad a tener las palabras como vectores y que se puedan relacionar entre ellas? Piensa algún proyecto donde se pudiera usar.

Ejercicio 6

Dado los siguientes problemas de redes neuronales, indica la función (o funciones) de pérdida que usarías:

Obtener el consumo de un coche según las distintas condiciones climáticas, la carretera y el tipo de coche

Averiguar si un paciente tendrá diabetes en el futuro según una serie de analíticas que se han ido haciendo a lo largo de su vida.

Distinguir entre 5 tipos de vino según distintas características del vino

Indicar las variedades de olivas que lleva un aceite y su proporción según el análisis químico que se le hace al aceite.

Indicar si una compra con tarjeta es fraudulenta

Averiguar a que partido político ha votado una persona

Averiguar la distancia a la que se encuentra una estrella según diversas fotos que se van sacando de ella con telescopios.

Entre 8 tipos distintos de canceres y dada la foto de las células de una persona averiguar los cánceres que puede tener

Saber el tipo de tiburón según el sonido que hace bajo el agua al desplazarse

Calcular la ubicación de los objetivos a destruir por un tanque según los sensores proporcionados por el tanque

Averiguar la cifra que se ha escrito una persona a mano.

Ejercicio 7

Crea una red neuronal para entrenar las flores. Tienes que entrenarla durante 300 épocas con todas las combinaciones de:

Estructura de la red:

[3]

[4, 3]

[4, 8, 3]

[4, 8, 16, 8, 3]

[4, 8, 16, 32, 16, 8, 4, 3]

[4, 8, 16, 32, 64, 32, 16, 8, 4, 3]

[4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 3]

Funciones de activación:

Sigmoid

Tanh

ReLU

LeakyReLU

SeLU

ELU

Responde las siguientes cuestiones:

¿Cual ha resultado ser la mejor estructura de red?

¿Cual ha sido la mejor función de activación para la mejor estructura de red?

Ejercicio 8.A

Crea y entrena una red neuronal que averigüe si un paciente tendrá diabetes. Los datos los obtendrás con la función load_diabetes.

Deberás:

Probar con varias funciones de activación en las capas ocultas para ver cual es la mejor.

Elegir adecuadamente la función de activación de la capa de salida

Elegir adecuadamente la función de coste a usar

Ejercicio 8.B

Crea y entrena una red neuronal que averigüe el dígito que ha escrito una persona. Los datos los obtendrás con la función load_digits.

Deberás:

Probar con varias funciones de activación en las capas ocultas para ver cual es la mejor.

Elegir adecuadamente la función de activación de la capa de salida

Elegir adecuadamente la función de coste a usar

Ejercicio 8.C

Crea y entrena una red neuronal que averigüe el tipo de un vino. Los datos los obtendrás con la función load_wine.

Deberás:

Probar con varias funciones de activación en las capas ocultas para ver cual es la mejor.

Elegir adecuadamente la función de activación de la capa de salida

Elegir adecuadamente la función de coste a usar

Ejercicio 8.D

Crea y entrena una red neuronal que averigüe si tiene cáncer de mama. Los datos los obtendrás con la función load_breast_cancer.

Deberás:

Probar con varias funciones de activación en las capas ocultas para ver cual es la mejor.

Elegir adecuadamente la función de activación de la capa de salida

Elegir adecuadamente la función de coste a usar