1 00:00:02,350 --> 00:00:06,089 Hola, este es el ejercicio de entrenar redes de neuronas 2 00:00:06,089 --> 00:00:10,449 usando el Playground que tiene la página web de TensorFlow. 3 00:00:11,289 --> 00:00:16,109 TensorFlow es una de las dos bibliotecas de código más usadas en Python 4 00:00:16,109 --> 00:00:21,050 para desarrollar redes de neuronas y en general modelos de Deep Learning y Machine Learning. 5 00:00:22,190 --> 00:00:25,890 En esta página web, playground.tensorflow.org, 6 00:00:26,710 --> 00:00:31,789 tienen un entorno de pruebas en el que se puede aprender cómo funciona una red de neuronas por dentro 7 00:00:31,789 --> 00:00:37,250 y jugar probando con distintos parámetros y demás y tratando de entrenar la red. 8 00:00:37,969 --> 00:00:43,570 El objetivo en este problema, que es el problema de clasificación, que es del que trata este ejercicio, 9 00:00:44,390 --> 00:00:52,350 es tratar de clasificar los puntos de datos entre si son naranja o azul, siendo naranja menos uno o azul uno. 10 00:00:52,350 --> 00:01:02,810 para poder hacer esto se van a tener que seguir los pasos empezando por el de capas y patrones 11 00:01:02,810 --> 00:01:09,189 en este paso se puede entrenar la red neuronal por defecto haciendo clic en el botón de ejecución 12 00:01:09,189 --> 00:01:16,739 y parándolo cuando veamos que el resultado es decente 13 00:01:16,739 --> 00:01:23,420 el resultado será decente cuando el nivel de loss o pérdida en el entorno de test sea muy reducido 14 00:01:23,420 --> 00:01:36,019 Podemos darle a parar y podemos observar en el color del fondo como se han predicho que va a ser la clasificación o la etiqueta de los puntos del entorno de test 15 00:01:36,019 --> 00:01:41,260 En los puntos del entorno de test se puede mostrar aquí para distinguirlos del del entorno de entrenamiento 16 00:01:41,739 --> 00:01:51,620 Así pues se puede comprobar como todos los puntos que son naranjas la red de neuronas que se representa en el fondo ha acertado prediciendolos como naranja 17 00:01:51,620 --> 00:01:54,819 Y todos los azules los ha acertado prediciendo como azules. 18 00:01:55,859 --> 00:02:05,900 Dándole a discretizar el output podemos hacer que sea puramente binario, es decir, o menos uno para el naranja, la clasificación naranja, o uno para el azul. 19 00:02:08,699 --> 00:02:15,699 Podemos así observar cómo se encuentra rápidamente una buena solución para la tarea de clasificación en este tipo de datos. 20 00:02:16,620 --> 00:02:23,060 El tipo de datos podemos cambiarlo aquí para cambiar a tipos quizá más difíciles de aprender o de entrenar. 21 00:02:23,580 --> 00:02:27,759 observa que las neuronas de la primera capa oculta han aprendido patrones simples 22 00:02:27,759 --> 00:02:35,099 mientras que las neuronas de la segunda capa han aprendido a combinar los patrones simples de la primera capa en patrones más complejos 23 00:02:35,099 --> 00:02:43,740 así podemos observar que del input de la variable 1 que podría ser la variable en el eje x 24 00:02:43,740 --> 00:02:46,900 y la variable 2 que podría ser la variable en el eje y 25 00:02:46,900 --> 00:02:53,680 Como inputs la primera capa oculta está aprendiendo patrones muy simples 26 00:02:53,680 --> 00:02:56,719 De hecho son lineales como se puede observar 27 00:02:56,719 --> 00:03:02,400 Básicamente son funciones lineales de distinta pendiente y origen 28 00:03:02,400 --> 00:03:06,080 Mientras que la segunda capa está aprendiendo un patrón más complejo 29 00:03:06,080 --> 00:03:09,439 Son patrones en este caso con formas más complejas 30 00:03:09,439 --> 00:03:12,659 Que permiten ajustarse mejor al entorno de datos 31 00:03:12,659 --> 00:03:17,300 el segundo ejercicio trata de cambiar la función de activación 32 00:03:17,300 --> 00:03:24,419 las redes de neuronas tienen como output de las capas intermedias una función de activación 33 00:03:24,419 --> 00:03:30,819 con la cual se determina cuál es el valor final que se le otorga al output de la propia red 34 00:03:30,819 --> 00:03:35,400 esta función de activación típicamente es una de estas cuatro que se ve aquí 35 00:03:35,400 --> 00:03:40,340 o relu o la tan h o la sigmoide o la lineal 36 00:03:40,340 --> 00:03:46,300 os recomiendo que preguntéis a chatgpt si queréis informaros más sobre cada función de activación 37 00:03:46,300 --> 00:03:50,699 y que busquéis qué tipo de gráfica representa cada una de estas 38 00:03:50,699 --> 00:03:54,740 entonces vamos a probar a cambiar la función de activación a la relu 39 00:03:54,740 --> 00:03:59,039 que es una de las más empleadas y volver a entrenar la red 40 00:03:59,039 --> 00:04:04,919 vamos a poder observar una vez le damos a repetir desde el principio y entrenar la red 41 00:04:04,919 --> 00:04:13,960 podemos parar aquí ya que el error es bajo 42 00:04:13,960 --> 00:04:20,399 que se encuentra una solución aún más rápido que antes, pero esta vez los límites son lineales. 43 00:04:21,019 --> 00:04:27,579 Es decir, donde antes se formaba una especie de forma cilíndrica o circular, ahora los límites son más lineales, 44 00:04:27,579 --> 00:04:32,720 son casi líneas completamente rectas. Esto se debe a la propia función de activación. 45 00:04:38,939 --> 00:04:44,779 El siguiente ejercicio trata sobre los mínimos locales. En este caso hay que modificar la arquitectura de la red 46 00:04:44,779 --> 00:04:51,079 para tener una sola capa oculta con tres neuronas entonces vamos a reducir el número de capas a una 47 00:04:51,079 --> 00:04:59,860 sola capa oculta y el número de neuronas a tres y restablecemos el entrenamiento entrene la varias 48 00:04:59,860 --> 00:05:05,639 veces y observa que el tiempo de entrenamiento varía mucho y es posible que se quede atascada 49 00:05:05,639 --> 00:05:13,500 en un mínimo local es interesante aprender entender que cuanto más capas ocultas en general o cuanto 50 00:05:13,500 --> 00:05:19,939 más deep sea la red de neuronas de ahí el término deep learning es más fácil que se alcancen los 51 00:05:19,939 --> 00:05:26,519 mínimos globales del problema de optimización y no que se quede parado en mínimos locales por 52 00:05:26,519 --> 00:05:30,720 ejemplo en este caso vemos que el resultado es un poquito peor que antes pero es posible en 53 00:05:30,720 --> 00:05:36,800 vuestras pruebas que en algunos casos no se llegue siquiera a un resultado idóneo en especial si 54 00:05:36,800 --> 00:05:45,600 probáis con tipos de datos más complicados como por ejemplo este demasiado pequeño ahora elimina 55 00:05:45,600 --> 00:05:49,939 una neurona para quedarte con solo dos neuronas. Observa que la red ahora es incapaz de encontrar 56 00:05:49,939 --> 00:05:55,740 una buena solución, aunque lo intentes varias veces, ya que este modelo va a tener muy pocos 57 00:05:55,740 --> 00:06:03,480 parámetros y se va a ceñir únicamente al patrón de los datos de entrenamiento. Como podemos 58 00:06:03,480 --> 00:06:09,800 observar, la predicción no es muy buena, ya que aunque sí que predice la mayoría de datos azules 59 00:06:09,800 --> 00:06:15,139 como azules, está prediciendo muchos datos naranjas también como azules, lo cual es un error. 60 00:06:15,600 --> 00:06:25,360 Se puede observar que el porcentaje de error o el por 1 de error es bastante alto, suficientemente grande. 61 00:06:25,860 --> 00:06:29,920 A continuación podemos ajustar el número de neuronas a 8 y entrenar varias veces. 62 00:06:30,740 --> 00:06:33,600 En este caso vamos a ver cómo es más rápido y nunca se atasca. 63 00:06:34,079 --> 00:06:44,600 Esto tiene que ver en la teoría de redes neuronales con que cuanto más white, es decir, cuantas más neuronas en una capa o en cada capa, 64 00:06:44,600 --> 00:06:52,379 se puede explorar más los mínimos globales, es decir, que no se queda simplemente en los mínimos locales 65 00:06:52,379 --> 00:06:54,339 y trata de encontrar mejores soluciones. 66 00:06:56,180 --> 00:07:01,839 Sin embargo, es verdad que podría quedarse atascado durante mucho tiempo para intentar salir de este tipo de meseta. 67 00:07:02,560 --> 00:07:07,980 Entonces podemos hacerlo aumentando el número de neuronas, restableciendo y volviendo a entrenar. 68 00:07:07,980 --> 00:07:12,420 como vemos en el fondo los límites siguen siendo lineales 69 00:07:12,420 --> 00:07:17,980 pero podemos observar que la precisión es mucho mejor que antes 70 00:07:17,980 --> 00:07:23,870 siguiente red profunda de gradientes de fuga 71 00:07:23,870 --> 00:07:26,410 ahora hay que cambiar el conjunto de datos para que sea la espiral 72 00:07:26,410 --> 00:07:31,170 podemos observar que la espiral va a ser un conjunto de datos mucho más complicado de predecir 73 00:07:31,170 --> 00:07:34,769 por lo que vamos a tener que aumentar el número de capas 74 00:07:34,769 --> 00:07:39,930 y vamos a tener que aumentar el número de neuroras en cada capa 75 00:07:39,930 --> 00:07:44,970 en este caso a las 8 que teníamos. Podemos observar como el número de conexiones neuronales 76 00:07:44,970 --> 00:07:50,649 aumenta considerablemente según aumentamos el número de neuronas. Al clicar en una neurona 77 00:07:50,649 --> 00:07:56,930 nos fijamos en que depende de todas las neuronas anteriores y cada una de esas anteriores depende 78 00:07:56,930 --> 00:08:02,930 a su vez de todas las anteriores por lo que las neuronas del final están aprendiendo patrones 79 00:08:02,930 --> 00:08:08,850 cada vez más complejos. Veamos si es suficiente para detectar este tipo de patrón de datos tan 80 00:08:08,850 --> 00:08:17,839 complicado. Podemos reiniciar y podemos intentar entrenar. Vemos que en este caso el entrenamiento 81 00:08:17,839 --> 00:08:24,339 llevará más tiempo y que no siempre nos asegurará que sea un resultado perfecto. Aquí parece que va 82 00:08:24,339 --> 00:08:33,559 mejorando poco a poco y vemos cómo la gráfica del error va reduciéndose hasta llegar a un límite 83 00:08:33,559 --> 00:08:43,500 bastante decente. Cuando llegamos a un límite decente podemos parar y llegar a la solución 84 00:08:43,500 --> 00:08:51,580 esperada. Es importante que probéis los parámetros de la izquierda si queréis observar qué pasa en 85 00:08:51,580 --> 00:08:56,200 distintos casos con los datos de entrada. Por ejemplo, mi recomendación es que el porcentaje 86 00:08:56,200 --> 00:09:03,059 de datos que se dedican al entrenamiento de la red sea superior al 50%. Normalmente en la industria 87 00:09:03,059 --> 00:09:09,440 se utiliza entre un 70 y un 80% para entrenar, mientras que el resto se utiliza para test y 88 00:09:09,440 --> 00:09:17,019 validación. Si queréis un reto podéis aumentar el ruido de los datos. Podemos ver que los datos 89 00:09:17,019 --> 00:09:22,860 tienen mucho más ruido ahora, es decir que va a ser más difícil predecir este patrón. Si no podéis 90 00:09:22,860 --> 00:09:28,960 simplemente dejar el ruido a cero. Y por último el tamaño de BATS tiene que ver con cuántos 91 00:09:28,960 --> 00:09:33,940 datos se entrenan a la vez en cada iteración. Podéis dejarlo de momento en 10 y dándole a 92 00:09:33,940 --> 00:09:40,059 regenerar podéis generar nuevos ejemplos de entrenamiento. Por último recomiendo que probéis 93 00:09:40,059 --> 00:09:47,480 a aumentar o disminuir el rate o el ratio de aprendizaje para tratar de converger más rápido 94 00:09:47,480 --> 00:09:56,940 pero jugándosela más a ir a acabar en mínimos locales o converger más lento pero poder intentar 95 00:09:56,940 --> 00:10:03,519 alcanzar mejores óptimos. Esto buscad qué valor se adapta mejor a vuestro caso. Probad de nuevo 96 00:10:03,519 --> 00:10:06,059 con distintas funciones de activación 97 00:10:06,059 --> 00:10:07,980 y si sois aventureros 98 00:10:07,980 --> 00:10:10,000 y queréis investigar un poco más 99 00:10:10,000 --> 00:10:10,779 por vuestra cuenta 100 00:10:10,779 --> 00:10:14,279 mirad qué significa la regularización L1 y L2 101 00:10:14,279 --> 00:10:16,220 y qué ratio de regularización 102 00:10:16,220 --> 00:10:18,000 ponerle a la red de neuronas 103 00:10:18,000 --> 00:10:27,950 una red de neuronas 104 00:10:27,950 --> 00:10:29,190 es el 105 00:10:29,190 --> 00:10:31,629 modelo de machine learning 106 00:10:31,629 --> 00:10:33,549 que hemos visto en este ejercicio 107 00:10:33,549 --> 00:10:35,409 que se fundamenta 108 00:10:35,409 --> 00:10:37,269 en utilizar una serie de capas 109 00:10:37,269 --> 00:10:38,789 intermedias ocultas 110 00:10:38,789 --> 00:10:50,110 a las cuales se les pasa una información en forma de características, en este caso hemos utilizado simplemente el eje X y el eje Y, o sea dos dimensiones de estos puntitos, 111 00:10:50,649 --> 00:10:57,210 aunque podríamos incluir características más complejas como el eje X al cuadrado o incluso el producto del eje X por el eje Y. 112 00:10:57,210 --> 00:11:12,190 Esas características se dan como entrenamiento a la red de neuronas que trata de aprender a predecir en este output cuál va a ser el valor resultante dado un cierto input. 113 00:11:12,190 --> 00:11:21,909 Es decir, si le damos un punto nuevo en esta situación, la red de neuronas tiene que ser buena prediciendo que el punto debe ser naranja en vez de azul. 114 00:11:21,909 --> 00:11:37,370 Una vez ha entrenado lo suficiente, con datos de entrenamiento será capaz de detectar o categorizar si es naranja o azul en datos nuevos que no haya conocido de antes 115 00:11:37,370 --> 00:11:43,909 Por ejemplo, estos datos podrían estar representando si una persona tiene diabetes o no 116 00:11:43,909 --> 00:11:48,889 Siendo naranja no tener diabetes y azul sí tener diabetes 117 00:11:48,889 --> 00:11:55,370 quizá el eje X puede representar una variable médica o fisiológica 118 00:11:55,370 --> 00:11:59,590 quizá de momento podemos decir que se refiere a la altura del paciente 119 00:11:59,590 --> 00:12:03,990 y el eje Y otra, por ejemplo podría referirse a la edad 120 00:12:03,990 --> 00:12:09,330 lo cual significa que a una edad determinada y a una altura determinada 121 00:12:09,330 --> 00:12:12,330 este paciente no tiene diabetes 122 00:12:12,330 --> 00:12:17,750 mientras que a una altura determinada y a una edad determinada este otro sí que lo tiene