Hoy, quiero compartirles algo bastante especial: mi experiencia enseñando redes neuronales en la Escuela Superior de Cómputo (ESCOM del IPN). Sobre todo para que podamos responder a la pregunta planteada en el título. 

Así que, vamos a sumergirnos en los fundamentos esenciales para entender las redes neuronales. Aunque parezca sorprendente, actualmente es posible practicar con redes neuronales sin ser un experto, gracias a herramientas como Keras y chatgpt, que simplifican mucho el proceso. Es más, hay videos con miles de vistas que te dicen, “aprende inteligencia artificial en 30 minutos” (¡No! En mi experiencia eso no es posible). Sin embargo, si queremos entender realmente qué hace que una red funcione (o no), es crucial tener al menos un entendimiento básico de ciertos temas.

A lo largo de estos años impartiendo la materia de «Redes neuronales y aprendizaje profundo», he tenido el gusto de conocer a estudiantes increíbles, algunos destacan de forma natural y otros, como muchos de nosotros, encontramos el camino con un poco más de esfuerzo. Pero algo que he observado es que dominar las redes neuronales está al alcance de todos, siempre que tengamos una buena base en cuatro áreas.

Así que pongamos manos en la masa descubriendo la primera área: álgebra lineal, una rama de las matemáticas que, aunque no la única, sirve como un excelente trampolín para adentrarnos en el estudio y comprensión de las redes neuronales. Su importancia radica en la capacidad de transformar y representar conceptos abstractos en modelos matemáticos que podemos manipular y entender, especialmente en aplicaciones prácticas dentro del campo de la inteligencia artificial.

Tomemos, por ejemplo, la representación de imágenes en las redes neuronales. Aquí, el álgebra lineal nos ofrece las herramientas para convertir una imagen en una matriz, donde cada elemento puede interpretarse como un pixel con valores específicos de color e intensidad. Esta transformación no solo facilita el procesamiento y análisis de la imagen por parte de una red neuronal sino que también nos permite aplicar diversas operaciones matemáticas para modificar o extraer información valiosa de la imagen.

De manera similar, en el ámbito del procesamiento de audio, el álgebra lineal juega un papel indispensable. Los sonidos, que podemos considerar como secuencias de ondas acústicas, se modelan como vectores en un espacio definido, donde cada elemento del vector representa una muestra de sonido en un instante específico. Esta representación vectorial hace posible la manipulación de señales de audio, permitiendo operaciones como la filtración, compresión, y análisis espectral, todas fundamentales para el procesamiento y reconocimiento de patrones sonoros en las redes neuronales.

Para profundizar en el álgebra lineal aplicada a las redes neuronales, es esencial dominar las representaciones matriciales y vectoriales, no solo en dos dimensiones sino también en espacios de mayor dimensionalidad. Esto implica entender cómo realizar operaciones básicas como la suma y resta de matrices y vectores, así como la multiplicación de matrices, que nos permite combinar y transformar datos de la manera adecuada. Pero no nos espantemos tan rápido esto se ve en un curso introductorio como en los primeros cursos de cualquier ingeniería. al final dejaré algunas recomendaciones de cursos y libros. 

En resumen de esta parte, el álgebra lineal no solo nos proporciona un marco para representar y manipular datos de manera efectiva sino que también establece las bases para explorar y comprender el aprendizaje profundo y las redes neuronales. Con el entendimiento de sus principios y operaciones básicas, estaremos mejor equipados para desentrañar los misterios detrás del funcionamiento de las redes neuronales y avanzar hacia aplicaciones más avanzadas y creativas en el campo de la inteligencia artificial.

Pasemos a la segunda área: la probabilidad y la estadística. Éstas son piedras angulares en el desarrollo, optimización y evaluación de las redes neuronales, permitiéndonos navegar a través de la incertidumbre inherente a los datos y procesos del mundo real. En un universo donde raramente las cosas son absolutamente blancas o negras, estas disciplinas matemáticas nos ofrecen un lenguaje y metodologías para cuantificar y manejar la ambigüedad y la variabilidad.

Cuando trabajamos con redes neuronales, nos encontramos constantemente con la tarea de hacer predicciones basadas en datos imperfectos o incompletos. La probabilidad nos ayuda a modelar la incertidumbre de los eventos, permitiéndonos estimar la confianza en las predicciones de nuestra red. Por ejemplo, en lugar de afirmar categóricamente que una imagen contiene un gato, la red puede indicarnos que hay un 80% de probabilidad de que así sea, ofreciéndonos una medida cuantitativa de su certeza.

Por otro lado, la estadística juega un papel crucial en el análisis e interpretación de los datos con los que entrenamos y evaluamos nuestras redes neuronales. Nos permite comprender las distribuciones subyacentes de nuestros datos, identificar patrones y anomalías, y tomar decisiones informadas sobre cómo mejorar nuestros modelos. A través de técnicas estadísticas, podemos evaluar la eficacia de nuestras redes, comparando las predicciones con los resultados reales y ajustando los modelos para aumentar su precisión y fiabilidad.

Además, la estadística nos facilita herramientas para el manejo de grandes volúmenes de datos. En el mundo del aprendizaje automático, donde a menudo trabajamos con conjuntos de datos de tamaño y complejidad significativos, la capacidad de resumir, analizar y extraer conclusiones de estos datos es invaluable. Métodos como el muestreo, la inferencia estadística y los tests de hipótesis nos permiten hacer generalizaciones y predicciones sobre poblaciones más amplias a partir de muestras limitadas, aumentando la eficiencia y la escalabilidad de nuestros proyectos.

En el contexto de las redes neuronales, la intersección de la probabilidad y la estadística con el aprendizaje automático se manifiesta en técnicas como el aprendizaje bayesiano, que incorpora la incertidumbre directamente en el modelo, permitiendo que las redes no solo aprendan de los datos sino que también cuantifiquen su incertidumbre en las predicciones. Esta aproximación puede ser particularmente útil en aplicaciones críticas, como la medicina o la conducción autónoma, donde comprender y gestionar el riesgo y la incertidumbre es tan importante como hacer predicciones precisas.

Para concluir esta área, la probabilidad y la estadística son fundamentales para la experimentación y la validación en el ciclo de vida del desarrollo de las redes neuronales. Nos permiten diseñar experimentos rigurosos, evaluar la significancia de los resultados y tomar decisiones basadas en evidencias sólidas. Así, más allá de ser meras herramientas matemáticas, se convierten en aliadas esenciales en nuestra búsqueda por desarrollar redes neuronales que sean no solo poderosas y precisas, sino también confiables y entendibles.

Vayamos a la tercera área: el cálculo. Sí ya sé, suena complejo, pero el cálculo, y en particular el cálculo diferencial, desempeña un papel fundamental en el corazón del entrenamiento de las redes neuronales, un aspecto que no podemos subestimar. La esencia de entrenar una red neuronal radica en optimizar sus pesos y sesgos para minimizar el error en sus predicciones o salidas en comparación con las salidas esperadas. Aquí es donde el cálculo diferencial entra en juego, aportando el marco teórico y las herramientas prácticas necesarias para realizar esta optimización de manera eficiente.

El método de descenso por gradiente, uno de los algoritmos de optimización más empleados en el aprendizaje automático y profundo, es un ejemplo perfecto de la aplicación del cálculo diferencial. Este método se basa en la premisa de que, para minimizar la función de costo o pérdida (que mide el error entre las predicciones de la red y los valores reales), es posible seguir la dirección opuesta al gradiente de la función. El «gradiente» aquí se refiere al vector de derivadas parciales de la función de coste con respecto a cada uno de los pesos de la red, indicando la dirección en la que la función aumenta más rápidamente.

Por tanto, el descenso por gradiente ajusta iterativamente los pesos en la dirección que reduce el error, utilizando la tasa de aprendizaje para determinar el tamaño del paso en cada iteración. Este proceso es esencialmente un ejercicio de cálculo diferencial aplicado, donde la derivada de la función de coste respecto a los pesos nos dice cómo cambiar los pesos para llegar al mínimo de la función de coste más rápidamente.

Además del descenso por gradiente, el cálculo diferencial es crucial en variantes más avanzadas y eficientes del método, como el descenso por gradiente estocástico (SGD) y métodos adaptativos como Adam. Estas variantes mejoran la eficiencia y la efectividad del entrenamiento de la red mediante ajustes en la forma de calcular o aplicar el gradiente, a menudo incorporando conceptos como el momento (que suaviza la trayectoria del gradiente a lo largo de las iteraciones) y la adaptación de la tasa de aprendizaje para cada peso individualmente.

El papel del cálculo en las redes neuronales va más allá de la optimización de pesos. También es fundamental en la comprensión y diseño de las funciones de activación, en la retropropagación y en la evaluación de la complejidad y capacidad de generalización de los modelos.

Entonces, el cálculo diferencial no es solo una herramienta para el entrenamiento de las redes neuronales; es una columna vertebral que sostiene la teoría y práctica del aprendizaje profundo, permitiéndonos navegar y manipular el paisaje multidimensional de los errores y optimizaciones que define el comportamiento y el rendimiento de las redes neuronales.

Con la álgebra lineal, la probabilidad, la estadística y el cálculo podemos entender el funcionamiento de las redes. Sin embargo, la programación es la llave que nos permite no solo entender teóricamente las redes neuronales sino también aplicar estos conocimientos en la práctica, llevando a cabo experimentos, construyendo modelos, y evaluando su eficacia en problemas reales. Entre los diversos lenguajes de programación disponibles, Python se ha consolidado como el líder indiscutible en el ámbito de la ciencia de datos y la inteligencia artificial por varias razones.

Python destaca por su sintaxis clara y legible, que facilita tanto el aprendizaje para los novatos en programación como la implementación de complejas estructuras de datos y algoritmos por parte de profesionales experimentados. Esta accesibilidad hace de Python una herramienta excelente para explorar y experimentar con redes neuronales, permitiendo a los usuarios centrarse en la lógica y los principios subyacentes más que en las complejidades del lenguaje de programación.

Además, Python es rico en bibliotecas y frameworks específicamente diseñados para el aprendizaje automático y el aprendizaje profundo, como TensorFlow, PyTorch, y Keras. Estas bibliotecas proporcionan abstracciones y pre-implementaciones de numerosas funciones y algoritmos, reduciendo significativamente la cantidad de código que los usuarios necesitan escribir y entender para construir modelos de redes neuronales eficaces. Esto no sólo acelera el proceso de desarrollo sino que también facilita la experimentación con diferentes arquitecturas y técnicas de optimización.

Una de las herramientas más poderosas a disposición de quienes usan Python para el aprendizaje profundo es «numpy», una biblioteca que ofrece soporte para arrays y matrices de gran tamaño, junto con una colección extensa de funciones matemáticas para operar con estos objetos. «Numpy» es fundamental para implementar de manera eficiente las operaciones de álgebra lineal necesarias en el entrenamiento y la aplicación de redes neuronales, desde la multiplicación de matrices hasta transformaciones más complejas. De hecho en nuestro curso, la mayoría de las implementaciones se hace solo usando numpy sin necesidad de paquetes más complejos.

La integración de Python con otras bibliotecas, como «pandas» para la manipulación y análisis de datos y «matplotlib» para la visualización, hace que sea sencillo desde cargar y preprocesar datos hasta evaluar modelos y presentar resultados de manera clara y efectiva. Esta capacidad para abarcar todo el flujo de trabajo de un proyecto de aprendizaje automático en un solo lenguaje de programación es invaluable. En el curso, ha habido estudiantes que me dicen: ¿puedo entregar en c++ la tarea? Y mi respuesta es: “si quieres gastar varios días para hacer el trabajo que se hace en una hora: adelante no te lo voy a impedir”.

En resumen, el dominio de Python amplía enormemente nuestras capacidades para explorar el potencial de las redes neuronales, desde realizar tareas simples de clasificación hasta abordar desafíos complejos como el desarrollo de modelos de lenguaje de última generación. Python no solo nos proporciona el acceso a una rica biblioteca de herramientas y frameworks sino que también nos permite unir los conceptos de álgebra lineal, probabilidad, estadística y cálculo en aplicaciones prácticas.

Finalmente, para adentrarnos en el mundo de las redes neuronales y aprovechar su potencial, desde clasificar imágenes hasta entender el lenguaje humano, necesitamos familiarizarnos con el álgebra lineal, la probabilidad y estadística, el cálculo y, por supuesto, la programación.

¡Muchas gracias por acompañarme en este post! Espero que hayan disfrutado y aprendido algo nuevo.

Recomendaciones para estudiar: